2 var version = "4.13.0";
4 function ascending(a, b) {
5 return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
8 function 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 ascending(f(d), x);
40 var ascendingBisect = bisector(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 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 = 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 quantile(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(ascending);
325 return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(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 quantile(numbers.sort(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 = 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$1;
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$1(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 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 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 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 nodrag(view) {
1789 var root = view.document.documentElement,
1790 selection$$1 = 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 = 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), mouse, this, arguments);
1883 if (!gesture) return;
1884 select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
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 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 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] = 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 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] = 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: 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 interpolate(a, b) {
2737 var t = typeof b, c;
2738 return b == null || t === "boolean" ? constant$3(b)
2739 : (t === "number" ? interpolateNumber
2740 : t === "string" ? ((c = color(b)) ? (b = c, interpolateRgb) : interpolateString)
2741 : b instanceof color ? 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 : 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: interpolateNumber(xa, xb)}, {i: i - 2, x: 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: 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: 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: interpolateNumber(xa, xb)}, {i: i - 2, x: 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 timeout$1(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 timeout$1(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 timeout$1(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$1(a, b) {
3413 return (typeof b === "number" ? interpolateNumber
3414 : b instanceof color ? interpolateRgb
3415 : (c = color(b)) ? (b = c, 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$1;
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$$1) {
3655 var name = this._name,
3658 if (typeof select$$1 !== "function") select$$1 = selector(select$$1);
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$$1.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$$1) {
3674 var name = this._name,
3677 if (typeof select$$1 !== "function") select$$1 = selectorAll(select$$1);
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$$1.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$1;
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 = 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 = 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 = 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 = 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 = 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);
4504 var point1 = 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 = 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(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 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 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$1[0] = lambda0$1, range$1[1] = lambda1;
7032 function boundsPoint(lambda, phi) {
7033 ranges.push(range$1 = [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$1 = [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$1[0] = lambda0$1, range$1[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$1[0] = lambda0$1, range$1[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 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$1 = 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 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 length$1(object) {
8342 geoStream(object, lengthStream);
8346 var coordinates = [null, null],
8347 object$1 = {type: "LineString", coordinates: coordinates};
8349 function distance(a, b) {
8352 return length$1(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 = 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 = 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 range(ceil(X0 / DX) * DX, X1, DX).map(X)
8459 .concat(range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
8460 .concat(range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$2; }).map(x))
8461 .concat(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$2(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 geoStream(object, projectionStream(contextStream));
8898 return contextStream.result();
8901 path.area = function(object) {
8902 geoStream(object, projectionStream(areaStream$1));
8903 return areaStream$1.result();
8906 path.measure = function(object) {
8907 geoStream(object, projectionStream(lengthStream$1));
8908 return lengthStream$1.result();
8911 path.bounds = function(object) {
8912 geoStream(object, projectionStream(boundsStream$1));
8913 return boundsStream$1.result();
8916 path.centroid = function(object) {
8917 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 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,
9326 (lower48Point.point(x, y), point)
9327 || (alaskaPoint.point(x, y), point)
9328 || (hawaiiPoint.point(x, y), point);
9331 albersUsa.invert = function(coordinates) {
9332 var k = lower48.scale(),
9333 t = lower48.translate(),
9334 x = (coordinates[0] - t[0]) / k,
9335 y = (coordinates[1] - t[1]) / k;
9336 return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
9337 : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
9338 : lower48).invert(coordinates);
9341 albersUsa.stream = function(stream) {
9342 return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
9345 albersUsa.precision = function(_) {
9346 if (!arguments.length) return lower48.precision();
9347 lower48.precision(_), alaska.precision(_), hawaii.precision(_);
9351 albersUsa.scale = function(_) {
9352 if (!arguments.length) return lower48.scale();
9353 lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
9354 return albersUsa.translate(lower48.translate());
9357 albersUsa.translate = function(_) {
9358 if (!arguments.length) return lower48.translate();
9359 var k = lower48.scale(), x = +_[0], y = +_[1];
9361 lower48Point = lower48
9363 .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
9364 .stream(pointStream);
9366 alaskaPoint = alaska
9367 .translate([x - 0.307 * k, y + 0.201 * k])
9368 .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]])
9369 .stream(pointStream);
9371 hawaiiPoint = hawaii
9372 .translate([x - 0.205 * k, y + 0.212 * k])
9373 .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]])
9374 .stream(pointStream);
9379 albersUsa.fitExtent = function(extent, object) {
9380 return fitExtent(albersUsa, extent, object);
9383 albersUsa.fitSize = function(size, object) {
9384 return fitSize(albersUsa, size, object);
9387 albersUsa.fitWidth = function(width, object) {
9388 return fitWidth(albersUsa, width, object);
9391 albersUsa.fitHeight = function(height, object) {
9392 return fitHeight(albersUsa, height, object);
9396 cache = cacheStream = null;
9400 return albersUsa.scale(1070);
9403 function azimuthalRaw(scale) {
9404 return function(x, y) {
9415 function azimuthalInvert(angle) {
9416 return function(x, y) {
9417 var z = sqrt(x * x + y * y),
9422 atan2(x * sc, z * cc),
9423 asin(z && y * sc / z)
9428 var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
9429 return sqrt(2 / (1 + cxcy));
9432 azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
9433 return 2 * asin(z / 2);
9436 function azimuthalEqualArea() {
9437 return projection(azimuthalEqualAreaRaw)
9439 .clipAngle(180 - 1e-3);
9442 var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
9443 return (c = acos(c)) && c / sin$1(c);
9446 azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
9450 function azimuthalEquidistant() {
9451 return projection(azimuthalEquidistantRaw)
9453 .clipAngle(180 - 1e-3);
9456 function mercatorRaw(lambda, phi) {
9457 return [lambda, log(tan((halfPi$2 + phi) / 2))];
9460 mercatorRaw.invert = function(x, y) {
9461 return [x, 2 * atan(exp(y)) - halfPi$2];
9464 function mercator() {
9465 return mercatorProjection(mercatorRaw)
9466 .scale(961 / tau$3);
9469 function mercatorProjection(project) {
9470 var m = projection(project),
9473 translate = m.translate,
9474 clipExtent = m.clipExtent,
9475 x0 = null, y0, x1, y1; // clip extent
9477 m.scale = function(_) {
9478 return arguments.length ? (scale(_), reclip()) : scale();
9481 m.translate = function(_) {
9482 return arguments.length ? (translate(_), reclip()) : translate();
9485 m.center = function(_) {
9486 return arguments.length ? (center(_), reclip()) : center();
9489 m.clipExtent = function(_) {
9490 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]];
9494 var k = pi$3 * scale(),
9495 t = m(rotation(m.rotate()).invert([0, 0]));
9496 return clipExtent(x0 == null
9497 ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
9498 ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
9499 : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
9506 return tan((halfPi$2 + y) / 2);
9509 function conicConformalRaw(y0, y1) {
9510 var cy0 = cos$1(y0),
9511 n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)),
9512 f = cy0 * pow(tany(y0), n) / n;
9514 if (!n) return mercatorRaw;
9516 function project(x, y) {
9517 if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; }
9518 else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; }
9519 var r = f / pow(tany(y), n);
9520 return [r * sin$1(n * x), f - r * cos$1(n * x)];
9523 project.invert = function(x, y) {
9524 var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy);
9525 return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2];
9531 function conicConformal() {
9532 return conicProjection(conicConformalRaw)
9534 .parallels([30, 30]);
9537 function equirectangularRaw(lambda, phi) {
9538 return [lambda, phi];
9541 equirectangularRaw.invert = equirectangularRaw;
9543 function equirectangular() {
9544 return projection(equirectangularRaw)
9548 function conicEquidistantRaw(y0, y1) {
9549 var cy0 = cos$1(y0),
9550 n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
9553 if (abs(n) < epsilon$2) return equirectangularRaw;
9555 function project(x, y) {
9556 var gy = g - y, nx = n * x;
9557 return [gy * sin$1(nx), g - gy * cos$1(nx)];
9560 project.invert = function(x, y) {
9562 return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];
9568 function conicEquidistant() {
9569 return conicProjection(conicEquidistantRaw)
9571 .center([0, 13.9389]);
9574 function gnomonicRaw(x, y) {
9575 var cy = cos$1(y), k = cos$1(x) * cy;
9576 return [cy * sin$1(x) / k, sin$1(y) / k];
9579 gnomonicRaw.invert = azimuthalInvert(atan);
9581 function gnomonic() {
9582 return projection(gnomonicRaw)
9587 function scaleTranslate(kx, ky, tx, ty) {
9588 return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
9589 point: function(x, y) {
9590 this.stream.point(x * kx + tx, y * ky + ty);
9595 function d3_geoIdentity() {
9596 var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
9597 x0 = null, y0, x1, y1, // clip extent
9598 postclip = identity$4,
9604 cache = cacheStream = null;
9608 return projection = {
9609 stream: function(stream) {
9610 return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
9612 postclip: function(_) {
9613 return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9615 clipExtent: function(_) {
9616 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]];
9618 scale: function(_) {
9619 return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;
9621 translate: function(_) {
9622 return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
9624 reflectX: function(_) {
9625 return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
9627 reflectY: function(_) {
9628 return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
9630 fitExtent: function(extent, object) {
9631 return fitExtent(projection, extent, object);
9633 fitSize: function(size, object) {
9634 return fitSize(projection, size, object);
9636 fitWidth: function(width, object) {
9637 return fitWidth(projection, width, object);
9639 fitHeight: function(height, object) {
9640 return fitHeight(projection, height, object);
9645 function naturalEarth1Raw(lambda, phi) {
9646 var phi2 = phi * phi, phi4 = phi2 * phi2;
9648 lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
9649 phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
9653 naturalEarth1Raw.invert = function(x, y) {
9654 var phi = y, i = 25, delta;
9656 var phi2 = phi * phi, phi4 = phi2 * phi2;
9657 phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
9658 (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
9659 } while (abs(delta) > epsilon$2 && --i > 0);
9661 x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
9666 function naturalEarth1() {
9667 return projection(naturalEarth1Raw)
9671 function orthographicRaw(x, y) {
9672 return [cos$1(y) * sin$1(x), sin$1(y)];
9675 orthographicRaw.invert = azimuthalInvert(asin);
9677 function orthographic() {
9678 return projection(orthographicRaw)
9680 .clipAngle(90 + epsilon$2);
9683 function stereographicRaw(x, y) {
9684 var cy = cos$1(y), k = 1 + cos$1(x) * cy;
9685 return [cy * sin$1(x) / k, sin$1(y) / k];
9688 stereographicRaw.invert = azimuthalInvert(function(z) {
9692 function stereographic() {
9693 return projection(stereographicRaw)
9698 function transverseMercatorRaw(lambda, phi) {
9699 return [log(tan((halfPi$2 + phi) / 2)), -lambda];
9702 transverseMercatorRaw.invert = function(x, y) {
9703 return [-y, 2 * atan(exp(x)) - halfPi$2];
9706 function transverseMercator() {
9707 var m = mercatorProjection(transverseMercatorRaw),
9711 m.center = function(_) {
9712 return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
9715 m.rotate = function(_) {
9716 return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
9719 return rotate([0, 0, 90])
9723 function defaultSeparation(a, b) {
9724 return a.parent === b.parent ? 1 : 2;
9727 function meanX(children) {
9728 return children.reduce(meanXReduce, 0) / children.length;
9731 function meanXReduce(x, c) {
9735 function maxY(children) {
9736 return 1 + children.reduce(maxYReduce, 0);
9739 function maxYReduce(y, c) {
9740 return Math.max(y, c.y);
9743 function leafLeft(node) {
9745 while (children = node.children) node = children[0];
9749 function leafRight(node) {
9751 while (children = node.children) node = children[children.length - 1];
9755 function cluster() {
9756 var separation = defaultSeparation,
9761 function cluster(root) {
9765 // First walk, computing the initial x & y values.
9766 root.eachAfter(function(node) {
9767 var children = node.children;
9769 node.x = meanX(children);
9770 node.y = maxY(children);
9772 node.x = previousNode ? x += separation(node, previousNode) : 0;
9774 previousNode = node;
9778 var left = leafLeft(root),
9779 right = leafRight(root),
9780 x0 = left.x - separation(left, right) / 2,
9781 x1 = right.x + separation(right, left) / 2;
9783 // Second walk, normalizing x & y to the desired size.
9784 return root.eachAfter(nodeSize ? function(node) {
9785 node.x = (node.x - root.x) * dx;
9786 node.y = (root.y - node.y) * dy;
9787 } : function(node) {
9788 node.x = (node.x - x0) / (x1 - x0) * dx;
9789 node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
9793 cluster.separation = function(x) {
9794 return arguments.length ? (separation = x, cluster) : separation;
9797 cluster.size = function(x) {
9798 return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
9801 cluster.nodeSize = function(x) {
9802 return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
9808 function count(node) {
9810 children = node.children,
9811 i = children && children.length;
9813 else while (--i >= 0) sum += children[i].value;
9817 function node_count() {
9818 return this.eachAfter(count);
9821 function node_each(callback) {
9822 var node = this, current, next = [node], children, i, n;
9824 current = next.reverse(), next = [];
9825 while (node = current.pop()) {
9826 callback(node), children = node.children;
9827 if (children) for (i = 0, n = children.length; i < n; ++i) {
9828 next.push(children[i]);
9831 } while (next.length);
9835 function node_eachBefore(callback) {
9836 var node = this, nodes = [node], children, i;
9837 while (node = nodes.pop()) {
9838 callback(node), children = node.children;
9839 if (children) for (i = children.length - 1; i >= 0; --i) {
9840 nodes.push(children[i]);
9846 function node_eachAfter(callback) {
9847 var node = this, nodes = [node], next = [], children, i, n;
9848 while (node = nodes.pop()) {
9849 next.push(node), children = node.children;
9850 if (children) for (i = 0, n = children.length; i < n; ++i) {
9851 nodes.push(children[i]);
9854 while (node = next.pop()) {
9860 function node_sum(value) {
9861 return this.eachAfter(function(node) {
9862 var sum = +value(node.data) || 0,
9863 children = node.children,
9864 i = children && children.length;
9865 while (--i >= 0) sum += children[i].value;
9870 function node_sort(compare) {
9871 return this.eachBefore(function(node) {
9872 if (node.children) {
9873 node.children.sort(compare);
9878 function node_path(end) {
9880 ancestor = leastCommonAncestor(start, end),
9882 while (start !== ancestor) {
9883 start = start.parent;
9886 var k = nodes.length;
9887 while (end !== ancestor) {
9888 nodes.splice(k, 0, end);
9894 function leastCommonAncestor(a, b) {
9895 if (a === b) return a;
9896 var aNodes = a.ancestors(),
9897 bNodes = b.ancestors(),
9909 function node_ancestors() {
9910 var node = this, nodes = [node];
9911 while (node = node.parent) {
9917 function node_descendants() {
9919 this.each(function(node) {
9925 function node_leaves() {
9927 this.eachBefore(function(node) {
9928 if (!node.children) {
9935 function node_links() {
9936 var root = this, links = [];
9937 root.each(function(node) {
9938 if (node !== root) { // Don’t include the root’s parent, if any.
9939 links.push({source: node.parent, target: node});
9945 function hierarchy(data, children) {
9946 var root = new Node(data),
9947 valued = +data.value && (root.value = data.value),
9955 if (children == null) children = defaultChildren;
9957 while (node = nodes.pop()) {
9958 if (valued) node.value = +node.data.value;
9959 if ((childs = children(node.data)) && (n = childs.length)) {
9960 node.children = new Array(n);
9961 for (i = n - 1; i >= 0; --i) {
9962 nodes.push(child = node.children[i] = new Node(childs[i]));
9963 child.parent = node;
9964 child.depth = node.depth + 1;
9969 return root.eachBefore(computeHeight);
9972 function node_copy() {
9973 return hierarchy(this).eachBefore(copyData);
9976 function defaultChildren(d) {
9980 function copyData(node) {
9981 node.data = node.data.data;
9984 function computeHeight(node) {
9986 do node.height = height;
9987 while ((node = node.parent) && (node.height < ++height));
9990 function Node(data) {
9997 Node.prototype = hierarchy.prototype = {
10001 eachAfter: node_eachAfter,
10002 eachBefore: node_eachBefore,
10006 ancestors: node_ancestors,
10007 descendants: node_descendants,
10008 leaves: node_leaves,
10013 var slice$3 = Array.prototype.slice;
10015 function shuffle$1(array) {
10016 var m = array.length,
10021 i = Math.random() * m-- | 0;
10023 array[m] = array[i];
10030 function enclose(circles) {
10031 var i = 0, n = (circles = shuffle$1(slice$3.call(circles))).length, B = [], p, e;
10035 if (e && enclosesWeak(e, p)) ++i;
10036 else e = encloseBasis(B = extendBasis(B, p)), i = 0;
10042 function extendBasis(B, p) {
10045 if (enclosesWeakAll(p, B)) return [p];
10047 // If we get here then B must have at least one element.
10048 for (i = 0; i < B.length; ++i) {
10049 if (enclosesNot(p, B[i])
10050 && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
10055 // If we get here then B must have at least two elements.
10056 for (i = 0; i < B.length - 1; ++i) {
10057 for (j = i + 1; j < B.length; ++j) {
10058 if (enclosesNot(encloseBasis2(B[i], B[j]), p)
10059 && enclosesNot(encloseBasis2(B[i], p), B[j])
10060 && enclosesNot(encloseBasis2(B[j], p), B[i])
10061 && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
10062 return [B[i], B[j], p];
10067 // If we get here then something is very wrong.
10071 function enclosesNot(a, b) {
10072 var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
10073 return dr < 0 || dr * dr < dx * dx + dy * dy;
10076 function enclosesWeak(a, b) {
10077 var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
10078 return dr > 0 && dr * dr > dx * dx + dy * dy;
10081 function enclosesWeakAll(a, B) {
10082 for (var i = 0; i < B.length; ++i) {
10083 if (!enclosesWeak(a, B[i])) {
10090 function encloseBasis(B) {
10091 switch (B.length) {
10092 case 1: return encloseBasis1(B[0]);
10093 case 2: return encloseBasis2(B[0], B[1]);
10094 case 3: return encloseBasis3(B[0], B[1], B[2]);
10098 function encloseBasis1(a) {
10106 function encloseBasis2(a, b) {
10107 var x1 = a.x, y1 = a.y, r1 = a.r,
10108 x2 = b.x, y2 = b.y, r2 = b.r,
10109 x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
10110 l = Math.sqrt(x21 * x21 + y21 * y21);
10112 x: (x1 + x2 + x21 / l * r21) / 2,
10113 y: (y1 + y2 + y21 / l * r21) / 2,
10114 r: (l + r1 + r2) / 2
10118 function encloseBasis3(a, b, c) {
10119 var x1 = a.x, y1 = a.y, r1 = a.r,
10120 x2 = b.x, y2 = b.y, r2 = b.r,
10121 x3 = c.x, y3 = c.y, r3 = c.r,
10128 d1 = x1 * x1 + y1 * y1 - r1 * r1,
10129 d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
10130 d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
10131 ab = a3 * b2 - a2 * b3,
10132 xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
10133 xb = (b3 * c2 - b2 * c3) / ab,
10134 ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
10135 yb = (a2 * c3 - a3 * c2) / ab,
10136 A = xb * xb + yb * yb - 1,
10137 B = 2 * (r1 + xa * xb + ya * yb),
10138 C = xa * xa + ya * ya - r1 * r1,
10139 r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
10141 x: x1 + xa + xb * r,
10142 y: y1 + ya + yb * r,
10147 function place(a, b, c) {
10154 dc = dx * dx + dy * dy;
10156 var x = 0.5 + ((db *= db) - (da *= da)) / (2 * dc),
10157 y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
10158 c.x = ax + x * dx + y * dy;
10159 c.y = ay + x * dy - y * dx;
10166 function intersects(a, b) {
10167 var dx = b.x - a.x,
10170 return dr * dr - 1e-6 > dx * dx + dy * dy;
10173 function score(node) {
10177 dx = (a.x * b.r + b.x * a.r) / ab,
10178 dy = (a.y * b.r + b.y * a.r) / ab;
10179 return dx * dx + dy * dy;
10182 function Node$1(circle) {
10185 this.previous = null;
10188 function packEnclose(circles) {
10189 if (!(n = circles.length)) return 0;
10191 var a, b, c, n, aa, ca, i, j, k, sj, sk;
10193 // Place the first circle.
10194 a = circles[0], a.x = 0, a.y = 0;
10195 if (!(n > 1)) return a.r;
10197 // Place the second circle.
10198 b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
10199 if (!(n > 2)) return a.r + b.r;
10201 // Place the third circle.
10202 place(b, a, c = circles[2]);
10204 // Initialize the front-chain using the first three circles a, b and c.
10205 a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
10206 a.next = c.previous = b;
10207 b.next = a.previous = c;
10208 c.next = b.previous = a;
10210 // Attempt to place each remaining circle…
10211 pack: for (i = 3; i < n; ++i) {
10212 place(a._, b._, c = circles[i]), c = new Node$1(c);
10214 // Find the closest intersecting circle on the front-chain, if any.
10215 // “Closeness” is determined by linear distance along the front-chain.
10216 // “Ahead” or “behind” is likewise determined by linear distance.
10217 j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
10220 if (intersects(j._, c._)) {
10221 b = j, a.next = b, b.previous = a, --i;
10224 sj += j._.r, j = j.next;
10226 if (intersects(k._, c._)) {
10227 a = k, a.next = b, b.previous = a, --i;
10230 sk += k._.r, k = k.previous;
10232 } while (j !== k.next);
10234 // Success! Insert the new circle c between a and b.
10235 c.previous = a, c.next = b, a.next = b.previous = b = c;
10237 // Compute the new closest circle pair to the centroid.
10239 while ((c = c.next) !== b) {
10240 if ((ca = score(c)) < aa) {
10247 // Compute the enclosing circle of the front chain.
10248 a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
10250 // Translate the circles to put the enclosing circle around the origin.
10251 for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
10256 function siblings(circles) {
10257 packEnclose(circles);
10261 function optional(f) {
10262 return f == null ? null : required(f);
10265 function required(f) {
10266 if (typeof f !== "function") throw new Error;
10270 function constantZero() {
10274 function constant$8(x) {
10275 return function() {
10280 function defaultRadius$1(d) {
10281 return Math.sqrt(d.value);
10284 function index$1() {
10288 padding = constantZero;
10290 function pack(root) {
10291 root.x = dx / 2, root.y = dy / 2;
10293 root.eachBefore(radiusLeaf(radius))
10294 .eachAfter(packChildren(padding, 0.5))
10295 .eachBefore(translateChild(1));
10297 root.eachBefore(radiusLeaf(defaultRadius$1))
10298 .eachAfter(packChildren(constantZero, 1))
10299 .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
10300 .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
10305 pack.radius = function(x) {
10306 return arguments.length ? (radius = optional(x), pack) : radius;
10309 pack.size = function(x) {
10310 return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
10313 pack.padding = function(x) {
10314 return arguments.length ? (padding = typeof x === "function" ? x : constant$8(+x), pack) : padding;
10320 function radiusLeaf(radius) {
10321 return function(node) {
10322 if (!node.children) {
10323 node.r = Math.max(0, +radius(node) || 0);
10328 function packChildren(padding, k) {
10329 return function(node) {
10330 if (children = node.children) {
10333 n = children.length,
10334 r = padding(node) * k || 0,
10337 if (r) for (i = 0; i < n; ++i) children[i].r += r;
10338 e = packEnclose(children);
10339 if (r) for (i = 0; i < n; ++i) children[i].r -= r;
10345 function translateChild(k) {
10346 return function(node) {
10347 var parent = node.parent;
10350 node.x = parent.x + k * node.x;
10351 node.y = parent.y + k * node.y;
10356 function roundNode(node) {
10357 node.x0 = Math.round(node.x0);
10358 node.y0 = Math.round(node.y0);
10359 node.x1 = Math.round(node.x1);
10360 node.y1 = Math.round(node.y1);
10363 function treemapDice(parent, x0, y0, x1, y1) {
10364 var nodes = parent.children,
10368 k = parent.value && (x1 - x0) / parent.value;
10371 node = nodes[i], node.y0 = y0, node.y1 = y1;
10372 node.x0 = x0, node.x1 = x0 += node.value * k;
10376 function partition() {
10382 function partition(root) {
10383 var n = root.height + 1;
10388 root.eachBefore(positionNode(dy, n));
10389 if (round) root.eachBefore(roundNode);
10393 function positionNode(dy, n) {
10394 return function(node) {
10395 if (node.children) {
10396 treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
10400 x1 = node.x1 - padding,
10401 y1 = node.y1 - padding;
10402 if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10403 if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10411 partition.round = function(x) {
10412 return arguments.length ? (round = !!x, partition) : round;
10415 partition.size = function(x) {
10416 return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
10419 partition.padding = function(x) {
10420 return arguments.length ? (padding = +x, partition) : padding;
10426 var keyPrefix$1 = "$", // Protect against keys like “__proto__”.
10427 preroot = {depth: -1},
10430 function defaultId(d) {
10434 function defaultParentId(d) {
10438 function stratify() {
10439 var id = defaultId,
10440 parentId = defaultParentId;
10442 function stratify(data) {
10449 nodes = new Array(n),
10454 for (i = 0; i < n; ++i) {
10455 d = data[i], node = nodes[i] = new Node(d);
10456 if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
10457 nodeKey = keyPrefix$1 + (node.id = nodeId);
10458 nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
10462 for (i = 0; i < n; ++i) {
10463 node = nodes[i], nodeId = parentId(data[i], i, data);
10464 if (nodeId == null || !(nodeId += "")) {
10465 if (root) throw new Error("multiple roots");
10468 parent = nodeByKey[keyPrefix$1 + nodeId];
10469 if (!parent) throw new Error("missing: " + nodeId);
10470 if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
10471 if (parent.children) parent.children.push(node);
10472 else parent.children = [node];
10473 node.parent = parent;
10477 if (!root) throw new Error("no root");
10478 root.parent = preroot;
10479 root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
10480 root.parent = null;
10481 if (n > 0) throw new Error("cycle");
10486 stratify.id = function(x) {
10487 return arguments.length ? (id = required(x), stratify) : id;
10490 stratify.parentId = function(x) {
10491 return arguments.length ? (parentId = required(x), stratify) : parentId;
10497 function defaultSeparation$1(a, b) {
10498 return a.parent === b.parent ? 1 : 2;
10501 // function radialSeparation(a, b) {
10502 // return (a.parent === b.parent ? 1 : 2) / a.depth;
10505 // This function is used to traverse the left contour of a subtree (or
10506 // subforest). It returns the successor of v on this contour. This successor is
10507 // either given by the leftmost child of v or by the thread of v. The function
10508 // returns null if and only if v is on the highest level of its subtree.
10509 function nextLeft(v) {
10510 var children = v.children;
10511 return children ? children[0] : v.t;
10514 // This function works analogously to nextLeft.
10515 function nextRight(v) {
10516 var children = v.children;
10517 return children ? children[children.length - 1] : v.t;
10520 // Shifts the current subtree rooted at w+. This is done by increasing
10521 // prelim(w+) and mod(w+) by shift.
10522 function moveSubtree(wm, wp, shift) {
10523 var change = shift / (wp.i - wm.i);
10531 // All other shifts, applied to the smaller subtrees between w- and w+, are
10532 // performed by this function. To prepare the shifts, we have to adjust
10533 // change(w+), shift(w+), and change(w-).
10534 function executeShifts(v) {
10537 children = v.children,
10538 i = children.length,
10544 shift += w.s + (change += w.c);
10548 // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
10549 // returns the specified (default) ancestor.
10550 function nextAncestor(vim, v, ancestor) {
10551 return vim.a.parent === v.parent ? vim.a : ancestor;
10554 function TreeNode(node, i) {
10556 this.parent = null;
10557 this.children = null;
10558 this.A = null; // default ancestor
10559 this.a = this; // ancestor
10560 this.z = 0; // prelim
10562 this.c = 0; // change
10563 this.s = 0; // shift
10564 this.t = null; // thread
10565 this.i = i; // number
10568 TreeNode.prototype = Object.create(Node.prototype);
10570 function treeRoot(root) {
10571 var tree = new TreeNode(root, 0),
10579 while (node = nodes.pop()) {
10580 if (children = node._.children) {
10581 node.children = new Array(n = children.length);
10582 for (i = n - 1; i >= 0; --i) {
10583 nodes.push(child = node.children[i] = new TreeNode(children[i], i));
10584 child.parent = node;
10589 (tree.parent = new TreeNode(null, 0)).children = [tree];
10593 // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
10595 var separation = defaultSeparation$1,
10600 function tree(root) {
10601 var t = treeRoot(root);
10603 // Compute the layout using Buchheim et al.’s algorithm.
10604 t.eachAfter(firstWalk), t.parent.m = -t.z;
10605 t.eachBefore(secondWalk);
10607 // If a fixed node size is specified, scale x and y.
10608 if (nodeSize) root.eachBefore(sizeNode);
10610 // If a fixed tree size is specified, scale x and y based on the extent.
10611 // Compute the left-most, right-most, and depth-most nodes for extents.
10616 root.eachBefore(function(node) {
10617 if (node.x < left.x) left = node;
10618 if (node.x > right.x) right = node;
10619 if (node.depth > bottom.depth) bottom = node;
10621 var s = left === right ? 1 : separation(left, right) / 2,
10623 kx = dx / (right.x + s + tx),
10624 ky = dy / (bottom.depth || 1);
10625 root.eachBefore(function(node) {
10626 node.x = (node.x + tx) * kx;
10627 node.y = node.depth * ky;
10634 // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
10635 // applied recursively to the children of v, as well as the function
10636 // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
10637 // node v is placed to the midpoint of its outermost children.
10638 function firstWalk(v) {
10639 var children = v.children,
10640 siblings = v.parent.children,
10641 w = v.i ? siblings[v.i - 1] : null;
10644 var midpoint = (children[0].z + children[children.length - 1].z) / 2;
10646 v.z = w.z + separation(v._, w._);
10647 v.m = v.z - midpoint;
10652 v.z = w.z + separation(v._, w._);
10654 v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
10657 // Computes all real x-coordinates by summing up the modifiers recursively.
10658 function secondWalk(v) {
10659 v._.x = v.z + v.parent.m;
10663 // The core of the algorithm. Here, a new subtree is combined with the
10664 // previous subtrees. Threads are used to traverse the inside and outside
10665 // contours of the left and right subtree up to the highest common level. The
10666 // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
10667 // superscript o means outside and i means inside, the subscript - means left
10668 // subtree and + means right subtree. For summing up the modifiers along the
10669 // contour, we use respective variables si+, si-, so-, and so+. Whenever two
10670 // nodes of the inside contours conflict, we compute the left one of the
10671 // greatest uncommon ancestors using the function ANCESTOR and call MOVE
10672 // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
10673 // Finally, we add a new thread (if necessary).
10674 function apportion(v, w, ancestor) {
10679 vom = vip.parent.children[0],
10685 while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
10686 vom = nextLeft(vom);
10687 vop = nextRight(vop);
10689 shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
10691 moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
10700 if (vim && !nextRight(vop)) {
10702 vop.m += sim - sop;
10704 if (vip && !nextLeft(vom)) {
10706 vom.m += sip - som;
10713 function sizeNode(node) {
10715 node.y = node.depth * dy;
10718 tree.separation = function(x) {
10719 return arguments.length ? (separation = x, tree) : separation;
10722 tree.size = function(x) {
10723 return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
10726 tree.nodeSize = function(x) {
10727 return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
10733 function treemapSlice(parent, x0, y0, x1, y1) {
10734 var nodes = parent.children,
10738 k = parent.value && (y1 - y0) / parent.value;
10741 node = nodes[i], node.x0 = x0, node.x1 = x1;
10742 node.y0 = y0, node.y1 = y0 += node.value * k;
10746 var phi = (1 + Math.sqrt(5)) / 2;
10748 function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
10750 nodes = parent.children,
10757 value = parent.value,
10767 dx = x1 - x0, dy = y1 - y0;
10769 // Find the next non-empty node.
10770 do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
10771 minValue = maxValue = sumValue;
10772 alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
10773 beta = sumValue * sumValue * alpha;
10774 minRatio = Math.max(maxValue / beta, beta / minValue);
10776 // Keep adding nodes while the aspect ratio maintains or improves.
10777 for (; i1 < n; ++i1) {
10778 sumValue += nodeValue = nodes[i1].value;
10779 if (nodeValue < minValue) minValue = nodeValue;
10780 if (nodeValue > maxValue) maxValue = nodeValue;
10781 beta = sumValue * sumValue * alpha;
10782 newRatio = Math.max(maxValue / beta, beta / minValue);
10783 if (newRatio > minRatio) { sumValue -= nodeValue; break; }
10784 minRatio = newRatio;
10787 // Position and record the row orientation.
10788 rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
10789 if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
10790 else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
10791 value -= sumValue, i0 = i1;
10797 var squarify = (function custom(ratio) {
10799 function squarify(parent, x0, y0, x1, y1) {
10800 squarifyRatio(ratio, parent, x0, y0, x1, y1);
10803 squarify.ratio = function(x) {
10804 return custom((x = +x) > 1 ? x : 1);
10810 function index$2() {
10811 var tile = squarify,
10815 paddingStack = [0],
10816 paddingInner = constantZero,
10817 paddingTop = constantZero,
10818 paddingRight = constantZero,
10819 paddingBottom = constantZero,
10820 paddingLeft = constantZero;
10822 function treemap(root) {
10827 root.eachBefore(positionNode);
10828 paddingStack = [0];
10829 if (round) root.eachBefore(roundNode);
10833 function positionNode(node) {
10834 var p = paddingStack[node.depth],
10839 if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10840 if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10845 if (node.children) {
10846 p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
10847 x0 += paddingLeft(node) - p;
10848 y0 += paddingTop(node) - p;
10849 x1 -= paddingRight(node) - p;
10850 y1 -= paddingBottom(node) - p;
10851 if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10852 if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10853 tile(node, x0, y0, x1, y1);
10857 treemap.round = function(x) {
10858 return arguments.length ? (round = !!x, treemap) : round;
10861 treemap.size = function(x) {
10862 return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
10865 treemap.tile = function(x) {
10866 return arguments.length ? (tile = required(x), treemap) : tile;
10869 treemap.padding = function(x) {
10870 return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
10873 treemap.paddingInner = function(x) {
10874 return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$8(+x), treemap) : paddingInner;
10877 treemap.paddingOuter = function(x) {
10878 return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
10881 treemap.paddingTop = function(x) {
10882 return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$8(+x), treemap) : paddingTop;
10885 treemap.paddingRight = function(x) {
10886 return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$8(+x), treemap) : paddingRight;
10889 treemap.paddingBottom = function(x) {
10890 return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$8(+x), treemap) : paddingBottom;
10893 treemap.paddingLeft = function(x) {
10894 return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$8(+x), treemap) : paddingLeft;
10900 function binary(parent, x0, y0, x1, y1) {
10901 var nodes = parent.children,
10902 i, n = nodes.length,
10903 sum, sums = new Array(n + 1);
10905 for (sums[0] = sum = i = 0; i < n; ++i) {
10906 sums[i + 1] = sum += nodes[i].value;
10909 partition(0, n, parent.value, x0, y0, x1, y1);
10911 function partition(i, j, value, x0, y0, x1, y1) {
10913 var node = nodes[i];
10914 node.x0 = x0, node.y0 = y0;
10915 node.x1 = x1, node.y1 = y1;
10919 var valueOffset = sums[i],
10920 valueTarget = (value / 2) + valueOffset,
10925 var mid = k + hi >>> 1;
10926 if (sums[mid] < valueTarget) k = mid + 1;
10930 if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
10932 var valueLeft = sums[k] - valueOffset,
10933 valueRight = value - valueLeft;
10935 if ((x1 - x0) > (y1 - y0)) {
10936 var xk = (x0 * valueRight + x1 * valueLeft) / value;
10937 partition(i, k, valueLeft, x0, y0, xk, y1);
10938 partition(k, j, valueRight, xk, y0, x1, y1);
10940 var yk = (y0 * valueRight + y1 * valueLeft) / value;
10941 partition(i, k, valueLeft, x0, y0, x1, yk);
10942 partition(k, j, valueRight, x0, yk, x1, y1);
10947 function sliceDice(parent, x0, y0, x1, y1) {
10948 (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
10951 var resquarify = (function custom(ratio) {
10953 function resquarify(parent, x0, y0, x1, y1) {
10954 if ((rows = parent._squarify) && (rows.ratio === ratio)) {
10962 value = parent.value;
10965 row = rows[j], nodes = row.children;
10966 for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
10967 if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
10968 else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
10969 value -= row.value;
10972 parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
10973 rows.ratio = ratio;
10977 resquarify.ratio = function(x) {
10978 return custom((x = +x) > 1 ? x : 1);
10984 function d3_polygonArea(polygon) {
10986 n = polygon.length,
10988 b = polygon[n - 1],
10994 area += a[1] * b[0] - a[0] * b[1];
11000 function d3_polygonCentroid(polygon) {
11002 n = polygon.length,
11006 b = polygon[n - 1],
11013 k += c = a[0] * b[1] - b[0] * a[1];
11014 x += (a[0] + b[0]) * c;
11015 y += (a[1] + b[1]) * c;
11018 return k *= 3, [x / k, y / k];
11021 // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
11022 // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
11023 // right, +y is up). Returns a positive value if ABC is counter-clockwise,
11024 // negative if clockwise, and zero if the points are collinear.
11025 function cross$1(a, b, c) {
11026 return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
11029 function lexicographicOrder(a, b) {
11030 return a[0] - b[0] || a[1] - b[1];
11033 // Computes the upper convex hull per the monotone chain algorithm.
11034 // Assumes points.length >= 3, is sorted by x, unique in y.
11035 // Returns an array of indices into points in left-to-right order.
11036 function computeUpperHullIndexes(points) {
11037 var n = points.length,
11041 for (var i = 2; i < n; ++i) {
11042 while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
11043 indexes[size++] = i;
11046 return indexes.slice(0, size); // remove popped points
11049 function d3_polygonHull(points) {
11050 if ((n = points.length) < 3) return null;
11054 sortedPoints = new Array(n),
11055 flippedPoints = new Array(n);
11057 for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
11058 sortedPoints.sort(lexicographicOrder);
11059 for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
11061 var upperIndexes = computeUpperHullIndexes(sortedPoints),
11062 lowerIndexes = computeUpperHullIndexes(flippedPoints);
11064 // Construct the hull polygon, removing possible duplicate endpoints.
11065 var skipLeft = lowerIndexes[0] === upperIndexes[0],
11066 skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
11069 // Add upper hull in right-to-l order.
11070 // Then add lower hull in left-to-right order.
11071 for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
11072 for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
11077 function contains$1(polygon, point) {
11078 var n = polygon.length,
11079 p = polygon[n - 1],
11080 x = point[0], y = point[1],
11081 x0 = p[0], y0 = p[1],
11085 for (var i = 0; i < n; ++i) {
11086 p = polygon[i], x1 = p[0], y1 = p[1];
11087 if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
11094 function length$2(polygon) {
11096 n = polygon.length,
11097 b = polygon[n - 1],
11112 perimeter += Math.sqrt(xa * xa + ya * ya);
11118 var slice$4 = [].slice;
11122 function Queue(size) {
11125 this._error = null;
11131 this._start = 0; // inside a synchronous task callback?
11134 Queue.prototype = queue.prototype = {
11135 constructor: Queue,
11136 defer: function(callback) {
11137 if (typeof callback !== "function") throw new Error("invalid callback");
11138 if (this._call) throw new Error("defer after await");
11139 if (this._error != null) return this;
11140 var t = slice$4.call(arguments, 1);
11142 ++this._waiting, this._tasks.push(t);
11146 abort: function() {
11147 if (this._error == null) abort(this, new Error("abort"));
11150 await: function(callback) {
11151 if (typeof callback !== "function") throw new Error("invalid callback");
11152 if (this._call) throw new Error("multiple await");
11153 this._call = function(error, results) { callback.apply(null, [error].concat(results)); };
11157 awaitAll: function(callback) {
11158 if (typeof callback !== "function") throw new Error("invalid callback");
11159 if (this._call) throw new Error("multiple await");
11160 this._call = callback;
11166 function poke$1(q) {
11168 try { start$1(q); } // let the current task complete
11170 if (q._tasks[q._ended + q._active - 1]) abort(q, e); // task errored synchronously
11171 else if (!q._data) throw e; // await callback errored synchronously
11176 function start$1(q) {
11177 while (q._start = q._waiting && q._active < q._size) {
11178 var i = q._ended + q._active,
11183 --q._waiting, ++q._active;
11184 t = c.apply(null, t);
11185 if (!q._tasks[i]) continue; // task finished synchronously
11186 q._tasks[i] = t || noabort;
11190 function end(q, i) {
11191 return function(e, r) {
11192 if (!q._tasks[i]) return; // ignore multiple callbacks
11193 --q._active, ++q._ended;
11194 q._tasks[i] = null;
11195 if (q._error != null) return; // ignore secondary errors
11200 if (q._waiting) poke$1(q);
11201 else maybeNotify(q);
11206 function abort(q, e) {
11207 var i = q._tasks.length, t;
11208 q._error = e; // ignore active callbacks
11209 q._data = undefined; // allow gc
11210 q._waiting = NaN; // prevent starting
11213 if (t = q._tasks[i]) {
11214 q._tasks[i] = null;
11217 catch (e) { /* ignore */ }
11222 q._active = NaN; // allow notification
11226 function maybeNotify(q) {
11227 if (!q._active && q._call) {
11229 q._data = undefined; // allow gc
11230 q._call(q._error, d);
11234 function queue(concurrency) {
11235 if (concurrency == null) concurrency = Infinity;
11236 else if (!((concurrency = +concurrency) >= 1)) throw new Error("invalid concurrency");
11237 return new Queue(concurrency);
11240 function defaultSource$1() {
11241 return Math.random();
11244 var uniform = (function sourceRandomUniform(source) {
11245 function randomUniform(min, max) {
11246 min = min == null ? 0 : +min;
11247 max = max == null ? 1 : +max;
11248 if (arguments.length === 1) max = min, min = 0;
11250 return function() {
11251 return source() * max + min;
11255 randomUniform.source = sourceRandomUniform;
11257 return randomUniform;
11258 })(defaultSource$1);
11260 var normal = (function sourceRandomNormal(source) {
11261 function randomNormal(mu, sigma) {
11263 mu = mu == null ? 0 : +mu;
11264 sigma = sigma == null ? 1 : +sigma;
11265 return function() {
11268 // If available, use the second previously-generated uniform random.
11269 if (x != null) y = x, x = null;
11271 // Otherwise, generate a new x and y.
11273 x = source() * 2 - 1;
11274 y = source() * 2 - 1;
11276 } while (!r || r > 1);
11278 return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
11282 randomNormal.source = sourceRandomNormal;
11284 return randomNormal;
11285 })(defaultSource$1);
11287 var logNormal = (function sourceRandomLogNormal(source) {
11288 function randomLogNormal() {
11289 var randomNormal = normal.source(source).apply(this, arguments);
11290 return function() {
11291 return Math.exp(randomNormal());
11295 randomLogNormal.source = sourceRandomLogNormal;
11297 return randomLogNormal;
11298 })(defaultSource$1);
11300 var irwinHall = (function sourceRandomIrwinHall(source) {
11301 function randomIrwinHall(n) {
11302 return function() {
11303 for (var sum = 0, i = 0; i < n; ++i) sum += source();
11308 randomIrwinHall.source = sourceRandomIrwinHall;
11310 return randomIrwinHall;
11311 })(defaultSource$1);
11313 var bates = (function sourceRandomBates(source) {
11314 function randomBates(n) {
11315 var randomIrwinHall = irwinHall.source(source)(n);
11316 return function() {
11317 return randomIrwinHall() / n;
11321 randomBates.source = sourceRandomBates;
11323 return randomBates;
11324 })(defaultSource$1);
11326 var exponential$1 = (function sourceRandomExponential(source) {
11327 function randomExponential(lambda) {
11328 return function() {
11329 return -Math.log(1 - source()) / lambda;
11333 randomExponential.source = sourceRandomExponential;
11335 return randomExponential;
11336 })(defaultSource$1);
11338 function request(url, callback) {
11340 event = dispatch("beforesend", "progress", "load", "error"),
11343 xhr = new XMLHttpRequest,
11350 // If IE does not support CORS, use XDomainRequest.
11351 if (typeof XDomainRequest !== "undefined"
11352 && !("withCredentials" in xhr)
11353 && /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest;
11356 ? xhr.onload = xhr.onerror = xhr.ontimeout = respond
11357 : xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); };
11359 function respond(o) {
11360 var status = xhr.status, result;
11361 if (!status && hasResponse(xhr)
11362 || status >= 200 && status < 300
11363 || status === 304) {
11366 result = response.call(request, xhr);
11368 event.call("error", request, e);
11374 event.call("load", request, result);
11376 event.call("error", request, o);
11380 xhr.onprogress = function(e) {
11381 event.call("progress", request, e);
11385 header: function(name, value) {
11386 name = (name + "").toLowerCase();
11387 if (arguments.length < 2) return headers.get(name);
11388 if (value == null) headers.remove(name);
11389 else headers.set(name, value + "");
11393 // If mimeType is non-null and no Accept header is set, a default is used.
11394 mimeType: function(value) {
11395 if (!arguments.length) return mimeType;
11396 mimeType = value == null ? null : value + "";
11400 // Specifies what type the response value should take;
11401 // for instance, arraybuffer, blob, document, or text.
11402 responseType: function(value) {
11403 if (!arguments.length) return responseType;
11404 responseType = value;
11408 timeout: function(value) {
11409 if (!arguments.length) return timeout;
11414 user: function(value) {
11415 return arguments.length < 1 ? user : (user = value == null ? null : value + "", request);
11418 password: function(value) {
11419 return arguments.length < 1 ? password : (password = value == null ? null : value + "", request);
11422 // Specify how to convert the response content to a specific type;
11423 // changes the callback value on "load" events.
11424 response: function(value) {
11429 // Alias for send("GET", …).
11430 get: function(data, callback) {
11431 return request.send("GET", data, callback);
11434 // Alias for send("POST", …).
11435 post: function(data, callback) {
11436 return request.send("POST", data, callback);
11439 // If callback is non-null, it will be used for error and load events.
11440 send: function(method, data, callback) {
11441 xhr.open(method, url, true, user, password);
11442 if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*");
11443 if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); });
11444 if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType);
11445 if (responseType != null) xhr.responseType = responseType;
11446 if (timeout > 0) xhr.timeout = timeout;
11447 if (callback == null && typeof data === "function") callback = data, data = null;
11448 if (callback != null && callback.length === 1) callback = fixCallback(callback);
11449 if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); });
11450 event.call("beforesend", request, xhr);
11451 xhr.send(data == null ? null : data);
11455 abort: function() {
11461 var value = event.on.apply(event, arguments);
11462 return value === event ? request : value;
11466 if (callback != null) {
11467 if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11468 return request.get(callback);
11474 function fixCallback(callback) {
11475 return function(error, xhr) {
11476 callback(error == null ? xhr : null);
11480 function hasResponse(xhr) {
11481 var type = xhr.responseType;
11482 return type && type !== "text"
11483 ? xhr.response // null on error
11484 : xhr.responseText; // "" on error
11487 function type$1(defaultMimeType, response) {
11488 return function(url, callback) {
11489 var r = request(url).mimeType(defaultMimeType).response(response);
11490 if (callback != null) {
11491 if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11492 return r.get(callback);
11498 var html = type$1("text/html", function(xhr) {
11499 return document.createRange().createContextualFragment(xhr.responseText);
11502 var d3_json = type$1("application/json", function(xhr) {
11503 return JSON.parse(xhr.responseText);
11506 var d3_text = type$1("text/plain", function(xhr) {
11507 return xhr.responseText;
11510 var d3_xml = type$1("application/xml", function(xhr) {
11511 var xml = xhr.responseXML;
11512 if (!xml) throw new Error("parse error");
11516 function dsv$1(defaultMimeType, parse) {
11517 return function(url, row, callback) {
11518 if (arguments.length < 3) callback = row, row = null;
11519 var r = request(url).mimeType(defaultMimeType);
11520 r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; };
11522 return callback ? r.get(callback) : r;
11526 function responseOf(parse, row) {
11527 return function(request$$1) {
11528 return parse(request$$1.responseText, row);
11532 var csv$1 = dsv$1("text/csv", csvParse);
11534 var tsv$1 = dsv$1("text/tab-separated-values", tsvParse);
11536 var array$2 = Array.prototype;
11538 var map$2 = array$2.map;
11539 var slice$5 = array$2.slice;
11541 var implicit = {name: "implicit"};
11543 function ordinal(range) {
11544 var index = map$1(),
11546 unknown = implicit;
11548 range = range == null ? [] : slice$5.call(range);
11550 function scale(d) {
11551 var key = d + "", i = index.get(key);
11553 if (unknown !== implicit) return unknown;
11554 index.set(key, i = domain.push(d));
11556 return range[(i - 1) % range.length];
11559 scale.domain = function(_) {
11560 if (!arguments.length) return domain.slice();
11561 domain = [], index = map$1();
11562 var i = -1, n = _.length, d, key;
11563 while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
11567 scale.range = function(_) {
11568 return arguments.length ? (range = slice$5.call(_), scale) : range.slice();
11571 scale.unknown = function(_) {
11572 return arguments.length ? (unknown = _, scale) : unknown;
11575 scale.copy = function() {
11586 var scale = ordinal().unknown(undefined),
11587 domain = scale.domain,
11588 ordinalRange = scale.range,
11597 delete scale.unknown;
11599 function rescale() {
11600 var n = domain().length,
11601 reverse = range$$1[1] < range$$1[0],
11602 start = range$$1[reverse - 0],
11603 stop = range$$1[1 - reverse];
11604 step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
11605 if (round) step = Math.floor(step);
11606 start += (stop - start - step * (n - paddingInner)) * align;
11607 bandwidth = step * (1 - paddingInner);
11608 if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
11609 var values = range(n).map(function(i) { return start + step * i; });
11610 return ordinalRange(reverse ? values.reverse() : values);
11613 scale.domain = function(_) {
11614 return arguments.length ? (domain(_), rescale()) : domain();
11617 scale.range = function(_) {
11618 return arguments.length ? (range$$1 = [+_[0], +_[1]], rescale()) : range$$1.slice();
11621 scale.rangeRound = function(_) {
11622 return range$$1 = [+_[0], +_[1]], round = true, rescale();
11625 scale.bandwidth = function() {
11629 scale.step = function() {
11633 scale.round = function(_) {
11634 return arguments.length ? (round = !!_, rescale()) : round;
11637 scale.padding = function(_) {
11638 return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11641 scale.paddingInner = function(_) {
11642 return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11645 scale.paddingOuter = function(_) {
11646 return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
11649 scale.align = function(_) {
11650 return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
11653 scale.copy = function() {
11658 .paddingInner(paddingInner)
11659 .paddingOuter(paddingOuter)
11666 function pointish(scale) {
11667 var copy = scale.copy;
11669 scale.padding = scale.paddingOuter;
11670 delete scale.paddingInner;
11671 delete scale.paddingOuter;
11673 scale.copy = function() {
11674 return pointish(copy());
11680 function point$1() {
11681 return pointish(band().paddingInner(1));
11684 function constant$9(x) {
11685 return function() {
11690 function number$2(x) {
11696 function deinterpolateLinear(a, b) {
11697 return (b -= (a = +a))
11698 ? function(x) { return (x - a) / b; }
11702 function deinterpolateClamp(deinterpolate) {
11703 return function(a, b) {
11704 var d = deinterpolate(a = +a, b = +b);
11705 return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };
11709 function reinterpolateClamp(reinterpolate) {
11710 return function(a, b) {
11711 var r = reinterpolate(a = +a, b = +b);
11712 return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };
11716 function bimap(domain, range$$1, deinterpolate, reinterpolate) {
11717 var d0 = domain[0], d1 = domain[1], r0 = range$$1[0], r1 = range$$1[1];
11718 if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);
11719 else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);
11720 return function(x) { return r0(d0(x)); };
11723 function polymap(domain, range$$1, deinterpolate, reinterpolate) {
11724 var j = Math.min(domain.length, range$$1.length) - 1,
11729 // Reverse descending domains.
11730 if (domain[j] < domain[0]) {
11731 domain = domain.slice().reverse();
11732 range$$1 = range$$1.slice().reverse();
11736 d[i] = deinterpolate(domain[i], domain[i + 1]);
11737 r[i] = reinterpolate(range$$1[i], range$$1[i + 1]);
11740 return function(x) {
11741 var i = bisectRight(domain, x, 1, j) - 1;
11742 return r[i](d[i](x));
11746 function copy(source, target) {
11748 .domain(source.domain())
11749 .range(source.range())
11750 .interpolate(source.interpolate())
11751 .clamp(source.clamp());
11754 // deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
11755 // reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].
11756 function continuous(deinterpolate, reinterpolate) {
11759 interpolate$$1 = interpolate,
11765 function rescale() {
11766 piecewise = Math.min(domain.length, range$$1.length) > 2 ? polymap : bimap;
11767 output = input = null;
11771 function scale(x) {
11772 return (output || (output = piecewise(domain, range$$1, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate$$1)))(+x);
11775 scale.invert = function(y) {
11776 return (input || (input = piecewise(range$$1, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
11779 scale.domain = function(_) {
11780 return arguments.length ? (domain = map$2.call(_, number$2), rescale()) : domain.slice();
11783 scale.range = function(_) {
11784 return arguments.length ? (range$$1 = slice$5.call(_), rescale()) : range$$1.slice();
11787 scale.rangeRound = function(_) {
11788 return range$$1 = slice$5.call(_), interpolate$$1 = interpolateRound, rescale();
11791 scale.clamp = function(_) {
11792 return arguments.length ? (clamp = !!_, rescale()) : clamp;
11795 scale.interpolate = function(_) {
11796 return arguments.length ? (interpolate$$1 = _, rescale()) : interpolate$$1;
11802 function tickFormat(domain, count, specifier) {
11803 var start = domain[0],
11804 stop = domain[domain.length - 1],
11805 step = tickStep(start, stop, count == null ? 10 : count),
11807 specifier = formatSpecifier(specifier == null ? ",f" : specifier);
11808 switch (specifier.type) {
11810 var value = Math.max(Math.abs(start), Math.abs(stop));
11811 if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
11812 return formatPrefix(specifier, value);
11819 if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
11824 if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
11828 return format(specifier);
11831 function linearish(scale) {
11832 var domain = scale.domain;
11834 scale.ticks = function(count) {
11836 return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
11839 scale.tickFormat = function(count, specifier) {
11840 return tickFormat(domain(), count, specifier);
11843 scale.nice = function(count) {
11844 if (count == null) count = 10;
11853 if (stop < start) {
11854 step = start, start = stop, stop = step;
11855 step = i0, i0 = i1, i1 = step;
11858 step = tickIncrement(start, stop, count);
11861 start = Math.floor(start / step) * step;
11862 stop = Math.ceil(stop / step) * step;
11863 step = tickIncrement(start, stop, count);
11864 } else if (step < 0) {
11865 start = Math.ceil(start * step) / step;
11866 stop = Math.floor(stop * step) / step;
11867 step = tickIncrement(start, stop, count);
11871 d[i0] = Math.floor(start / step) * step;
11872 d[i1] = Math.ceil(stop / step) * step;
11874 } else if (step < 0) {
11875 d[i0] = Math.ceil(start * step) / step;
11876 d[i1] = Math.floor(stop * step) / step;
11886 function linear$2() {
11887 var scale = continuous(deinterpolateLinear, interpolateNumber);
11889 scale.copy = function() {
11890 return copy(scale, linear$2());
11893 return linearish(scale);
11896 function identity$5() {
11897 var domain = [0, 1];
11899 function scale(x) {
11903 scale.invert = scale;
11905 scale.domain = scale.range = function(_) {
11906 return arguments.length ? (domain = map$2.call(_, number$2), scale) : domain.slice();
11909 scale.copy = function() {
11910 return identity$5().domain(domain);
11913 return linearish(scale);
11916 function nice(domain, interval) {
11917 domain = domain.slice();
11920 i1 = domain.length - 1,
11926 t = i0, i0 = i1, i1 = t;
11927 t = x0, x0 = x1, x1 = t;
11930 domain[i0] = interval.floor(x0);
11931 domain[i1] = interval.ceil(x1);
11935 function deinterpolate(a, b) {
11936 return (b = Math.log(b / a))
11937 ? function(x) { return Math.log(x / a) / b; }
11941 function reinterpolate(a, b) {
11943 ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }
11944 : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };
11947 function pow10(x) {
11948 return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
11951 function powp(base) {
11952 return base === 10 ? pow10
11953 : base === Math.E ? Math.exp
11954 : function(x) { return Math.pow(base, x); };
11957 function logp(base) {
11958 return base === Math.E ? Math.log
11959 : base === 10 && Math.log10
11960 || base === 2 && Math.log2
11961 || (base = Math.log(base), function(x) { return Math.log(x) / base; });
11964 function reflect(f) {
11965 return function(x) {
11971 var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),
11972 domain = scale.domain,
11977 function rescale() {
11978 logs = logp(base), pows = powp(base);
11979 if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);
11983 scale.base = function(_) {
11984 return arguments.length ? (base = +_, rescale()) : base;
11987 scale.domain = function(_) {
11988 return arguments.length ? (domain(_), rescale()) : domain();
11991 scale.ticks = function(count) {
11994 v = d[d.length - 1],
11997 if (r = v < u) i = u, u = v, v = i;
12004 n = count == null ? 10 : +count,
12007 if (!(base % 1) && j - i < n) {
12008 i = Math.round(i) - 1, j = Math.round(j) + 1;
12009 if (u > 0) for (; i < j; ++i) {
12010 for (k = 1, p = pows(i); k < base; ++k) {
12012 if (t < u) continue;
12016 } else for (; i < j; ++i) {
12017 for (k = base - 1, p = pows(i); k >= 1; --k) {
12019 if (t < u) continue;
12025 z = ticks(i, j, Math.min(j - i, n)).map(pows);
12028 return r ? z.reverse() : z;
12031 scale.tickFormat = function(count, specifier) {
12032 if (specifier == null) specifier = base === 10 ? ".0e" : ",";
12033 if (typeof specifier !== "function") specifier = format(specifier);
12034 if (count === Infinity) return specifier;
12035 if (count == null) count = 10;
12036 var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
12037 return function(d) {
12038 var i = d / pows(Math.round(logs(d)));
12039 if (i * base < base - 0.5) i *= base;
12040 return i <= k ? specifier(d) : "";
12044 scale.nice = function() {
12045 return domain(nice(domain(), {
12046 floor: function(x) { return pows(Math.floor(logs(x))); },
12047 ceil: function(x) { return pows(Math.ceil(logs(x))); }
12051 scale.copy = function() {
12052 return copy(scale, log$1().base(base));
12058 function raise$1(x, exponent) {
12059 return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
12064 scale = continuous(deinterpolate, reinterpolate),
12065 domain = scale.domain;
12067 function deinterpolate(a, b) {
12068 return (b = raise$1(b, exponent) - (a = raise$1(a, exponent)))
12069 ? function(x) { return (raise$1(x, exponent) - a) / b; }
12073 function reinterpolate(a, b) {
12074 b = raise$1(b, exponent) - (a = raise$1(a, exponent));
12075 return function(t) { return raise$1(a + b * t, 1 / exponent); };
12078 scale.exponent = function(_) {
12079 return arguments.length ? (exponent = +_, domain(domain())) : exponent;
12082 scale.copy = function() {
12083 return copy(scale, pow$1().exponent(exponent));
12086 return linearish(scale);
12089 function sqrt$1() {
12090 return pow$1().exponent(0.5);
12093 function quantile$1() {
12098 function rescale() {
12099 var i = 0, n = Math.max(1, range$$1.length);
12100 thresholds = new Array(n - 1);
12101 while (++i < n) thresholds[i - 1] = quantile(domain, i / n);
12105 function scale(x) {
12106 if (!isNaN(x = +x)) return range$$1[bisectRight(thresholds, x)];
12109 scale.invertExtent = function(y) {
12110 var i = range$$1.indexOf(y);
12111 return i < 0 ? [NaN, NaN] : [
12112 i > 0 ? thresholds[i - 1] : domain[0],
12113 i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
12117 scale.domain = function(_) {
12118 if (!arguments.length) return domain.slice();
12120 for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
12121 domain.sort(ascending);
12125 scale.range = function(_) {
12126 return arguments.length ? (range$$1 = slice$5.call(_), rescale()) : range$$1.slice();
12129 scale.quantiles = function() {
12130 return thresholds.slice();
12133 scale.copy = function() {
12134 return quantile$1()
12142 function quantize() {
12149 function scale(x) {
12150 if (x <= x) return range$$1[bisectRight(domain, x, 0, n)];
12153 function rescale() {
12155 domain = new Array(n);
12156 while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
12160 scale.domain = function(_) {
12161 return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
12164 scale.range = function(_) {
12165 return arguments.length ? (n = (range$$1 = slice$5.call(_)).length - 1, rescale()) : range$$1.slice();
12168 scale.invertExtent = function(y) {
12169 var i = range$$1.indexOf(y);
12170 return i < 0 ? [NaN, NaN]
12171 : i < 1 ? [x0, domain[0]]
12172 : i >= n ? [domain[n - 1], x1]
12173 : [domain[i - 1], domain[i]];
12176 scale.copy = function() {
12182 return linearish(scale);
12185 function threshold() {
12186 var domain = [0.5],
12190 function scale(x) {
12191 if (x <= x) return range$$1[bisectRight(domain, x, 0, n)];
12194 scale.domain = function(_) {
12195 return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : domain.slice();
12198 scale.range = function(_) {
12199 return arguments.length ? (range$$1 = slice$5.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : range$$1.slice();
12202 scale.invertExtent = function(y) {
12203 var i = range$$1.indexOf(y);
12204 return [domain[i - 1], domain[i]];
12207 scale.copy = function() {
12216 var t0$1 = new Date,
12219 function newInterval(floori, offseti, count, field) {
12221 function interval(date) {
12222 return floori(date = new Date(+date)), date;
12225 interval.floor = interval;
12227 interval.ceil = function(date) {
12228 return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
12231 interval.round = function(date) {
12232 var d0 = interval(date),
12233 d1 = interval.ceil(date);
12234 return date - d0 < d1 - date ? d0 : d1;
12237 interval.offset = function(date, step) {
12238 return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
12241 interval.range = function(start, stop, step) {
12242 var range = [], previous;
12243 start = interval.ceil(start);
12244 step = step == null ? 1 : Math.floor(step);
12245 if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
12246 do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
12247 while (previous < start && start < stop);
12251 interval.filter = function(test) {
12252 return newInterval(function(date) {
12253 if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
12254 }, function(date, step) {
12255 if (date >= date) {
12256 if (step < 0) while (++step <= 0) {
12257 while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
12258 } else while (--step >= 0) {
12259 while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
12266 interval.count = function(start, end) {
12267 t0$1.setTime(+start), t1$1.setTime(+end);
12268 floori(t0$1), floori(t1$1);
12269 return Math.floor(count(t0$1, t1$1));
12272 interval.every = function(step) {
12273 step = Math.floor(step);
12274 return !isFinite(step) || !(step > 0) ? null
12275 : !(step > 1) ? interval
12276 : interval.filter(field
12277 ? function(d) { return field(d) % step === 0; }
12278 : function(d) { return interval.count(0, d) % step === 0; });
12285 var millisecond = newInterval(function() {
12287 }, function(date, step) {
12288 date.setTime(+date + step);
12289 }, function(start, end) {
12290 return end - start;
12293 // An optimized implementation for this simple case.
12294 millisecond.every = function(k) {
12296 if (!isFinite(k) || !(k > 0)) return null;
12297 if (!(k > 1)) return millisecond;
12298 return newInterval(function(date) {
12299 date.setTime(Math.floor(date / k) * k);
12300 }, function(date, step) {
12301 date.setTime(+date + step * k);
12302 }, function(start, end) {
12303 return (end - start) / k;
12306 var milliseconds = millisecond.range;
12308 var durationSecond = 1e3;
12309 var durationMinute = 6e4;
12310 var durationHour = 36e5;
12311 var durationDay = 864e5;
12312 var durationWeek = 6048e5;
12314 var second = newInterval(function(date) {
12315 date.setTime(Math.floor(date / durationSecond) * durationSecond);
12316 }, function(date, step) {
12317 date.setTime(+date + step * durationSecond);
12318 }, function(start, end) {
12319 return (end - start) / durationSecond;
12320 }, function(date) {
12321 return date.getUTCSeconds();
12323 var seconds = second.range;
12325 var minute = newInterval(function(date) {
12326 date.setTime(Math.floor(date / durationMinute) * durationMinute);
12327 }, function(date, step) {
12328 date.setTime(+date + step * durationMinute);
12329 }, function(start, end) {
12330 return (end - start) / durationMinute;
12331 }, function(date) {
12332 return date.getMinutes();
12334 var minutes = minute.range;
12336 var hour = newInterval(function(date) {
12337 var offset = date.getTimezoneOffset() * durationMinute % durationHour;
12338 if (offset < 0) offset += durationHour;
12339 date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset);
12340 }, function(date, step) {
12341 date.setTime(+date + step * durationHour);
12342 }, function(start, end) {
12343 return (end - start) / durationHour;
12344 }, function(date) {
12345 return date.getHours();
12347 var hours = hour.range;
12349 var day = newInterval(function(date) {
12350 date.setHours(0, 0, 0, 0);
12351 }, function(date, step) {
12352 date.setDate(date.getDate() + step);
12353 }, function(start, end) {
12354 return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
12355 }, function(date) {
12356 return date.getDate() - 1;
12358 var days = day.range;
12360 function weekday(i) {
12361 return newInterval(function(date) {
12362 date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
12363 date.setHours(0, 0, 0, 0);
12364 }, function(date, step) {
12365 date.setDate(date.getDate() + step * 7);
12366 }, function(start, end) {
12367 return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
12371 var sunday = weekday(0);
12372 var monday = weekday(1);
12373 var tuesday = weekday(2);
12374 var wednesday = weekday(3);
12375 var thursday = weekday(4);
12376 var friday = weekday(5);
12377 var saturday = weekday(6);
12379 var sundays = sunday.range;
12380 var mondays = monday.range;
12381 var tuesdays = tuesday.range;
12382 var wednesdays = wednesday.range;
12383 var thursdays = thursday.range;
12384 var fridays = friday.range;
12385 var saturdays = saturday.range;
12387 var month = newInterval(function(date) {
12389 date.setHours(0, 0, 0, 0);
12390 }, function(date, step) {
12391 date.setMonth(date.getMonth() + step);
12392 }, function(start, end) {
12393 return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
12394 }, function(date) {
12395 return date.getMonth();
12397 var months = month.range;
12399 var year = newInterval(function(date) {
12400 date.setMonth(0, 1);
12401 date.setHours(0, 0, 0, 0);
12402 }, function(date, step) {
12403 date.setFullYear(date.getFullYear() + step);
12404 }, function(start, end) {
12405 return end.getFullYear() - start.getFullYear();
12406 }, function(date) {
12407 return date.getFullYear();
12410 // An optimized implementation for this simple case.
12411 year.every = function(k) {
12412 return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12413 date.setFullYear(Math.floor(date.getFullYear() / k) * k);
12414 date.setMonth(0, 1);
12415 date.setHours(0, 0, 0, 0);
12416 }, function(date, step) {
12417 date.setFullYear(date.getFullYear() + step * k);
12420 var years = year.range;
12422 var utcMinute = newInterval(function(date) {
12423 date.setUTCSeconds(0, 0);
12424 }, function(date, step) {
12425 date.setTime(+date + step * durationMinute);
12426 }, function(start, end) {
12427 return (end - start) / durationMinute;
12428 }, function(date) {
12429 return date.getUTCMinutes();
12431 var utcMinutes = utcMinute.range;
12433 var utcHour = newInterval(function(date) {
12434 date.setUTCMinutes(0, 0, 0);
12435 }, function(date, step) {
12436 date.setTime(+date + step * durationHour);
12437 }, function(start, end) {
12438 return (end - start) / durationHour;
12439 }, function(date) {
12440 return date.getUTCHours();
12442 var utcHours = utcHour.range;
12444 var utcDay = newInterval(function(date) {
12445 date.setUTCHours(0, 0, 0, 0);
12446 }, function(date, step) {
12447 date.setUTCDate(date.getUTCDate() + step);
12448 }, function(start, end) {
12449 return (end - start) / durationDay;
12450 }, function(date) {
12451 return date.getUTCDate() - 1;
12453 var utcDays = utcDay.range;
12455 function utcWeekday(i) {
12456 return newInterval(function(date) {
12457 date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
12458 date.setUTCHours(0, 0, 0, 0);
12459 }, function(date, step) {
12460 date.setUTCDate(date.getUTCDate() + step * 7);
12461 }, function(start, end) {
12462 return (end - start) / durationWeek;
12466 var utcSunday = utcWeekday(0);
12467 var utcMonday = utcWeekday(1);
12468 var utcTuesday = utcWeekday(2);
12469 var utcWednesday = utcWeekday(3);
12470 var utcThursday = utcWeekday(4);
12471 var utcFriday = utcWeekday(5);
12472 var utcSaturday = utcWeekday(6);
12474 var utcSundays = utcSunday.range;
12475 var utcMondays = utcMonday.range;
12476 var utcTuesdays = utcTuesday.range;
12477 var utcWednesdays = utcWednesday.range;
12478 var utcThursdays = utcThursday.range;
12479 var utcFridays = utcFriday.range;
12480 var utcSaturdays = utcSaturday.range;
12482 var utcMonth = newInterval(function(date) {
12483 date.setUTCDate(1);
12484 date.setUTCHours(0, 0, 0, 0);
12485 }, function(date, step) {
12486 date.setUTCMonth(date.getUTCMonth() + step);
12487 }, function(start, end) {
12488 return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
12489 }, function(date) {
12490 return date.getUTCMonth();
12492 var utcMonths = utcMonth.range;
12494 var utcYear = newInterval(function(date) {
12495 date.setUTCMonth(0, 1);
12496 date.setUTCHours(0, 0, 0, 0);
12497 }, function(date, step) {
12498 date.setUTCFullYear(date.getUTCFullYear() + step);
12499 }, function(start, end) {
12500 return end.getUTCFullYear() - start.getUTCFullYear();
12501 }, function(date) {
12502 return date.getUTCFullYear();
12505 // An optimized implementation for this simple case.
12506 utcYear.every = function(k) {
12507 return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12508 date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
12509 date.setUTCMonth(0, 1);
12510 date.setUTCHours(0, 0, 0, 0);
12511 }, function(date, step) {
12512 date.setUTCFullYear(date.getUTCFullYear() + step * k);
12515 var utcYears = utcYear.range;
12517 function localDate(d) {
12518 if (0 <= d.y && d.y < 100) {
12519 var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
12520 date.setFullYear(d.y);
12523 return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
12526 function utcDate(d) {
12527 if (0 <= d.y && d.y < 100) {
12528 var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
12529 date.setUTCFullYear(d.y);
12532 return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
12535 function newYear(y) {
12536 return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
12539 function formatLocale$1(locale) {
12540 var locale_dateTime = locale.dateTime,
12541 locale_date = locale.date,
12542 locale_time = locale.time,
12543 locale_periods = locale.periods,
12544 locale_weekdays = locale.days,
12545 locale_shortWeekdays = locale.shortDays,
12546 locale_months = locale.months,
12547 locale_shortMonths = locale.shortMonths;
12549 var periodRe = formatRe(locale_periods),
12550 periodLookup = formatLookup(locale_periods),
12551 weekdayRe = formatRe(locale_weekdays),
12552 weekdayLookup = formatLookup(locale_weekdays),
12553 shortWeekdayRe = formatRe(locale_shortWeekdays),
12554 shortWeekdayLookup = formatLookup(locale_shortWeekdays),
12555 monthRe = formatRe(locale_months),
12556 monthLookup = formatLookup(locale_months),
12557 shortMonthRe = formatRe(locale_shortMonths),
12558 shortMonthLookup = formatLookup(locale_shortMonths);
12561 "a": formatShortWeekday,
12562 "A": formatWeekday,
12563 "b": formatShortMonth,
12566 "d": formatDayOfMonth,
12567 "e": formatDayOfMonth,
12568 "f": formatMicroseconds,
12571 "j": formatDayOfYear,
12572 "L": formatMilliseconds,
12573 "m": formatMonthNumber,
12574 "M": formatMinutes,
12576 "Q": formatUnixTimestamp,
12577 "s": formatUnixTimestampSeconds,
12578 "S": formatSeconds,
12579 "u": formatWeekdayNumberMonday,
12580 "U": formatWeekNumberSunday,
12581 "V": formatWeekNumberISO,
12582 "w": formatWeekdayNumberSunday,
12583 "W": formatWeekNumberMonday,
12587 "Y": formatFullYear,
12589 "%": formatLiteralPercent
12593 "a": formatUTCShortWeekday,
12594 "A": formatUTCWeekday,
12595 "b": formatUTCShortMonth,
12596 "B": formatUTCMonth,
12598 "d": formatUTCDayOfMonth,
12599 "e": formatUTCDayOfMonth,
12600 "f": formatUTCMicroseconds,
12601 "H": formatUTCHour24,
12602 "I": formatUTCHour12,
12603 "j": formatUTCDayOfYear,
12604 "L": formatUTCMilliseconds,
12605 "m": formatUTCMonthNumber,
12606 "M": formatUTCMinutes,
12607 "p": formatUTCPeriod,
12608 "Q": formatUnixTimestamp,
12609 "s": formatUnixTimestampSeconds,
12610 "S": formatUTCSeconds,
12611 "u": formatUTCWeekdayNumberMonday,
12612 "U": formatUTCWeekNumberSunday,
12613 "V": formatUTCWeekNumberISO,
12614 "w": formatUTCWeekdayNumberSunday,
12615 "W": formatUTCWeekNumberMonday,
12618 "y": formatUTCYear,
12619 "Y": formatUTCFullYear,
12620 "Z": formatUTCZone,
12621 "%": formatLiteralPercent
12625 "a": parseShortWeekday,
12627 "b": parseShortMonth,
12629 "c": parseLocaleDateTime,
12630 "d": parseDayOfMonth,
12631 "e": parseDayOfMonth,
12632 "f": parseMicroseconds,
12635 "j": parseDayOfYear,
12636 "L": parseMilliseconds,
12637 "m": parseMonthNumber,
12640 "Q": parseUnixTimestamp,
12641 "s": parseUnixTimestampSeconds,
12643 "u": parseWeekdayNumberMonday,
12644 "U": parseWeekNumberSunday,
12645 "V": parseWeekNumberISO,
12646 "w": parseWeekdayNumberSunday,
12647 "W": parseWeekNumberMonday,
12648 "x": parseLocaleDate,
12649 "X": parseLocaleTime,
12651 "Y": parseFullYear,
12653 "%": parseLiteralPercent
12656 // These recursive directive definitions must be deferred.
12657 formats.x = newFormat(locale_date, formats);
12658 formats.X = newFormat(locale_time, formats);
12659 formats.c = newFormat(locale_dateTime, formats);
12660 utcFormats.x = newFormat(locale_date, utcFormats);
12661 utcFormats.X = newFormat(locale_time, utcFormats);
12662 utcFormats.c = newFormat(locale_dateTime, utcFormats);
12664 function newFormat(specifier, formats) {
12665 return function(date) {
12669 n = specifier.length,
12674 if (!(date instanceof Date)) date = new Date(+date);
12677 if (specifier.charCodeAt(i) === 37) {
12678 string.push(specifier.slice(j, i));
12679 if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
12680 else pad = c === "e" ? " " : "0";
12681 if (format = formats[c]) c = format(date, pad);
12687 string.push(specifier.slice(j, i));
12688 return string.join("");
12692 function newParse(specifier, newDate) {
12693 return function(string) {
12694 var d = newYear(1900),
12695 i = parseSpecifier(d, specifier, string += "", 0),
12697 if (i != string.length) return null;
12699 // If a UNIX timestamp is specified, return it.
12700 if ("Q" in d) return new Date(d.Q);
12702 // The am-pm flag is 0 for AM, and 1 for PM.
12703 if ("p" in d) d.H = d.H % 12 + d.p * 12;
12705 // Convert day-of-week and week-of-year to day-of-year.
12707 if (d.V < 1 || d.V > 53) return null;
12708 if (!("w" in d)) d.w = 1;
12710 week = utcDate(newYear(d.y)), day$$1 = week.getUTCDay();
12711 week = day$$1 > 4 || day$$1 === 0 ? utcMonday.ceil(week) : utcMonday(week);
12712 week = utcDay.offset(week, (d.V - 1) * 7);
12713 d.y = week.getUTCFullYear();
12714 d.m = week.getUTCMonth();
12715 d.d = week.getUTCDate() + (d.w + 6) % 7;
12717 week = newDate(newYear(d.y)), day$$1 = week.getDay();
12718 week = day$$1 > 4 || day$$1 === 0 ? monday.ceil(week) : monday(week);
12719 week = day.offset(week, (d.V - 1) * 7);
12720 d.y = week.getFullYear();
12721 d.m = week.getMonth();
12722 d.d = week.getDate() + (d.w + 6) % 7;
12724 } else if ("W" in d || "U" in d) {
12725 if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
12726 day$$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
12728 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;
12731 // If a time zone is specified, all fields are interpreted as UTC and then
12732 // offset according to the specified time zone.
12734 d.H += d.Z / 100 | 0;
12739 // Otherwise, all fields are in local time.
12744 function parseSpecifier(d, specifier, string, j) {
12746 n = specifier.length,
12752 if (j >= m) return -1;
12753 c = specifier.charCodeAt(i++);
12755 c = specifier.charAt(i++);
12756 parse = parses[c in pads ? specifier.charAt(i++) : c];
12757 if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
12758 } else if (c != string.charCodeAt(j++)) {
12766 function parsePeriod(d, string, i) {
12767 var n = periodRe.exec(string.slice(i));
12768 return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12771 function parseShortWeekday(d, string, i) {
12772 var n = shortWeekdayRe.exec(string.slice(i));
12773 return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12776 function parseWeekday(d, string, i) {
12777 var n = weekdayRe.exec(string.slice(i));
12778 return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12781 function parseShortMonth(d, string, i) {
12782 var n = shortMonthRe.exec(string.slice(i));
12783 return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12786 function parseMonth(d, string, i) {
12787 var n = monthRe.exec(string.slice(i));
12788 return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12791 function parseLocaleDateTime(d, string, i) {
12792 return parseSpecifier(d, locale_dateTime, string, i);
12795 function parseLocaleDate(d, string, i) {
12796 return parseSpecifier(d, locale_date, string, i);
12799 function parseLocaleTime(d, string, i) {
12800 return parseSpecifier(d, locale_time, string, i);
12803 function formatShortWeekday(d) {
12804 return locale_shortWeekdays[d.getDay()];
12807 function formatWeekday(d) {
12808 return locale_weekdays[d.getDay()];
12811 function formatShortMonth(d) {
12812 return locale_shortMonths[d.getMonth()];
12815 function formatMonth(d) {
12816 return locale_months[d.getMonth()];
12819 function formatPeriod(d) {
12820 return locale_periods[+(d.getHours() >= 12)];
12823 function formatUTCShortWeekday(d) {
12824 return locale_shortWeekdays[d.getUTCDay()];
12827 function formatUTCWeekday(d) {
12828 return locale_weekdays[d.getUTCDay()];
12831 function formatUTCShortMonth(d) {
12832 return locale_shortMonths[d.getUTCMonth()];
12835 function formatUTCMonth(d) {
12836 return locale_months[d.getUTCMonth()];
12839 function formatUTCPeriod(d) {
12840 return locale_periods[+(d.getUTCHours() >= 12)];
12844 format: function(specifier) {
12845 var f = newFormat(specifier += "", formats);
12846 f.toString = function() { return specifier; };
12849 parse: function(specifier) {
12850 var p = newParse(specifier += "", localDate);
12851 p.toString = function() { return specifier; };
12854 utcFormat: function(specifier) {
12855 var f = newFormat(specifier += "", utcFormats);
12856 f.toString = function() { return specifier; };
12859 utcParse: function(specifier) {
12860 var p = newParse(specifier, utcDate);
12861 p.toString = function() { return specifier; };
12867 var pads = {"-": "", "_": " ", "0": "0"},
12868 numberRe = /^\s*\d+/, // note: ignores next directive
12870 requoteRe = /[\\^$*+?|[\]().{}]/g;
12872 function pad(value, fill, width) {
12873 var sign = value < 0 ? "-" : "",
12874 string = (sign ? -value : value) + "",
12875 length = string.length;
12876 return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
12879 function requote(s) {
12880 return s.replace(requoteRe, "\\$&");
12883 function formatRe(names) {
12884 return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
12887 function formatLookup(names) {
12888 var map = {}, i = -1, n = names.length;
12889 while (++i < n) map[names[i].toLowerCase()] = i;
12893 function parseWeekdayNumberSunday(d, string, i) {
12894 var n = numberRe.exec(string.slice(i, i + 1));
12895 return n ? (d.w = +n[0], i + n[0].length) : -1;
12898 function parseWeekdayNumberMonday(d, string, i) {
12899 var n = numberRe.exec(string.slice(i, i + 1));
12900 return n ? (d.u = +n[0], i + n[0].length) : -1;
12903 function parseWeekNumberSunday(d, string, i) {
12904 var n = numberRe.exec(string.slice(i, i + 2));
12905 return n ? (d.U = +n[0], i + n[0].length) : -1;
12908 function parseWeekNumberISO(d, string, i) {
12909 var n = numberRe.exec(string.slice(i, i + 2));
12910 return n ? (d.V = +n[0], i + n[0].length) : -1;
12913 function parseWeekNumberMonday(d, string, i) {
12914 var n = numberRe.exec(string.slice(i, i + 2));
12915 return n ? (d.W = +n[0], i + n[0].length) : -1;
12918 function parseFullYear(d, string, i) {
12919 var n = numberRe.exec(string.slice(i, i + 4));
12920 return n ? (d.y = +n[0], i + n[0].length) : -1;
12923 function parseYear(d, string, i) {
12924 var n = numberRe.exec(string.slice(i, i + 2));
12925 return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
12928 function parseZone(d, string, i) {
12929 var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
12930 return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
12933 function parseMonthNumber(d, string, i) {
12934 var n = numberRe.exec(string.slice(i, i + 2));
12935 return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
12938 function parseDayOfMonth(d, string, i) {
12939 var n = numberRe.exec(string.slice(i, i + 2));
12940 return n ? (d.d = +n[0], i + n[0].length) : -1;
12943 function parseDayOfYear(d, string, i) {
12944 var n = numberRe.exec(string.slice(i, i + 3));
12945 return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
12948 function parseHour24(d, string, i) {
12949 var n = numberRe.exec(string.slice(i, i + 2));
12950 return n ? (d.H = +n[0], i + n[0].length) : -1;
12953 function parseMinutes(d, string, i) {
12954 var n = numberRe.exec(string.slice(i, i + 2));
12955 return n ? (d.M = +n[0], i + n[0].length) : -1;
12958 function parseSeconds(d, string, i) {
12959 var n = numberRe.exec(string.slice(i, i + 2));
12960 return n ? (d.S = +n[0], i + n[0].length) : -1;
12963 function parseMilliseconds(d, string, i) {
12964 var n = numberRe.exec(string.slice(i, i + 3));
12965 return n ? (d.L = +n[0], i + n[0].length) : -1;
12968 function parseMicroseconds(d, string, i) {
12969 var n = numberRe.exec(string.slice(i, i + 6));
12970 return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
12973 function parseLiteralPercent(d, string, i) {
12974 var n = percentRe.exec(string.slice(i, i + 1));
12975 return n ? i + n[0].length : -1;
12978 function parseUnixTimestamp(d, string, i) {
12979 var n = numberRe.exec(string.slice(i));
12980 return n ? (d.Q = +n[0], i + n[0].length) : -1;
12983 function parseUnixTimestampSeconds(d, string, i) {
12984 var n = numberRe.exec(string.slice(i));
12985 return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;
12988 function formatDayOfMonth(d, p) {
12989 return pad(d.getDate(), p, 2);
12992 function formatHour24(d, p) {
12993 return pad(d.getHours(), p, 2);
12996 function formatHour12(d, p) {
12997 return pad(d.getHours() % 12 || 12, p, 2);
13000 function formatDayOfYear(d, p) {
13001 return pad(1 + day.count(year(d), d), p, 3);
13004 function formatMilliseconds(d, p) {
13005 return pad(d.getMilliseconds(), p, 3);
13008 function formatMicroseconds(d, p) {
13009 return formatMilliseconds(d, p) + "000";
13012 function formatMonthNumber(d, p) {
13013 return pad(d.getMonth() + 1, p, 2);
13016 function formatMinutes(d, p) {
13017 return pad(d.getMinutes(), p, 2);
13020 function formatSeconds(d, p) {
13021 return pad(d.getSeconds(), p, 2);
13024 function formatWeekdayNumberMonday(d) {
13025 var day$$1 = d.getDay();
13026 return day$$1 === 0 ? 7 : day$$1;
13029 function formatWeekNumberSunday(d, p) {
13030 return pad(sunday.count(year(d), d), p, 2);
13033 function formatWeekNumberISO(d, p) {
13034 var day$$1 = d.getDay();
13035 d = (day$$1 >= 4 || day$$1 === 0) ? thursday(d) : thursday.ceil(d);
13036 return pad(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2);
13039 function formatWeekdayNumberSunday(d) {
13043 function formatWeekNumberMonday(d, p) {
13044 return pad(monday.count(year(d), d), p, 2);
13047 function formatYear(d, p) {
13048 return pad(d.getFullYear() % 100, p, 2);
13051 function formatFullYear(d, p) {
13052 return pad(d.getFullYear() % 10000, p, 4);
13055 function formatZone(d) {
13056 var z = d.getTimezoneOffset();
13057 return (z > 0 ? "-" : (z *= -1, "+"))
13058 + pad(z / 60 | 0, "0", 2)
13059 + pad(z % 60, "0", 2);
13062 function formatUTCDayOfMonth(d, p) {
13063 return pad(d.getUTCDate(), p, 2);
13066 function formatUTCHour24(d, p) {
13067 return pad(d.getUTCHours(), p, 2);
13070 function formatUTCHour12(d, p) {
13071 return pad(d.getUTCHours() % 12 || 12, p, 2);
13074 function formatUTCDayOfYear(d, p) {
13075 return pad(1 + utcDay.count(utcYear(d), d), p, 3);
13078 function formatUTCMilliseconds(d, p) {
13079 return pad(d.getUTCMilliseconds(), p, 3);
13082 function formatUTCMicroseconds(d, p) {
13083 return formatUTCMilliseconds(d, p) + "000";
13086 function formatUTCMonthNumber(d, p) {
13087 return pad(d.getUTCMonth() + 1, p, 2);
13090 function formatUTCMinutes(d, p) {
13091 return pad(d.getUTCMinutes(), p, 2);
13094 function formatUTCSeconds(d, p) {
13095 return pad(d.getUTCSeconds(), p, 2);
13098 function formatUTCWeekdayNumberMonday(d) {
13099 var dow = d.getUTCDay();
13100 return dow === 0 ? 7 : dow;
13103 function formatUTCWeekNumberSunday(d, p) {
13104 return pad(utcSunday.count(utcYear(d), d), p, 2);
13107 function formatUTCWeekNumberISO(d, p) {
13108 var day$$1 = d.getUTCDay();
13109 d = (day$$1 >= 4 || day$$1 === 0) ? utcThursday(d) : utcThursday.ceil(d);
13110 return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
13113 function formatUTCWeekdayNumberSunday(d) {
13114 return d.getUTCDay();
13117 function formatUTCWeekNumberMonday(d, p) {
13118 return pad(utcMonday.count(utcYear(d), d), p, 2);
13121 function formatUTCYear(d, p) {
13122 return pad(d.getUTCFullYear() % 100, p, 2);
13125 function formatUTCFullYear(d, p) {
13126 return pad(d.getUTCFullYear() % 10000, p, 4);
13129 function formatUTCZone() {
13133 function formatLiteralPercent() {
13137 function formatUnixTimestamp(d) {
13141 function formatUnixTimestampSeconds(d) {
13142 return Math.floor(+d / 1000);
13152 dateTime: "%x, %X",
13153 date: "%-m/%-d/%Y",
13154 time: "%-I:%M:%S %p",
13155 periods: ["AM", "PM"],
13156 days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
13157 shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
13158 months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
13159 shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
13162 function defaultLocale$1(definition) {
13163 locale$1 = formatLocale$1(definition);
13164 timeFormat = locale$1.format;
13165 timeParse = locale$1.parse;
13166 utcFormat = locale$1.utcFormat;
13167 utcParse = locale$1.utcParse;
13171 var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
13173 function formatIsoNative(date) {
13174 return date.toISOString();
13177 var formatIso = Date.prototype.toISOString
13179 : utcFormat(isoSpecifier);
13181 function parseIsoNative(string) {
13182 var date = new Date(string);
13183 return isNaN(date) ? null : date;
13186 var parseIso = +new Date("2000-01-01T00:00:00.000Z")
13188 : utcParse(isoSpecifier);
13190 var durationSecond$1 = 1000,
13191 durationMinute$1 = durationSecond$1 * 60,
13192 durationHour$1 = durationMinute$1 * 60,
13193 durationDay$1 = durationHour$1 * 24,
13194 durationWeek$1 = durationDay$1 * 7,
13195 durationMonth = durationDay$1 * 30,
13196 durationYear = durationDay$1 * 365;
13198 function date$1(t) {
13199 return new Date(t);
13202 function number$3(t) {
13203 return t instanceof Date ? +t : +new Date(+t);
13206 function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format) {
13207 var scale = continuous(deinterpolateLinear, interpolateNumber),
13208 invert = scale.invert,
13209 domain = scale.domain;
13211 var formatMillisecond = format(".%L"),
13212 formatSecond = format(":%S"),
13213 formatMinute = format("%I:%M"),
13214 formatHour = format("%I %p"),
13215 formatDay = format("%a %d"),
13216 formatWeek = format("%b %d"),
13217 formatMonth = format("%B"),
13218 formatYear = format("%Y");
13220 var tickIntervals = [
13221 [second$$1, 1, durationSecond$1],
13222 [second$$1, 5, 5 * durationSecond$1],
13223 [second$$1, 15, 15 * durationSecond$1],
13224 [second$$1, 30, 30 * durationSecond$1],
13225 [minute$$1, 1, durationMinute$1],
13226 [minute$$1, 5, 5 * durationMinute$1],
13227 [minute$$1, 15, 15 * durationMinute$1],
13228 [minute$$1, 30, 30 * durationMinute$1],
13229 [ hour$$1, 1, durationHour$1 ],
13230 [ hour$$1, 3, 3 * durationHour$1 ],
13231 [ hour$$1, 6, 6 * durationHour$1 ],
13232 [ hour$$1, 12, 12 * durationHour$1 ],
13233 [ day$$1, 1, durationDay$1 ],
13234 [ day$$1, 2, 2 * durationDay$1 ],
13235 [ week, 1, durationWeek$1 ],
13236 [ month$$1, 1, durationMonth ],
13237 [ month$$1, 3, 3 * durationMonth ],
13238 [ year$$1, 1, durationYear ]
13241 function tickFormat(date$$1) {
13242 return (second$$1(date$$1) < date$$1 ? formatMillisecond
13243 : minute$$1(date$$1) < date$$1 ? formatSecond
13244 : hour$$1(date$$1) < date$$1 ? formatMinute
13245 : day$$1(date$$1) < date$$1 ? formatHour
13246 : month$$1(date$$1) < date$$1 ? (week(date$$1) < date$$1 ? formatDay : formatWeek)
13247 : year$$1(date$$1) < date$$1 ? formatMonth
13248 : formatYear)(date$$1);
13251 function tickInterval(interval, start, stop, step) {
13252 if (interval == null) interval = 10;
13254 // If a desired tick count is specified, pick a reasonable tick interval
13255 // based on the extent of the domain and a rough estimate of tick size.
13256 // Otherwise, assume interval is already a time interval and use it.
13257 if (typeof interval === "number") {
13258 var target = Math.abs(stop - start) / interval,
13259 i = bisector(function(i) { return i[2]; }).right(tickIntervals, target);
13260 if (i === tickIntervals.length) {
13261 step = tickStep(start / durationYear, stop / durationYear, interval);
13262 interval = year$$1;
13264 i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
13268 step = Math.max(tickStep(start, stop, interval), 1);
13269 interval = millisecond$$1;
13273 return step == null ? interval : interval.every(step);
13276 scale.invert = function(y) {
13277 return new Date(invert(y));
13280 scale.domain = function(_) {
13281 return arguments.length ? domain(map$2.call(_, number$3)) : domain().map(date$1);
13284 scale.ticks = function(interval, step) {
13287 t1 = d[d.length - 1],
13290 if (r) t = t0, t0 = t1, t1 = t;
13291 t = tickInterval(interval, t0, t1, step);
13292 t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
13293 return r ? t.reverse() : t;
13296 scale.tickFormat = function(count, specifier) {
13297 return specifier == null ? tickFormat : format(specifier);
13300 scale.nice = function(interval, step) {
13302 return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
13303 ? domain(nice(d, interval))
13307 scale.copy = function() {
13308 return copy(scale, calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format));
13315 return calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);
13318 function utcTime() {
13319 return calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);
13322 function colors(s) {
13323 return s.match(/.{6}/g).map(function(x) {
13328 var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
13330 var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6");
13332 var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9");
13334 var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5");
13336 var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
13338 var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13340 var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13342 var rainbow = cubehelix();
13344 function rainbow$1(t) {
13345 if (t < 0 || t > 1) t -= Math.floor(t);
13346 var ts = Math.abs(t - 0.5);
13347 rainbow.h = 360 * t - 100;
13348 rainbow.s = 1.5 - 1.5 * ts;
13349 rainbow.l = 0.8 - 0.9 * ts;
13350 return rainbow + "";
13353 function ramp(range) {
13354 var n = range.length;
13355 return function(t) {
13356 return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
13360 var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
13362 var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
13364 var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
13366 var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
13368 function sequential(interpolator) {
13373 function scale(x) {
13374 var t = (x - x0) / (x1 - x0);
13375 return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
13378 scale.domain = function(_) {
13379 return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];
13382 scale.clamp = function(_) {
13383 return arguments.length ? (clamp = !!_, scale) : clamp;
13386 scale.interpolator = function(_) {
13387 return arguments.length ? (interpolator = _, scale) : interpolator;
13390 scale.copy = function() {
13391 return sequential(interpolator).domain([x0, x1]).clamp(clamp);
13394 return linearish(scale);
13397 function constant$a(x) {
13398 return function constant() {
13403 var abs$1 = Math.abs;
13404 var atan2$1 = Math.atan2;
13405 var cos$2 = Math.cos;
13406 var max$2 = Math.max;
13407 var min$1 = Math.min;
13408 var sin$2 = Math.sin;
13409 var sqrt$2 = Math.sqrt;
13411 var epsilon$3 = 1e-12;
13412 var pi$4 = Math.PI;
13413 var halfPi$3 = pi$4 / 2;
13414 var tau$4 = 2 * pi$4;
13416 function acos$1(x) {
13417 return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
13420 function asin$1(x) {
13421 return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
13424 function arcInnerRadius(d) {
13425 return d.innerRadius;
13428 function arcOuterRadius(d) {
13429 return d.outerRadius;
13432 function arcStartAngle(d) {
13433 return d.startAngle;
13436 function arcEndAngle(d) {
13440 function arcPadAngle(d) {
13441 return d && d.padAngle; // Note: optional!
13444 function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
13445 var x10 = x1 - x0, y10 = y1 - y0,
13446 x32 = x3 - x2, y32 = y3 - y2,
13447 t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10);
13448 return [x0 + t * x10, y0 + t * y10];
13451 // Compute perpendicular offset line of length rc.
13452 // http://mathworld.wolfram.com/Circle-LineIntersection.html
13453 function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
13456 lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
13463 x00 = (x11 + x10) / 2,
13464 y00 = (y11 + y10) / 2,
13467 d2 = dx * dx + dy * dy,
13469 D = x11 * y10 - x10 * y11,
13470 d = (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)),
13471 cx0 = (D * dy - dx * d) / d2,
13472 cy0 = (-D * dx - dy * d) / d2,
13473 cx1 = (D * dy + dx * d) / d2,
13474 cy1 = (-D * dx + dy * d) / d2,
13480 // Pick the closer of the two intersection points.
13481 // TODO Is there a faster way to determine which intersection to use?
13482 if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
13489 x11: cx0 * (r1 / r - 1),
13490 y11: cy0 * (r1 / r - 1)
13495 var innerRadius = arcInnerRadius,
13496 outerRadius = arcOuterRadius,
13497 cornerRadius = constant$a(0),
13499 startAngle = arcStartAngle,
13500 endAngle = arcEndAngle,
13501 padAngle = arcPadAngle,
13507 r0 = +innerRadius.apply(this, arguments),
13508 r1 = +outerRadius.apply(this, arguments),
13509 a0 = startAngle.apply(this, arguments) - halfPi$3,
13510 a1 = endAngle.apply(this, arguments) - halfPi$3,
13511 da = abs$1(a1 - a0),
13514 if (!context) context = buffer = path();
13516 // Ensure that the outer radius is always larger than the inner radius.
13517 if (r1 < r0) r = r1, r1 = r0, r0 = r;
13520 if (!(r1 > epsilon$3)) context.moveTo(0, 0);
13522 // Or is it a circle or annulus?
13523 else if (da > tau$4 - epsilon$3) {
13524 context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));
13525 context.arc(0, 0, r1, a0, a1, !cw);
13526 if (r0 > epsilon$3) {
13527 context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));
13528 context.arc(0, 0, r0, a1, a0, cw);
13532 // Or is it a circular or annular sector?
13540 ap = padAngle.apply(this, arguments) / 2,
13541 rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)),
13542 rc = min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
13548 // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
13549 if (rp > epsilon$3) {
13550 var p0 = asin$1(rp / r0 * sin$2(ap)),
13551 p1 = asin$1(rp / r1 * sin$2(ap));
13552 if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
13553 else da0 = 0, a00 = a10 = (a0 + a1) / 2;
13554 if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
13555 else da1 = 0, a01 = a11 = (a0 + a1) / 2;
13558 var x01 = r1 * cos$2(a01),
13559 y01 = r1 * sin$2(a01),
13560 x10 = r0 * cos$2(a10),
13561 y10 = r0 * sin$2(a10);
13563 // Apply rounded corners?
13564 if (rc > epsilon$3) {
13565 var x11 = r1 * cos$2(a11),
13566 y11 = r1 * sin$2(a11),
13567 x00 = r0 * cos$2(a00),
13568 y00 = r0 * sin$2(a00);
13570 // Restrict the corner radius according to the sector angle.
13572 var oc = da0 > epsilon$3 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],
13577 kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2),
13578 lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
13579 rc0 = min$1(rc, (r0 - lc) / (kc - 1));
13580 rc1 = min$1(rc, (r1 - lc) / (kc + 1));
13584 // Is the sector collapsed to a line?
13585 if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
13587 // Does the sector’s outer ring have rounded corners?
13588 else if (rc1 > epsilon$3) {
13589 t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
13590 t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
13592 context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
13594 // Have the corners merged?
13595 if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13597 // Otherwise, draw the two corners and the ring.
13599 context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13600 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);
13601 context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13605 // Or is the outer ring just a circular arc?
13606 else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
13608 // Is there no inner ring, and it’s a circular sector?
13609 // Or perhaps it’s an annular sector collapsed due to padding?
13610 if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10);
13612 // Does the sector’s inner ring (or point) have rounded corners?
13613 else if (rc0 > epsilon$3) {
13614 t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
13615 t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
13617 context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
13619 // Have the corners merged?
13620 if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13622 // Otherwise, draw the two corners and the ring.
13624 context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13625 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);
13626 context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13630 // Or is the inner ring just a circular arc?
13631 else context.arc(0, 0, r0, a10, a00, cw);
13634 context.closePath();
13636 if (buffer) return context = null, buffer + "" || null;
13639 arc.centroid = function() {
13640 var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
13641 a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
13642 return [cos$2(a) * r, sin$2(a) * r];
13645 arc.innerRadius = function(_) {
13646 return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : innerRadius;
13649 arc.outerRadius = function(_) {
13650 return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : outerRadius;
13653 arc.cornerRadius = function(_) {
13654 return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : cornerRadius;
13657 arc.padRadius = function(_) {
13658 return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), arc) : padRadius;
13661 arc.startAngle = function(_) {
13662 return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : startAngle;
13665 arc.endAngle = function(_) {
13666 return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : endAngle;
13669 arc.padAngle = function(_) {
13670 return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : padAngle;
13673 arc.context = function(_) {
13674 return arguments.length ? ((context = _ == null ? null : _), arc) : context;
13680 function Linear(context) {
13681 this._context = context;
13684 Linear.prototype = {
13685 areaStart: function() {
13688 areaEnd: function() {
13691 lineStart: function() {
13694 lineEnd: function() {
13695 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
13696 this._line = 1 - this._line;
13698 point: function(x, y) {
13700 switch (this._point) {
13701 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
13702 case 1: this._point = 2; // proceed
13703 default: this._context.lineTo(x, y); break;
13708 function curveLinear(context) {
13709 return new Linear(context);
13723 defined = constant$a(true),
13725 curve = curveLinear,
13728 function line(data) {
13735 if (context == null) output = curve(buffer = path());
13737 for (i = 0; i <= n; ++i) {
13738 if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13739 if (defined0 = !defined0) output.lineStart();
13740 else output.lineEnd();
13742 if (defined0) output.point(+x$$1(d, i, data), +y$$1(d, i, data));
13745 if (buffer) return output = null, buffer + "" || null;
13748 line.x = function(_) {
13749 return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$a(+_), line) : x$$1;
13752 line.y = function(_) {
13753 return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$a(+_), line) : y$$1;
13756 line.defined = function(_) {
13757 return arguments.length ? (defined = typeof _ === "function" ? _ : constant$a(!!_), line) : defined;
13760 line.curve = function(_) {
13761 return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
13764 line.context = function(_) {
13765 return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
13774 y0 = constant$a(0),
13776 defined = constant$a(true),
13778 curve = curveLinear,
13781 function area(data) {
13789 x0z = new Array(n),
13790 y0z = new Array(n);
13792 if (context == null) output = curve(buffer = path());
13794 for (i = 0; i <= n; ++i) {
13795 if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13796 if (defined0 = !defined0) {
13798 output.areaStart();
13799 output.lineStart();
13802 output.lineStart();
13803 for (k = i - 1; k >= j; --k) {
13804 output.point(x0z[k], y0z[k]);
13811 x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
13812 output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
13816 if (buffer) return output = null, buffer + "" || null;
13819 function arealine() {
13820 return line().defined(defined).curve(curve).context(context);
13823 area.x = function(_) {
13824 return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$a(+_), x1 = null, area) : x0;
13827 area.x0 = function(_) {
13828 return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$a(+_), area) : x0;
13831 area.x1 = function(_) {
13832 return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), area) : x1;
13835 area.y = function(_) {
13836 return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$a(+_), y1 = null, area) : y0;
13839 area.y0 = function(_) {
13840 return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$a(+_), area) : y0;
13843 area.y1 = function(_) {
13844 return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), area) : y1;
13848 area.lineY0 = function() {
13849 return arealine().x(x0).y(y0);
13852 area.lineY1 = function() {
13853 return arealine().x(x0).y(y1);
13856 area.lineX1 = function() {
13857 return arealine().x(x1).y(y0);
13860 area.defined = function(_) {
13861 return arguments.length ? (defined = typeof _ === "function" ? _ : constant$a(!!_), area) : defined;
13864 area.curve = function(_) {
13865 return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
13868 area.context = function(_) {
13869 return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
13875 function descending(a, b) {
13876 return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
13879 function identity$6(d) {
13884 var value = identity$6,
13885 sortValues = descending,
13887 startAngle = constant$a(0),
13888 endAngle = constant$a(tau$4),
13889 padAngle = constant$a(0);
13891 function pie(data) {
13897 index = new Array(n),
13898 arcs = new Array(n),
13899 a0 = +startAngle.apply(this, arguments),
13900 da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)),
13902 p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
13903 pa = p * (da < 0 ? -1 : 1),
13906 for (i = 0; i < n; ++i) {
13907 if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
13912 // Optionally sort the arcs by previously-computed values or by data.
13913 if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
13914 else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
13916 // Compute the arcs! They are stored in the original data's order.
13917 for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
13918 j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
13931 pie.value = function(_) {
13932 return arguments.length ? (value = typeof _ === "function" ? _ : constant$a(+_), pie) : value;
13935 pie.sortValues = function(_) {
13936 return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
13939 pie.sort = function(_) {
13940 return arguments.length ? (sort = _, sortValues = null, pie) : sort;
13943 pie.startAngle = function(_) {
13944 return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : startAngle;
13947 pie.endAngle = function(_) {
13948 return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : endAngle;
13951 pie.padAngle = function(_) {
13952 return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : padAngle;
13958 var curveRadialLinear = curveRadial(curveLinear);
13960 function Radial(curve) {
13961 this._curve = curve;
13964 Radial.prototype = {
13965 areaStart: function() {
13966 this._curve.areaStart();
13968 areaEnd: function() {
13969 this._curve.areaEnd();
13971 lineStart: function() {
13972 this._curve.lineStart();
13974 lineEnd: function() {
13975 this._curve.lineEnd();
13977 point: function(a, r) {
13978 this._curve.point(r * Math.sin(a), r * -Math.cos(a));
13982 function curveRadial(curve) {
13984 function radial(context) {
13985 return new Radial(curve(context));
13988 radial._curve = curve;
13993 function lineRadial(l) {
13996 l.angle = l.x, delete l.x;
13997 l.radius = l.y, delete l.y;
13999 l.curve = function(_) {
14000 return arguments.length ? c(curveRadial(_)) : c()._curve;
14006 function lineRadial$1() {
14007 return lineRadial(line().curve(curveRadialLinear));
14010 function areaRadial() {
14011 var a = area().curve(curveRadialLinear),
14018 a.angle = a.x, delete a.x;
14019 a.startAngle = a.x0, delete a.x0;
14020 a.endAngle = a.x1, delete a.x1;
14021 a.radius = a.y, delete a.y;
14022 a.innerRadius = a.y0, delete a.y0;
14023 a.outerRadius = a.y1, delete a.y1;
14024 a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;
14025 a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;
14026 a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;
14027 a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;
14029 a.curve = function(_) {
14030 return arguments.length ? c(curveRadial(_)) : c()._curve;
14036 function pointRadial(x, y) {
14037 return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
14040 var slice$6 = Array.prototype.slice;
14042 function linkSource(d) {
14046 function linkTarget(d) {
14050 function link$2(curve) {
14051 var source = linkSource,
14052 target = linkTarget,
14058 var buffer, argv = slice$6.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
14059 if (!context) context = buffer = path();
14060 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));
14061 if (buffer) return context = null, buffer + "" || null;
14064 link.source = function(_) {
14065 return arguments.length ? (source = _, link) : source;
14068 link.target = function(_) {
14069 return arguments.length ? (target = _, link) : target;
14072 link.x = function(_) {
14073 return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$a(+_), link) : x$$1;
14076 link.y = function(_) {
14077 return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$a(+_), link) : y$$1;
14080 link.context = function(_) {
14081 return arguments.length ? ((context = _ == null ? null : _), link) : context;
14087 function curveHorizontal(context, x0, y0, x1, y1) {
14088 context.moveTo(x0, y0);
14089 context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
14092 function curveVertical(context, x0, y0, x1, y1) {
14093 context.moveTo(x0, y0);
14094 context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
14097 function curveRadial$1(context, x0, y0, x1, y1) {
14098 var p0 = pointRadial(x0, y0),
14099 p1 = pointRadial(x0, y0 = (y0 + y1) / 2),
14100 p2 = pointRadial(x1, y0),
14101 p3 = pointRadial(x1, y1);
14102 context.moveTo(p0[0], p0[1]);
14103 context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
14106 function linkHorizontal() {
14107 return link$2(curveHorizontal);
14110 function linkVertical() {
14111 return link$2(curveVertical);
14114 function linkRadial() {
14115 var l = link$2(curveRadial$1);
14116 l.angle = l.x, delete l.x;
14117 l.radius = l.y, delete l.y;
14122 draw: function(context, size) {
14123 var r = Math.sqrt(size / pi$4);
14124 context.moveTo(r, 0);
14125 context.arc(0, 0, r, 0, tau$4);
14130 draw: function(context, size) {
14131 var r = Math.sqrt(size / 5) / 2;
14132 context.moveTo(-3 * r, -r);
14133 context.lineTo(-r, -r);
14134 context.lineTo(-r, -3 * r);
14135 context.lineTo(r, -3 * r);
14136 context.lineTo(r, -r);
14137 context.lineTo(3 * r, -r);
14138 context.lineTo(3 * r, r);
14139 context.lineTo(r, r);
14140 context.lineTo(r, 3 * r);
14141 context.lineTo(-r, 3 * r);
14142 context.lineTo(-r, r);
14143 context.lineTo(-3 * r, r);
14144 context.closePath();
14148 var tan30 = Math.sqrt(1 / 3),
14149 tan30_2 = tan30 * 2;
14152 draw: function(context, size) {
14153 var y = Math.sqrt(size / tan30_2),
14155 context.moveTo(0, -y);
14156 context.lineTo(x, 0);
14157 context.lineTo(0, y);
14158 context.lineTo(-x, 0);
14159 context.closePath();
14163 var ka = 0.89081309152928522810,
14164 kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10),
14165 kx = Math.sin(tau$4 / 10) * kr,
14166 ky = -Math.cos(tau$4 / 10) * kr;
14169 draw: function(context, size) {
14170 var r = Math.sqrt(size * ka),
14173 context.moveTo(0, -r);
14174 context.lineTo(x, y);
14175 for (var i = 1; i < 5; ++i) {
14176 var a = tau$4 * i / 5,
14179 context.lineTo(s * r, -c * r);
14180 context.lineTo(c * x - s * y, s * x + c * y);
14182 context.closePath();
14187 draw: function(context, size) {
14188 var w = Math.sqrt(size),
14190 context.rect(x, x, w, w);
14194 var sqrt3 = Math.sqrt(3);
14197 draw: function(context, size) {
14198 var y = -Math.sqrt(size / (sqrt3 * 3));
14199 context.moveTo(0, y * 2);
14200 context.lineTo(-sqrt3 * y, -y);
14201 context.lineTo(sqrt3 * y, -y);
14202 context.closePath();
14207 s = Math.sqrt(3) / 2,
14208 k = 1 / Math.sqrt(12),
14209 a = (k / 2 + 1) * 3;
14212 draw: function(context, size) {
14213 var r = Math.sqrt(size / a),
14220 context.moveTo(x0, y0);
14221 context.lineTo(x1, y1);
14222 context.lineTo(x2, y2);
14223 context.lineTo(c * x0 - s * y0, s * x0 + c * y0);
14224 context.lineTo(c * x1 - s * y1, s * x1 + c * y1);
14225 context.lineTo(c * x2 - s * y2, s * x2 + c * y2);
14226 context.lineTo(c * x0 + s * y0, c * y0 - s * x0);
14227 context.lineTo(c * x1 + s * y1, c * y1 - s * x1);
14228 context.lineTo(c * x2 + s * y2, c * y2 - s * x2);
14229 context.closePath();
14243 function symbol() {
14244 var type = constant$a(circle$2),
14245 size = constant$a(64),
14248 function symbol() {
14250 if (!context) context = buffer = path();
14251 type.apply(this, arguments).draw(context, +size.apply(this, arguments));
14252 if (buffer) return context = null, buffer + "" || null;
14255 symbol.type = function(_) {
14256 return arguments.length ? (type = typeof _ === "function" ? _ : constant$a(_), symbol) : type;
14259 symbol.size = function(_) {
14260 return arguments.length ? (size = typeof _ === "function" ? _ : constant$a(+_), symbol) : size;
14263 symbol.context = function(_) {
14264 return arguments.length ? (context = _ == null ? null : _, symbol) : context;
14270 function noop$2() {}
14272 function point$2(that, x, y) {
14273 that._context.bezierCurveTo(
14274 (2 * that._x0 + that._x1) / 3,
14275 (2 * that._y0 + that._y1) / 3,
14276 (that._x0 + 2 * that._x1) / 3,
14277 (that._y0 + 2 * that._y1) / 3,
14278 (that._x0 + 4 * that._x1 + x) / 6,
14279 (that._y0 + 4 * that._y1 + y) / 6
14283 function Basis(context) {
14284 this._context = context;
14287 Basis.prototype = {
14288 areaStart: function() {
14291 areaEnd: function() {
14294 lineStart: function() {
14295 this._x0 = this._x1 =
14296 this._y0 = this._y1 = NaN;
14299 lineEnd: function() {
14300 switch (this._point) {
14301 case 3: point$2(this, this._x1, this._y1); // proceed
14302 case 2: this._context.lineTo(this._x1, this._y1); break;
14304 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14305 this._line = 1 - this._line;
14307 point: function(x, y) {
14309 switch (this._point) {
14310 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14311 case 1: this._point = 2; break;
14312 case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
14313 default: point$2(this, x, y); break;
14315 this._x0 = this._x1, this._x1 = x;
14316 this._y0 = this._y1, this._y1 = y;
14320 function basis$2(context) {
14321 return new Basis(context);
14324 function BasisClosed(context) {
14325 this._context = context;
14328 BasisClosed.prototype = {
14331 lineStart: function() {
14332 this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
14333 this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
14336 lineEnd: function() {
14337 switch (this._point) {
14339 this._context.moveTo(this._x2, this._y2);
14340 this._context.closePath();
14344 this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
14345 this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
14346 this._context.closePath();
14350 this.point(this._x2, this._y2);
14351 this.point(this._x3, this._y3);
14352 this.point(this._x4, this._y4);
14357 point: function(x, y) {
14359 switch (this._point) {
14360 case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
14361 case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
14362 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;
14363 default: point$2(this, x, y); break;
14365 this._x0 = this._x1, this._x1 = x;
14366 this._y0 = this._y1, this._y1 = y;
14370 function basisClosed$1(context) {
14371 return new BasisClosed(context);
14374 function BasisOpen(context) {
14375 this._context = context;
14378 BasisOpen.prototype = {
14379 areaStart: function() {
14382 areaEnd: function() {
14385 lineStart: function() {
14386 this._x0 = this._x1 =
14387 this._y0 = this._y1 = NaN;
14390 lineEnd: function() {
14391 if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14392 this._line = 1 - this._line;
14394 point: function(x, y) {
14396 switch (this._point) {
14397 case 0: this._point = 1; break;
14398 case 1: this._point = 2; break;
14399 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;
14400 case 3: this._point = 4; // proceed
14401 default: point$2(this, x, y); break;
14403 this._x0 = this._x1, this._x1 = x;
14404 this._y0 = this._y1, this._y1 = y;
14408 function basisOpen(context) {
14409 return new BasisOpen(context);
14412 function Bundle(context, beta) {
14413 this._basis = new Basis(context);
14417 Bundle.prototype = {
14418 lineStart: function() {
14421 this._basis.lineStart();
14423 lineEnd: function() {
14439 this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
14440 this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
14445 this._x = this._y = null;
14446 this._basis.lineEnd();
14448 point: function(x, y) {
14454 var bundle = (function custom(beta) {
14456 function bundle(context) {
14457 return beta === 1 ? new Basis(context) : new Bundle(context, beta);
14460 bundle.beta = function(beta) {
14461 return custom(+beta);
14467 function point$3(that, x, y) {
14468 that._context.bezierCurveTo(
14469 that._x1 + that._k * (that._x2 - that._x0),
14470 that._y1 + that._k * (that._y2 - that._y0),
14471 that._x2 + that._k * (that._x1 - x),
14472 that._y2 + that._k * (that._y1 - y),
14478 function Cardinal(context, tension) {
14479 this._context = context;
14480 this._k = (1 - tension) / 6;
14483 Cardinal.prototype = {
14484 areaStart: function() {
14487 areaEnd: function() {
14490 lineStart: function() {
14491 this._x0 = this._x1 = this._x2 =
14492 this._y0 = this._y1 = this._y2 = NaN;
14495 lineEnd: function() {
14496 switch (this._point) {
14497 case 2: this._context.lineTo(this._x2, this._y2); break;
14498 case 3: point$3(this, this._x1, this._y1); break;
14500 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14501 this._line = 1 - this._line;
14503 point: function(x, y) {
14505 switch (this._point) {
14506 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14507 case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
14508 case 2: this._point = 3; // proceed
14509 default: point$3(this, x, y); break;
14511 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14512 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14516 var cardinal = (function custom(tension) {
14518 function cardinal(context) {
14519 return new Cardinal(context, tension);
14522 cardinal.tension = function(tension) {
14523 return custom(+tension);
14529 function CardinalClosed(context, tension) {
14530 this._context = context;
14531 this._k = (1 - tension) / 6;
14534 CardinalClosed.prototype = {
14537 lineStart: function() {
14538 this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14539 this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14542 lineEnd: function() {
14543 switch (this._point) {
14545 this._context.moveTo(this._x3, this._y3);
14546 this._context.closePath();
14550 this._context.lineTo(this._x3, this._y3);
14551 this._context.closePath();
14555 this.point(this._x3, this._y3);
14556 this.point(this._x4, this._y4);
14557 this.point(this._x5, this._y5);
14562 point: function(x, y) {
14564 switch (this._point) {
14565 case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14566 case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14567 case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14568 default: point$3(this, x, y); break;
14570 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14571 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14575 var cardinalClosed = (function custom(tension) {
14577 function cardinal$$1(context) {
14578 return new CardinalClosed(context, tension);
14581 cardinal$$1.tension = function(tension) {
14582 return custom(+tension);
14585 return cardinal$$1;
14588 function CardinalOpen(context, tension) {
14589 this._context = context;
14590 this._k = (1 - tension) / 6;
14593 CardinalOpen.prototype = {
14594 areaStart: function() {
14597 areaEnd: function() {
14600 lineStart: function() {
14601 this._x0 = this._x1 = this._x2 =
14602 this._y0 = this._y1 = this._y2 = NaN;
14605 lineEnd: function() {
14606 if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14607 this._line = 1 - this._line;
14609 point: function(x, y) {
14611 switch (this._point) {
14612 case 0: this._point = 1; break;
14613 case 1: this._point = 2; break;
14614 case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14615 case 3: this._point = 4; // proceed
14616 default: point$3(this, x, y); break;
14618 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14619 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14623 var cardinalOpen = (function custom(tension) {
14625 function cardinal$$1(context) {
14626 return new CardinalOpen(context, tension);
14629 cardinal$$1.tension = function(tension) {
14630 return custom(+tension);
14633 return cardinal$$1;
14636 function point$4(that, x, y) {
14642 if (that._l01_a > epsilon$3) {
14643 var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
14644 n = 3 * that._l01_a * (that._l01_a + that._l12_a);
14645 x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
14646 y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
14649 if (that._l23_a > epsilon$3) {
14650 var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
14651 m = 3 * that._l23_a * (that._l23_a + that._l12_a);
14652 x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
14653 y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
14656 that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
14659 function CatmullRom(context, alpha) {
14660 this._context = context;
14661 this._alpha = alpha;
14664 CatmullRom.prototype = {
14665 areaStart: function() {
14668 areaEnd: function() {
14671 lineStart: function() {
14672 this._x0 = this._x1 = this._x2 =
14673 this._y0 = this._y1 = this._y2 = NaN;
14674 this._l01_a = this._l12_a = this._l23_a =
14675 this._l01_2a = this._l12_2a = this._l23_2a =
14678 lineEnd: function() {
14679 switch (this._point) {
14680 case 2: this._context.lineTo(this._x2, this._y2); break;
14681 case 3: this.point(this._x2, this._y2); break;
14683 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14684 this._line = 1 - this._line;
14686 point: function(x, y) {
14690 var x23 = this._x2 - x,
14691 y23 = this._y2 - y;
14692 this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14695 switch (this._point) {
14696 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14697 case 1: this._point = 2; break;
14698 case 2: this._point = 3; // proceed
14699 default: point$4(this, x, y); break;
14702 this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14703 this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14704 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14705 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14709 var catmullRom = (function custom(alpha) {
14711 function catmullRom(context) {
14712 return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
14715 catmullRom.alpha = function(alpha) {
14716 return custom(+alpha);
14722 function CatmullRomClosed(context, alpha) {
14723 this._context = context;
14724 this._alpha = alpha;
14727 CatmullRomClosed.prototype = {
14730 lineStart: function() {
14731 this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14732 this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14733 this._l01_a = this._l12_a = this._l23_a =
14734 this._l01_2a = this._l12_2a = this._l23_2a =
14737 lineEnd: function() {
14738 switch (this._point) {
14740 this._context.moveTo(this._x3, this._y3);
14741 this._context.closePath();
14745 this._context.lineTo(this._x3, this._y3);
14746 this._context.closePath();
14750 this.point(this._x3, this._y3);
14751 this.point(this._x4, this._y4);
14752 this.point(this._x5, this._y5);
14757 point: function(x, y) {
14761 var x23 = this._x2 - x,
14762 y23 = this._y2 - y;
14763 this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14766 switch (this._point) {
14767 case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14768 case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14769 case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14770 default: point$4(this, x, y); break;
14773 this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14774 this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14775 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14776 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14780 var catmullRomClosed = (function custom(alpha) {
14782 function catmullRom$$1(context) {
14783 return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
14786 catmullRom$$1.alpha = function(alpha) {
14787 return custom(+alpha);
14790 return catmullRom$$1;
14793 function CatmullRomOpen(context, alpha) {
14794 this._context = context;
14795 this._alpha = alpha;
14798 CatmullRomOpen.prototype = {
14799 areaStart: function() {
14802 areaEnd: function() {
14805 lineStart: function() {
14806 this._x0 = this._x1 = this._x2 =
14807 this._y0 = this._y1 = this._y2 = NaN;
14808 this._l01_a = this._l12_a = this._l23_a =
14809 this._l01_2a = this._l12_2a = this._l23_2a =
14812 lineEnd: function() {
14813 if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14814 this._line = 1 - this._line;
14816 point: function(x, y) {
14820 var x23 = this._x2 - x,
14821 y23 = this._y2 - y;
14822 this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14825 switch (this._point) {
14826 case 0: this._point = 1; break;
14827 case 1: this._point = 2; break;
14828 case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14829 case 3: this._point = 4; // proceed
14830 default: point$4(this, x, y); break;
14833 this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14834 this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14835 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14836 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14840 var catmullRomOpen = (function custom(alpha) {
14842 function catmullRom$$1(context) {
14843 return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
14846 catmullRom$$1.alpha = function(alpha) {
14847 return custom(+alpha);
14850 return catmullRom$$1;
14853 function LinearClosed(context) {
14854 this._context = context;
14857 LinearClosed.prototype = {
14860 lineStart: function() {
14863 lineEnd: function() {
14864 if (this._point) this._context.closePath();
14866 point: function(x, y) {
14868 if (this._point) this._context.lineTo(x, y);
14869 else this._point = 1, this._context.moveTo(x, y);
14873 function linearClosed(context) {
14874 return new LinearClosed(context);
14877 function sign$1(x) {
14878 return x < 0 ? -1 : 1;
14881 // Calculate the slopes of the tangents (Hermite-type interpolation) based on
14882 // the following paper: Steffen, M. 1990. A Simple Method for Monotonic
14883 // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
14884 // NOV(II), P. 443, 1990.
14885 function slope3(that, x2, y2) {
14886 var h0 = that._x1 - that._x0,
14887 h1 = x2 - that._x1,
14888 s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
14889 s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
14890 p = (s0 * h1 + s1 * h0) / (h0 + h1);
14891 return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
14894 // Calculate a one-sided slope.
14895 function slope2(that, t) {
14896 var h = that._x1 - that._x0;
14897 return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
14900 // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
14901 // "you can express cubic Hermite interpolation in terms of cubic Bézier curves
14902 // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
14903 function point$5(that, t0, t1) {
14908 dx = (x1 - x0) / 3;
14909 that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
14912 function MonotoneX(context) {
14913 this._context = context;
14916 MonotoneX.prototype = {
14917 areaStart: function() {
14920 areaEnd: function() {
14923 lineStart: function() {
14924 this._x0 = this._x1 =
14925 this._y0 = this._y1 =
14929 lineEnd: function() {
14930 switch (this._point) {
14931 case 2: this._context.lineTo(this._x1, this._y1); break;
14932 case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
14934 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14935 this._line = 1 - this._line;
14937 point: function(x, y) {
14941 if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
14942 switch (this._point) {
14943 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14944 case 1: this._point = 2; break;
14945 case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
14946 default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
14949 this._x0 = this._x1, this._x1 = x;
14950 this._y0 = this._y1, this._y1 = y;
14955 function MonotoneY(context) {
14956 this._context = new ReflectContext(context);
14959 (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
14960 MonotoneX.prototype.point.call(this, y, x);
14963 function ReflectContext(context) {
14964 this._context = context;
14967 ReflectContext.prototype = {
14968 moveTo: function(x, y) { this._context.moveTo(y, x); },
14969 closePath: function() { this._context.closePath(); },
14970 lineTo: function(x, y) { this._context.lineTo(y, x); },
14971 bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
14974 function monotoneX(context) {
14975 return new MonotoneX(context);
14978 function monotoneY(context) {
14979 return new MonotoneY(context);
14982 function Natural(context) {
14983 this._context = context;
14986 Natural.prototype = {
14987 areaStart: function() {
14990 areaEnd: function() {
14993 lineStart: function() {
14997 lineEnd: function() {
15003 this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
15005 this._context.lineTo(x[1], y[1]);
15007 var px = controlPoints(x),
15008 py = controlPoints(y);
15009 for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
15010 this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
15015 if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
15016 this._line = 1 - this._line;
15017 this._x = this._y = null;
15019 point: function(x, y) {
15025 // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
15026 function controlPoints(x) {
15033 a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
15034 for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
15035 a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
15036 for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
15037 a[n - 1] = r[n - 1] / b[n - 1];
15038 for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
15039 b[n - 1] = (x[n] + a[n - 1]) / 2;
15040 for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
15044 function natural(context) {
15045 return new Natural(context);
15048 function Step(context, t) {
15049 this._context = context;
15054 areaStart: function() {
15057 areaEnd: function() {
15060 lineStart: function() {
15061 this._x = this._y = NaN;
15064 lineEnd: function() {
15065 if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
15066 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
15067 if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
15069 point: function(x, y) {
15071 switch (this._point) {
15072 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
15073 case 1: this._point = 2; // proceed
15075 if (this._t <= 0) {
15076 this._context.lineTo(this._x, y);
15077 this._context.lineTo(x, y);
15079 var x1 = this._x * (1 - this._t) + x * this._t;
15080 this._context.lineTo(x1, this._y);
15081 this._context.lineTo(x1, y);
15086 this._x = x, this._y = y;
15090 function step(context) {
15091 return new Step(context, 0.5);
15094 function stepBefore(context) {
15095 return new Step(context, 0);
15098 function stepAfter(context) {
15099 return new Step(context, 1);
15102 function none$1(series, order) {
15103 if (!((n = series.length) > 1)) return;
15104 for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
15105 s0 = s1, s1 = series[order[i]];
15106 for (j = 0; j < m; ++j) {
15107 s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
15112 function none$2(series) {
15113 var n = series.length, o = new Array(n);
15114 while (--n >= 0) o[n] = n;
15118 function stackValue(d, key) {
15123 var keys = constant$a([]),
15126 value = stackValue;
15128 function stack(data) {
15129 var kz = keys.apply(this, arguments),
15136 for (i = 0; i < n; ++i) {
15137 for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
15138 si[j] = sij = [0, +value(data[j], ki, j, data)];
15139 sij.data = data[j];
15144 for (i = 0, oz = order(sz); i < n; ++i) {
15145 sz[oz[i]].index = i;
15152 stack.keys = function(_) {
15153 return arguments.length ? (keys = typeof _ === "function" ? _ : constant$a(slice$6.call(_)), stack) : keys;
15156 stack.value = function(_) {
15157 return arguments.length ? (value = typeof _ === "function" ? _ : constant$a(+_), stack) : value;
15160 stack.order = function(_) {
15161 return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$a(slice$6.call(_)), stack) : order;
15164 stack.offset = function(_) {
15165 return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
15171 function expand(series, order) {
15172 if (!((n = series.length) > 0)) return;
15173 for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
15174 for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
15175 if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
15177 none$1(series, order);
15180 function diverging(series, order) {
15181 if (!((n = series.length) > 1)) return;
15182 for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
15183 for (yp = yn = 0, i = 0; i < n; ++i) {
15184 if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
15185 d[0] = yp, d[1] = yp += dy;
15186 } else if (dy < 0) {
15187 d[1] = yn, d[0] = yn += dy;
15195 function silhouette(series, order) {
15196 if (!((n = series.length) > 0)) return;
15197 for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
15198 for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
15199 s0[j][1] += s0[j][0] = -y / 2;
15201 none$1(series, order);
15204 function wiggle(series, order) {
15205 if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
15206 for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
15207 for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
15208 var si = series[order[i]],
15209 sij0 = si[j][1] || 0,
15210 sij1 = si[j - 1][1] || 0,
15211 s3 = (sij0 - sij1) / 2;
15212 for (var k = 0; k < i; ++k) {
15213 var sk = series[order[k]],
15214 skj0 = sk[j][1] || 0,
15215 skj1 = sk[j - 1][1] || 0;
15218 s1 += sij0, s2 += s3 * sij0;
15220 s0[j - 1][1] += s0[j - 1][0] = y;
15221 if (s1) y -= s2 / s1;
15223 s0[j - 1][1] += s0[j - 1][0] = y;
15224 none$1(series, order);
15227 function ascending$2(series) {
15228 var sums = series.map(sum$2);
15229 return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
15232 function sum$2(series) {
15233 var s = 0, i = -1, n = series.length, v;
15234 while (++i < n) if (v = +series[i][1]) s += v;
15238 function descending$1(series) {
15239 return ascending$2(series).reverse();
15242 function insideOut(series) {
15243 var n = series.length,
15246 sums = series.map(sum$2),
15247 order = none$2(series).sort(function(a, b) { return sums[b] - sums[a]; }),
15253 for (i = 0; i < n; ++i) {
15255 if (top < bottom) {
15264 return bottoms.reverse().concat(tops);
15267 function reverse(series) {
15268 return none$2(series).reverse();
15271 function constant$b(x) {
15272 return function() {
15285 function RedBlackTree() {
15286 this._ = null; // root node
15289 function RedBlackNode(node) {
15290 node.U = // parent node
15291 node.C = // color - true for red, false for black
15292 node.L = // left node
15293 node.R = // right node
15294 node.P = // previous node
15295 node.N = null; // next node
15298 RedBlackTree.prototype = {
15299 constructor: RedBlackTree,
15301 insert: function(after, node) {
15302 var parent, grandpa, uncle;
15307 if (after.N) after.N.P = node;
15311 while (after.L) after = after.L;
15317 } else if (this._) {
15318 after = RedBlackFirst(this._);
15321 after.P = after.L = node;
15324 node.P = node.N = null;
15328 node.L = node.R = null;
15333 while (parent && parent.C) {
15334 grandpa = parent.U;
15335 if (parent === grandpa.L) {
15337 if (uncle && uncle.C) {
15338 parent.C = uncle.C = false;
15342 if (after === parent.R) {
15343 RedBlackRotateLeft(this, parent);
15349 RedBlackRotateRight(this, grandpa);
15353 if (uncle && uncle.C) {
15354 parent.C = uncle.C = false;
15358 if (after === parent.L) {
15359 RedBlackRotateRight(this, parent);
15365 RedBlackRotateLeft(this, grandpa);
15373 remove: function(node) {
15374 if (node.N) node.N.P = node.P;
15375 if (node.P) node.P.N = node.N;
15376 node.N = node.P = null;
15378 var parent = node.U,
15385 if (!left) next = right;
15386 else if (!right) next = left;
15387 else next = RedBlackFirst(right);
15390 if (parent.L === node) parent.L = next;
15391 else parent.R = next;
15396 if (left && right) {
15401 if (next !== right) {
15418 if (node) node.U = parent;
15420 if (node && node.C) { node.C = false; return; }
15423 if (node === this._) break;
15424 if (node === parent.L) {
15425 sibling = parent.R;
15429 RedBlackRotateLeft(this, parent);
15430 sibling = parent.R;
15432 if ((sibling.L && sibling.L.C)
15433 || (sibling.R && sibling.R.C)) {
15434 if (!sibling.R || !sibling.R.C) {
15435 sibling.L.C = false;
15437 RedBlackRotateRight(this, sibling);
15438 sibling = parent.R;
15440 sibling.C = parent.C;
15441 parent.C = sibling.R.C = false;
15442 RedBlackRotateLeft(this, parent);
15447 sibling = parent.L;
15451 RedBlackRotateRight(this, parent);
15452 sibling = parent.L;
15454 if ((sibling.L && sibling.L.C)
15455 || (sibling.R && sibling.R.C)) {
15456 if (!sibling.L || !sibling.L.C) {
15457 sibling.R.C = false;
15459 RedBlackRotateLeft(this, sibling);
15460 sibling = parent.L;
15462 sibling.C = parent.C;
15463 parent.C = sibling.L.C = false;
15464 RedBlackRotateRight(this, parent);
15474 if (node) node.C = false;
15478 function RedBlackRotateLeft(tree, node) {
15484 if (parent.L === p) parent.L = q;
15493 if (p.R) p.R.U = p;
15497 function RedBlackRotateRight(tree, node) {
15503 if (parent.L === p) parent.L = q;
15512 if (p.L) p.L.U = p;
15516 function RedBlackFirst(node) {
15517 while (node.L) node = node.L;
15521 function createEdge(left, right, v0, v1) {
15522 var edge = [null, null],
15523 index = edges.push(edge) - 1;
15525 edge.right = right;
15526 if (v0) setEdgeEnd(edge, left, right, v0);
15527 if (v1) setEdgeEnd(edge, right, left, v1);
15528 cells[left.index].halfedges.push(index);
15529 cells[right.index].halfedges.push(index);
15533 function createBorderEdge(left, v0, v1) {
15534 var edge = [v0, v1];
15539 function setEdgeEnd(edge, left, right, vertex) {
15540 if (!edge[0] && !edge[1]) {
15543 edge.right = right;
15544 } else if (edge.left === right) {
15551 // Liang–Barsky line clipping.
15552 function clipEdge(edge, x0, y0, x1, y1) {
15566 if (!dx && r > 0) return;
15569 if (r < t0) return;
15570 if (r < t1) t1 = r;
15571 } else if (dx > 0) {
15572 if (r > t1) return;
15573 if (r > t0) t0 = r;
15577 if (!dx && r < 0) return;
15580 if (r > t1) return;
15581 if (r > t0) t0 = r;
15582 } else if (dx > 0) {
15583 if (r < t0) return;
15584 if (r < t1) t1 = r;
15588 if (!dy && r > 0) return;
15591 if (r < t0) return;
15592 if (r < t1) t1 = r;
15593 } else if (dy > 0) {
15594 if (r > t1) return;
15595 if (r > t0) t0 = r;
15599 if (!dy && r < 0) return;
15602 if (r > t1) return;
15603 if (r > t0) t0 = r;
15604 } else if (dy > 0) {
15605 if (r < t0) return;
15606 if (r < t1) t1 = r;
15609 if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
15611 if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
15612 if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
15616 function connectEdge(edge, x0, y0, x1, y1) {
15618 if (v1) return true;
15622 right = edge.right,
15627 fx = (lx + rx) / 2,
15628 fy = (ly + ry) / 2,
15633 if (fx < x0 || fx >= x1) return;
15635 if (!v0) v0 = [fx, y0];
15636 else if (v0[1] >= y1) return;
15639 if (!v0) v0 = [fx, y1];
15640 else if (v0[1] < y0) return;
15644 fm = (lx - rx) / (ry - ly);
15646 if (fm < -1 || fm > 1) {
15648 if (!v0) v0 = [(y0 - fb) / fm, y0];
15649 else if (v0[1] >= y1) return;
15650 v1 = [(y1 - fb) / fm, y1];
15652 if (!v0) v0 = [(y1 - fb) / fm, y1];
15653 else if (v0[1] < y0) return;
15654 v1 = [(y0 - fb) / fm, y0];
15658 if (!v0) v0 = [x0, fm * x0 + fb];
15659 else if (v0[0] >= x1) return;
15660 v1 = [x1, fm * x1 + fb];
15662 if (!v0) v0 = [x1, fm * x1 + fb];
15663 else if (v0[0] < x0) return;
15664 v1 = [x0, fm * x0 + fb];
15674 function clipEdges(x0, y0, x1, y1) {
15675 var i = edges.length,
15679 if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
15680 || !clipEdge(edge, x0, y0, x1, y1)
15681 || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4
15682 || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) {
15688 function createCell(site) {
15689 return cells[site.index] = {
15695 function cellHalfedgeAngle(cell, edge) {
15696 var site = cell.site,
15699 if (site === vb) vb = va, va = site;
15700 if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
15701 if (site === va) va = edge[1], vb = edge[0];
15702 else va = edge[0], vb = edge[1];
15703 return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
15706 function cellHalfedgeStart(cell, edge) {
15707 return edge[+(edge.left !== cell.site)];
15710 function cellHalfedgeEnd(cell, edge) {
15711 return edge[+(edge.left === cell.site)];
15714 function sortCellHalfedges() {
15715 for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
15716 if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
15717 var index = new Array(m),
15718 array = new Array(m);
15719 for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
15720 index.sort(function(i, j) { return array[j] - array[i]; });
15721 for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
15722 for (j = 0; j < m; ++j) halfedges[j] = array[j];
15727 function clipCells(x0, y0, x1, y1) {
15728 var nCells = cells.length,
15743 for (iCell = 0; iCell < nCells; ++iCell) {
15744 if (cell = cells[iCell]) {
15746 halfedges = cell.halfedges;
15747 iHalfedge = halfedges.length;
15749 // Remove any dangling clipped edges.
15750 while (iHalfedge--) {
15751 if (!edges[halfedges[iHalfedge]]) {
15752 halfedges.splice(iHalfedge, 1);
15756 // Insert any border edges as necessary.
15757 iHalfedge = 0, nHalfedges = halfedges.length;
15758 while (iHalfedge < nHalfedges) {
15759 end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
15760 start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
15761 if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) {
15762 halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
15763 Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1]
15764 : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1]
15765 : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0]
15766 : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0]
15772 if (nHalfedges) cover = false;
15776 // If there weren’t any edges, have the closest site cover the extent.
15777 // It doesn’t matter which corner of the extent we measure!
15779 var dx, dy, d2, dc = Infinity;
15781 for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
15782 if (cell = cells[iCell]) {
15786 d2 = dx * dx + dy * dy;
15787 if (d2 < dc) dc = d2, cover = cell;
15792 var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
15793 cover.halfedges.push(
15794 edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
15795 edges.push(createBorderEdge(site, v01, v11)) - 1,
15796 edges.push(createBorderEdge(site, v11, v10)) - 1,
15797 edges.push(createBorderEdge(site, v10, v00)) - 1
15802 // Lastly delete any cells with no edges; these were entirely clipped.
15803 for (iCell = 0; iCell < nCells; ++iCell) {
15804 if (cell = cells[iCell]) {
15805 if (!cell.halfedges.length) {
15806 delete cells[iCell];
15812 var circlePool = [];
15816 function Circle() {
15817 RedBlackNode(this);
15825 function attachCircle(arc) {
15829 if (!lArc || !rArc) return;
15831 var lSite = lArc.site,
15835 if (lSite === rSite) return;
15839 ax = lSite[0] - bx,
15840 ay = lSite[1] - by,
15841 cx = rSite[0] - bx,
15842 cy = rSite[1] - by;
15844 var d = 2 * (ax * cy - ay * cx);
15845 if (d >= -epsilon2$2) return;
15847 var ha = ax * ax + ay * ay,
15848 hc = cx * cx + cy * cy,
15849 x = (cy * ha - ay * hc) / d,
15850 y = (ax * hc - cx * ha) / d;
15852 var circle = circlePool.pop() || new Circle;
15854 circle.site = cSite;
15856 circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
15858 arc.circle = circle;
15864 if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
15865 if (node.L) node = node.L;
15866 else { before = node.P; break; }
15868 if (node.R) node = node.R;
15869 else { before = node; break; }
15873 circles.insert(before, circle);
15874 if (!before) firstCircle = circle;
15877 function detachCircle(arc) {
15878 var circle = arc.circle;
15880 if (!circle.P) firstCircle = circle.N;
15881 circles.remove(circle);
15882 circlePool.push(circle);
15883 RedBlackNode(circle);
15888 var beachPool = [];
15891 RedBlackNode(this);
15894 this.circle = null;
15897 function createBeach(site) {
15898 var beach = beachPool.pop() || new Beach;
15903 function detachBeach(beach) {
15904 detachCircle(beach);
15905 beaches.remove(beach);
15906 beachPool.push(beach);
15907 RedBlackNode(beach);
15910 function removeBeach(beach) {
15911 var circle = beach.circle,
15915 previous = beach.P,
15917 disappearing = [beach];
15919 detachBeach(beach);
15921 var lArc = previous;
15923 && Math.abs(x - lArc.circle.x) < epsilon$4
15924 && Math.abs(y - lArc.circle.cy) < epsilon$4) {
15926 disappearing.unshift(lArc);
15931 disappearing.unshift(lArc);
15932 detachCircle(lArc);
15936 && Math.abs(x - rArc.circle.x) < epsilon$4
15937 && Math.abs(y - rArc.circle.cy) < epsilon$4) {
15939 disappearing.push(rArc);
15944 disappearing.push(rArc);
15945 detachCircle(rArc);
15947 var nArcs = disappearing.length,
15949 for (iArc = 1; iArc < nArcs; ++iArc) {
15950 rArc = disappearing[iArc];
15951 lArc = disappearing[iArc - 1];
15952 setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
15955 lArc = disappearing[0];
15956 rArc = disappearing[nArcs - 1];
15957 rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
15959 attachCircle(lArc);
15960 attachCircle(rArc);
15963 function addBeach(site) {
15965 directrix = site[1],
15973 dxl = leftBreakPoint(node, directrix) - x;
15974 if (dxl > epsilon$4) node = node.L; else {
15975 dxr = x - rightBreakPoint(node, directrix);
15976 if (dxr > epsilon$4) {
15983 if (dxl > -epsilon$4) {
15986 } else if (dxr > -epsilon$4) {
15990 lArc = rArc = node;
15998 var newArc = createBeach(site);
15999 beaches.insert(lArc, newArc);
16001 if (!lArc && !rArc) return;
16003 if (lArc === rArc) {
16004 detachCircle(lArc);
16005 rArc = createBeach(lArc.site);
16006 beaches.insert(newArc, rArc);
16007 newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
16008 attachCircle(lArc);
16009 attachCircle(rArc);
16013 if (!rArc) { // && lArc
16014 newArc.edge = createEdge(lArc.site, newArc.site);
16018 // else lArc !== rArc
16019 detachCircle(lArc);
16020 detachCircle(rArc);
16022 var lSite = lArc.site,
16028 cx = rSite[0] - ax,
16029 cy = rSite[1] - ay,
16030 d = 2 * (bx * cy - by * cx),
16031 hb = bx * bx + by * by,
16032 hc = cx * cx + cy * cy,
16033 vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
16035 setEdgeEnd(rArc.edge, lSite, rSite, vertex);
16036 newArc.edge = createEdge(lSite, site, null, vertex);
16037 rArc.edge = createEdge(site, rSite, null, vertex);
16038 attachCircle(lArc);
16039 attachCircle(rArc);
16042 function leftBreakPoint(arc, directrix) {
16043 var site = arc.site,
16046 pby2 = rfocy - directrix;
16048 if (!pby2) return rfocx;
16051 if (!lArc) return -Infinity;
16054 var lfocx = site[0],
16056 plby2 = lfocy - directrix;
16058 if (!plby2) return lfocx;
16060 var hl = lfocx - rfocx,
16061 aby2 = 1 / pby2 - 1 / plby2,
16064 if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
16066 return (rfocx + lfocx) / 2;
16069 function rightBreakPoint(arc, directrix) {
16071 if (rArc) return leftBreakPoint(rArc, directrix);
16072 var site = arc.site;
16073 return site[1] === directrix ? site[0] : Infinity;
16076 var epsilon$4 = 1e-6;
16077 var epsilon2$2 = 1e-12;
16083 function triangleArea(a, b, c) {
16084 return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
16087 function lexicographic(a, b) {
16092 function Diagram(sites, extent) {
16093 var site = sites.sort(lexicographic).pop(),
16099 cells = new Array(sites.length);
16100 beaches = new RedBlackTree;
16101 circles = new RedBlackTree;
16104 circle = firstCircle;
16105 if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
16106 if (site[0] !== x || site[1] !== y) {
16108 x = site[0], y = site[1];
16110 site = sites.pop();
16111 } else if (circle) {
16112 removeBeach(circle.arc);
16118 sortCellHalfedges();
16121 var x0 = +extent[0][0],
16122 y0 = +extent[0][1],
16123 x1 = +extent[1][0],
16124 y1 = +extent[1][1];
16125 clipEdges(x0, y0, x1, y1);
16126 clipCells(x0, y0, x1, y1);
16129 this.edges = edges;
16130 this.cells = cells;
16138 Diagram.prototype = {
16139 constructor: Diagram,
16141 polygons: function() {
16142 var edges = this.edges;
16144 return this.cells.map(function(cell) {
16145 var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
16146 polygon.data = cell.site.data;
16151 triangles: function() {
16152 var triangles = [],
16153 edges = this.edges;
16155 this.cells.forEach(function(cell, i) {
16156 if (!(m = (halfedges = cell.halfedges).length)) return;
16157 var site = cell.site,
16162 e1 = edges[halfedges[m - 1]],
16163 s1 = e1.left === site ? e1.right : e1.left;
16167 e1 = edges[halfedges[j]];
16168 s1 = e1.left === site ? e1.right : e1.left;
16169 if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
16170 triangles.push([site.data, s0.data, s1.data]);
16178 links: function() {
16179 return this.edges.filter(function(edge) {
16181 }).map(function(edge) {
16183 source: edge.left.data,
16184 target: edge.right.data
16189 find: function(x, y, radius) {
16190 var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
16192 // Use the previously-found cell, or start with an arbitrary one.
16193 while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
16194 var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
16196 // Traverse the half-edges to find a closer cell, if any.
16198 cell = that.cells[i0 = i1], i1 = null;
16199 cell.halfedges.forEach(function(e) {
16200 var edge = that.edges[e], v = edge.left;
16201 if ((v === cell.site || !v) && !(v = edge.right)) return;
16202 var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
16203 if (v2 < d2) d2 = v2, i1 = v.index;
16205 } while (i1 !== null);
16209 return radius == null || d2 <= radius * radius ? cell.site : null;
16213 function voronoi() {
16218 function voronoi(data) {
16219 return new Diagram(data.map(function(d, i) {
16220 var s = [Math.round(x$$1(d, i, data) / epsilon$4) * epsilon$4, Math.round(y$$1(d, i, data) / epsilon$4) * epsilon$4];
16227 voronoi.polygons = function(data) {
16228 return voronoi(data).polygons();
16231 voronoi.links = function(data) {
16232 return voronoi(data).links();
16235 voronoi.triangles = function(data) {
16236 return voronoi(data).triangles();
16239 voronoi.x = function(_) {
16240 return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$b(+_), voronoi) : x$$1;
16243 voronoi.y = function(_) {
16244 return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$b(+_), voronoi) : y$$1;
16247 voronoi.extent = function(_) {
16248 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]]];
16251 voronoi.size = function(_) {
16252 return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
16258 function constant$c(x) {
16259 return function() {
16264 function ZoomEvent(target, type, transform) {
16265 this.target = target;
16267 this.transform = transform;
16270 function Transform(k, x, y) {
16276 Transform.prototype = {
16277 constructor: Transform,
16278 scale: function(k) {
16279 return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
16281 translate: function(x, y) {
16282 return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
16284 apply: function(point) {
16285 return [point[0] * this.k + this.x, point[1] * this.k + this.y];
16287 applyX: function(x) {
16288 return x * this.k + this.x;
16290 applyY: function(y) {
16291 return y * this.k + this.y;
16293 invert: function(location) {
16294 return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
16296 invertX: function(x) {
16297 return (x - this.x) / this.k;
16299 invertY: function(y) {
16300 return (y - this.y) / this.k;
16302 rescaleX: function(x) {
16303 return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
16305 rescaleY: function(y) {
16306 return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
16308 toString: function() {
16309 return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
16313 var identity$7 = new Transform(1, 0, 0);
16315 transform.prototype = Transform.prototype;
16317 function transform(node) {
16318 return node.__zoom || identity$7;
16321 function nopropagation$2() {
16322 event.stopImmediatePropagation();
16325 function noevent$2() {
16326 event.preventDefault();
16327 event.stopImmediatePropagation();
16330 // Ignore right-click, since that should open the context menu.
16331 function defaultFilter$2() {
16332 return !event.button;
16335 function defaultExtent$1() {
16336 var e = this, w, h;
16337 if (e instanceof SVGElement) {
16338 e = e.ownerSVGElement || e;
16339 w = e.width.baseVal.value;
16340 h = e.height.baseVal.value;
16343 h = e.clientHeight;
16345 return [[0, 0], [w, h]];
16348 function defaultTransform() {
16349 return this.__zoom || identity$7;
16352 function defaultWheelDelta() {
16353 return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
16356 function defaultTouchable$1() {
16357 return "ontouchstart" in this;
16360 function defaultConstrain(transform$$1, extent, translateExtent) {
16361 var dx0 = transform$$1.invertX(extent[0][0]) - translateExtent[0][0],
16362 dx1 = transform$$1.invertX(extent[1][0]) - translateExtent[1][0],
16363 dy0 = transform$$1.invertY(extent[0][1]) - translateExtent[0][1],
16364 dy1 = transform$$1.invertY(extent[1][1]) - translateExtent[1][1];
16365 return transform$$1.translate(
16366 dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
16367 dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
16371 function d3_zoom() {
16372 var filter = defaultFilter$2,
16373 extent = defaultExtent$1,
16374 constrain = defaultConstrain,
16375 wheelDelta = defaultWheelDelta,
16376 touchable = defaultTouchable$1,
16377 scaleExtent = [0, Infinity],
16378 translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
16380 interpolate$$1 = interpolateZoom,
16382 listeners = dispatch("start", "zoom", "end"),
16387 clickDistance2 = 0;
16389 function zoom(selection$$1) {
16391 .property("__zoom", defaultTransform)
16392 .on("wheel.zoom", wheeled)
16393 .on("mousedown.zoom", mousedowned)
16394 .on("dblclick.zoom", dblclicked)
16396 .on("touchstart.zoom", touchstarted)
16397 .on("touchmove.zoom", touchmoved)
16398 .on("touchend.zoom touchcancel.zoom", touchended)
16399 .style("touch-action", "none")
16400 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
16403 zoom.transform = function(collection, transform$$1) {
16404 var selection$$1 = collection.selection ? collection.selection() : collection;
16405 selection$$1.property("__zoom", defaultTransform);
16406 if (collection !== selection$$1) {
16407 schedule(collection, transform$$1);
16409 selection$$1.interrupt().each(function() {
16410 gesture(this, arguments)
16412 .zoom(null, typeof transform$$1 === "function" ? transform$$1.apply(this, arguments) : transform$$1)
16418 zoom.scaleBy = function(selection$$1, k) {
16419 zoom.scaleTo(selection$$1, function() {
16420 var k0 = this.__zoom.k,
16421 k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16426 zoom.scaleTo = function(selection$$1, k) {
16427 zoom.transform(selection$$1, function() {
16428 var e = extent.apply(this, arguments),
16431 p1 = t0.invert(p0),
16432 k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16433 return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
16437 zoom.translateBy = function(selection$$1, x, y) {
16438 zoom.transform(selection$$1, function() {
16439 return constrain(this.__zoom.translate(
16440 typeof x === "function" ? x.apply(this, arguments) : x,
16441 typeof y === "function" ? y.apply(this, arguments) : y
16442 ), extent.apply(this, arguments), translateExtent);
16446 zoom.translateTo = function(selection$$1, x, y) {
16447 zoom.transform(selection$$1, function() {
16448 var e = extent.apply(this, arguments),
16451 return constrain(identity$7.translate(p[0], p[1]).scale(t.k).translate(
16452 typeof x === "function" ? -x.apply(this, arguments) : -x,
16453 typeof y === "function" ? -y.apply(this, arguments) : -y
16454 ), e, translateExtent);
16458 function scale(transform$$1, k) {
16459 k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
16460 return k === transform$$1.k ? transform$$1 : new Transform(k, transform$$1.x, transform$$1.y);
16463 function translate(transform$$1, p0, p1) {
16464 var x = p0[0] - p1[0] * transform$$1.k, y = p0[1] - p1[1] * transform$$1.k;
16465 return x === transform$$1.x && y === transform$$1.y ? transform$$1 : new Transform(transform$$1.k, x, y);
16468 function centroid(extent) {
16469 return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
16472 function schedule(transition$$1, transform$$1, center) {
16474 .on("start.zoom", function() { gesture(this, arguments).start(); })
16475 .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
16476 .tween("zoom", function() {
16479 g = gesture(that, args),
16480 e = extent.apply(that, args),
16481 p = center || centroid(e),
16482 w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
16484 b = typeof transform$$1 === "function" ? transform$$1.apply(that, args) : transform$$1,
16485 i = interpolate$$1(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
16486 return function(t) {
16487 if (t === 1) t = b; // Avoid rounding error on end.
16488 else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
16494 function gesture(that, args) {
16495 for (var i = 0, n = gestures.length, g; i < n; ++i) {
16496 if ((g = gestures[i]).that === that) {
16500 return new Gesture(that, args);
16503 function Gesture(that, args) {
16508 this.extent = extent.apply(that, args);
16511 Gesture.prototype = {
16512 start: function() {
16513 if (++this.active === 1) {
16514 this.index = gestures.push(this) - 1;
16515 this.emit("start");
16519 zoom: function(key, transform$$1) {
16520 if (this.mouse && key !== "mouse") this.mouse[1] = transform$$1.invert(this.mouse[0]);
16521 if (this.touch0 && key !== "touch") this.touch0[1] = transform$$1.invert(this.touch0[0]);
16522 if (this.touch1 && key !== "touch") this.touch1[1] = transform$$1.invert(this.touch1[0]);
16523 this.that.__zoom = transform$$1;
16528 if (--this.active === 0) {
16529 gestures.splice(this.index, 1);
16535 emit: function(type) {
16536 customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
16540 function wheeled() {
16541 if (!filter.apply(this, arguments)) return;
16542 var g = gesture(this, arguments),
16544 k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
16547 // If the mouse is in the same location as before, reuse it.
16548 // If there were recent wheel events, reset the wheel idle timeout.
16550 if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
16551 g.mouse[1] = t.invert(g.mouse[0] = p);
16553 clearTimeout(g.wheel);
16556 // If this wheel event won’t trigger a transform change, ignore it.
16557 else if (t.k === k) return;
16559 // Otherwise, capture the mouse point and location at the start.
16561 g.mouse = [p, t.invert(p)];
16567 g.wheel = setTimeout(wheelidled, wheelDelay);
16568 g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
16570 function wheelidled() {
16576 function mousedowned() {
16577 if (touchending || !filter.apply(this, arguments)) return;
16578 var g = gesture(this, arguments),
16579 v = select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
16581 x0 = event.clientX,
16582 y0 = event.clientY;
16584 nodrag(event.view);
16586 g.mouse = [p, this.__zoom.invert(p)];
16590 function mousemoved() {
16593 var dx = event.clientX - x0, dy = event.clientY - y0;
16594 g.moved = dx * dx + dy * dy > clickDistance2;
16596 g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent, translateExtent));
16599 function mouseupped() {
16600 v.on("mousemove.zoom mouseup.zoom", null);
16601 yesdrag(event.view, g.moved);
16607 function dblclicked() {
16608 if (!filter.apply(this, arguments)) return;
16609 var t0 = this.__zoom,
16611 p1 = t0.invert(p0),
16612 k1 = t0.k * (event.shiftKey ? 0.5 : 2),
16613 t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
16616 if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0);
16617 else select(this).call(zoom.transform, t1);
16620 function touchstarted() {
16621 if (!filter.apply(this, arguments)) return;
16622 var g = gesture(this, arguments),
16623 touches = event.changedTouches,
16625 n = touches.length, i, t, p;
16628 for (i = 0; i < n; ++i) {
16629 t = touches[i], p = touch(this, touches, t.identifier);
16630 p = [p, this.__zoom.invert(p), t.identifier];
16631 if (!g.touch0) g.touch0 = p, started = true;
16632 else if (!g.touch1) g.touch1 = p;
16635 // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
16636 if (touchstarting) {
16637 touchstarting = clearTimeout(touchstarting);
16640 p = select(this).on("dblclick.zoom");
16641 if (p) p.apply(this, arguments);
16647 touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
16653 function touchmoved() {
16654 var g = gesture(this, arguments),
16655 touches = event.changedTouches,
16656 n = touches.length, i, t, p, l;
16659 if (touchstarting) touchstarting = clearTimeout(touchstarting);
16660 for (i = 0; i < n; ++i) {
16661 t = touches[i], p = touch(this, touches, t.identifier);
16662 if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
16663 else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
16667 var p0 = g.touch0[0], l0 = g.touch0[1],
16668 p1 = g.touch1[0], l1 = g.touch1[1],
16669 dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
16670 dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
16671 t = scale(t, Math.sqrt(dp / dl));
16672 p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
16673 l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
16675 else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
16677 g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
16680 function touchended() {
16681 var g = gesture(this, arguments),
16682 touches = event.changedTouches,
16683 n = touches.length, i, t;
16686 if (touchending) clearTimeout(touchending);
16687 touchending = setTimeout(function() { touchending = null; }, touchDelay);
16688 for (i = 0; i < n; ++i) {
16690 if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
16691 else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
16693 if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
16694 if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
16698 zoom.wheelDelta = function(_) {
16699 return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$c(+_), zoom) : wheelDelta;
16702 zoom.filter = function(_) {
16703 return arguments.length ? (filter = typeof _ === "function" ? _ : constant$c(!!_), zoom) : filter;
16706 zoom.touchable = function(_) {
16707 return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$c(!!_), zoom) : touchable;
16710 zoom.extent = function(_) {
16711 return arguments.length ? (extent = typeof _ === "function" ? _ : constant$c([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
16714 zoom.scaleExtent = function(_) {
16715 return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
16718 zoom.translateExtent = function(_) {
16719 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]]];
16722 zoom.constrain = function(_) {
16723 return arguments.length ? (constrain = _, zoom) : constrain;
16726 zoom.duration = function(_) {
16727 return arguments.length ? (duration = +_, zoom) : duration;
16730 zoom.interpolate = function(_) {
16731 return arguments.length ? (interpolate$$1 = _, zoom) : interpolate$$1;
16734 zoom.on = function() {
16735 var value = listeners.on.apply(listeners, arguments);
16736 return value === listeners ? zoom : value;
16739 zoom.clickDistance = function(_) {
16740 return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
16748 var index$3 = /*#__PURE__*/Object.freeze({
16750 bisect: bisectRight,
16751 bisectRight: bisectRight,
16752 bisectLeft: bisectLeft,
16753 ascending: ascending,
16754 bisector: bisector,
16756 descending: d3_descending,
16757 deviation: deviation,
16759 histogram: histogram,
16760 thresholdFreedmanDiaconis: freedmanDiaconis,
16761 thresholdScott: scott,
16762 thresholdSturges: sturges,
16770 quantile: quantile,
16776 tickIncrement: tickIncrement,
16777 tickStep: tickStep,
16778 transpose: transpose,
16779 variance: variance,
16782 axisRight: axisRight,
16783 axisBottom: axisBottom,
16784 axisLeft: axisLeft,
16788 brushSelection: brushSelection,
16802 cubehelix: cubehelix,
16803 dispatch: dispatch,
16805 dragDisable: nodrag,
16806 dragEnable: yesdrag,
16808 csvParse: csvParse,
16809 csvParseRows: csvParseRows,
16810 csvFormat: csvFormat,
16811 csvFormatRows: csvFormatRows,
16812 tsvParse: tsvParse,
16813 tsvParseRows: tsvParseRows,
16814 tsvFormat: tsvFormat,
16815 tsvFormatRows: tsvFormatRows,
16816 easeLinear: linear$1,
16817 easeQuad: quadInOut,
16818 easeQuadIn: quadIn,
16819 easeQuadOut: quadOut,
16820 easeQuadInOut: quadInOut,
16821 easeCubic: cubicInOut,
16822 easeCubicIn: cubicIn,
16823 easeCubicOut: cubicOut,
16824 easeCubicInOut: cubicInOut,
16825 easePoly: polyInOut,
16826 easePolyIn: polyIn,
16827 easePolyOut: polyOut,
16828 easePolyInOut: polyInOut,
16831 easeSinOut: sinOut,
16832 easeSinInOut: sinInOut,
16835 easeExpOut: expOut,
16836 easeExpInOut: expInOut,
16837 easeCircle: circleInOut,
16838 easeCircleIn: circleIn,
16839 easeCircleOut: circleOut,
16840 easeCircleInOut: circleInOut,
16841 easeBounce: bounceOut,
16842 easeBounceIn: bounceIn,
16843 easeBounceOut: bounceOut,
16844 easeBounceInOut: bounceInOut,
16845 easeBack: backInOut,
16846 easeBackIn: backIn,
16847 easeBackOut: backOut,
16848 easeBackInOut: backInOut,
16849 easeElastic: elasticOut,
16850 easeElasticIn: elasticIn,
16851 easeElasticOut: elasticOut,
16852 easeElasticInOut: elasticInOut,
16853 forceCenter: center$1,
16854 forceCollide: collide,
16856 forceManyBody: manyBody,
16857 forceRadial: radial,
16858 forceSimulation: simulation,
16861 formatDefaultLocale: defaultLocale,
16862 get format () { return format; },
16863 get formatPrefix () { return formatPrefix; },
16864 formatLocale: formatLocale,
16865 formatSpecifier: formatSpecifier,
16866 precisionFixed: precisionFixed,
16867 precisionPrefix: precisionPrefix,
16868 precisionRound: precisionRound,
16869 geoArea: d3_geoArea,
16870 geoBounds: d3_geoBounds,
16871 geoCentroid: d3_geoCentroid,
16873 geoClipAntimeridian: clipAntimeridian,
16874 geoClipCircle: clipCircle,
16875 geoClipExtent: extent$1,
16876 geoClipRectangle: clipRectangle,
16877 geoContains: contains,
16878 geoDistance: distance,
16879 geoGraticule: graticule,
16880 geoGraticule10: graticule10,
16881 geoInterpolate: interpolate$2,
16882 geoLength: length$1,
16883 geoPath: d3_geoPath,
16885 geoAlbersUsa: albersUsa,
16886 geoAzimuthalEqualArea: azimuthalEqualArea,
16887 geoAzimuthalEqualAreaRaw: azimuthalEqualAreaRaw,
16888 geoAzimuthalEquidistant: azimuthalEquidistant,
16889 geoAzimuthalEquidistantRaw: azimuthalEquidistantRaw,
16890 geoConicConformal: conicConformal,
16891 geoConicConformalRaw: conicConformalRaw,
16892 geoConicEqualArea: conicEqualArea,
16893 geoConicEqualAreaRaw: conicEqualAreaRaw,
16894 geoConicEquidistant: conicEquidistant,
16895 geoConicEquidistantRaw: conicEquidistantRaw,
16896 geoEquirectangular: equirectangular,
16897 geoEquirectangularRaw: equirectangularRaw,
16898 geoGnomonic: gnomonic,
16899 geoGnomonicRaw: gnomonicRaw,
16900 geoIdentity: d3_geoIdentity,
16901 geoProjection: projection,
16902 geoProjectionMutator: projectionMutator,
16903 geoMercator: mercator,
16904 geoMercatorRaw: mercatorRaw,
16905 geoNaturalEarth1: naturalEarth1,
16906 geoNaturalEarth1Raw: naturalEarth1Raw,
16907 geoOrthographic: orthographic,
16908 geoOrthographicRaw: orthographicRaw,
16909 geoStereographic: stereographic,
16910 geoStereographicRaw: stereographicRaw,
16911 geoTransverseMercator: transverseMercator,
16912 geoTransverseMercatorRaw: transverseMercatorRaw,
16913 geoRotation: rotation,
16914 geoStream: geoStream,
16915 geoTransform: d3_geoTransform,
16917 hierarchy: hierarchy,
16919 packSiblings: siblings,
16920 packEnclose: enclose,
16921 partition: partition,
16922 stratify: stratify,
16925 treemapBinary: binary,
16926 treemapDice: treemapDice,
16927 treemapSlice: treemapSlice,
16928 treemapSliceDice: sliceDice,
16929 treemapSquarify: squarify,
16930 treemapResquarify: resquarify,
16931 interpolate: interpolate,
16932 interpolateArray: array$1,
16933 interpolateBasis: basis$1,
16934 interpolateBasisClosed: basisClosed,
16935 interpolateDate: date,
16936 interpolateNumber: interpolateNumber,
16937 interpolateObject: object,
16938 interpolateRound: interpolateRound,
16939 interpolateString: interpolateString,
16940 interpolateTransformCss: interpolateTransformCss,
16941 interpolateTransformSvg: interpolateTransformSvg,
16942 interpolateZoom: interpolateZoom,
16943 interpolateRgb: interpolateRgb,
16944 interpolateRgbBasis: rgbBasis,
16945 interpolateRgbBasisClosed: rgbBasisClosed,
16946 interpolateHsl: hsl$2,
16947 interpolateHslLong: hslLong,
16948 interpolateLab: lab$1,
16949 interpolateHcl: hcl$2,
16950 interpolateHclLong: hclLong,
16951 interpolateCubehelix: cubehelix$2,
16952 interpolateCubehelixLong: cubehelixLong,
16953 quantize: d3_quantize,
16955 polygonArea: d3_polygonArea,
16956 polygonCentroid: d3_polygonCentroid,
16957 polygonHull: d3_polygonHull,
16958 polygonContains: contains$1,
16959 polygonLength: length$2,
16960 quadtree: quadtree,
16962 randomUniform: uniform,
16963 randomNormal: normal,
16964 randomLogNormal: logNormal,
16965 randomBates: bates,
16966 randomIrwinHall: irwinHall,
16967 randomExponential: exponential$1,
16976 scalePoint: point$1,
16977 scaleIdentity: identity$5,
16978 scaleLinear: linear$2,
16980 scaleOrdinal: ordinal,
16981 scaleImplicit: implicit,
16984 scaleQuantile: quantile$1,
16985 scaleQuantize: quantize,
16986 scaleThreshold: threshold,
16989 schemeCategory10: category10,
16990 schemeCategory20b: category20b,
16991 schemeCategory20c: category20c,
16992 schemeCategory20: category20,
16993 interpolateCubehelixDefault: cubehelix$3,
16994 interpolateRainbow: rainbow$1,
16995 interpolateWarm: warm,
16996 interpolateCool: cool,
16997 interpolateViridis: viridis,
16998 interpolateMagma: magma,
16999 interpolateInferno: inferno,
17000 interpolatePlasma: plasma,
17001 scaleSequential: sequential,
17005 matcher: matcher$1,
17007 namespace: namespace,
17008 namespaces: namespaces,
17009 clientPoint: point,
17011 selectAll: d3_selectAll,
17012 selection: selection,
17013 selector: selector,
17014 selectorAll: selectorAll,
17017 touches: d3_touches,
17018 window: defaultView,
17019 get event () { return event; },
17020 customEvent: customEvent,
17025 areaRadial: areaRadial,
17026 radialArea: areaRadial,
17027 lineRadial: lineRadial$1,
17028 radialLine: lineRadial$1,
17029 pointRadial: pointRadial,
17030 linkHorizontal: linkHorizontal,
17031 linkVertical: linkVertical,
17032 linkRadial: linkRadial,
17035 symbolCircle: circle$2,
17036 symbolCross: cross$2,
17037 symbolDiamond: diamond,
17038 symbolSquare: square,
17040 symbolTriangle: triangle,
17042 curveBasisClosed: basisClosed$1,
17043 curveBasisOpen: basisOpen,
17044 curveBasis: basis$2,
17045 curveBundle: bundle,
17046 curveCardinalClosed: cardinalClosed,
17047 curveCardinalOpen: cardinalOpen,
17048 curveCardinal: cardinal,
17049 curveCatmullRomClosed: catmullRomClosed,
17050 curveCatmullRomOpen: catmullRomOpen,
17051 curveCatmullRom: catmullRom,
17052 curveLinearClosed: linearClosed,
17053 curveLinear: curveLinear,
17054 curveMonotoneX: monotoneX,
17055 curveMonotoneY: monotoneY,
17056 curveNatural: natural,
17058 curveStepAfter: stepAfter,
17059 curveStepBefore: stepBefore,
17061 stackOffsetExpand: expand,
17062 stackOffsetDiverging: diverging,
17063 stackOffsetNone: none$1,
17064 stackOffsetSilhouette: silhouette,
17065 stackOffsetWiggle: wiggle,
17066 stackOrderAscending: ascending$2,
17067 stackOrderDescending: descending$1,
17068 stackOrderInsideOut: insideOut,
17069 stackOrderNone: none$2,
17070 stackOrderReverse: reverse,
17071 timeInterval: newInterval,
17072 timeMillisecond: millisecond,
17073 timeMilliseconds: milliseconds,
17074 utcMillisecond: millisecond,
17075 utcMilliseconds: milliseconds,
17076 timeSecond: second,
17077 timeSeconds: seconds,
17079 utcSeconds: seconds,
17080 timeMinute: minute,
17081 timeMinutes: minutes,
17087 timeWeeks: sundays,
17088 timeSunday: sunday,
17089 timeSundays: sundays,
17090 timeMonday: monday,
17091 timeMondays: mondays,
17092 timeTuesday: tuesday,
17093 timeTuesdays: tuesdays,
17094 timeWednesday: wednesday,
17095 timeWednesdays: wednesdays,
17096 timeThursday: thursday,
17097 timeThursdays: thursdays,
17098 timeFriday: friday,
17099 timeFridays: fridays,
17100 timeSaturday: saturday,
17101 timeSaturdays: saturdays,
17103 timeMonths: months,
17106 utcMinute: utcMinute,
17107 utcMinutes: utcMinutes,
17109 utcHours: utcHours,
17112 utcWeek: utcSunday,
17113 utcWeeks: utcSundays,
17114 utcSunday: utcSunday,
17115 utcSundays: utcSundays,
17116 utcMonday: utcMonday,
17117 utcMondays: utcMondays,
17118 utcTuesday: utcTuesday,
17119 utcTuesdays: utcTuesdays,
17120 utcWednesday: utcWednesday,
17121 utcWednesdays: utcWednesdays,
17122 utcThursday: utcThursday,
17123 utcThursdays: utcThursdays,
17124 utcFriday: utcFriday,
17125 utcFridays: utcFridays,
17126 utcSaturday: utcSaturday,
17127 utcSaturdays: utcSaturdays,
17128 utcMonth: utcMonth,
17129 utcMonths: utcMonths,
17131 utcYears: utcYears,
17132 timeFormatDefaultLocale: defaultLocale$1,
17133 get timeFormat () { return timeFormat; },
17134 get timeParse () { return timeParse; },
17135 get utcFormat () { return utcFormat; },
17136 get utcParse () { return utcParse; },
17137 timeFormatLocale: formatLocale$1,
17138 isoFormat: formatIso,
17139 isoParse: parseIso,
17142 timerFlush: timerFlush,
17143 timeout: timeout$1,
17144 interval: interval$1,
17145 transition: transition,
17147 interrupt: interrupt,
17150 zoomTransform: transform,
17151 zoomIdentity: identity$7
17154 function actionAddEntity(way) {
17155 return function(graph) {
17156 return graph.replace(way);
17161 * Removes all key-value entries from the list cache.
17165 * @memberOf ListCache
17167 function listCacheClear() {
17168 this.__data__ = [];
17174 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
17175 * comparison between two values to determine if they are equivalent.
17181 * @param {*} value The value to compare.
17182 * @param {*} other The other value to compare.
17183 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
17186 * var object = { 'a': 1 };
17187 * var other = { 'a': 1 };
17189 * _.eq(object, object);
17192 * _.eq(object, other);
17198 * _.eq('a', Object('a'));
17204 function eq(value, other) {
17205 return value === other || (value !== value && other !== other);
17209 * Gets the index at which the `key` is found in `array` of key-value pairs.
17212 * @param {Array} array The array to inspect.
17213 * @param {*} key The key to search for.
17214 * @returns {number} Returns the index of the matched value, else `-1`.
17216 function assocIndexOf(array, key) {
17217 var length = array.length;
17219 if (eq(array[length][0], key)) {
17226 /** Used for built-in method references. */
17227 var arrayProto = Array.prototype;
17229 /** Built-in value references. */
17230 var splice = arrayProto.splice;
17233 * Removes `key` and its value from the list cache.
17237 * @memberOf ListCache
17238 * @param {string} key The key of the value to remove.
17239 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17241 function listCacheDelete(key) {
17242 var data = this.__data__,
17243 index = assocIndexOf(data, key);
17248 var lastIndex = data.length - 1;
17249 if (index == lastIndex) {
17252 splice.call(data, index, 1);
17259 * Gets the list cache value for `key`.
17263 * @memberOf ListCache
17264 * @param {string} key The key of the value to get.
17265 * @returns {*} Returns the entry value.
17267 function listCacheGet(key) {
17268 var data = this.__data__,
17269 index = assocIndexOf(data, key);
17271 return index < 0 ? undefined : data[index][1];
17275 * Checks if a list cache value for `key` exists.
17279 * @memberOf ListCache
17280 * @param {string} key The key of the entry to check.
17281 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17283 function listCacheHas(key) {
17284 return assocIndexOf(this.__data__, key) > -1;
17288 * Sets the list cache `key` to `value`.
17292 * @memberOf ListCache
17293 * @param {string} key The key of the value to set.
17294 * @param {*} value The value to set.
17295 * @returns {Object} Returns the list cache instance.
17297 function listCacheSet(key, value) {
17298 var data = this.__data__,
17299 index = assocIndexOf(data, key);
17303 data.push([key, value]);
17305 data[index][1] = value;
17311 * Creates an list cache object.
17315 * @param {Array} [entries] The key-value pairs to cache.
17317 function ListCache(entries) {
17319 length = entries == null ? 0 : entries.length;
17322 while (++index < length) {
17323 var entry = entries[index];
17324 this.set(entry[0], entry[1]);
17328 // Add methods to `ListCache`.
17329 ListCache.prototype.clear = listCacheClear;
17330 ListCache.prototype['delete'] = listCacheDelete;
17331 ListCache.prototype.get = listCacheGet;
17332 ListCache.prototype.has = listCacheHas;
17333 ListCache.prototype.set = listCacheSet;
17336 * Removes all key-value entries from the stack.
17342 function stackClear() {
17343 this.__data__ = new ListCache;
17348 * Removes `key` and its value from the stack.
17353 * @param {string} key The key of the value to remove.
17354 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17356 function stackDelete(key) {
17357 var data = this.__data__,
17358 result = data['delete'](key);
17360 this.size = data.size;
17365 * Gets the stack value for `key`.
17370 * @param {string} key The key of the value to get.
17371 * @returns {*} Returns the entry value.
17373 function stackGet(key) {
17374 return this.__data__.get(key);
17378 * Checks if a stack value for `key` exists.
17383 * @param {string} key The key of the entry to check.
17384 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17386 function stackHas(key) {
17387 return this.__data__.has(key);
17390 /** Detect free variable `global` from Node.js. */
17391 var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
17393 /** Detect free variable `self`. */
17394 var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
17396 /** Used as a reference to the global object. */
17397 var root$2 = freeGlobal || freeSelf || Function('return this')();
17399 /** Built-in value references. */
17400 var Symbol = root$2.Symbol;
17402 /** Used for built-in method references. */
17403 var objectProto = Object.prototype;
17405 /** Used to check objects for own properties. */
17406 var hasOwnProperty = objectProto.hasOwnProperty;
17409 * Used to resolve the
17410 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17413 var nativeObjectToString = objectProto.toString;
17415 /** Built-in value references. */
17416 var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
17419 * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
17422 * @param {*} value The value to query.
17423 * @returns {string} Returns the raw `toStringTag`.
17425 function getRawTag(value) {
17426 var isOwn = hasOwnProperty.call(value, symToStringTag),
17427 tag = value[symToStringTag];
17430 value[symToStringTag] = undefined;
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 // Use `util.types` for Node.js 10+.
18388 var types = freeModule$1 && freeModule$1.require && freeModule$1.require('util').types;
18394 // Legacy `process.binding('util')` for Node.js < 10.
18395 return freeProcess && freeProcess.binding && freeProcess.binding('util');
18399 /* Node.js helper references. */
18400 var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
18403 * Checks if `value` is classified as a typed array.
18409 * @param {*} value The value to check.
18410 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18413 * _.isTypedArray(new Uint8Array);
18416 * _.isTypedArray([]);
18419 var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
18421 /** Used for built-in method references. */
18422 var objectProto$7 = Object.prototype;
18424 /** Used to check objects for own properties. */
18425 var hasOwnProperty$6 = objectProto$7.hasOwnProperty;
18428 * Creates an array of the enumerable property names of the array-like `value`.
18431 * @param {*} value The value to query.
18432 * @param {boolean} inherited Specify returning inherited property names.
18433 * @returns {Array} Returns the array of property names.
18435 function arrayLikeKeys(value, inherited) {
18436 var isArr = isArray(value),
18437 isArg = !isArr && isArguments(value),
18438 isBuff = !isArr && !isArg && isBuffer(value),
18439 isType = !isArr && !isArg && !isBuff && isTypedArray(value),
18440 skipIndexes = isArr || isArg || isBuff || isType,
18441 result = skipIndexes ? baseTimes(value.length, String) : [],
18442 length = result.length;
18444 for (var key in value) {
18445 if ((inherited || hasOwnProperty$6.call(value, key)) &&
18447 // Safari 9 has enumerable `arguments.length` in strict mode.
18449 // Node.js 0.10 has enumerable non-index properties on buffers.
18450 (isBuff && (key == 'offset' || key == 'parent')) ||
18451 // PhantomJS 2 has enumerable non-index properties on typed arrays.
18452 (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
18453 // Skip index properties.
18454 isIndex(key, length)
18462 /** Used for built-in method references. */
18463 var objectProto$8 = Object.prototype;
18466 * Checks if `value` is likely a prototype object.
18469 * @param {*} value The value to check.
18470 * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
18472 function isPrototype(value) {
18473 var Ctor = value && value.constructor,
18474 proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$8;
18476 return value === proto;
18480 * Creates a unary function that invokes `func` with its argument transformed.
18483 * @param {Function} func The function to wrap.
18484 * @param {Function} transform The argument transform.
18485 * @returns {Function} Returns the new function.
18487 function overArg(func, transform) {
18488 return function(arg) {
18489 return func(transform(arg));
18493 /* Built-in method references for those with the same name as other `lodash` methods. */
18494 var nativeKeys = overArg(Object.keys, Object);
18496 /** Used for built-in method references. */
18497 var objectProto$9 = Object.prototype;
18499 /** Used to check objects for own properties. */
18500 var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
18503 * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
18506 * @param {Object} object The object to query.
18507 * @returns {Array} Returns the array of property names.
18509 function baseKeys(object) {
18510 if (!isPrototype(object)) {
18511 return nativeKeys(object);
18514 for (var key in Object(object)) {
18515 if (hasOwnProperty$7.call(object, key) && key != 'constructor') {
18523 * Checks if `value` is array-like. A value is considered array-like if it's
18524 * not a function and has a `value.length` that's an integer greater than or
18525 * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
18531 * @param {*} value The value to check.
18532 * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
18535 * _.isArrayLike([1, 2, 3]);
18538 * _.isArrayLike(document.body.children);
18541 * _.isArrayLike('abc');
18544 * _.isArrayLike(_.noop);
18547 function isArrayLike(value) {
18548 return value != null && isLength(value.length) && !isFunction(value);
18552 * Creates an array of the own enumerable property names of `object`.
18554 * **Note:** Non-object values are coerced to objects. See the
18555 * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18556 * for more details.
18562 * @param {Object} object The object to query.
18563 * @returns {Array} Returns the array of property names.
18571 * Foo.prototype.c = 3;
18574 * // => ['a', 'b'] (iteration order is not guaranteed)
18579 function keys$1(object) {
18580 return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
18584 * The base implementation of `_.assign` without support for multiple sources
18585 * or `customizer` functions.
18588 * @param {Object} object The destination object.
18589 * @param {Object} source The source object.
18590 * @returns {Object} Returns `object`.
18592 function baseAssign(object, source) {
18593 return object && copyObject(source, keys$1(source), object);
18597 * This function is like
18598 * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18599 * except that it includes inherited enumerable properties.
18602 * @param {Object} object The object to query.
18603 * @returns {Array} Returns the array of property names.
18605 function nativeKeysIn(object) {
18607 if (object != null) {
18608 for (var key in Object(object)) {
18615 /** Used for built-in method references. */
18616 var objectProto$a = Object.prototype;
18618 /** Used to check objects for own properties. */
18619 var hasOwnProperty$8 = objectProto$a.hasOwnProperty;
18622 * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
18625 * @param {Object} object The object to query.
18626 * @returns {Array} Returns the array of property names.
18628 function baseKeysIn(object) {
18629 if (!isObject(object)) {
18630 return nativeKeysIn(object);
18632 var isProto = isPrototype(object),
18635 for (var key in object) {
18636 if (!(key == 'constructor' && (isProto || !hasOwnProperty$8.call(object, key)))) {
18644 * Creates an array of the own and inherited enumerable property names of `object`.
18646 * **Note:** Non-object values are coerced to objects.
18652 * @param {Object} object The object to query.
18653 * @returns {Array} Returns the array of property names.
18661 * Foo.prototype.c = 3;
18663 * _.keysIn(new Foo);
18664 * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
18666 function keysIn$1(object) {
18667 return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
18671 * The base implementation of `_.assignIn` without support for multiple sources
18672 * or `customizer` functions.
18675 * @param {Object} object The destination object.
18676 * @param {Object} source The source object.
18677 * @returns {Object} Returns `object`.
18679 function baseAssignIn(object, source) {
18680 return object && copyObject(source, keysIn$1(source), object);
18683 /** Detect free variable `exports`. */
18684 var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18686 /** Detect free variable `module`. */
18687 var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
18689 /** Detect the popular CommonJS extension `module.exports`. */
18690 var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
18692 /** Built-in value references. */
18693 var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined,
18694 allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
18697 * Creates a clone of `buffer`.
18700 * @param {Buffer} buffer The buffer to clone.
18701 * @param {boolean} [isDeep] Specify a deep clone.
18702 * @returns {Buffer} Returns the cloned buffer.
18704 function cloneBuffer(buffer, isDeep) {
18706 return buffer.slice();
18708 var length = buffer.length,
18709 result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
18711 buffer.copy(result);
18716 * Copies the values of `source` to `array`.
18719 * @param {Array} source The array to copy values from.
18720 * @param {Array} [array=[]] The array to copy values to.
18721 * @returns {Array} Returns `array`.
18723 function copyArray(source, array) {
18725 length = source.length;
18727 array || (array = Array(length));
18728 while (++index < length) {
18729 array[index] = source[index];
18735 * A specialized version of `_.filter` for arrays without support for
18736 * iteratee shorthands.
18739 * @param {Array} [array] The array to iterate over.
18740 * @param {Function} predicate The function invoked per iteration.
18741 * @returns {Array} Returns the new filtered array.
18743 function arrayFilter(array, predicate) {
18745 length = array == null ? 0 : array.length,
18749 while (++index < length) {
18750 var value = array[index];
18751 if (predicate(value, index, array)) {
18752 result[resIndex++] = value;
18759 * This method returns a new empty array.
18765 * @returns {Array} Returns the new empty array.
18768 * var arrays = _.times(2, _.stubArray);
18770 * console.log(arrays);
18773 * console.log(arrays[0] === arrays[1]);
18776 function stubArray() {
18780 /** Used for built-in method references. */
18781 var objectProto$b = Object.prototype;
18783 /** Built-in value references. */
18784 var propertyIsEnumerable$1 = objectProto$b.propertyIsEnumerable;
18786 /* Built-in method references for those with the same name as other `lodash` methods. */
18787 var nativeGetSymbols = Object.getOwnPropertySymbols;
18790 * Creates an array of the own enumerable symbols of `object`.
18793 * @param {Object} object The object to query.
18794 * @returns {Array} Returns the array of symbols.
18796 var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
18797 if (object == null) {
18800 object = Object(object);
18801 return arrayFilter(nativeGetSymbols(object), function(symbol) {
18802 return propertyIsEnumerable$1.call(object, symbol);
18807 * Copies own symbols of `source` to `object`.
18810 * @param {Object} source The object to copy symbols from.
18811 * @param {Object} [object={}] The object to copy symbols to.
18812 * @returns {Object} Returns `object`.
18814 function copySymbols(source, object) {
18815 return copyObject(source, getSymbols(source), object);
18819 * Appends the elements of `values` to `array`.
18822 * @param {Array} array The array to modify.
18823 * @param {Array} values The values to append.
18824 * @returns {Array} Returns `array`.
18826 function arrayPush(array, values) {
18828 length = values.length,
18829 offset = array.length;
18831 while (++index < length) {
18832 array[offset + index] = values[index];
18837 /** Built-in value references. */
18838 var getPrototype = overArg(Object.getPrototypeOf, Object);
18840 /* Built-in method references for those with the same name as other `lodash` methods. */
18841 var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
18844 * Creates an array of the own and inherited enumerable symbols of `object`.
18847 * @param {Object} object The object to query.
18848 * @returns {Array} Returns the array of symbols.
18850 var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
18853 arrayPush(result, getSymbols(object));
18854 object = getPrototype(object);
18860 * Copies own and inherited symbols of `source` to `object`.
18863 * @param {Object} source The object to copy symbols from.
18864 * @param {Object} [object={}] The object to copy symbols to.
18865 * @returns {Object} Returns `object`.
18867 function copySymbolsIn(source, object) {
18868 return copyObject(source, getSymbolsIn(source), object);
18872 * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
18873 * `keysFunc` and `symbolsFunc` to get the enumerable property names and
18874 * symbols of `object`.
18877 * @param {Object} object The object to query.
18878 * @param {Function} keysFunc The function to get the keys of `object`.
18879 * @param {Function} symbolsFunc The function to get the symbols of `object`.
18880 * @returns {Array} Returns the array of property names and symbols.
18882 function baseGetAllKeys(object, keysFunc, symbolsFunc) {
18883 var result = keysFunc(object);
18884 return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
18888 * Creates an array of own enumerable property names and symbols of `object`.
18891 * @param {Object} object The object to query.
18892 * @returns {Array} Returns the array of property names and symbols.
18894 function getAllKeys(object) {
18895 return baseGetAllKeys(object, keys$1, getSymbols);
18899 * Creates an array of own and inherited enumerable property names and
18900 * symbols of `object`.
18903 * @param {Object} object The object to query.
18904 * @returns {Array} Returns the array of property names and symbols.
18906 function getAllKeysIn(object) {
18907 return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
18910 /* Built-in method references that are verified to be native. */
18911 var DataView = getNative(root$2, 'DataView');
18913 /* Built-in method references that are verified to be native. */
18914 var Promise = getNative(root$2, 'Promise');
18916 /* Built-in method references that are verified to be native. */
18917 var Set$1 = getNative(root$2, 'Set');
18919 /* Built-in method references that are verified to be native. */
18920 var WeakMap = getNative(root$2, 'WeakMap');
18922 /** `Object#toString` result references. */
18923 var mapTag$1 = '[object Map]',
18924 objectTag$1 = '[object Object]',
18925 promiseTag = '[object Promise]',
18926 setTag$1 = '[object Set]',
18927 weakMapTag$1 = '[object WeakMap]';
18929 var dataViewTag$1 = '[object DataView]';
18931 /** Used to detect maps, sets, and weakmaps. */
18932 var dataViewCtorString = toSource(DataView),
18933 mapCtorString = toSource(Map$1),
18934 promiseCtorString = toSource(Promise),
18935 setCtorString = toSource(Set$1),
18936 weakMapCtorString = toSource(WeakMap);
18939 * Gets the `toStringTag` of `value`.
18942 * @param {*} value The value to query.
18943 * @returns {string} Returns the `toStringTag`.
18945 var getTag = baseGetTag;
18947 // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
18948 if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$1) ||
18949 (Map$1 && getTag(new Map$1) != mapTag$1) ||
18950 (Promise && getTag(Promise.resolve()) != promiseTag) ||
18951 (Set$1 && getTag(new Set$1) != setTag$1) ||
18952 (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
18953 getTag = function(value) {
18954 var result = baseGetTag(value),
18955 Ctor = result == objectTag$1 ? value.constructor : undefined,
18956 ctorString = Ctor ? toSource(Ctor) : '';
18959 switch (ctorString) {
18960 case dataViewCtorString: return dataViewTag$1;
18961 case mapCtorString: return mapTag$1;
18962 case promiseCtorString: return promiseTag;
18963 case setCtorString: return setTag$1;
18964 case weakMapCtorString: return weakMapTag$1;
18971 var getTag$1 = getTag;
18973 /** Used for built-in method references. */
18974 var objectProto$c = Object.prototype;
18976 /** Used to check objects for own properties. */
18977 var hasOwnProperty$9 = objectProto$c.hasOwnProperty;
18980 * Initializes an array clone.
18983 * @param {Array} array The array to clone.
18984 * @returns {Array} Returns the initialized clone.
18986 function initCloneArray(array) {
18987 var length = array.length,
18988 result = new array.constructor(length);
18990 // Add properties assigned by `RegExp#exec`.
18991 if (length && typeof array[0] == 'string' && hasOwnProperty$9.call(array, 'index')) {
18992 result.index = array.index;
18993 result.input = array.input;
18998 /** Built-in value references. */
18999 var Uint8Array = root$2.Uint8Array;
19002 * Creates a clone of `arrayBuffer`.
19005 * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
19006 * @returns {ArrayBuffer} Returns the cloned array buffer.
19008 function cloneArrayBuffer(arrayBuffer) {
19009 var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
19010 new Uint8Array(result).set(new Uint8Array(arrayBuffer));
19015 * Creates a clone of `dataView`.
19018 * @param {Object} dataView The data view to clone.
19019 * @param {boolean} [isDeep] Specify a deep clone.
19020 * @returns {Object} Returns the cloned data view.
19022 function cloneDataView(dataView, isDeep) {
19023 var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
19024 return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
19027 /** Used to match `RegExp` flags from their coerced string values. */
19028 var reFlags = /\w*$/;
19031 * Creates a clone of `regexp`.
19034 * @param {Object} regexp The regexp to clone.
19035 * @returns {Object} Returns the cloned regexp.
19037 function cloneRegExp(regexp) {
19038 var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
19039 result.lastIndex = regexp.lastIndex;
19043 /** Used to convert symbols to primitives and strings. */
19044 var symbolProto = Symbol ? Symbol.prototype : undefined,
19045 symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
19048 * Creates a clone of the `symbol` object.
19051 * @param {Object} symbol The symbol object to clone.
19052 * @returns {Object} Returns the cloned symbol object.
19054 function cloneSymbol(symbol) {
19055 return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
19059 * Creates a clone of `typedArray`.
19062 * @param {Object} typedArray The typed array to clone.
19063 * @param {boolean} [isDeep] Specify a deep clone.
19064 * @returns {Object} Returns the cloned typed array.
19066 function cloneTypedArray(typedArray, isDeep) {
19067 var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
19068 return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
19071 /** `Object#toString` result references. */
19072 var boolTag$1 = '[object Boolean]',
19073 dateTag$1 = '[object Date]',
19074 mapTag$2 = '[object Map]',
19075 numberTag$1 = '[object Number]',
19076 regexpTag$1 = '[object RegExp]',
19077 setTag$2 = '[object Set]',
19078 stringTag$1 = '[object String]',
19079 symbolTag = '[object Symbol]';
19081 var arrayBufferTag$1 = '[object ArrayBuffer]',
19082 dataViewTag$2 = '[object DataView]',
19083 float32Tag$1 = '[object Float32Array]',
19084 float64Tag$1 = '[object Float64Array]',
19085 int8Tag$1 = '[object Int8Array]',
19086 int16Tag$1 = '[object Int16Array]',
19087 int32Tag$1 = '[object Int32Array]',
19088 uint8Tag$1 = '[object Uint8Array]',
19089 uint8ClampedTag$1 = '[object Uint8ClampedArray]',
19090 uint16Tag$1 = '[object Uint16Array]',
19091 uint32Tag$1 = '[object Uint32Array]';
19094 * Initializes an object clone based on its `toStringTag`.
19096 * **Note:** This function only supports cloning values with tags of
19097 * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
19100 * @param {Object} object The object to clone.
19101 * @param {string} tag The `toStringTag` of the object to clone.
19102 * @param {boolean} [isDeep] Specify a deep clone.
19103 * @returns {Object} Returns the initialized clone.
19105 function initCloneByTag(object, tag, isDeep) {
19106 var Ctor = object.constructor;
19108 case arrayBufferTag$1:
19109 return cloneArrayBuffer(object);
19113 return new Ctor(+object);
19115 case dataViewTag$2:
19116 return cloneDataView(object, isDeep);
19118 case float32Tag$1: case float64Tag$1:
19119 case int8Tag$1: case int16Tag$1: case int32Tag$1:
19120 case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1:
19121 return cloneTypedArray(object, isDeep);
19128 return new Ctor(object);
19131 return cloneRegExp(object);
19137 return cloneSymbol(object);
19141 /** Built-in value references. */
19142 var objectCreate = Object.create;
19145 * The base implementation of `_.create` without support for assigning
19146 * properties to the created object.
19149 * @param {Object} proto The object to inherit from.
19150 * @returns {Object} Returns the new object.
19152 var baseCreate = (function() {
19153 function object() {}
19154 return function(proto) {
19155 if (!isObject(proto)) {
19158 if (objectCreate) {
19159 return objectCreate(proto);
19161 object.prototype = proto;
19162 var result = new object;
19163 object.prototype = undefined;
19169 * Initializes an object clone.
19172 * @param {Object} object The object to clone.
19173 * @returns {Object} Returns the initialized clone.
19175 function initCloneObject(object) {
19176 return (typeof object.constructor == 'function' && !isPrototype(object))
19177 ? baseCreate(getPrototype(object))
19181 /** `Object#toString` result references. */
19182 var mapTag$3 = '[object Map]';
19185 * The base implementation of `_.isMap` without Node.js optimizations.
19188 * @param {*} value The value to check.
19189 * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19191 function baseIsMap(value) {
19192 return isObjectLike(value) && getTag$1(value) == mapTag$3;
19195 /* Node.js helper references. */
19196 var nodeIsMap = nodeUtil && nodeUtil.isMap;
19199 * Checks if `value` is classified as a `Map` object.
19205 * @param {*} value The value to check.
19206 * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19209 * _.isMap(new Map);
19212 * _.isMap(new WeakMap);
19215 var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
19217 /** `Object#toString` result references. */
19218 var setTag$3 = '[object Set]';
19221 * The base implementation of `_.isSet` without Node.js optimizations.
19224 * @param {*} value The value to check.
19225 * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19227 function baseIsSet(value) {
19228 return isObjectLike(value) && getTag$1(value) == setTag$3;
19231 /* Node.js helper references. */
19232 var nodeIsSet = nodeUtil && nodeUtil.isSet;
19235 * Checks if `value` is classified as a `Set` object.
19241 * @param {*} value The value to check.
19242 * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19245 * _.isSet(new Set);
19248 * _.isSet(new WeakSet);
19251 var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
19253 /** Used to compose bitmasks for cloning. */
19254 var CLONE_DEEP_FLAG = 1,
19255 CLONE_FLAT_FLAG = 2,
19256 CLONE_SYMBOLS_FLAG = 4;
19258 /** `Object#toString` result references. */
19259 var argsTag$2 = '[object Arguments]',
19260 arrayTag$1 = '[object Array]',
19261 boolTag$2 = '[object Boolean]',
19262 dateTag$2 = '[object Date]',
19263 errorTag$1 = '[object Error]',
19264 funcTag$2 = '[object Function]',
19265 genTag$1 = '[object GeneratorFunction]',
19266 mapTag$4 = '[object Map]',
19267 numberTag$2 = '[object Number]',
19268 objectTag$2 = '[object Object]',
19269 regexpTag$2 = '[object RegExp]',
19270 setTag$4 = '[object Set]',
19271 stringTag$2 = '[object String]',
19272 symbolTag$1 = '[object Symbol]',
19273 weakMapTag$2 = '[object WeakMap]';
19275 var arrayBufferTag$2 = '[object ArrayBuffer]',
19276 dataViewTag$3 = '[object DataView]',
19277 float32Tag$2 = '[object Float32Array]',
19278 float64Tag$2 = '[object Float64Array]',
19279 int8Tag$2 = '[object Int8Array]',
19280 int16Tag$2 = '[object Int16Array]',
19281 int32Tag$2 = '[object Int32Array]',
19282 uint8Tag$2 = '[object Uint8Array]',
19283 uint8ClampedTag$2 = '[object Uint8ClampedArray]',
19284 uint16Tag$2 = '[object Uint16Array]',
19285 uint32Tag$2 = '[object Uint32Array]';
19287 /** Used to identify `toStringTag` values supported by `_.clone`. */
19288 var cloneableTags = {};
19289 cloneableTags[argsTag$2] = cloneableTags[arrayTag$1] =
19290 cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] =
19291 cloneableTags[boolTag$2] = cloneableTags[dateTag$2] =
19292 cloneableTags[float32Tag$2] = cloneableTags[float64Tag$2] =
19293 cloneableTags[int8Tag$2] = cloneableTags[int16Tag$2] =
19294 cloneableTags[int32Tag$2] = cloneableTags[mapTag$4] =
19295 cloneableTags[numberTag$2] = cloneableTags[objectTag$2] =
19296 cloneableTags[regexpTag$2] = cloneableTags[setTag$4] =
19297 cloneableTags[stringTag$2] = cloneableTags[symbolTag$1] =
19298 cloneableTags[uint8Tag$2] = cloneableTags[uint8ClampedTag$2] =
19299 cloneableTags[uint16Tag$2] = cloneableTags[uint32Tag$2] = true;
19300 cloneableTags[errorTag$1] = cloneableTags[funcTag$2] =
19301 cloneableTags[weakMapTag$2] = false;
19304 * The base implementation of `_.clone` and `_.cloneDeep` which tracks
19305 * traversed objects.
19308 * @param {*} value The value to clone.
19309 * @param {boolean} bitmask The bitmask flags.
19311 * 2 - Flatten inherited properties
19312 * 4 - Clone symbols
19313 * @param {Function} [customizer] The function to customize cloning.
19314 * @param {string} [key] The key of `value`.
19315 * @param {Object} [object] The parent object of `value`.
19316 * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
19317 * @returns {*} Returns the cloned value.
19319 function baseClone(value, bitmask, customizer, key, object, stack) {
19321 isDeep = bitmask & CLONE_DEEP_FLAG,
19322 isFlat = bitmask & CLONE_FLAT_FLAG,
19323 isFull = bitmask & CLONE_SYMBOLS_FLAG;
19326 result = object ? customizer(value, key, object, stack) : customizer(value);
19328 if (result !== undefined) {
19331 if (!isObject(value)) {
19334 var isArr = isArray(value);
19336 result = initCloneArray(value);
19338 return copyArray(value, result);
19341 var tag = getTag$1(value),
19342 isFunc = tag == funcTag$2 || tag == genTag$1;
19344 if (isBuffer(value)) {
19345 return cloneBuffer(value, isDeep);
19347 if (tag == objectTag$2 || tag == argsTag$2 || (isFunc && !object)) {
19348 result = (isFlat || isFunc) ? {} : initCloneObject(value);
19351 ? copySymbolsIn(value, baseAssignIn(result, value))
19352 : copySymbols(value, baseAssign(result, value));
19355 if (!cloneableTags[tag]) {
19356 return object ? value : {};
19358 result = initCloneByTag(value, tag, isDeep);
19361 // Check for circular references and return its corresponding clone.
19362 stack || (stack = new Stack);
19363 var stacked = stack.get(value);
19367 stack.set(value, result);
19369 if (isSet(value)) {
19370 value.forEach(function(subValue) {
19371 result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
19377 if (isMap(value)) {
19378 value.forEach(function(subValue, key) {
19379 result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
19385 var keysFunc = isFull
19386 ? (isFlat ? getAllKeysIn : getAllKeys)
19387 : (isFlat ? keysIn : keys$1);
19389 var props = isArr ? undefined : keysFunc(value);
19390 arrayEach(props || value, function(subValue, key) {
19393 subValue = value[key];
19395 // Recursively populate clone (susceptible to call stack limits).
19396 assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
19401 /** Used to compose bitmasks for cloning. */
19402 var CLONE_SYMBOLS_FLAG$1 = 4;
19405 * Creates a shallow clone of `value`.
19407 * **Note:** This method is loosely based on the
19408 * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
19409 * and supports cloning arrays, array buffers, booleans, date objects, maps,
19410 * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
19411 * arrays. The own enumerable properties of `arguments` objects are cloned
19412 * as plain objects. An empty object is returned for uncloneable values such
19413 * as error objects, functions, DOM nodes, and WeakMaps.
19419 * @param {*} value The value to clone.
19420 * @returns {*} Returns the cloned value.
19424 * var objects = [{ 'a': 1 }, { 'b': 2 }];
19426 * var shallow = _.clone(objects);
19427 * console.log(shallow[0] === objects[0]);
19430 function clone(value) {
19431 return baseClone(value, CLONE_SYMBOLS_FLAG$1);
19435 * A specialized version of `baseAggregator` for arrays.
19438 * @param {Array} [array] The array to iterate over.
19439 * @param {Function} setter The function to set `accumulator` values.
19440 * @param {Function} iteratee The iteratee to transform keys.
19441 * @param {Object} accumulator The initial aggregated object.
19442 * @returns {Function} Returns `accumulator`.
19444 function arrayAggregator(array, setter, iteratee, accumulator) {
19446 length = array == null ? 0 : array.length;
19448 while (++index < length) {
19449 var value = array[index];
19450 setter(accumulator, value, iteratee(value), array);
19452 return accumulator;
19456 * Creates a base function for methods like `_.forIn` and `_.forOwn`.
19459 * @param {boolean} [fromRight] Specify iterating from right to left.
19460 * @returns {Function} Returns the new base function.
19462 function createBaseFor(fromRight) {
19463 return function(object, iteratee, keysFunc) {
19465 iterable = Object(object),
19466 props = keysFunc(object),
19467 length = props.length;
19470 var key = props[fromRight ? length : ++index];
19471 if (iteratee(iterable[key], key, iterable) === false) {
19480 * The base implementation of `baseForOwn` which iterates over `object`
19481 * properties returned by `keysFunc` and invokes `iteratee` for each property.
19482 * Iteratee functions may exit iteration early by explicitly returning `false`.
19485 * @param {Object} object The object to iterate over.
19486 * @param {Function} iteratee The function invoked per iteration.
19487 * @param {Function} keysFunc The function to get the keys of `object`.
19488 * @returns {Object} Returns `object`.
19490 var baseFor = createBaseFor();
19493 * The base implementation of `_.forOwn` without support for iteratee shorthands.
19496 * @param {Object} object The object to iterate over.
19497 * @param {Function} iteratee The function invoked per iteration.
19498 * @returns {Object} Returns `object`.
19500 function baseForOwn(object, iteratee) {
19501 return object && baseFor(object, iteratee, keys$1);
19505 * Creates a `baseEach` or `baseEachRight` function.
19508 * @param {Function} eachFunc The function to iterate over a collection.
19509 * @param {boolean} [fromRight] Specify iterating from right to left.
19510 * @returns {Function} Returns the new base function.
19512 function createBaseEach(eachFunc, fromRight) {
19513 return function(collection, iteratee) {
19514 if (collection == null) {
19517 if (!isArrayLike(collection)) {
19518 return eachFunc(collection, iteratee);
19520 var length = collection.length,
19521 index = fromRight ? length : -1,
19522 iterable = Object(collection);
19524 while ((fromRight ? index-- : ++index < length)) {
19525 if (iteratee(iterable[index], index, iterable) === false) {
19534 * The base implementation of `_.forEach` without support for iteratee shorthands.
19537 * @param {Array|Object} collection The collection to iterate over.
19538 * @param {Function} iteratee The function invoked per iteration.
19539 * @returns {Array|Object} Returns `collection`.
19541 var baseEach = createBaseEach(baseForOwn);
19544 * Aggregates elements of `collection` on `accumulator` with keys transformed
19545 * by `iteratee` and values set by `setter`.
19548 * @param {Array|Object} collection The collection to iterate over.
19549 * @param {Function} setter The function to set `accumulator` values.
19550 * @param {Function} iteratee The iteratee to transform keys.
19551 * @param {Object} accumulator The initial aggregated object.
19552 * @returns {Function} Returns `accumulator`.
19554 function baseAggregator(collection, setter, iteratee, accumulator) {
19555 baseEach(collection, function(value, key, collection) {
19556 setter(accumulator, value, iteratee(value), collection);
19558 return accumulator;
19561 /** Used to stand-in for `undefined` hash values. */
19562 var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
19565 * Adds `value` to the array cache.
19569 * @memberOf SetCache
19571 * @param {*} value The value to cache.
19572 * @returns {Object} Returns the cache instance.
19574 function setCacheAdd(value) {
19575 this.__data__.set(value, HASH_UNDEFINED$2);
19580 * Checks if `value` is in the array cache.
19584 * @memberOf SetCache
19585 * @param {*} value The value to search for.
19586 * @returns {number} Returns `true` if `value` is found, else `false`.
19588 function setCacheHas(value) {
19589 return this.__data__.has(value);
19594 * Creates an array cache object to store unique values.
19598 * @param {Array} [values] The values to cache.
19600 function SetCache(values) {
19602 length = values == null ? 0 : values.length;
19604 this.__data__ = new MapCache;
19605 while (++index < length) {
19606 this.add(values[index]);
19610 // Add methods to `SetCache`.
19611 SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
19612 SetCache.prototype.has = setCacheHas;
19615 * A specialized version of `_.some` for arrays without support for iteratee
19619 * @param {Array} [array] The array to iterate over.
19620 * @param {Function} predicate The function invoked per iteration.
19621 * @returns {boolean} Returns `true` if any element passes the predicate check,
19624 function arraySome(array, predicate) {
19626 length = array == null ? 0 : array.length;
19628 while (++index < length) {
19629 if (predicate(array[index], index, array)) {
19637 * Checks if a `cache` value for `key` exists.
19640 * @param {Object} cache The cache to query.
19641 * @param {string} key The key of the entry to check.
19642 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
19644 function cacheHas(cache, key) {
19645 return cache.has(key);
19648 /** Used to compose bitmasks for value comparisons. */
19649 var COMPARE_PARTIAL_FLAG = 1,
19650 COMPARE_UNORDERED_FLAG = 2;
19653 * A specialized version of `baseIsEqualDeep` for arrays with support for
19654 * partial deep comparisons.
19657 * @param {Array} array The array to compare.
19658 * @param {Array} other The other array to compare.
19659 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19660 * @param {Function} customizer The function to customize comparisons.
19661 * @param {Function} equalFunc The function to determine equivalents of values.
19662 * @param {Object} stack Tracks traversed `array` and `other` objects.
19663 * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
19665 function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
19666 var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
19667 arrLength = array.length,
19668 othLength = other.length;
19670 if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
19673 // Assume cyclic values are equal.
19674 var stacked = stack.get(array);
19675 if (stacked && stack.get(other)) {
19676 return stacked == other;
19680 seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
19682 stack.set(array, other);
19683 stack.set(other, array);
19685 // Ignore non-index properties.
19686 while (++index < arrLength) {
19687 var arrValue = array[index],
19688 othValue = other[index];
19691 var compared = isPartial
19692 ? customizer(othValue, arrValue, index, other, array, stack)
19693 : customizer(arrValue, othValue, index, array, other, stack);
19695 if (compared !== undefined) {
19702 // Recursively compare arrays (susceptible to call stack limits).
19704 if (!arraySome(other, function(othValue, othIndex) {
19705 if (!cacheHas(seen, othIndex) &&
19706 (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
19707 return seen.push(othIndex);
19714 arrValue === othValue ||
19715 equalFunc(arrValue, othValue, bitmask, customizer, stack)
19721 stack['delete'](array);
19722 stack['delete'](other);
19727 * Converts `map` to its key-value pairs.
19730 * @param {Object} map The map to convert.
19731 * @returns {Array} Returns the key-value pairs.
19733 function mapToArray(map) {
19735 result = Array(map.size);
19737 map.forEach(function(value, key) {
19738 result[++index] = [key, value];
19744 * Converts `set` to an array of its values.
19747 * @param {Object} set The set to convert.
19748 * @returns {Array} Returns the values.
19750 function setToArray(set) {
19752 result = Array(set.size);
19754 set.forEach(function(value) {
19755 result[++index] = value;
19760 /** Used to compose bitmasks for value comparisons. */
19761 var COMPARE_PARTIAL_FLAG$1 = 1,
19762 COMPARE_UNORDERED_FLAG$1 = 2;
19764 /** `Object#toString` result references. */
19765 var boolTag$3 = '[object Boolean]',
19766 dateTag$3 = '[object Date]',
19767 errorTag$2 = '[object Error]',
19768 mapTag$5 = '[object Map]',
19769 numberTag$3 = '[object Number]',
19770 regexpTag$3 = '[object RegExp]',
19771 setTag$5 = '[object Set]',
19772 stringTag$3 = '[object String]',
19773 symbolTag$2 = '[object Symbol]';
19775 var arrayBufferTag$3 = '[object ArrayBuffer]',
19776 dataViewTag$4 = '[object DataView]';
19778 /** Used to convert symbols to primitives and strings. */
19779 var symbolProto$1 = Symbol ? Symbol.prototype : undefined,
19780 symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : undefined;
19783 * A specialized version of `baseIsEqualDeep` for comparing objects of
19784 * the same `toStringTag`.
19786 * **Note:** This function only supports comparing values with tags of
19787 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
19790 * @param {Object} object The object to compare.
19791 * @param {Object} other The other object to compare.
19792 * @param {string} tag The `toStringTag` of the objects to compare.
19793 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19794 * @param {Function} customizer The function to customize comparisons.
19795 * @param {Function} equalFunc The function to determine equivalents of values.
19796 * @param {Object} stack Tracks traversed `object` and `other` objects.
19797 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19799 function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
19801 case dataViewTag$4:
19802 if ((object.byteLength != other.byteLength) ||
19803 (object.byteOffset != other.byteOffset)) {
19806 object = object.buffer;
19807 other = other.buffer;
19809 case arrayBufferTag$3:
19810 if ((object.byteLength != other.byteLength) ||
19811 !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
19819 // Coerce booleans to `1` or `0` and dates to milliseconds.
19820 // Invalid dates are coerced to `NaN`.
19821 return eq(+object, +other);
19824 return object.name == other.name && object.message == other.message;
19828 // Coerce regexes to strings and treat strings, primitives and objects,
19829 // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
19830 // for more details.
19831 return object == (other + '');
19834 var convert = mapToArray;
19837 var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1;
19838 convert || (convert = setToArray);
19840 if (object.size != other.size && !isPartial) {
19843 // Assume cyclic values are equal.
19844 var stacked = stack.get(object);
19846 return stacked == other;
19848 bitmask |= COMPARE_UNORDERED_FLAG$1;
19850 // Recursively compare objects (susceptible to call stack limits).
19851 stack.set(object, other);
19852 var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
19853 stack['delete'](object);
19857 if (symbolValueOf$1) {
19858 return symbolValueOf$1.call(object) == symbolValueOf$1.call(other);
19864 /** Used to compose bitmasks for value comparisons. */
19865 var COMPARE_PARTIAL_FLAG$2 = 1;
19867 /** Used for built-in method references. */
19868 var objectProto$d = Object.prototype;
19870 /** Used to check objects for own properties. */
19871 var hasOwnProperty$a = objectProto$d.hasOwnProperty;
19874 * A specialized version of `baseIsEqualDeep` for objects with support for
19875 * partial deep comparisons.
19878 * @param {Object} object The object to compare.
19879 * @param {Object} other The other object to compare.
19880 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19881 * @param {Function} customizer The function to customize comparisons.
19882 * @param {Function} equalFunc The function to determine equivalents of values.
19883 * @param {Object} stack Tracks traversed `object` and `other` objects.
19884 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19886 function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
19887 var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
19888 objProps = getAllKeys(object),
19889 objLength = objProps.length,
19890 othProps = getAllKeys(other),
19891 othLength = othProps.length;
19893 if (objLength != othLength && !isPartial) {
19896 var index = objLength;
19898 var key = objProps[index];
19899 if (!(isPartial ? key in other : hasOwnProperty$a.call(other, key))) {
19903 // Assume cyclic values are equal.
19904 var stacked = stack.get(object);
19905 if (stacked && stack.get(other)) {
19906 return stacked == other;
19909 stack.set(object, other);
19910 stack.set(other, object);
19912 var skipCtor = isPartial;
19913 while (++index < objLength) {
19914 key = objProps[index];
19915 var objValue = object[key],
19916 othValue = other[key];
19919 var compared = isPartial
19920 ? customizer(othValue, objValue, key, other, object, stack)
19921 : customizer(objValue, othValue, key, object, other, stack);
19923 // Recursively compare objects (susceptible to call stack limits).
19924 if (!(compared === undefined
19925 ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
19931 skipCtor || (skipCtor = key == 'constructor');
19933 if (result && !skipCtor) {
19934 var objCtor = object.constructor,
19935 othCtor = other.constructor;
19937 // Non `Object` object instances with different constructors are not equal.
19938 if (objCtor != othCtor &&
19939 ('constructor' in object && 'constructor' in other) &&
19940 !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
19941 typeof othCtor == 'function' && othCtor instanceof othCtor)) {
19945 stack['delete'](object);
19946 stack['delete'](other);
19950 /** Used to compose bitmasks for value comparisons. */
19951 var COMPARE_PARTIAL_FLAG$3 = 1;
19953 /** `Object#toString` result references. */
19954 var argsTag$3 = '[object Arguments]',
19955 arrayTag$2 = '[object Array]',
19956 objectTag$3 = '[object Object]';
19958 /** Used for built-in method references. */
19959 var objectProto$e = Object.prototype;
19961 /** Used to check objects for own properties. */
19962 var hasOwnProperty$b = objectProto$e.hasOwnProperty;
19965 * A specialized version of `baseIsEqual` for arrays and objects which performs
19966 * deep comparisons and tracks traversed objects enabling objects with circular
19967 * references to be compared.
19970 * @param {Object} object The object to compare.
19971 * @param {Object} other The other object to compare.
19972 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19973 * @param {Function} customizer The function to customize comparisons.
19974 * @param {Function} equalFunc The function to determine equivalents of values.
19975 * @param {Object} [stack] Tracks traversed `object` and `other` objects.
19976 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19978 function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
19979 var objIsArr = isArray(object),
19980 othIsArr = isArray(other),
19981 objTag = objIsArr ? arrayTag$2 : getTag$1(object),
19982 othTag = othIsArr ? arrayTag$2 : getTag$1(other);
19984 objTag = objTag == argsTag$3 ? objectTag$3 : objTag;
19985 othTag = othTag == argsTag$3 ? objectTag$3 : othTag;
19987 var objIsObj = objTag == objectTag$3,
19988 othIsObj = othTag == objectTag$3,
19989 isSameTag = objTag == othTag;
19991 if (isSameTag && isBuffer(object)) {
19992 if (!isBuffer(other)) {
19998 if (isSameTag && !objIsObj) {
19999 stack || (stack = new Stack);
20000 return (objIsArr || isTypedArray(object))
20001 ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
20002 : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
20004 if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) {
20005 var objIsWrapped = objIsObj && hasOwnProperty$b.call(object, '__wrapped__'),
20006 othIsWrapped = othIsObj && hasOwnProperty$b.call(other, '__wrapped__');
20008 if (objIsWrapped || othIsWrapped) {
20009 var objUnwrapped = objIsWrapped ? object.value() : object,
20010 othUnwrapped = othIsWrapped ? other.value() : other;
20012 stack || (stack = new Stack);
20013 return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
20019 stack || (stack = new Stack);
20020 return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
20024 * The base implementation of `_.isEqual` which supports partial comparisons
20025 * and tracks traversed objects.
20028 * @param {*} value The value to compare.
20029 * @param {*} other The other value to compare.
20030 * @param {boolean} bitmask The bitmask flags.
20031 * 1 - Unordered comparison
20032 * 2 - Partial comparison
20033 * @param {Function} [customizer] The function to customize comparisons.
20034 * @param {Object} [stack] Tracks traversed `value` and `other` objects.
20035 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
20037 function baseIsEqual(value, other, bitmask, customizer, stack) {
20038 if (value === other) {
20041 if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
20042 return value !== value && other !== other;
20044 return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
20047 /** Used to compose bitmasks for value comparisons. */
20048 var COMPARE_PARTIAL_FLAG$4 = 1,
20049 COMPARE_UNORDERED_FLAG$2 = 2;
20052 * The base implementation of `_.isMatch` without support for iteratee shorthands.
20055 * @param {Object} object The object to inspect.
20056 * @param {Object} source The object of property values to match.
20057 * @param {Array} matchData The property names, values, and compare flags to match.
20058 * @param {Function} [customizer] The function to customize comparisons.
20059 * @returns {boolean} Returns `true` if `object` is a match, else `false`.
20061 function baseIsMatch(object, source, matchData, customizer) {
20062 var index = matchData.length,
20064 noCustomizer = !customizer;
20066 if (object == null) {
20069 object = Object(object);
20071 var data = matchData[index];
20072 if ((noCustomizer && data[2])
20073 ? data[1] !== object[data[0]]
20074 : !(data[0] in object)
20079 while (++index < length) {
20080 data = matchData[index];
20082 objValue = object[key],
20083 srcValue = data[1];
20085 if (noCustomizer && data[2]) {
20086 if (objValue === undefined && !(key in object)) {
20090 var stack = new Stack;
20092 var result = customizer(objValue, srcValue, key, object, source, stack);
20094 if (!(result === undefined
20095 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack)
20106 * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
20109 * @param {*} value The value to check.
20110 * @returns {boolean} Returns `true` if `value` if suitable for strict
20111 * equality comparisons, else `false`.
20113 function isStrictComparable(value) {
20114 return value === value && !isObject(value);
20118 * Gets the property names, values, and compare flags of `object`.
20121 * @param {Object} object The object to query.
20122 * @returns {Array} Returns the match data of `object`.
20124 function getMatchData(object) {
20125 var result = keys$1(object),
20126 length = result.length;
20129 var key = result[length],
20130 value = object[key];
20132 result[length] = [key, value, isStrictComparable(value)];
20138 * A specialized version of `matchesProperty` for source values suitable
20139 * for strict equality comparisons, i.e. `===`.
20142 * @param {string} key The key of the property to get.
20143 * @param {*} srcValue The value to match.
20144 * @returns {Function} Returns the new spec function.
20146 function matchesStrictComparable(key, srcValue) {
20147 return function(object) {
20148 if (object == null) {
20151 return object[key] === srcValue &&
20152 (srcValue !== undefined || (key in Object(object)));
20157 * The base implementation of `_.matches` which doesn't clone `source`.
20160 * @param {Object} source The object of property values to match.
20161 * @returns {Function} Returns the new spec function.
20163 function baseMatches(source) {
20164 var matchData = getMatchData(source);
20165 if (matchData.length == 1 && matchData[0][2]) {
20166 return matchesStrictComparable(matchData[0][0], matchData[0][1]);
20168 return function(object) {
20169 return object === source || baseIsMatch(object, source, matchData);
20173 /** `Object#toString` result references. */
20174 var symbolTag$3 = '[object Symbol]';
20177 * Checks if `value` is classified as a `Symbol` primitive or object.
20183 * @param {*} value The value to check.
20184 * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
20187 * _.isSymbol(Symbol.iterator);
20190 * _.isSymbol('abc');
20193 function isSymbol(value) {
20194 return typeof value == 'symbol' ||
20195 (isObjectLike(value) && baseGetTag(value) == symbolTag$3);
20198 /** Used to match property names within property paths. */
20199 var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
20200 reIsPlainProp = /^\w*$/;
20203 * Checks if `value` is a property name and not a property path.
20206 * @param {*} value The value to check.
20207 * @param {Object} [object] The object to query keys on.
20208 * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
20210 function isKey(value, object) {
20211 if (isArray(value)) {
20214 var type = typeof value;
20215 if (type == 'number' || type == 'symbol' || type == 'boolean' ||
20216 value == null || isSymbol(value)) {
20219 return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
20220 (object != null && value in Object(object));
20223 /** Error message constants. */
20224 var FUNC_ERROR_TEXT = 'Expected a function';
20227 * Creates a function that memoizes the result of `func`. If `resolver` is
20228 * provided, it determines the cache key for storing the result based on the
20229 * arguments provided to the memoized function. By default, the first argument
20230 * provided to the memoized function is used as the map cache key. The `func`
20231 * is invoked with the `this` binding of the memoized function.
20233 * **Note:** The cache is exposed as the `cache` property on the memoized
20234 * function. Its creation may be customized by replacing the `_.memoize.Cache`
20235 * constructor with one whose instances implement the
20236 * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
20237 * method interface of `clear`, `delete`, `get`, `has`, and `set`.
20242 * @category Function
20243 * @param {Function} func The function to have its output memoized.
20244 * @param {Function} [resolver] The function to resolve the cache key.
20245 * @returns {Function} Returns the new memoized function.
20248 * var object = { 'a': 1, 'b': 2 };
20249 * var other = { 'c': 3, 'd': 4 };
20251 * var values = _.memoize(_.values);
20262 * // Modify the result cache.
20263 * values.cache.set(object, ['a', 'b']);
20267 * // Replace `_.memoize.Cache`.
20268 * _.memoize.Cache = WeakMap;
20270 function memoize(func, resolver) {
20271 if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
20272 throw new TypeError(FUNC_ERROR_TEXT);
20274 var memoized = function() {
20275 var args = arguments,
20276 key = resolver ? resolver.apply(this, args) : args[0],
20277 cache = memoized.cache;
20279 if (cache.has(key)) {
20280 return cache.get(key);
20282 var result = func.apply(this, args);
20283 memoized.cache = cache.set(key, result) || cache;
20286 memoized.cache = new (memoize.Cache || MapCache);
20290 // Expose `MapCache`.
20291 memoize.Cache = MapCache;
20293 /** Used as the maximum memoize cache size. */
20294 var MAX_MEMOIZE_SIZE = 500;
20297 * A specialized version of `_.memoize` which clears the memoized function's
20298 * cache when it exceeds `MAX_MEMOIZE_SIZE`.
20301 * @param {Function} func The function to have its output memoized.
20302 * @returns {Function} Returns the new memoized function.
20304 function memoizeCapped(func) {
20305 var result = memoize(func, function(key) {
20306 if (cache.size === MAX_MEMOIZE_SIZE) {
20312 var cache = result.cache;
20316 /** Used to match property names within property paths. */
20317 var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
20319 /** Used to match backslashes in property paths. */
20320 var reEscapeChar = /\\(\\)?/g;
20323 * Converts `string` to a property path array.
20326 * @param {string} string The string to convert.
20327 * @returns {Array} Returns the property path array.
20329 var stringToPath = memoizeCapped(function(string) {
20331 if (string.charCodeAt(0) === 46 /* . */) {
20334 string.replace(rePropName, function(match, number, quote, subString) {
20335 result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
20341 * A specialized version of `_.map` for arrays without support for iteratee
20345 * @param {Array} [array] The array to iterate over.
20346 * @param {Function} iteratee The function invoked per iteration.
20347 * @returns {Array} Returns the new mapped array.
20349 function arrayMap(array, iteratee) {
20351 length = array == null ? 0 : array.length,
20352 result = Array(length);
20354 while (++index < length) {
20355 result[index] = iteratee(array[index], index, array);
20360 /** Used as references for various `Number` constants. */
20361 var INFINITY = 1 / 0;
20363 /** Used to convert symbols to primitives and strings. */
20364 var symbolProto$2 = Symbol ? Symbol.prototype : undefined,
20365 symbolToString = symbolProto$2 ? symbolProto$2.toString : undefined;
20368 * The base implementation of `_.toString` which doesn't convert nullish
20369 * values to empty strings.
20372 * @param {*} value The value to process.
20373 * @returns {string} Returns the string.
20375 function baseToString(value) {
20376 // Exit early for strings to avoid a performance hit in some environments.
20377 if (typeof value == 'string') {
20380 if (isArray(value)) {
20381 // Recursively convert values (susceptible to call stack limits).
20382 return arrayMap(value, baseToString) + '';
20384 if (isSymbol(value)) {
20385 return symbolToString ? symbolToString.call(value) : '';
20387 var result = (value + '');
20388 return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
20392 * Converts `value` to a string. An empty string is returned for `null`
20393 * and `undefined` values. The sign of `-0` is preserved.
20399 * @param {*} value The value to convert.
20400 * @returns {string} Returns the converted string.
20403 * _.toString(null);
20409 * _.toString([1, 2, 3]);
20412 function toString(value) {
20413 return value == null ? '' : baseToString(value);
20417 * Casts `value` to a path array if it's not one.
20420 * @param {*} value The value to inspect.
20421 * @param {Object} [object] The object to query keys on.
20422 * @returns {Array} Returns the cast property path array.
20424 function castPath(value, object) {
20425 if (isArray(value)) {
20428 return isKey(value, object) ? [value] : stringToPath(toString(value));
20431 /** Used as references for various `Number` constants. */
20432 var INFINITY$1 = 1 / 0;
20435 * Converts `value` to a string key if it's not a string or symbol.
20438 * @param {*} value The value to inspect.
20439 * @returns {string|symbol} Returns the key.
20441 function toKey(value) {
20442 if (typeof value == 'string' || isSymbol(value)) {
20445 var result = (value + '');
20446 return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
20450 * The base implementation of `_.get` without support for default values.
20453 * @param {Object} object The object to query.
20454 * @param {Array|string} path The path of the property to get.
20455 * @returns {*} Returns the resolved value.
20457 function baseGet(object, path) {
20458 path = castPath(path, object);
20461 length = path.length;
20463 while (object != null && index < length) {
20464 object = object[toKey(path[index++])];
20466 return (index && index == length) ? object : undefined;
20470 * Gets the value at `path` of `object`. If the resolved value is
20471 * `undefined`, the `defaultValue` is returned in its place.
20477 * @param {Object} object The object to query.
20478 * @param {Array|string} path The path of the property to get.
20479 * @param {*} [defaultValue] The value returned for `undefined` resolved values.
20480 * @returns {*} Returns the resolved value.
20483 * var object = { 'a': [{ 'b': { 'c': 3 } }] };
20485 * _.get(object, 'a[0].b.c');
20488 * _.get(object, ['a', '0', 'b', 'c']);
20491 * _.get(object, 'a.b.c', 'default');
20494 function get$2(object, path, defaultValue) {
20495 var result = object == null ? undefined : baseGet(object, path);
20496 return result === undefined ? defaultValue : result;
20500 * The base implementation of `_.hasIn` without support for deep paths.
20503 * @param {Object} [object] The object to query.
20504 * @param {Array|string} key The key to check.
20505 * @returns {boolean} Returns `true` if `key` exists, else `false`.
20507 function baseHasIn(object, key) {
20508 return object != null && key in Object(object);
20512 * Checks if `path` exists on `object`.
20515 * @param {Object} object The object to query.
20516 * @param {Array|string} path The path to check.
20517 * @param {Function} hasFunc The function to check properties.
20518 * @returns {boolean} Returns `true` if `path` exists, else `false`.
20520 function hasPath(object, path, hasFunc) {
20521 path = castPath(path, object);
20524 length = path.length,
20527 while (++index < length) {
20528 var key = toKey(path[index]);
20529 if (!(result = object != null && hasFunc(object, key))) {
20532 object = object[key];
20534 if (result || ++index != length) {
20537 length = object == null ? 0 : object.length;
20538 return !!length && isLength(length) && isIndex(key, length) &&
20539 (isArray(object) || isArguments(object));
20543 * Checks if `path` is a direct or inherited property of `object`.
20549 * @param {Object} object The object to query.
20550 * @param {Array|string} path The path to check.
20551 * @returns {boolean} Returns `true` if `path` exists, else `false`.
20554 * var object = _.create({ 'a': _.create({ 'b': 2 }) });
20556 * _.hasIn(object, 'a');
20559 * _.hasIn(object, 'a.b');
20562 * _.hasIn(object, ['a', 'b']);
20565 * _.hasIn(object, 'b');
20568 function hasIn(object, path) {
20569 return object != null && hasPath(object, path, baseHasIn);
20572 /** Used to compose bitmasks for value comparisons. */
20573 var COMPARE_PARTIAL_FLAG$5 = 1,
20574 COMPARE_UNORDERED_FLAG$3 = 2;
20577 * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
20580 * @param {string} path The path of the property to get.
20581 * @param {*} srcValue The value to match.
20582 * @returns {Function} Returns the new spec function.
20584 function baseMatchesProperty(path, srcValue) {
20585 if (isKey(path) && isStrictComparable(srcValue)) {
20586 return matchesStrictComparable(toKey(path), srcValue);
20588 return function(object) {
20589 var objValue = get$2(object, path);
20590 return (objValue === undefined && objValue === srcValue)
20591 ? hasIn(object, path)
20592 : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3);
20597 * This method returns the first argument it receives.
20603 * @param {*} value Any value.
20604 * @returns {*} Returns `value`.
20607 * var object = { 'a': 1 };
20609 * console.log(_.identity(object) === object);
20612 function identity$8(value) {
20617 * The base implementation of `_.property` without support for deep paths.
20620 * @param {string} key The key of the property to get.
20621 * @returns {Function} Returns the new accessor function.
20623 function baseProperty(key) {
20624 return function(object) {
20625 return object == null ? undefined : object[key];
20630 * A specialized version of `baseProperty` which supports deep paths.
20633 * @param {Array|string} path The path of the property to get.
20634 * @returns {Function} Returns the new accessor function.
20636 function basePropertyDeep(path) {
20637 return function(object) {
20638 return baseGet(object, path);
20643 * Creates a function that returns the value at `path` of a given object.
20649 * @param {Array|string} path The path of the property to get.
20650 * @returns {Function} Returns the new accessor function.
20654 * { 'a': { 'b': 2 } },
20655 * { 'a': { 'b': 1 } }
20658 * _.map(objects, _.property('a.b'));
20661 * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
20664 function property(path) {
20665 return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
20669 * The base implementation of `_.iteratee`.
20672 * @param {*} [value=_.identity] The value to convert to an iteratee.
20673 * @returns {Function} Returns the iteratee.
20675 function baseIteratee(value) {
20676 // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
20677 // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
20678 if (typeof value == 'function') {
20681 if (value == null) {
20684 if (typeof value == 'object') {
20685 return isArray(value)
20686 ? baseMatchesProperty(value[0], value[1])
20687 : baseMatches(value);
20689 return property(value);
20693 * Creates a function like `_.groupBy`.
20696 * @param {Function} setter The function to set accumulator values.
20697 * @param {Function} [initializer] The accumulator object initializer.
20698 * @returns {Function} Returns the new aggregator function.
20700 function createAggregator(setter, initializer) {
20701 return function(collection, iteratee) {
20702 var func = isArray(collection) ? arrayAggregator : baseAggregator,
20703 accumulator = initializer ? initializer() : {};
20705 return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
20709 /** Used for built-in method references. */
20710 var objectProto$f = Object.prototype;
20712 /** Used to check objects for own properties. */
20713 var hasOwnProperty$c = objectProto$f.hasOwnProperty;
20716 * Creates an object composed of keys generated from the results of running
20717 * each element of `collection` thru `iteratee`. The order of grouped values
20718 * is determined by the order they occur in `collection`. The corresponding
20719 * value of each key is an array of elements responsible for generating the
20720 * key. The iteratee is invoked with one argument: (value).
20725 * @category Collection
20726 * @param {Array|Object} collection The collection to iterate over.
20727 * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
20728 * @returns {Object} Returns the composed aggregate object.
20731 * _.groupBy([6.1, 4.2, 6.3], Math.floor);
20732 * // => { '4': [4.2], '6': [6.1, 6.3] }
20734 * // The `_.property` iteratee shorthand.
20735 * _.groupBy(['one', 'two', 'three'], 'length');
20736 * // => { '3': ['one', 'two'], '5': ['three'] }
20738 var groupBy = createAggregator(function(result, value, key) {
20739 if (hasOwnProperty$c.call(result, key)) {
20740 result[key].push(value);
20742 baseAssignValue(result, key, [value]);
20747 * Gets the last element of `array`.
20753 * @param {Array} array The array to query.
20754 * @returns {*} Returns the last element of `array`.
20757 * _.last([1, 2, 3]);
20760 function last(array) {
20761 var length = array == null ? 0 : array.length;
20762 return length ? array[length - 1] : undefined;
20766 * The base implementation of `_.slice` without an iteratee call guard.
20769 * @param {Array} array The array to slice.
20770 * @param {number} [start=0] The start position.
20771 * @param {number} [end=array.length] The end position.
20772 * @returns {Array} Returns the slice of `array`.
20774 function baseSlice(array, start, end) {
20776 length = array.length;
20779 start = -start > length ? 0 : (length + start);
20781 end = end > length ? length : end;
20785 length = start > end ? 0 : ((end - start) >>> 0);
20788 var result = Array(length);
20789 while (++index < length) {
20790 result[index] = array[index + start];
20796 * Gets the parent value at `path` of `object`.
20799 * @param {Object} object The object to query.
20800 * @param {Array} path The path to get the parent value of.
20801 * @returns {*} Returns the parent value.
20803 function parent(object, path) {
20804 return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
20808 * The base implementation of `_.unset`.
20811 * @param {Object} object The object to modify.
20812 * @param {Array|string} path The property path to unset.
20813 * @returns {boolean} Returns `true` if the property is deleted, else `false`.
20815 function baseUnset(object, path) {
20816 path = castPath(path, object);
20817 object = parent(object, path);
20818 return object == null || delete object[toKey(last(path))];
20821 /** `Object#toString` result references. */
20822 var objectTag$4 = '[object Object]';
20824 /** Used for built-in method references. */
20825 var funcProto$2 = Function.prototype,
20826 objectProto$g = Object.prototype;
20828 /** Used to resolve the decompiled source of functions. */
20829 var funcToString$2 = funcProto$2.toString;
20831 /** Used to check objects for own properties. */
20832 var hasOwnProperty$d = objectProto$g.hasOwnProperty;
20834 /** Used to infer the `Object` constructor. */
20835 var objectCtorString = funcToString$2.call(Object);
20838 * Checks if `value` is a plain object, that is, an object created by the
20839 * `Object` constructor or one with a `[[Prototype]]` of `null`.
20845 * @param {*} value The value to check.
20846 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
20853 * _.isPlainObject(new Foo);
20856 * _.isPlainObject([1, 2, 3]);
20859 * _.isPlainObject({ 'x': 0, 'y': 0 });
20862 * _.isPlainObject(Object.create(null));
20865 function isPlainObject(value) {
20866 if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
20869 var proto = getPrototype(value);
20870 if (proto === null) {
20873 var Ctor = hasOwnProperty$d.call(proto, 'constructor') && proto.constructor;
20874 return typeof Ctor == 'function' && Ctor instanceof Ctor &&
20875 funcToString$2.call(Ctor) == objectCtorString;
20879 * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
20883 * @param {*} value The value to inspect.
20884 * @param {string} key The key of the property to inspect.
20885 * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
20887 function customOmitClone(value) {
20888 return isPlainObject(value) ? undefined : value;
20891 /** Built-in value references. */
20892 var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
20895 * Checks if `value` is a flattenable `arguments` object or array.
20898 * @param {*} value The value to check.
20899 * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
20901 function isFlattenable(value) {
20902 return isArray(value) || isArguments(value) ||
20903 !!(spreadableSymbol && value && value[spreadableSymbol]);
20907 * The base implementation of `_.flatten` with support for restricting flattening.
20910 * @param {Array} array The array to flatten.
20911 * @param {number} depth The maximum recursion depth.
20912 * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
20913 * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
20914 * @param {Array} [result=[]] The initial result value.
20915 * @returns {Array} Returns the new flattened array.
20917 function baseFlatten(array, depth, predicate, isStrict, result) {
20919 length = array.length;
20921 predicate || (predicate = isFlattenable);
20922 result || (result = []);
20924 while (++index < length) {
20925 var value = array[index];
20926 if (depth > 0 && predicate(value)) {
20928 // Recursively flatten arrays (susceptible to call stack limits).
20929 baseFlatten(value, depth - 1, predicate, isStrict, result);
20931 arrayPush(result, value);
20933 } else if (!isStrict) {
20934 result[result.length] = value;
20941 * Flattens `array` a single level deep.
20947 * @param {Array} array The array to flatten.
20948 * @returns {Array} Returns the new flattened array.
20951 * _.flatten([1, [2, [3, [4]], 5]]);
20952 * // => [1, 2, [3, [4]], 5]
20954 function flatten(array) {
20955 var length = array == null ? 0 : array.length;
20956 return length ? baseFlatten(array, 1) : [];
20960 * A faster alternative to `Function#apply`, this function invokes `func`
20961 * with the `this` binding of `thisArg` and the arguments of `args`.
20964 * @param {Function} func The function to invoke.
20965 * @param {*} thisArg The `this` binding of `func`.
20966 * @param {Array} args The arguments to invoke `func` with.
20967 * @returns {*} Returns the result of `func`.
20969 function apply(func, thisArg, args) {
20970 switch (args.length) {
20971 case 0: return func.call(thisArg);
20972 case 1: return func.call(thisArg, args[0]);
20973 case 2: return func.call(thisArg, args[0], args[1]);
20974 case 3: return func.call(thisArg, args[0], args[1], args[2]);
20976 return func.apply(thisArg, args);
20979 /* Built-in method references for those with the same name as other `lodash` methods. */
20980 var nativeMax = Math.max;
20983 * A specialized version of `baseRest` which transforms the rest array.
20986 * @param {Function} func The function to apply a rest parameter to.
20987 * @param {number} [start=func.length-1] The start position of the rest parameter.
20988 * @param {Function} transform The rest array transform.
20989 * @returns {Function} Returns the new function.
20991 function overRest(func, start, transform) {
20992 start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
20993 return function() {
20994 var args = arguments,
20996 length = nativeMax(args.length - start, 0),
20997 array = Array(length);
20999 while (++index < length) {
21000 array[index] = args[start + index];
21003 var otherArgs = Array(start + 1);
21004 while (++index < start) {
21005 otherArgs[index] = args[index];
21007 otherArgs[start] = transform(array);
21008 return apply(func, this, otherArgs);
21013 * Creates a function that returns `value`.
21019 * @param {*} value The value to return from the new function.
21020 * @returns {Function} Returns the new constant function.
21023 * var objects = _.times(2, _.constant({ 'a': 1 }));
21025 * console.log(objects);
21026 * // => [{ 'a': 1 }, { 'a': 1 }]
21028 * console.log(objects[0] === objects[1]);
21031 function constant$d(value) {
21032 return function() {
21038 * The base implementation of `setToString` without support for hot loop shorting.
21041 * @param {Function} func The function to modify.
21042 * @param {Function} string The `toString` result.
21043 * @returns {Function} Returns `func`.
21045 var baseSetToString = !defineProperty ? identity$8 : function(func, string) {
21046 return defineProperty(func, 'toString', {
21047 'configurable': true,
21048 'enumerable': false,
21049 'value': constant$d(string),
21054 /** Used to detect hot functions by number of calls within a span of milliseconds. */
21055 var HOT_COUNT = 800,
21058 /* Built-in method references for those with the same name as other `lodash` methods. */
21059 var nativeNow = Date.now;
21062 * Creates a function that'll short out and invoke `identity` instead
21063 * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
21067 * @param {Function} func The function to restrict.
21068 * @returns {Function} Returns the new shortable function.
21070 function shortOut(func) {
21074 return function() {
21075 var stamp = nativeNow(),
21076 remaining = HOT_SPAN - (stamp - lastCalled);
21078 lastCalled = stamp;
21079 if (remaining > 0) {
21080 if (++count >= HOT_COUNT) {
21081 return arguments[0];
21086 return func.apply(undefined, arguments);
21091 * Sets the `toString` method of `func` to return `string`.
21094 * @param {Function} func The function to modify.
21095 * @param {Function} string The `toString` result.
21096 * @returns {Function} Returns `func`.
21098 var setToString = shortOut(baseSetToString);
21101 * A specialized version of `baseRest` which flattens the rest array.
21104 * @param {Function} func The function to apply a rest parameter to.
21105 * @returns {Function} Returns the new function.
21107 function flatRest(func) {
21108 return setToString(overRest(func, undefined, flatten), func + '');
21111 /** Used to compose bitmasks for cloning. */
21112 var CLONE_DEEP_FLAG$1 = 1,
21113 CLONE_FLAT_FLAG$1 = 2,
21114 CLONE_SYMBOLS_FLAG$2 = 4;
21117 * The opposite of `_.pick`; this method creates an object composed of the
21118 * own and inherited enumerable property paths of `object` that are not omitted.
21120 * **Note:** This method is considerably slower than `_.pick`.
21126 * @param {Object} object The source object.
21127 * @param {...(string|string[])} [paths] The property paths to omit.
21128 * @returns {Object} Returns the new object.
21131 * var object = { 'a': 1, 'b': '2', 'c': 3 };
21133 * _.omit(object, ['a', 'c']);
21134 * // => { 'b': '2' }
21136 var omit = flatRest(function(object, paths) {
21138 if (object == null) {
21141 var isDeep = false;
21142 paths = arrayMap(paths, function(path) {
21143 path = castPath(path, object);
21144 isDeep || (isDeep = path.length > 1);
21147 copyObject(object, getAllKeysIn(object), result);
21149 result = baseClone(result, CLONE_DEEP_FLAG$1 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$2, customOmitClone);
21151 var length = paths.length;
21153 baseUnset(result, paths[length]);
21159 * Creates an array with all falsey values removed. The values `false`, `null`,
21160 * `0`, `""`, `undefined`, and `NaN` are falsey.
21166 * @param {Array} array The array to compact.
21167 * @returns {Array} Returns the new array of filtered values.
21170 * _.compact([0, 1, false, 2, '', 3]);
21173 function compact(array) {
21175 length = array == null ? 0 : array.length,
21179 while (++index < length) {
21180 var value = array[index];
21182 result[resIndex++] = value;
21189 * The base implementation of `_.rest` which doesn't validate or coerce arguments.
21192 * @param {Function} func The function to apply a rest parameter to.
21193 * @param {number} [start=func.length-1] The start position of the rest parameter.
21194 * @returns {Function} Returns the new function.
21196 function baseRest(func, start) {
21197 return setToString(overRest(func, start, identity$8), func + '');
21201 * Checks if the given arguments are from an iteratee call.
21204 * @param {*} value The potential iteratee value argument.
21205 * @param {*} index The potential iteratee index or key argument.
21206 * @param {*} object The potential iteratee object argument.
21207 * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
21210 function isIterateeCall(value, index, object) {
21211 if (!isObject(object)) {
21214 var type = typeof index;
21215 if (type == 'number'
21216 ? (isArrayLike(object) && isIndex(index, object.length))
21217 : (type == 'string' && index in object)
21219 return eq(object[index], value);
21225 * Creates a function like `_.assign`.
21228 * @param {Function} assigner The function to assign values.
21229 * @returns {Function} Returns the new assigner function.
21231 function createAssigner(assigner) {
21232 return baseRest(function(object, sources) {
21234 length = sources.length,
21235 customizer = length > 1 ? sources[length - 1] : undefined,
21236 guard = length > 2 ? sources[2] : undefined;
21238 customizer = (assigner.length > 3 && typeof customizer == 'function')
21239 ? (length--, customizer)
21242 if (guard && isIterateeCall(sources[0], sources[1], guard)) {
21243 customizer = length < 3 ? undefined : customizer;
21246 object = Object(object);
21247 while (++index < length) {
21248 var source = sources[index];
21250 assigner(object, source, index, customizer);
21258 * This method is like `_.assign` except that it iterates over own and
21259 * inherited source properties.
21261 * **Note:** This method mutates `object`.
21268 * @param {Object} object The destination object.
21269 * @param {...Object} [sources] The source objects.
21270 * @returns {Object} Returns `object`.
21282 * Foo.prototype.b = 2;
21283 * Bar.prototype.d = 4;
21285 * _.assignIn({ 'a': 0 }, new Foo, new Bar);
21286 * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
21288 var assignIn = createAssigner(function(object, source) {
21289 copyObject(source, keysIn$1(source), object);
21293 * The base implementation of `_.filter` without support for iteratee shorthands.
21296 * @param {Array|Object} collection The collection to iterate over.
21297 * @param {Function} predicate The function invoked per iteration.
21298 * @returns {Array} Returns the new filtered array.
21300 function baseFilter(collection, predicate) {
21302 baseEach(collection, function(value, index, collection) {
21303 if (predicate(value, index, collection)) {
21304 result.push(value);
21311 * Iterates over elements of `collection`, returning an array of all elements
21312 * `predicate` returns truthy for. The predicate is invoked with three
21313 * arguments: (value, index|key, collection).
21315 * **Note:** Unlike `_.remove`, this method returns a new array.
21320 * @category Collection
21321 * @param {Array|Object} collection The collection to iterate over.
21322 * @param {Function} [predicate=_.identity] The function invoked per iteration.
21323 * @returns {Array} Returns the new filtered array.
21328 * { 'user': 'barney', 'age': 36, 'active': true },
21329 * { 'user': 'fred', 'age': 40, 'active': false }
21332 * _.filter(users, function(o) { return !o.active; });
21333 * // => objects for ['fred']
21335 * // The `_.matches` iteratee shorthand.
21336 * _.filter(users, { 'age': 36, 'active': true });
21337 * // => objects for ['barney']
21339 * // The `_.matchesProperty` iteratee shorthand.
21340 * _.filter(users, ['active', false]);
21341 * // => objects for ['fred']
21343 * // The `_.property` iteratee shorthand.
21344 * _.filter(users, 'active');
21345 * // => objects for ['barney']
21347 function filter(collection, predicate) {
21348 var func = isArray(collection) ? arrayFilter : baseFilter;
21349 return func(collection, baseIteratee(predicate, 3));
21353 * Creates a `_.find` or `_.findLast` function.
21356 * @param {Function} findIndexFunc The function to find the collection index.
21357 * @returns {Function} Returns the new find function.
21359 function createFind(findIndexFunc) {
21360 return function(collection, predicate, fromIndex) {
21361 var iterable = Object(collection);
21362 if (!isArrayLike(collection)) {
21363 var iteratee = baseIteratee(predicate, 3);
21364 collection = keys$1(collection);
21365 predicate = function(key) { return iteratee(iterable[key], key, iterable); };
21367 var index = findIndexFunc(collection, predicate, fromIndex);
21368 return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
21373 * The base implementation of `_.findIndex` and `_.findLastIndex` without
21374 * support for iteratee shorthands.
21377 * @param {Array} array The array to inspect.
21378 * @param {Function} predicate The function invoked per iteration.
21379 * @param {number} fromIndex The index to search from.
21380 * @param {boolean} [fromRight] Specify iterating from right to left.
21381 * @returns {number} Returns the index of the matched value, else `-1`.
21383 function baseFindIndex(array, predicate, fromIndex, fromRight) {
21384 var length = array.length,
21385 index = fromIndex + (fromRight ? 1 : -1);
21387 while ((fromRight ? index-- : ++index < length)) {
21388 if (predicate(array[index], index, array)) {
21395 /** Used as references for various `Number` constants. */
21398 /** Used to match leading and trailing whitespace. */
21399 var reTrim = /^\s+|\s+$/g;
21401 /** Used to detect bad signed hexadecimal string values. */
21402 var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
21404 /** Used to detect binary string values. */
21405 var reIsBinary = /^0b[01]+$/i;
21407 /** Used to detect octal string values. */
21408 var reIsOctal = /^0o[0-7]+$/i;
21410 /** Built-in method references without a dependency on `root`. */
21411 var freeParseInt = parseInt;
21414 * Converts `value` to a number.
21420 * @param {*} value The value to process.
21421 * @returns {number} Returns the number.
21427 * _.toNumber(Number.MIN_VALUE);
21430 * _.toNumber(Infinity);
21433 * _.toNumber('3.2');
21436 function toNumber(value) {
21437 if (typeof value == 'number') {
21440 if (isSymbol(value)) {
21443 if (isObject(value)) {
21444 var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
21445 value = isObject(other) ? (other + '') : other;
21447 if (typeof value != 'string') {
21448 return value === 0 ? value : +value;
21450 value = value.replace(reTrim, '');
21451 var isBinary = reIsBinary.test(value);
21452 return (isBinary || reIsOctal.test(value))
21453 ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
21454 : (reIsBadHex.test(value) ? NAN : +value);
21457 /** Used as references for various `Number` constants. */
21458 var INFINITY$2 = 1 / 0,
21459 MAX_INTEGER = 1.7976931348623157e+308;
21462 * Converts `value` to a finite number.
21468 * @param {*} value The value to convert.
21469 * @returns {number} Returns the converted number.
21475 * _.toFinite(Number.MIN_VALUE);
21478 * _.toFinite(Infinity);
21479 * // => 1.7976931348623157e+308
21481 * _.toFinite('3.2');
21484 function toFinite(value) {
21486 return value === 0 ? value : 0;
21488 value = toNumber(value);
21489 if (value === INFINITY$2 || value === -INFINITY$2) {
21490 var sign = (value < 0 ? -1 : 1);
21491 return sign * MAX_INTEGER;
21493 return value === value ? value : 0;
21497 * Converts `value` to an integer.
21499 * **Note:** This method is loosely based on
21500 * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
21506 * @param {*} value The value to convert.
21507 * @returns {number} Returns the converted integer.
21510 * _.toInteger(3.2);
21513 * _.toInteger(Number.MIN_VALUE);
21516 * _.toInteger(Infinity);
21517 * // => 1.7976931348623157e+308
21519 * _.toInteger('3.2');
21522 function toInteger(value) {
21523 var result = toFinite(value),
21524 remainder = result % 1;
21526 return result === result ? (remainder ? result - remainder : result) : 0;
21529 /* Built-in method references for those with the same name as other `lodash` methods. */
21530 var nativeMax$1 = Math.max;
21533 * This method is like `_.find` except that it returns the index of the first
21534 * element `predicate` returns truthy for instead of the element itself.
21540 * @param {Array} array The array to inspect.
21541 * @param {Function} [predicate=_.identity] The function invoked per iteration.
21542 * @param {number} [fromIndex=0] The index to search from.
21543 * @returns {number} Returns the index of the found element, else `-1`.
21547 * { 'user': 'barney', 'active': false },
21548 * { 'user': 'fred', 'active': false },
21549 * { 'user': 'pebbles', 'active': true }
21552 * _.findIndex(users, function(o) { return o.user == 'barney'; });
21555 * // The `_.matches` iteratee shorthand.
21556 * _.findIndex(users, { 'user': 'fred', 'active': false });
21559 * // The `_.matchesProperty` iteratee shorthand.
21560 * _.findIndex(users, ['active', false]);
21563 * // The `_.property` iteratee shorthand.
21564 * _.findIndex(users, 'active');
21567 function findIndex(array, predicate, fromIndex) {
21568 var length = array == null ? 0 : array.length;
21572 var index = fromIndex == null ? 0 : toInteger(fromIndex);
21574 index = nativeMax$1(length + index, 0);
21576 return baseFindIndex(array, baseIteratee(predicate, 3), index);
21580 * Iterates over elements of `collection`, returning the first element
21581 * `predicate` returns truthy for. The predicate is invoked with three
21582 * arguments: (value, index|key, collection).
21587 * @category Collection
21588 * @param {Array|Object} collection The collection to inspect.
21589 * @param {Function} [predicate=_.identity] The function invoked per iteration.
21590 * @param {number} [fromIndex=0] The index to search from.
21591 * @returns {*} Returns the matched element, else `undefined`.
21595 * { 'user': 'barney', 'age': 36, 'active': true },
21596 * { 'user': 'fred', 'age': 40, 'active': false },
21597 * { 'user': 'pebbles', 'age': 1, 'active': true }
21600 * _.find(users, function(o) { return o.age < 40; });
21601 * // => object for 'barney'
21603 * // The `_.matches` iteratee shorthand.
21604 * _.find(users, { 'age': 1, 'active': true });
21605 * // => object for 'pebbles'
21607 * // The `_.matchesProperty` iteratee shorthand.
21608 * _.find(users, ['active', false]);
21609 * // => object for 'fred'
21611 * // The `_.property` iteratee shorthand.
21612 * _.find(users, 'active');
21613 * // => object for 'barney'
21615 var find$1 = createFind(findIndex);
21618 * The base implementation of `_.map` without support for iteratee shorthands.
21621 * @param {Array|Object} collection The collection to iterate over.
21622 * @param {Function} iteratee The function invoked per iteration.
21623 * @returns {Array} Returns the new mapped array.
21625 function baseMap(collection, iteratee) {
21627 result = isArrayLike(collection) ? Array(collection.length) : [];
21629 baseEach(collection, function(value, key, collection) {
21630 result[++index] = iteratee(value, key, collection);
21636 * Creates an array of values by running each element in `collection` thru
21637 * `iteratee`. The iteratee is invoked with three arguments:
21638 * (value, index|key, collection).
21640 * Many lodash methods are guarded to work as iteratees for methods like
21641 * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
21643 * The guarded methods are:
21644 * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
21645 * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
21646 * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
21647 * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
21652 * @category Collection
21653 * @param {Array|Object} collection The collection to iterate over.
21654 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
21655 * @returns {Array} Returns the new mapped array.
21658 * function square(n) {
21662 * _.map([4, 8], square);
21665 * _.map({ 'a': 4, 'b': 8 }, square);
21666 * // => [16, 64] (iteration order is not guaranteed)
21669 * { 'user': 'barney' },
21670 * { 'user': 'fred' }
21673 * // The `_.property` iteratee shorthand.
21674 * _.map(users, 'user');
21675 * // => ['barney', 'fred']
21677 function map$3(collection, iteratee) {
21678 var func = isArray(collection) ? arrayMap : baseMap;
21679 return func(collection, baseIteratee(iteratee, 3));
21683 * The base implementation of `_.values` and `_.valuesIn` which creates an
21684 * array of `object` property values corresponding to the property names
21688 * @param {Object} object The object to query.
21689 * @param {Array} props The property names to get values for.
21690 * @returns {Object} Returns the array of property values.
21692 function baseValues(object, props) {
21693 return arrayMap(props, function(key) {
21694 return object[key];
21699 * Creates an array of the own enumerable string keyed property values of `object`.
21701 * **Note:** Non-object values are coerced to objects.
21707 * @param {Object} object The object to query.
21708 * @returns {Array} Returns the array of property values.
21716 * Foo.prototype.c = 3;
21718 * _.values(new Foo);
21719 * // => [1, 2] (iteration order is not guaranteed)
21724 function values$1(object) {
21725 return object == null ? [] : baseValues(object, keys$1(object));
21729 * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
21730 * of key-value pairs for `object` corresponding to the property names of `props`.
21733 * @param {Object} object The object to query.
21734 * @param {Array} props The property names to get values for.
21735 * @returns {Object} Returns the key-value pairs.
21737 function baseToPairs(object, props) {
21738 return arrayMap(props, function(key) {
21739 return [key, object[key]];
21744 * Converts `set` to its value-value pairs.
21747 * @param {Object} set The set to convert.
21748 * @returns {Array} Returns the value-value pairs.
21750 function setToPairs(set) {
21752 result = Array(set.size);
21754 set.forEach(function(value) {
21755 result[++index] = [value, value];
21760 /** `Object#toString` result references. */
21761 var mapTag$6 = '[object Map]',
21762 setTag$6 = '[object Set]';
21765 * Creates a `_.toPairs` or `_.toPairsIn` function.
21768 * @param {Function} keysFunc The function to get the keys of a given object.
21769 * @returns {Function} Returns the new pairs function.
21771 function createToPairs(keysFunc) {
21772 return function(object) {
21773 var tag = getTag$1(object);
21774 if (tag == mapTag$6) {
21775 return mapToArray(object);
21777 if (tag == setTag$6) {
21778 return setToPairs(object);
21780 return baseToPairs(object, keysFunc(object));
21785 * Creates an array of own enumerable string keyed-value pairs for `object`
21786 * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
21787 * entries are returned.
21794 * @param {Object} object The object to query.
21795 * @returns {Array} Returns the key-value pairs.
21803 * Foo.prototype.c = 3;
21805 * _.toPairs(new Foo);
21806 * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
21808 var toPairs = createToPairs(keys$1);
21811 * The base implementation of `_.isNaN` without support for number objects.
21814 * @param {*} value The value to check.
21815 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
21817 function baseIsNaN(value) {
21818 return value !== value;
21822 * A specialized version of `_.indexOf` which performs strict equality
21823 * comparisons of values, i.e. `===`.
21826 * @param {Array} array The array to inspect.
21827 * @param {*} value The value to search for.
21828 * @param {number} fromIndex The index to search from.
21829 * @returns {number} Returns the index of the matched value, else `-1`.
21831 function strictIndexOf(array, value, fromIndex) {
21832 var index = fromIndex - 1,
21833 length = array.length;
21835 while (++index < length) {
21836 if (array[index] === value) {
21844 * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
21847 * @param {Array} array The array to inspect.
21848 * @param {*} value The value to search for.
21849 * @param {number} fromIndex The index to search from.
21850 * @returns {number} Returns the index of the matched value, else `-1`.
21852 function baseIndexOf(array, value, fromIndex) {
21853 return value === value
21854 ? strictIndexOf(array, value, fromIndex)
21855 : baseFindIndex(array, baseIsNaN, fromIndex);
21859 * A specialized version of `_.includes` for arrays without support for
21860 * specifying an index to search from.
21863 * @param {Array} [array] The array to inspect.
21864 * @param {*} target The value to search for.
21865 * @returns {boolean} Returns `true` if `target` is found, else `false`.
21867 function arrayIncludes(array, value) {
21868 var length = array == null ? 0 : array.length;
21869 return !!length && baseIndexOf(array, value, 0) > -1;
21873 * This function is like `arrayIncludes` except that it accepts a comparator.
21876 * @param {Array} [array] The array to inspect.
21877 * @param {*} target The value to search for.
21878 * @param {Function} comparator The comparator invoked per element.
21879 * @returns {boolean} Returns `true` if `target` is found, else `false`.
21881 function arrayIncludesWith(array, value, comparator) {
21883 length = array == null ? 0 : array.length;
21885 while (++index < length) {
21886 if (comparator(value, array[index])) {
21894 * This method returns `undefined`.
21902 * _.times(2, _.noop);
21903 * // => [undefined, undefined]
21905 function noop$3() {
21906 // No operation performed.
21909 /** Used as references for various `Number` constants. */
21910 var INFINITY$3 = 1 / 0;
21913 * Creates a set object of `values`.
21916 * @param {Array} values The values to add to the set.
21917 * @returns {Object} Returns the new set.
21919 var createSet = !(Set$1 && (1 / setToArray(new Set$1([,-0]))[1]) == INFINITY$3) ? noop$3 : function(values) {
21920 return new Set$1(values);
21923 /** Used as the size to enable large array optimizations. */
21924 var LARGE_ARRAY_SIZE$1 = 200;
21927 * The base implementation of `_.uniqBy` without support for iteratee shorthands.
21930 * @param {Array} array The array to inspect.
21931 * @param {Function} [iteratee] The iteratee invoked per element.
21932 * @param {Function} [comparator] The comparator invoked per element.
21933 * @returns {Array} Returns the new duplicate free array.
21935 function baseUniq(array, iteratee, comparator) {
21937 includes = arrayIncludes,
21938 length = array.length,
21945 includes = arrayIncludesWith;
21947 else if (length >= LARGE_ARRAY_SIZE$1) {
21948 var set = iteratee ? null : createSet(array);
21950 return setToArray(set);
21953 includes = cacheHas;
21954 seen = new SetCache;
21957 seen = iteratee ? [] : result;
21960 while (++index < length) {
21961 var value = array[index],
21962 computed = iteratee ? iteratee(value) : value;
21964 value = (comparator || value !== 0) ? value : 0;
21965 if (isCommon && computed === computed) {
21966 var seenIndex = seen.length;
21967 while (seenIndex--) {
21968 if (seen[seenIndex] === computed) {
21973 seen.push(computed);
21975 result.push(value);
21977 else if (!includes(seen, computed, comparator)) {
21978 if (seen !== result) {
21979 seen.push(computed);
21981 result.push(value);
21988 * This method is like `_.isArrayLike` except that it also checks if `value`
21995 * @param {*} value The value to check.
21996 * @returns {boolean} Returns `true` if `value` is an array-like object,
22000 * _.isArrayLikeObject([1, 2, 3]);
22003 * _.isArrayLikeObject(document.body.children);
22006 * _.isArrayLikeObject('abc');
22009 * _.isArrayLikeObject(_.noop);
22012 function isArrayLikeObject(value) {
22013 return isObjectLike(value) && isArrayLike(value);
22017 * Creates an array of unique values, in order, from all given arrays using
22018 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22019 * for equality comparisons.
22025 * @param {...Array} [arrays] The arrays to inspect.
22026 * @returns {Array} Returns the new array of combined values.
22029 * _.union([2], [1, 2]);
22032 var union = baseRest(function(arrays) {
22033 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
22036 /** Used as the size to enable large array optimizations. */
22037 var LARGE_ARRAY_SIZE$2 = 200;
22040 * The base implementation of methods like `_.difference` without support
22041 * for excluding multiple arrays or iteratee shorthands.
22044 * @param {Array} array The array to inspect.
22045 * @param {Array} values The values to exclude.
22046 * @param {Function} [iteratee] The iteratee invoked per element.
22047 * @param {Function} [comparator] The comparator invoked per element.
22048 * @returns {Array} Returns the new array of filtered values.
22050 function baseDifference(array, values, iteratee, comparator) {
22052 includes = arrayIncludes,
22054 length = array.length,
22056 valuesLength = values.length;
22062 values = arrayMap(values, baseUnary(iteratee));
22065 includes = arrayIncludesWith;
22068 else if (values.length >= LARGE_ARRAY_SIZE$2) {
22069 includes = cacheHas;
22071 values = new SetCache(values);
22074 while (++index < length) {
22075 var value = array[index],
22076 computed = iteratee == null ? value : iteratee(value);
22078 value = (comparator || value !== 0) ? value : 0;
22079 if (isCommon && computed === computed) {
22080 var valuesIndex = valuesLength;
22081 while (valuesIndex--) {
22082 if (values[valuesIndex] === computed) {
22086 result.push(value);
22088 else if (!includes(values, computed, comparator)) {
22089 result.push(value);
22096 * Creates an array excluding all given values using
22097 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22098 * for equality comparisons.
22100 * **Note:** Unlike `_.pull`, this method returns a new array.
22106 * @param {Array} array The array to inspect.
22107 * @param {...*} [values] The values to exclude.
22108 * @returns {Array} Returns the new array of filtered values.
22109 * @see _.difference, _.xor
22112 * _.without([2, 1, 2, 3], 1, 2);
22115 var without = baseRest(function(array, values) {
22116 return isArrayLikeObject(array)
22117 ? baseDifference(array, values)
22121 function osmIsInterestingTag(key) {
22122 return key !== 'attribution' &&
22123 key !== 'created_by' &&
22124 key !== 'source' &&
22126 key.indexOf('tiger:') !== 0;
22131 var osmOneWayTags = {
22133 'chair_lift': true,
22134 'mixed_lift': true,
22139 'magic_carpet': true,
22150 'piste:halfpipe': true
22167 var osmPavedTags = {
22172 'concrete:lanes': true,
22173 'concrete:plates': true
22297 "беларуская (тарашкевіца)",
22298 "беларуская (тарашкевіца)",
22338 "বিষ্ণুপ্রিয়া মণিপুরী",
22367 "Chavacano de Zamboanga",
22368 "Chavacano de Zamboanga",
22372 "Min Dong Chinese",
22413 "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
22433 "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
22487 "Emiliano-Romagnolo",
22488 "emiliàn e rumagnòl",
22543 "Na Vosa Vakaviti",
22562 "Northern Frisian",
22613 "गोंयची कोंकणी / Gõychi Konknni",
22693 "Bahasa Indonesia",
22733 "ᐃᓄᒃᑎᑐᑦ/inuktitut",
22742 "Jamaican Creole English",
22818 "къарачай-малкъар",
22958 "Baso Minangkabau",
23057 "Norwegian Nynorsk",
23078 "Sesotho sa Leboa",
23142 "Pennsylvania German",
23157 "Norfuk / Pitkern",
23158 "Norfuk / Pitkern",
23283 "srpskohrvatski / српскохрватски",
23347 "Saterland Frisian",
23473 "ئۇيغۇرچە / Uyghurche",
23488 "oʻzbekcha/ўзбекча",
23582 "Classical Chinese",
23587 "Chinese (Min Nan)",
23603 var wikipedia$1 = /*#__PURE__*/Object.freeze({
23607 var require$$6 = ( wikipedia$1 && wikipedia ) || wikipedia$1;
23609 var wikipedia$2 = require$$6;
23611 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 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 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:977},"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:1077},"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,tags:{"name:en":"Doutor"}},"星巴克":{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:874},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,tags:{brand:"Oilibya","name:ar":"أويليبيا"}},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},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 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}}};
23612 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}}};
23613 var man_made = {windmill:{"De Hoop":{count:57}}};
23614 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},"ΑΒ Βασιλόπουλος":{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}}};
23615 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}}};
23616 var dataSuggestions = {
23619 man_made: man_made,
23624 var dataAddressFormats = [{format:[["housenumber","street"],["city","postcode"]]},{countryCodes:["au"],format:[["unit","housenumber","street"],["suburb","state","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:["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"]]}];
23626 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"}}];
23628 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,"SK53_bulk:load":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};
23630 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:{rtl:false},lt:{rtl:false},lv:{rtl:false},mg:{rtl:false},mk:{rtl:false},ml:{rtl:false},mn:{rtl:false},ms:{rtl:false},ne:{rtl:false},nl:{rtl:false},nn:{rtl:false},no:{rtl:false},nv:{rtl:false},pl:{rtl:false},pt:{rtl:false},"pt-BR":{rtl:false},rm:{rtl:false},ro:{rtl:false},ru:{rtl:false},sc:{rtl:false},si:{rtl:false},sk:{rtl:false},sl:{rtl:false},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}};
23632 var dataPhoneFormats = {ag:"+1-268-555-1234",ai:"+1-264-555-1234",as:"+1-684-555-1234",at:"+43 1 123 45 67",bb:"+1-246-555-1234",bj:"+229 20 12 34 56",bm:"+1-441-555-1234",br:"+55 11 0982 1098",bs:"+1-242-555-1234",ca:"+1-226-555-1234",ci:"+225 20 12 34 56",cn:"+86 10 12345678",de:"+49 89 1234567",dm:"+1-767-555-1234","do":"+1-809-555-1234",es:"+34 989 12 34 56",fi:"+358 40 123 4567",fr:"+33 1 23 45 67 89",gb:"+44 1632 961234",gd:"+1-473-555-1234",gg:"+44 1632 961234",gu:"+1-671-555-1234",hk:"+852 1234 5678",hr:"+385 01 123 4567",hu:"+36 1 123 45 67",ie:"+353 20 912 3456",im:"+44 1632 961234",it:"+39 01 123 456",je:"+44 1632 961234",jm:"+1-876-555-1234",kn:"+1-869-555-1234",ky:"+1-345-555-1234",kz:"+7 495 1234567",lc:"+1-758-555-1234",mp:"+1-670-555-1234",ms:"+1-664-555-1234",nl:"+31 42 123 4567",no:"+47 22 12 34 56",pl:"+48 42 123 4567",pr:"+1-787-555-1234",pt:"+351 211 123456",ru:"+7 495 1234567",se:"+46 31 123 4567",si:"+386 31 123 4567",sj:"+47 22 12 34 56",sx:"+1-721-555-1234",tc:"+1-649-555-1234",tr:"+90 312 123 4567",tt:"+1-868-555-1234",tw:"+886 1 2345 6789",ua:"+380 44 123 4567",us:"+1-202-555-1234",va:"+39 01 123 456",vc:"+1-784-555-1234",vg:"+1-284-555-1234",vi:"+1-340-555-1234",vn:"+84 1 234 5678",za:"+27 11 907 1111"};
23634 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"}]}]}];
23636 var type$2 = "FeatureCollection";
23637 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]]]}}];
23638 var dataImperial = {
23643 var type$3 = "FeatureCollection";
23644 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]]]}}];
23645 var dataDriveLeft = {
23647 features: features$1
23650 var en = {icons:{information:"info",remove:"remove",undo:"undo"},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."},relation:"These features can't be connected because they have conflicting relation roles.",restriction:"These features can't be connected because it would damage a \"{relation}\" relation."},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 it would damage a \"{relation}\" relation.",relation:"These features can't be merged because they have conflicting relation roles.",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",no_history:"No History (New Feature)",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:{just_edited:"You just edited OpenStreetMap!",thank_you:"Thank you for improving the map.",thank_you_location:"Thank you for improving the map around {where}.",help_html:"Your changes should appear on OpenStreetMap within a few minutes. It may take longer for maps elsewhere to receive updates.",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",view_on_osm:"View Changes on OSM",changeset_id:"Your changeset #: {changeset_id}",like_osm:"Like OpenStreetMap? Connect with others:",more:"More",events:"Events",languages:"Languages: {languages}",missing:"Is something missing from this list?",tell_us:"Tell us!"},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"},streetside:{tooltip:"Streetside photos from Microsoft",title:"Photo Overlay (Bing Streetside)",report:"Report a privacy concern with this image",hires:"High resolution"},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"},booth:{label:"Booth"},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"},distance:{label:"Total Distance"},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"},faces:{label:"Faces"},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..."},horse_dressage:{label:"Dressage Riding",options:{"undefined":"No",equestrian:"Yes"}},horse_riding:{label:"Horseback Riding",options:{"undefined":"No",horse_riding:"Yes"}},horse_scale:{label:"Horseback Riding Difficulty",placeholder:"Difficult, Dangerous...",options:{common:"Easy: No problems or difficulties. (default)",demanding:"Use with caution: Uneven way, occasional difficult passages.",difficult:"Difficult: Way narrow and exposed. May contain obstacles to step over and narrow passages.",critical:"Borderline: Passable only for experienced riders and horses. Major obstacles. Bridges should be examined carefully.",dangerous:"Dangerous: Passable only for very experienced riders and horses and only in good weather. Dismount.",impossible:"Impassable: Way or bridge not passable for horses. Too narrow, insuffient support, obstacles like ladders. Danger of life."}},horse_stables:{label:"Riding Stable",options:{"undefined":"No",stables:"Yes"}},iata:{label:"IATA"},icao:{label:"ICAO"},incline_steps:{label:"Incline",options:{up:"Up",down:"Down"}},incline:{label:"Incline"},indoor:{label:"Indoor"},industrial:{label:"Type"},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..."},"maxspeed/advisory":{label:"Advisory 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:"Telephone",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"},"siren/purpose":{label:"Purpose"},"siren/type":{label:"Type",options:{pneumatic:"Pneumatic",electronic:"Electronic",other:"Other"}},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"},usage_rail:{label:"Usage Type",options:{main:"Main",branch:"Branch",industrial:"Industrial",military:"Military",test:"Test",tourism:"Tourism"}},vending:{label:"Types 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:""},"advertising/column":{name:"Advertising Column",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"},"allotments/plot":{name:"Community Garden Plot",terms:""},"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/monastery":{name:"Monastery Grounds",terms:"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,monastery,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"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/coffee":{name:"Coffee Vending Machine",terms:"coffee"},"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/electronics":{name:"Electronics Vending Machine",terms:"cable,charger,earbud,headphone,phone,tablet"},"amenity/vending_machine/elongated_coin":{name:"Flat Coin Vending Machine",terms:"coin,crush,elongated,flatten,penny,souvenir"},"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/food":{name:"Food Vending Machine",terms:"food"},"amenity/vending_machine/fuel":{name:"Gas Pump",terms:"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/vending_machine/ice_cream":{name:"Ice Cream Vending Machine",terms:"chocolate,ice cream,frozen,popsicle,vanilla"},"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/stamps":{name:"Postage Vending Machine",terms:"mail,postage,stamp"},"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/maze":{name:"Maze",terms:"theme park,amusement ride,labyrinth"},"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/grandstand":{name:"Grandstand",terms:"tribune,stand,stands,bleachers"},"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_alarm":{name:"Fire Alarm Call Box",terms:""},"emergency/fire_extinguisher":{name:"Fire Extinguisher",terms:""},"emergency/fire_hydrant":{name:"Fire Hydrant",terms:"fire plug"},"emergency/first_aid_kit":{name:"First Aid Kit",terms:"bandage,first aid,med,med kit,medic*,medkit"},"emergency/life_ring":{name:"Life Ring",terms:"life buoy,kisby ring,kisbie ring,perry buoy"},"emergency/lifeguard":{name:"Lifeguard",terms:"CPR,rescue"},"emergency/phone":{name:"Emergency Phone",terms:""},"emergency/siren":{name:"Siren",terms:"air raid,loud,noise,storm,tornado,warning"},"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/laboratory":{name:"Medical Laboratory",terms:"medical_laboratory,medical_lab,blood_check"},"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,trail"},"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:"exit"},"highway/motorway_link":{name:"Motorway Link",terms:"exit,ramp,road,street,on ramp,off ramp"},"highway/motorway":{name:"Motorway",terms:"autobahn,expressway,freeway,highway,interstate,parkway,road,street,thruway,turnpike"},"highway/passing_place":{name:"Passing Place",terms:"turnout, pullout"},"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:"on ramp,off ramp,ramp,road,street"},"highway/primary":{name:"Primary Road",terms:"road,street"},"highway/raceway":{name:"Racetrack (Motorsport)",terms:"auto*,formula one,kart,motocross,nascar,race*,track"},"highway/residential":{name:"Residential Road",terms:"road,street"},"highway/rest_area":{name:"Rest Area",terms:"rest stop"},"highway/road":{name:"Unknown Road",terms:"road,street"},"highway/secondary_link":{name:"Secondary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/secondary":{name:"Secondary Road",terms:"road,street"},"highway/service":{name:"Service Road",terms:"road,street"},"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:"on ramp,off ramp,ramp,road,street"},"highway/tertiary":{name:"Tertiary Road",terms:"road,street"},"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:"on ramp,off ramp,ramp,road,street"},"highway/trunk":{name:"Trunk Road",terms:"road,street"},"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:"road,street"},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:"dedicatory,epitaph,remember,remembrance,memory,monument,stolperstein"},"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:"cut,forest,lumber,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/beach_resort":{name:"Beach Resort",terms:""},"leisure/bird_hide":{name:"Bird Hide",terms:"machan,ornithology"},"leisure/bleachers":{name:"Bleachers",terms:"crowd,bench,sports,stand,stands,seat,seating"},"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/outdoor_seating":{name:"Outdoor Seating Area",terms:"al fresco,beer garden,dining,cafe,restaurant,pub,bar,patio"},"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/antenna":{name:"Antenna",terms:"broadcast,cell phone,cell,communication,mobile phone,radio,television,transmission,tv"},"man_made/breakwater":{name:"Breakwater",terms:""},"man_made/bridge":{name:"Bridge",terms:""},"man_made/chimney":{name:"Chimney",terms:""},"man_made/clearcut":{name:"Clearcut Forest",terms:"cut,forest,lumber,tree,wood"},"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/observatory":{name:"Observatory",terms:"astronomical,meteorological"},"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:"crag,escarpment,rock face,scarp"},"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/mud":{name:"Mud",terms:"wetland"},"natural/peak":{name:"Peak",terms:"acme,aiguille,alp,climax,crest,crown,hill,mount,mountain,pinnacle,summit,tip,top"},"natural/reef":{name:"Reef",terms:"barrier,coral,ocean,sand,shoal"},"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_repair":{name:"Motorcycle Repair Shop",terms:"auto,bike,garage,motorcycle,repair,service"},"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_grooming":{name:"Pet Grooming Store",terms:"dog"},"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/trail_riding_station":{name:"Trail Riding Station",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:"Only Left Turn",terms:""},"type/restriction/only_right_turn":{name:"Only Right Turn",terms:""},"type/restriction/only_straight_on":{name:"Only Straight On",terms:""},"type/restriction/only_u_turn":{name:"Only U-turn",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:{AGIV:{attribution:{text:"Orthophoto Flanders most recent © AGIV"},name:"AGIV Flanders most recent aerial imagery"},AGIV10cm:{attribution:{text:"Orthophoto Flanders © AGIV"},name:"AGIV Flanders 2013-2015 aerial imagery 10cm"},AGIVFlandersGRB:{attribution:{text:"GRB Flanders © AGIV"},name:"AGIV Flanders GRB"},Bing:{description:"Satellite and aerial imagery.",name:"Bing aerial imagery"},"DigitalGlobe-Premium":{attribution:{text:"Terms & Feedback"},description:"DigitalGlobe-Premium is a mosaic composed of DigitalGlobe basemap with select regions filled with +Vivid or custom area of interest imagery, 50cm resolution or better, and refreshed more frequently with ongoing updates.",name:"DigitalGlobe Premium Imagery"},"DigitalGlobe-Premium-vintage":{attribution:{text:"Terms & Feedback"},description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",name:"DigitalGlobe Premium Imagery Vintage"},"DigitalGlobe-Standard":{attribution:{text:"Terms & Feedback"},description:"DigitalGlobe-Standard is a curated set of imagery covering 86% of the earth’s landmass, with 30-60cm resolution where available, backfilled by Landsat. Average age is 2.31 years, with some areas updated 2x per year.",name:"DigitalGlobe Standard Imagery"},"DigitalGlobe-Standard-vintage":{attribution:{text:"Terms & Feedback"},description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 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"},SPW_ORTHO_LAST:{name:"SPW(allonie) most recent aerial imagery"},SPW_PICC:{name:"SPW(allonie) PICC numerical imagery"},"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"},US_Forest_Service_roads_overlay:{description:"Highway: Green casing = unclassified. Brown casing = track. Surface: gravel = light brown fill, Asphalt = black, paved = gray, ground =white, concrete = blue, grass = green. Seasonal = white bars",name:"U.S. Forest Roads Overlay"},UrbISOrtho2016:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2016"},UrbISOrtho2017:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2017"},UrbisAdmFR:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbisAdm FR"},UrbisAdmNL:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbisAdm NL"},"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 government 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)"},"osmse-ekonomiska":{attribution:{text:"© Lantmäteriet"},description:"Scan of ´Economic maps´ ca 1950-1980",name:"Lantmäteriet Economic Map (historic)"},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. Data by OpenStreetMap, under ODbL"},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"},"trafikverket-baninfo":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish railway network, including sidings",name:"Trafikverket Railway Network"},"trafikverket-baninfo-option":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish railway network with several options for map layers",name:"Trafikverket Railway Network options"},"trafikverket-vagnat":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB road network",name:"Trafikverket Road Network"},"trafikverket-vagnat-extra":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB extra details: Highway reference, traffic calming, rest area, bus stop, bridge, tunnel, speed camera",name:"Trafikverket Road Network extra"},"trafikverket-vagnat-navn":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB street names",name:"Trafikverket Street Names"},"trafikverket-vagnat-option":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB road network with several options for map layers",name:"Trafikverket Road Network options"}},community:{"cape-coast-youthmappers":{name:"University of Cape Coast YouthMappers",description:"Follow us on Twitter: {url}",extendedDescription:"This is the official handle for the Youth Mappers chapter of the University of Cape Coast, Ghana. we love maps, open data and helping the vulnerable."},"osm-gh-facebook":{name:"OpenStreetMap Ghana on Facebook",description:"Facebook group for people interested in OpenStreetMap.",extendedDescription:"Mappers in Ghana community, promoting OpenStreetMap and Humanitarian OpenStreetMap Team (HOT) projects in Ghana. Join us."},"osm-gh-twitter":{name:"OpenStreetMap Ghana on Twitter",description:"Follow us on Twitter: {url}"},"talk-gh":{name:"Talk-gh Mailing List",description:"Talk-gh is the official mailing list for Ghana OSM community."},"osm-mg-facebook":{name:"OpenStreetMap Madagascar Facebook Group",description:"Malagasy Facebook group for people interested in OpenStreetMap."},"talk-mg":{name:"Talk-mg Mailing List",description:"Place for OpenStreetMap contributors, communities and users in Madagascar to share and discuss."},"OSM-BGD-facebook":{name:"OpenStreetMap Bangladesh",description:"Improve OpenStreetMap in Bangladesh",extendedDescription:"Mapping in Bangladesh? Have questions, want to connect with the community here? Join us at {url}. All are welcome!"},"OSM-India-facebook":{name:"OpenStreetMap India - Participatory neighborhood mapping",description:"Improve OpenStreetMap in India",extendedDescription:"Mapping in India? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",events:{sotmasia2018:{name:"State of the Map Asia 2018",description:"Join the 2018 OpenStreetMap region-wide event at State of the Map Asia in India",where:"Indian Institute of Management, Bangalore, India"}}},"OSM-india-mailinglist":{name:"OpenStreetMap India Mailinglist",description:"Talk-in is the official Mailinglist for Indian Community"},"OSM-india-twitter":{name:"OpenStreetMap India Twitter",description:"We are just a tweet away: {url}"},"OSM-India-Puducherry-Facebook":{name:"Free Software Hardware Movement - Facebook",description:"FSHM Facebook page to know about community events, activities",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap. Its FB page is the best way to keep in contact with its events."},"OSM-India-Puducherry-Matrix":{name:"Free Software Hardware Movement - Matrix",description:"FSHM Riot group to discuss, share and update mapping activities, events in and around Puducherry",extendedDescription:"FSHM community members share their OSM mapping updates / experiences through the Riot.im group, this group is also used to discuss things related to free software / hardware, technology and activism."},"OSM-IDN-facebook":{name:"OpenStreetMap Indonesia",description:"Improve OpenStreetMap in Indonesia",extendedDescription:"Mapping in Indonesia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-japan-facebook":{name:"OpenStreetMap Japan Community",description:"Mappers and OpenStreetMap users in Japan"},"OSM-japan-mailinglist":{name:"OpenStreetMap Japan Mailinglist",description:"Talk-ja is an Official Mailinglist for Japanese Community"},"OSM-japan-twitter":{name:"OpenStreetMap Japan Twitter",description:"Hashtag on Twitter: {url}"},"OSM-japan-website":{name:"OpenStreetMap Japan",description:"Mappers and OpenStreetMap users in Japan"},"OSM-korea-telegram":{name:"OSM Korea Telegram Channel",description:"Unofficial Channnel for OpenStreetMap contributors, communities and users in Korea to share and discuss."},"OSM-MY-facebook":{name:"OpenStreetMap Malaysia on Facebook",description:"For chat about anything related to OpenStreetMap!"},"OSM-MY-forum":{name:"OpenStreetMap Malaysia Forum",description:"Official OpenStreetMap Malaysia Forum"},"OSM-MY-matrix":{name:"OpenStreetMap Malaysia Riot channel",description:"All mappers are welcome! Sign up at {signupUrl}"},"OSM-MNG-facebook":{name:"OpenStreetMap Mongolia",description:"Improve OpenStreetMap in Mongolia",extendedDescription:"Mapping in Mongolia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-MMR-facebook":{name:"OpenStreetMap Myanmar",description:"Improve OpenStreetMap in Myanmar",extendedDescription:"Mapping in Myanmar? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-Nepal-facebook":{name:"OpenStreetMap Nepal",description:"Improve OpenStreetMap in Nepal",extendedDescription:"Mapping in Nepal? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-PH-facebook":{name:"OpenStreetMap PH Facebook",description:"Welcome to OpenStreetMap Philippines, where we encourage all fellow Filipinos to contribute to the OpenStreetMap project."},"OSM-PH-mailinglist":{name:"Talk-ph Mailing List",description:"A mailing list to discuss OpenStreetMap in the Philippines"},"OSM-PH-slack":{name:"OpenStreetMap PH Slack",description:"All are welcome! Sign up at {signupUrl}"},"OSM-PH-telegram":{name:"OpenStreetMap PH Telegram",description:"Un-official, Telegram local community of OpenStreetMap contributors and friends in the Philippines"},"OSM-RU-forum":{name:"OpenStreetMap RU forum",description:"OpenStreetMap Russia web forum"},"OSM-RU-telegram":{name:"OpenStreetMap RU telegram",description:"OpenStreetMap Russia telegram chat"},"OSM-LKA-facebook":{name:"OpenStreetMap Sri Lanka",description:"Improve OpenStreetMap in Sri Lanka",extendedDescription:"Mapping in Sri Lanka? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-TW-facebook":{name:"OpenStreetMap Taiwan Community",description:"Facebook Group for Mappers and OpenStreetMap users to discuss matters about Taiwan."},"OSM-TW-mailinglist":{name:"OpenStreetMap Taiwan Mailinglist",description:"Talk-tw is an Official Mailinglist for the Communities to dicuss matters about Taiwan"},"OSM-TH-CNX-meetup":{name:"OSM Meetup Chiang Mai",description:"Irregular meeting of the OpenStreetMap community in Chiang Mai",extendedDescription:"Members of the OpenStreetMap community meet every few months in Chiang Mai. Get in contact and check out {url} to see when the next meetup is scheduled"},"OSM-TH-facebook":{name:"OpenStreetMap TH Facebook group",description:"Facebook group for OpenStreetMappers in Thailand"},"OSM-TH-forum":{name:"OpenStreetMap TH forum",description:"OpenStreetMap Thailand web forum"},"al-forum":{name:"OSM Albania Forum",description:"OpenStreetMap Albania Forum"},"al-maptime-tirana":{name:"Maptime Tirana",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time."},"al-telegram":{name:"OSM Albania Telegram channel",description:"OpenStreetMap Albania Telegram channel"},"at-forum":{name:"OpenStreetMap Austria Forum",description:"The official forum for OpenStreetMap questions in and around Austria"},"at-mailinglist":{name:"Talk-at Mailing List",description:"Talk-at is the official mailing list for the Austrian OSM community"},"at-twitter":{name:"OpenStreetMap Austria Twitter",description:"OpenStreetMap Austria On Twitter: {url}"},"osmgraz-meetup":{name:"OSM community meetup Graz",description:"Monthly meetup of the OpenStreetMap community in Graz"},"osmgraz-twitter":{name:"OSM community Graz on twitter",description:"OpenStreetMap community in Graz on twitter"},"osm-at":{name:"OpenStreetMap Austria",description:"The platform for information on OpenStreetMap in Austria"},byosm:{name:"OpenStreetMap Belarus",description:"OpenStreetMap Belarus telegram chat"},"be-facebook":{name:"OpenStreetMap BE Community",description:"Mappers and OpenStreetMap on Facebook in Belgium"},"be-forum":{name:"OpenStreetMap BE forum",description:"OpenStreetMap Belgium web forum"},"be-irc":{name:"OpenStreetMap Belgium IRC",description:"Join #osmbe on irc.oftc.net (port 6667)",extendedDescription:"Join #osmbe on irc.oftc.net (port 6667), it is bridged with the Matrix chat channel"},"be-mailinglist":{name:"Talk-be Mailing List",description:"Talk-be is the official mailing list for the Belgian OSM community"},"be-maptime":{name:"Maptime Belgium",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time."},"be-matrix":{name:"OpenStreetMap BE Matrix channel",description:"All mappers are welcome!",extendedDescription:"Most talk is happening at the \"OpenStreetMap Belgium\" channel. You can ask anything there! The other rooms are for specific subjects."},"be-meetup":{name:"OpenStreetMap Belgium Meetup",description:"Real life meetups of everyone who is interested in OpenStreetMap",extendedDescription:"Physical meetups are great to meet other mappers, ask them questions and to learn a lot. Especially new contributors are very welcome!"},"be-twitter":{name:"OpenStreetMap Belgium Twitter",description:"OSM Belgium on Twitter: @osm_be"},"hr-facebook":{name:"OpenStreetMap Croatia Facebook group",description:"OpenStreetMap Croatia Facebook group"},"hr-irc":{name:"OpenStreetMap Croatia on IRC",description:"Join #osm-hr on irc.freenode.org (port 6667)"},"hr-mailinglist":{name:"Talk-hr Mailing List",description:"Talk-hr mailing list"},"czech-community":{name:"Czech OSM community",description:"Map portal, website and contacts on OSM members in Czechia"},"osmcz-facebook":{name:"OpenStreetMap CZ on Facebook",description:"Follow czech community on Facebook - including translated WeeklyOSM!"},"osmcz-twitter":{name:"Czech twitter @osmcz",description:"Follow czech community on Twitter - including translated WeeklyOSM!"},"talk-cz-mailinglist":{name:"Czech mailing list (talk-cz)",description:"Talk-cz is the official mailing list for Czech community"},"dk-forum":{name:"OpenStreetMap Denmark Web Forum",description:"OpenStreetMap Denmark web forum"},"dk-irc":{name:"OpenStreetMap Denmark IRC",description:"Join #osm-dk on irc.oftc.net (port 6667)"},"dk-mailinglist":{name:"Talk-dk Mailing List",description:"A mailing list to discuss OpenStreetMap in Denmark"},"fi-forum":{name:"OpenStreetMap FI forum",description:"OpenStreetMap Finland web forum"},"fi-irc":{name:"OpenStreetMap Finland IRC",description:"Join #osm-fi on irc.oftc.net (port 6667)"},"fi-mailinglist":{name:"Talk-fi Mailing List",description:"Talk-fi is the official mailing list for the Finnish OSM community"},"fr-facebook":{name:"OpenStreetMap France Facebook page",description:"OpenStreetMap France Facebook page"},"fr-forum":{name:"OpenStreetMap France web forum",description:"OpenStreetMap France web forum"},"fr-irc":{name:"OpenStreetMap France on IRC",description:"Join #osm-fr on irc.oftc.net (port 6667)"},"fr-mailinglist":{name:"Talk-fr Mailing List",description:"Talk-fr mailing list"},"fr-twitter":{name:"OpenStreetMap France on Twitter",description:"OpenStreetMap France on Twitter: {url}"},"de-berlin-mailinglist":{name:"Berlin Mailing List",description:"This is the mailing list for the Berlin OSM community"},"de-berlin-meetup":{name:"OpenStreetMap Berlin-Brandenburg Meetup",description:"Mappers and OpenStreetMap users in the Berlin area"},"de-berlin-telegram":{name:"@osmberlin on Telegram",description:"OpenStreetMap Berlin Telegram chat"},"de-berlin-twitter":{name:"OpenStreetMap Berlin Twitter",description:"Follow us on Twitter: {url}"},"de-forum":{name:"OpenStreetMap DE forum",description:"OpenStreetMap Germany web forum"},"de-irc":{name:"OpenStreetMap Germany IRC",description:"Join #osm-de on irc.oftc.net (port 6667)"},"de-mailinglist":{name:"Talk-de Mailing List",description:"Talk-de is the official mailing list for the German OSM community"},"de-ostwestfalen-lippe-mailinglist":{name:"OWL Mailing List",description:"This is the mailing list for the Ostwestfalen-Lippe OSM community"},"de-telegram":{name:"OpenStreetMap Germany Telegram",description:"Join the OpenStreetMap Germany Telegram supergroup at {url}"},"osm-de":{name:"OpenStreetMap Germany",description:"The platform for information on OpenStreetMap in Germany"},"hu-facebook":{name:"OpenStreetMap HU on Facebook",description:"Mappers and OpenStreetMap Facebook in Hungary"},"hu-forum":{name:"OpenStreetMap HU forum",description:"OpenStreetMap Hungary web forum"},"hu-meetup":{name:"OpenStreetMap Hungary Meetup",description:"The platform for organizing meetups in Hungary"},"it-facebook":{name:"OpenStreetMap Italy Facebook",description:"Join the OpenStreetMap Italy community on Facebook"},"it-irc":{name:"OpenStreetMap Italy IRC",description:"Join #osm-it on irc.oftc.net (port 6667)"},"it-mailinglist":{name:"Talk-it Mailing List",description:"Talk-it is the official mailing list for the Italian OSM community"},"it-telegram":{name:"@OpenStreetMapItalia on Telegram",description:"OpenStreetMap Italy Telegram chat"},"it-twitter":{name:"OpenStreetMap Italy Twitter",description:"Follow us on Twitter at {url}"},"OSM-Rome-meetup":{name:"Incontro Mappatori Romani",description:"Improve OpenStreetMap in the Rome area",extendedDescription:"We aim to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Lazio."},"South-Tyrol-Mailing-List":{name:"OpenStreetMap mailing list for South Tyrol",description:"OpenStreetMap Italy regional talk list for South Tyrol"},"talk-it-lazio":{name:"OpenStreetMap IT Lazio",description:"All are welcome! Sign up at {signupUrl}",extendedDescription:"Mailinglist for Rome and Lazio area."},"Trentino-Mailing-List":{name:"OpenStreetMap mailing list for Trentino",description:"OpenStreetMap Italy regional talk list for Trentino"},"no-forum":{name:"OpenStreetMap Norway Web Forum",description:"OpenStreetMap Norway web forum"},"no-irc":{name:"OpenStreetMap Norway on IRC",description:"Chat room for mappers and OpenStreetMap users, developers and enthusiasts in Norway"},"no-mailinglist":{name:"OpenStreetMap Norway mailing list",description:"Mailing list for mappers and OpenStreetMap users, developers and enthusiasts in Norway"},"OSM-PL-facebook-group":{name:"OpenStreetMap Poland Facebook group",description:"Group for mappers and users of OpenStreetMap in Poland"},"OSM-PL-forum":{name:"OpenStreetMap Poland Forum",description:"Forum of Polish OpenStreetMap community"},"si-forum":{name:"OpenStreetMap Slovenia Forum",description:"Forum of OpenStreetMap community in Slovenia"},"si-mailinglist":{name:"OpenStreetMap Slovenia mailing list",description:"Mailing list of OpenStreetMap community in Slovenia"},"OSM-ES-mailinglist":{name:"Talk-es mailing list",description:"A mailing list to discuss OpenStreetMap in Spain"},"OSM-ES-telegram":{name:"@OSMes on Telegram",description:"OpenStreetMap Spain Telegram chat"},"osm-se":{name:"OpenStreetMap.se",description:"Provide OSM services and information for the local community in Sweden"},"se-facebook":{name:"OpenStreetMap Sweden Facebook",description:"OpenStreetMap Sweden on Facebook"},"se-forum":{name:"OpenStreetMap Sweden Web Forum",description:"OpenStreetMap Sweden web forum"},"se-irc":{name:"OpenStreetMap Sweden IRC",description:"Join #osm.se on irc.oftc.net (port 6667)"},"se-mailinglist":{name:"Talk-se Mailing List",description:"A mailing list to discuss OpenStreetMap in Sweden"},"se-twitter":{name:"OpenStreetMap Sweden on Twitter",description:"Follow us on Twitter: {url}"},"Nottingham-OSM-pub-meetup":{name:"East Midlands (Nottingham) Monthly pub meet-up",description:"Social gathering for East Midlands mappers and users",extendedDescription:"A group have been meeting since March 2011, initially in Nottingham, and, more recently in Derby, and from time to time elsewhere in the East Midlands. These are social gatherings, but are an excellent place to come and ask specific questions about OSM either in the area or in general. In the summer months we usually do some light mapping for an hour in the vicinity of our meeting place. The group as a whole has a special interest in mapping public rights of way and from time to time has mapping meetings for this purpose."},"gb-mailinglist":{name:"Talk-gb Mailing List",description:"Talk-gb is the main communication forum list for the British (including Northern Ireland) OSM community"},"mappa-mercia-group":{name:"Mappa Mercia local group",description:"A home for OpenStreetMap enthusiasts in the Midlands",extendedDescription:"Mappa Mercia is a project to grow OpenStreetMap in the West Midlands, UK. We run community events, provide training and support local organisations wishing to open up their data."},"gb-irc":{name:"OpenStreetMap United Kingdom IRC",description:"Join #osm-gb on irc.oftc.net (port 6667)",extendedDescription:"Join #osm-gb on irc.oftc.net (port 6667), please be patient and wait for a few minutes if you ask a question"},"OSM-CA-Slack":{name:"OSM-CA Slack",description:"All are welcome! Sign up at {signupUrl}."},"OSM-Vancouver-meetup":{name:"OpenStreetMap Vancouver",description:"Mappers and OpenStreetMap users in the Vancouver, BC area"},"OSM-CU-telegram":{name:"OSM Cuba on Telegram",description:"OpenStreetMap Cuba Telegram chat"},"OSM-NI-telegram":{name:"OSM Nicaragua on Telegram",description:"OpenStreetMap Nicaragua Telegram chat"},"Bay-Area-OpenStreetMappers":{name:"Bay Area OpenStreetMappers",description:"Improve OpenStreetMap in the Bay Area",extendedDescription:"This group is about growing the OpenStreetMap community here in the Bay Area. Our events are open to everyone, from open source enthusiasts, cyclists, GIS professionals, geocachers, and beyond. Anyone and everyone who is interested in maps, map making and free map data is welcome to join our group as well as attend our events."},"Central-Pennsylvania-OSM":{name:"Central Pennsylvania OSM",description:"Online mapping community based out of State College, PA"},"Code-for-San-Jose-Slack":{name:"Code for San Jose Slack",description:"All are welcome! Sign up at {signupUrl}, then join the #osm channel."},"Dallas-Fort-Worth-OSM":{name:"Dallas-Fort Worth OSM",description:"The OpenStreetMap user group for Dallas-Fort Worth",extendedDescription:"Dallas, Fort Worth, and all the cities in between are abounding with creative and tech-savvy people. The vision for this usergroup is to find new ways to use the amazing resource of OSM."},GeoPhilly:{name:"GeoPhilly",description:"Meetup for map enthusiasts in the Philadelphia area",extendedDescription:"GeoPhilly unites developers, geographers, data geeks, open source enthusiasts, civic hackers and map addicts in our shared love of maps and the stories they tell. If you use maps as part of your work or just want to learn more, this is the meetup for you! Our events aim to be open, friendly, educational and social and range from happy hours to lightning talks or even workshops. Come create a diverse, inspiring geospatial community in the Philadelphia with us!"},MapMinnesota:{name:"MapMinnesota",description:"Mappers and OpenStreetMap enthusiasts in the Twin Cities area",extendedDescription:"Connecting OpenStreetMap enthusiasts in Minnesota and the Twin Cities!"},"Mapping-DC-meetup":{name:"Mapping DC",description:"Improve OpenStreetMap in the DC area",extendedDescription:"We are a group of volunteer mappers who aim to improve the OpenStreetMap in the DC area. We also aim to teach others about the OSM ecosystem, data analytics, cartography, and GIS. We gather every other month at meetups to focus on one area of our city."},"Maptime-ME-meetup":{name:"MaptimeME",description:"Mappers and OpenStreetMap users, around Portland, ME",extendedDescription:"Maptime is, rather literally, time for mapmaking. Our mission is to open the doors of cartographic possibility to anyone interested by creating a time and space for collaborative learning, exploration, and map creation using mapping tools and technologies."},"OpenCleveland-meetup":{name:"Open Cleveland",description:"Improve OpenStreetMap in the Cleveland area",extendedDescription:"Open Geo Cleveland aims to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Northeast Ohio. We're also a maptime chapter =)"},"OSM-Boston":{name:"OpenStreetMap Boston",description:"Mappers and OpenStreetMap users in the Boston area",extendedDescription:"OpenStreetMap is the free and open, wiki-style map of the world, with hundreds of thousands of contributions every day from people like you. Editing the map is simple, and fun! Join us both indoors and outdoors in our effort to create the best map of the Boston area and the rest of the world!"},"OSM-Central-Salish-Sea":{name:"OpenStreetMap Central Salish Sea",description:"Mappers and OpenStreetMap users around Mount Vernon, WA",extendedDescription:"OpenStreetMap is an map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more. We meet all the time to talk maps, make maps and have fun!"},"OSM-Chattanooga":{name:"OSM Chattanooga",description:"The OpenStreetMap user group for Chattanooga"},"OSM-Colorado":{name:"OpenStreetMap Colorado",description:"Mappers and OpenStreetMap users in the state of Colorado, USA",extendedDescription:"OpenStreetMap (OSM) Colorado is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties."},"OSM-NYC":{name:"OpenStreetMap NYC",description:"Mappers and OpenStreetMap users, developers and enthusiasts in the New York Metropolitan area"},"OSM-Portland":{name:"OpenStreetMap Portland",description:"Mappers and OpenStreetMap users in the Portland area",extendedDescription:"OpenStreetMap (OSM) is a map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more, and come join us at a meetup to talk maps, contribute to OSM, and have fun!"},"OSM-Seattle":{name:"OpenStreetMap Seattle",description:"Mappers and OpenStreetMap users in the Seattle area"},"OSM-SoCal":{name:"OpenStreetMap Southern California",description:"Let's have some fun, contribute something to Los Angeles, and learn about mapping!",extendedDescription:"OpenStreetMap (OSM) Southern California is for anyone interested in mapping to get together to work with OpenStreetMap. OpenStreetMap, the Wikipedia of maps, is a free open-source map of the world being created by more than 1,000,000 volunteers around the globe. Everyone is welcome. If you don't know OpenStreetMap, we'll teach you. If you have an idea for a mapping project or even a field trip that the group can do, great!"},"OSM-South-Bay":{name:"OSM South Bay",description:"Map Nights hosted by Code for San Jose",extendedDescription:"Code for San Jose, the local Code for America brigade, hosts monthly Map Nights on Thursday nights in downtown San José. Meet fellow South Bay mappers, help out with local mapping projects, and hear about other civic tech projects. Programming and GIS skills are not required."},"OSM-Tampa-Bay":{name:"OpenStreetMap Tampa Bay",description:"Mappers and OpenStreetMap users in the Tampa Bay area",extendedDescription:"OSM Tampa Bay group for local residents to get together and build out the definitive map of Tampa Bay with OpenStreetMap, the free and editable map of the world. If you're into maps, data, open source, GPS, hiking, cycling, et cetera, you'll love working with OpenStreetMap -- so join in! We'll get together and map and talk about new topics once-a-month or so."},"OSM-US-Slack":{name:"OpenStreetMap US Slack",description:"All are welcome! Sign up at {signupUrl}"},"OSM-US":{name:"OpenStreetMap US",description:"We help grow and improve OpenStreetMap in the United States.",extendedDescription:"We support OpenStreetMap by holding annual conferences, providing community resources, building partnerships, and by spreading the word. Join OpenStreetMap US here: {signupUrl}",events:{sotmus2018:{name:"State of the Map US 2018",description:"Join the OpenStreetMap community at State of the Map US in Detroit, Michigan. Connect with other mappers, businesses, government agencies, and non profits, all collaborating around the free and editable map of the world.",where:"Detroit, Michigan"}}},"OSM-Utah":{name:"OpenStreetMap Utah",description:"Mappers and OpenStreetMap users in the Salt Lake City area",extendedDescription:"Activities may include things like Learn To Map workshops, mapping parties and outdoor data collection. The events will take place in the SLC area, at least initially. We are looking for seasoned mappers as well as people new to OSM. Join and let's do some mapping!"},"OSM-Wyoming":{name:"OpenStreetMap Wyoming",description:"Mappers and OpenStreetMap users in the state of Wyoming",extendedDescription:"OpenStreetMap (OSM) Wyoming is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties."},"PHXGeo-meetup":{name:"PHXGeo Meetup",description:"Mappers and OpenStreetMap users in the Phoenix, AZ area",extendedDescription:"This is a meetup group for those in the Phoenix area who like maps, GIS, OpenStreetMap, cartography and anything in between."},"PHXGeo-twitter":{name:"PHXGeo Twitter",description:"Follow us on Twitter at {url}"},"Western-Slope-facebook":{name:"Western Slope OSM Facebook",description:"Mappers and OpenStreetMap users around Grand Junction, CO"},"Western-Slope-meetup":{name:"Western Slope OSM Meetup",description:"Mappers and OpenStreetMap users around Grand Junction, CO",extendedDescription:"The goal of this group is to introduce OpenStreetMap to the community, develop a community of mappers, create the most amazing geodata possible using whatever method we can and finally strategize in order to get this data out into our community. Imagine accurate trail signage! Imagine further development of bike paths! Imagine anything you want, that's the joy of OpenStreetMap!"},"Maptime-Australia-Slack":{name:"Maptime Australia Slack",description:"Sign up at {signupUrl}"},"talk-au":{name:"Talk-au Mailing List",description:"Place for Aussie mappers to chat"},"OSM-AR-facebook":{name:"OpenStreetMap Argentina Facebook",description:"Join the OpenStreetMap Argentina community on Facebook",extendedDescription:"News from the local community"},"OSM-AR-forum":{name:"OpenStreetMap Argentina web forum",description:"Join the OpenStreetMap Argentina web forum",extendedDescription:"Ideal for long or important discussions. Slow response time."},"OSM-AR-irc":{name:"OpenStreetMap Argentina IRC",description:"Join #osm-ar on irc.oftc.net (port 6667)",extendedDescription:"You may find the most geeky user in the community."},"OSM-AR-mailinglist":{name:"Talk-ar Mailing List",description:"Historic mailing list. Almost unused today."},"OSM-AR-telegram":{name:"OpenStreetMap Argentina Telegram",description:"Join the OpenStreetMap Argentina community on Telegram",extendedDescription:"The most active channel in the community, ideal for chatting and getting answers to your questions instantly. Everyone is welcome!"},"OSM-AR-twitter":{name:"OpenStreetMap Argentina Twitter",description:"Follow us on Twitter at {url}",extendedDescription:"News from the local community and OpenStreetMap in general."},"OSM-BO-mailinglist":{name:"Talk-bo Mailing List",description:"Talk-bo is the official mailing list for the Bolivian OpenStreetMap community",extendedDescription:"Mapping in Bolivia? Have questions, want to connect with the community here? Join us at {url}. All are welcome!"},"Bahia-telegram":{name:"OpenStreetMap Bahia Telegram Group",description:"Join the OpenStreetMap Bahia community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"DF-telegram":{name:"OpenStreetMap Brasília Telegram Group",description:"Join the OpenStreetMap Brasília community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-br-mailinglist":{name:"Talk-br Mailing List",description:"A mailing list to discuss OpenStreetMap in Brazil"},"OSM-br-telegram":{name:"OpenStreetMap Brasil Telegram",description:"Join the OpenStreetMap Brasil community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-br-twitter":{name:"OpenStreetMap Brasil Twitter",description:"Follow us on Twitter at {url}"},"OSM-CL-facebook":{name:"OpenStreetMap Chile Facebook",description:"Join the OpenStreetMap Chile community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-mailinglist":{name:"Talk-cl Mailing List",description:"A mailing list to discuss OpenStreetMap in Chile"},"OSM-CL-telegram":{name:"OpenStreetMap Chile Telegram",description:"Join the OpenStreetMap Chile community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-twitter":{name:"OpenStreetMap Chile Twitter",description:"Follow us on Twitter at {url}"},"Maptime-Bogota":{name:"Maptime Bogotá",description:"We're a group of mappers interested in mapping in OpenStreetMap around Bogotá.",extendedDescription:"Learn to collect data in the field and digitize onto OpenStreetMap. It is not necessary to have previous knowledge! You just need the desire to participate, learn, and have fun."},"OSM-CO-facebook":{name:"OpenStreetMap Colombia Facebook",description:"Join the OpenStreetMap Colombia community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap. Everyone is welcome!"},"OSM-CO-mailinglist":{name:"Talk-co Mailing List",description:"A mailing list to discuss OpenStreetMap in Colombia"},"OSM-CO-telegram":{name:"OSM Colombia on Telegram",description:"OpenStreetMap Colombia Telegram chat"},"OSM-CO-twitter":{name:"OpenStreetMap Colombia Twitter",description:"Follow us on Twitter at {url}"},"OSM-CO":{name:"OpenStreetMap Colombia",description:"News of the OpenStreetMap Colombia community and the OSMCo Foundation"},"OSM-EC-telegram":{name:"OSM Ecuador on Telegram",description:"OpenStreetMap Ecuador Telegram chat"},"OSM-PY-telegram":{name:"OSM Paraguay on Telegram",description:"OpenStreetMap Paraguay Telegram chat"},"OSM-PE-facebook":{name:"OpenStreetMap Peru Facebook",description:"Join the OpenStreetMap Peru community on Facebook"},"OSM-PE-mailinglist":{name:"Talk-pe Mailing List",description:"The official mailing list for the OpenStreetMap Peru community"},"OSM-PE-matrix":{name:"OpenStreetMap Peru Matrix Chat",description:"Chat with other members of the OpenStreetMap Peru community in Matrix."},"OSM-PE-telegram":{name:"OpenStreetMap Peru Telegram",description:"Join the OpenStreetMap Peru community on Telegram"},"OSM-PE-twitter":{name:"OpenStreetMap Peru Twitter",description:"Follow us on Twitter at {url}"},"OSM-PE":{name:"OpenStreetMap Peru",description:"News and resources for the OpenStreetMap Peru community"},"OSM-Facebook":{name:"OpenStreetMap on Facebook",description:"Like us on Facebook for news and updates about OpenStreetMap."},"OSM-help":{name:"OpenStreetMap Help",description:"Ask a question and get answers on OSM's community-driven question and answer site.",extendedDescription:"{url} is for everyone who needs help with OpenStreetMap. Whether you are a beginner mapper or have a technical question, we're here to help!"},"OSM-Reddit":{name:"OpenStreetMap on Reddit",description:"/r/openstreetmap/ is a great place to learn more about OpenStreetMap. Ask us anything!"},"OSM-Telegram":{name:"OpenStreetMap Telegram",description:"Join the OpenStreetMap Telegram global supergroup at {url}"},"OSM-Twitter":{name:"OpenStreetMap Twitter",description:"Follow us on Twitter at {url}"},OSMF:{name:"OpenStreetMap Foundation",description:"OSMF is a UK-based not-for-profit that supports the OpenStreetMap Project",extendedDescription:"OSMF supports the OpenStreetMap by fundraising, maintaining the servers which power OSM, organizing the annual State of the Map conference, and coordinating the volunteers who keep OSM running. You can show your support and have a voice in the direction of OpenStreetMap by joining as an OSMF member here: {signupUrl}",events:{sotm2018:{name:"State of the Map 2018",description:"Join us for 3 days in Milan, Italy for the annual worldwide OpenStreetMap conference, bringing together everyone in the community to socialize, share, and learn.",where:"Milan, Italy"}}}}};
23652 var features$2 = {cape_coast_gh:{type:"Feature",id:"cape_coast_gh",properties:{},geometry:{type:"Polygon",coordinates:[[[-1.6,5],[-1.6,5.4],[-1,5.4],[-1,5],[-1.6,5]]]}},ghana:{type:"Feature",properties:{},id:"ghana",geometry:{type:"Polygon",coordinates:[[[-3.11256,5.13335],[-2.97215,5.11112],[-2.94811,5.12753],[-2.75757,5.10599],[-2.7253,5.14087],[-2.78641,5.28242],[-2.78297,5.29541],[-2.76993,5.2937],[-2.76546,5.31797],[-2.77748,5.33079],[-2.77319,5.35557],[-2.72495,5.34224],[-2.78023,5.60642],[-2.86022,5.65049],[-2.92889,5.61838],[-2.96631,5.64127],[-2.95292,5.71643],[-3.02639,5.7096],[-3.01987,5.8575],[-3.07411,5.98624],[-3.10226,6.15284],[-3.15514,6.25114],[-3.17574,6.25182],[-3.17162,6.29755],[-3.23753,6.54183],[-3.23341,6.60049],[-3.26157,6.61959],[-3.21007,6.73417],[-3.24028,6.83031],[-2.95326,7.23817],[-2.97558,7.27018],[-2.92236,7.61436],[-2.77611,7.94432],[-2.60513,8.03747],[-2.62985,8.11769],[-2.48978,8.20877],[-2.64221,9.00988],[-2.77679,9.03972],[-2.76581,9.15633],[-2.66968,9.26478],[-2.93884,10.66601],[-2.82898,11.0113],[-0.68939,11.00051],[-0.60974,10.91962],[-0.43121,11.04095],[-0.43396,11.10295],[-0.27843,11.17672],[-0.13424,11.13967],[-0.14214,11.10632],[-0.05905,11.08341],[-0.0388,11.10733],[-0.01339,11.11204],[0.02369,11.05308],[0.03296,10.97793],[-0.00549,10.96411],[-0.02266,10.81914],[-0.07141,10.76856],[-0.07999,10.69806],[-0.05905,10.63294],[0.04257,10.60257],[0.0618,10.56207],[0.14351,10.52629],[0.17097,10.42265],[0.26711,10.41151],[0.28633,10.42096],[0.34264,10.31357],[0.39757,10.31492],[0.39722,10.30546],[0.37148,10.28283],[0.35225,10.10746],[0.41817,10.06487],[0.40924,10.01822],[0.36461,10.03174],[0.34676,9.66506],[0.26779,9.64678],[0.24994,9.44771],[0.42847,9.48564],[0.56168,9.40977],[0.48203,8.80501],[0.3804,8.74122],[0.47653,8.59324],[0.65369,8.49546],[0.65781,8.42347],[0.70862,8.38339],[0.72784,8.28964],[0.60425,8.21693],[0.62004,7.70623],[0.59464,7.70283],[0.5809,7.62253],[0.52322,7.5953],[0.52734,7.45099],[0.56168,7.39243],[0.62759,7.40741],[0.66055,7.30935],[0.59395,7.11248],[0.61317,7.09306],[0.59601,7.00549],[0.52322,6.97823],[0.52322,6.94006],[0.56442,6.92234],[0.53284,6.82962],[0.65094,6.73962],[0.63446,6.63733],[0.74707,6.57048],[0.71411,6.51864],[0.90242,6.33355],[1.00405,6.33543],[1.02516,6.25319],[1.05537,6.22964],[1.1,6.17],[1.2,6.17],[1.2,4],[-3,4.5],[-3.11256,5.13335]]]}},madagascar:{type:"Feature",id:"madagascar",properties:{},geometry:{type:"Polygon",coordinates:[[[51,-15],[47.5,-26],[42,-26],[43.5,-16],[49.5,-11],[51,-15]]]}},BGD:{type:"Feature",id:"BGD",properties:{name:"Bangladesh"},geometry:{type:"Polygon",coordinates:[[[92.67272,22.04124],[92.65226,21.32405],[92.30323,21.47548],[92.36855,20.67088],[92.08289,21.1922],[92.02522,21.70157],[91.83489,22.18294],[91.41709,22.76502],[90.49601,22.80502],[90.58696,22.39279],[90.27297,21.83637],[89.84747,22.03915],[89.70205,21.85712],[89.41886,21.96618],[89.03196,22.05571],[88.87631,22.87915],[88.52977,23.63114],[88.69994,24.23372],[88.08442,24.50166],[88.30637,24.86608],[88.93155,25.23869],[88.20979,25.76807],[88.56305,26.44653],[89.35509,26.01441],[89.83248,25.96508],[89.92069,25.26975],[90.87221,25.1326],[91.7996,25.14743],[92.3762,24.97669],[91.91509,24.13041],[91.46773,24.07264],[91.15896,23.50353],[91.70647,22.98526],[91.86993,23.62435],[92.14603,23.6275],[92.67272,22.04124]]]}},india_full:{type:"Feature",id:"india_full",properties:{name:"India"},geometry:{type:"MultiPolygon",coordinates:[[[[77.83745,35.49401],[78.91227,34.32194],[78.81109,33.5062],[79.20889,32.99439],[79.17613,32.48378],[78.45845,32.61816],[78.73889,31.51591],[79.72137,30.88272],[81.11126,30.18348],[80.47672,29.72987],[80.08843,28.79447],[81.0572,28.41609],[81.99999,27.92548],[83.30425,27.36451],[84.67502,27.2349],[85.25178,26.7262],[86.02439,26.63098],[87.22747,26.3979],[88.06024,26.41462],[88.1748,26.8104],[88.04313,27.44582],[88.12044,27.87654],[88.73033,28.08686],[88.81425,27.29932],[88.83564,27.09897],[89.74453,26.7194],[90.37328,26.87572],[91.21751,26.80865],[92.03348,26.83831],[92.10371,27.45261],[91.69666,27.77174],[92.50312,27.89688],[93.41335,28.64063],[94.56599,29.27744],[95.4048,29.03172],[96.11768,29.4528],[96.58659,28.83098],[96.24883,28.41103],[97.32711,28.26158],[97.40256,27.88254],[97.05199,27.69906],[97.134,27.08377],[96.41937,27.26459],[95.12477,26.57357],[95.15515,26.00131],[94.60325,25.16249],[94.55266,24.67524],[94.10674,23.85074],[93.32519,24.07856],[93.28633,23.04366],[93.06029,22.70311],[93.16613,22.27846],[92.67272,22.04124],[92.14603,23.6275],[91.86993,23.62435],[91.70647,22.98526],[91.15896,23.50353],[91.46773,24.07264],[91.91509,24.13041],[92.3762,24.97669],[91.7996,25.14743],[90.87221,25.1326],[89.92069,25.26975],[89.83248,25.96508],[89.35509,26.01441],[88.56305,26.44653],[88.20979,25.76807],[88.93155,25.23869],[88.30637,24.86608],[88.08442,24.50166],[88.69994,24.23372],[88.52977,23.63114],[88.87631,22.87915],[89.03196,22.05571],[88.88877,21.69059],[88.2085,21.70317],[86.9757,21.49556],[87.03317,20.74331],[86.49935,20.15164],[85.06027,19.47858],[83.94101,18.30201],[83.18922,17.67122],[82.19279,17.01664],[82.19124,16.55666],[81.69272,16.31022],[80.792,15.95197],[80.3249,15.89918],[80.02507,15.13641],[80.23327,13.83577],[80.28629,13.00626],[79.86255,12.05621],[79.858,10.35727],[79.34051,10.30885],[78.88535,9.54614],[79.18972,9.21654],[78.27794,8.93305],[77.94116,8.25296],[77.5399,7.96554],[76.59298,8.89928],[76.13006,10.29963],[75.74647,11.30825],[75.3961,11.78125],[74.86482,12.74194],[74.61672,13.99258],[74.44386,14.61722],[73.5342,15.99065],[73.11991,17.92857],[72.82091,19.20823],[72.82448,20.4195],[72.63053,21.35601],[71.17527,20.75744],[70.47046,20.87733],[69.16413,22.0893],[69.64493,22.45078],[69.3496,22.84318],[68.17664,23.69196],[68.8426,24.35913],[71.04324,24.35652],[70.8447,25.2151],[70.28287,25.72223],[70.16893,26.49187],[69.51439,26.94097],[70.6165,27.9892],[71.77767,27.91318],[72.82375,28.96159],[73.45064,29.97641],[74.42138,30.97981],[74.40593,31.69264],[75.25864,32.2711],[74.45156,32.7649],[74.10429,33.44147],[73.74995,34.3177],[74.2402,34.74889],[75.75706,34.50492],[76.87172,34.65354],[77.83745,35.49401]]]]}},india_puducherry:{type:"Feature",id:"india_puducherry",properties:{name:"Puducherry"},geometry:{type:"Polygon",coordinates:[[[79.87782,12.04973],[79.84726,11.95536],[79.83593,11.90229],[79.81979,11.85761],[79.81464,11.79006],[79.79645,11.7736],[79.77036,11.77191],[79.74564,11.78065],[79.6804,11.7988],[79.61655,11.82434],[79.58702,11.88549],[79.65672,11.93152],[79.64745,11.9594],[79.6423,12.0138],[79.66599,12.03865],[79.72813,12.04201],[79.79885,12.0457],[79.8452,12.05644],[79.87782,12.04973]]]}},IDN:{type:"Feature",id:"IDN",properties:{},geometry:{type:"Polygon",coordinates:[[[109.538,1.92671],[109.58606,1.79192],[109.68554,1.78179],[109.66224,1.61881],[109.82759,1.48148],[109.93117,1.42466],[109.97919,1.29865],[110.09758,1.19756],[110.1922,1.18303],[110.30096,0.99575],[110.39497,0.99668],[110.49064,0.87637],[110.59486,0.858],[110.85815,0.94998],[110.9055,1.02835],[111.19759,1.06475],[111.22607,1.08799],[111.40504,1.0094],[111.48916,1.03442],[111.52219,0.95868],[111.66704,1.04281],[111.82599,0.98538],[111.934,1.10284],[112.13391,1.13752],[112.22581,1.39272],[112.20003,1.43709],[112.5171,1.57395],[112.77536,1.56153],[112.87744,1.58118],[113.05767,1.55877],[113.106,1.44495],[113.35493,1.35908],[113.41908,1.28549],[113.53549,1.32127],[113.63068,1.21597],[113.81508,1.30294],[113.85093,1.38715],[113.97573,1.45005],[114.14945,1.46149],[114.2027,1.4213],[114.41581,1.51111],[114.52646,1.44179],[114.58583,1.44665],[114.61498,1.57508],[114.71115,1.67148],[114.69469,1.81063],[114.74372,1.86954],[114.87834,1.91463],[114.80632,2.02438],[114.78024,2.14454],[114.79949,2.24936],[114.90604,2.25697],[114.95039,2.35132],[115.09508,2.41123],[115.13965,2.4776],[115.23743,2.50599],[115.09278,2.69409],[115.14115,2.74432],[115.11387,2.83327],[115.15001,2.90895],[115.24912,2.9667],[115.48328,3.01964],[115.56423,3.17109],[115.51617,3.26111],[115.53779,3.36201],[115.6344,3.45571],[115.57652,3.6094],[115.57965,3.74752],[115.61864,3.84247],[115.58177,3.88792],[115.64991,3.98828],[115.70731,4.19935],[115.8296,4.24118],[115.8779,4.39102],[116.00607,4.34818],[116.07901,4.27643],[116.18028,4.38255],[116.34851,4.39138],[116.43275,4.32567],[116.53602,4.37566],[116.61942,4.33622],[116.89887,4.36704],[116.97351,4.34488],[117.28899,4.31595],[117.52934,4.1615],[117.8992,4.16585],[117.95861,4.19058],[118.26478,4.09696],[127.3,5.2],[129,2.7],[141,-2.4],[141,-6.3],[140.83,-6.7],[141.02,-6.95],[141.02,-9.5],[128.5,-9.5],[127.3,-8.2],[125,-8.5],[123.96,-9.2],[124.11,-9.42],[124.22,-9.37],[124.269,-9.4],[124.287,-9.5],[124.358,-9.48564],[124.355,-9.43281],[124.383,-9.361],[124.444,-9.31899],[124.48,-9.15],[124.95,-8.9],[124.94064,-9.03565],[124.99695,-9.06413],[125.11368,-8.98275],[125.18234,-9.03293],[125.18234,-9.17396],[124.98459,-9.19429],[124.99283,-9.28646],[125.04913,-9.33254],[125.16,-9.7],[123,-11.4],[100,-7],[93.5,6.3],[96.6,6.1],[103,1.4],[103.75,1.14],[103.9,1.2],[104.5,1.3],[105,3],[108,5.1],[109.64501,2.08141],[109.62041,1.98321],[109.538,1.92671]]]}},japan:{type:"Feature",id:"japan",properties:{},geometry:{type:"Polygon",coordinates:[[[141.11938,45.69083],[142.28497,45.56863],[145.39307,44.48867],[145.57983,44.11125],[145.27222,43.79291],[145.47821,43.46289],[145.68695,43.4589],[145.91217,43.39108],[145.44903,42.69934],[143.91094,41.8376],[142.48272,39.3181],[142.1751,38.15265],[141.38409,35.69383],[140.94463,35.21056],[140.55908,32.1198],[139.38457,31.87843],[138.98907,33.1752],[138.01025,34.29807],[135.99976,33.17434],[133.53882,32.71336],[132.48516,32.06483],[131.56128,31.04352],[131.03497,29.53613],[129.94629,27.50827],[127.78301,25.4442],[126.47461,25.42343],[125.86487,24.52713],[124.92657,23.88678],[123.37921,23.82053],[122.67883,24.31456],[122.7293,24.64795],[124.67834,25.02588],[125.36602,25.52354],[126.24493,26.35342],[127.56329,27.13828],[128.57403,28.73003],[128.74981,31.46703],[128.36426,32.62087],[128.92559,33.76174],[129.21021,34.62417],[129.56177,34.84086],[136.69739,37.9312],[139.1209,38.85762],[139.04297,42.04929],[140.13165,43.58114],[140.5711,45.64549],[141.11938,45.69083]]]}},korea:{type:"Feature",id:"korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,33],[124,39.5],[124.38171,40.12429],[124.87061,40.47202],[126.04614,40.95294],[126.60095,41.57231],[126.90308,41.79179],[127.24915,41.50446],[128.19397,41.41802],[128.28186,41.56614],[128.0127,42.0097],[128.8751,42.04521],[129.2926,42.43967],[129.67438,42.45589],[129.87762,43],[130.19348,42.92023],[130.31433,42.66224],[130.50385,42.59555],[130.68237,42.2895],[131.3,36.6],[127.3,33],[125,33]]]}},malaysia:{type:"Feature",id:"malaysia",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[109.538,1.92671],[109.62041,1.98321],[109.64501,2.08141],[113.8,4.8],[114.26015,4.50701],[114.33278,4.34889],[114.31645,4.26363],[114.45418,4.24183],[114.49579,4.14668],[114.6492,4.00624],[114.80762,4.14929],[114.85775,4.26957],[114.87758,4.42656],[114.82955,4.42966],[114.80229,4.67536],[114.85851,4.79751],[114.97133,4.80824],[115.02238,4.74977],[115.09879,4.4685],[115.15547,4.38302],[115.24582,4.34118],[115.28924,4.60384],[115.2375,4.79584],[115.15038,4.87204],[115.15825,5.02512],[115,5.3],[116.9,7.6],[117.5,7.4],[119.35011,5.53088],[119.43909,5.11578],[118.83773,4.45269],[118.26478,4.09696],[117.95861,4.19058],[117.8992,4.16585],[117.52934,4.1615],[117.28899,4.31595],[116.97351,4.34488],[116.89887,4.36704],[116.61942,4.33622],[116.53602,4.37566],[116.43275,4.32567],[116.34851,4.39138],[116.18028,4.38255],[116.07901,4.27643],[116.00607,4.34818],[115.8779,4.39102],[115.8296,4.24118],[115.70731,4.19935],[115.64991,3.98828],[115.58177,3.88792],[115.61864,3.84247],[115.57965,3.74752],[115.57652,3.6094],[115.6344,3.45571],[115.53779,3.36201],[115.51617,3.26111],[115.56423,3.17109],[115.48328,3.01964],[115.24912,2.9667],[115.15001,2.90895],[115.11387,2.83327],[115.14115,2.74432],[115.09278,2.69409],[115.23743,2.50599],[115.13965,2.4776],[115.09508,2.41123],[114.95039,2.35132],[114.90604,2.25697],[114.79949,2.24936],[114.78024,2.14454],[114.80632,2.02438],[114.87834,1.91463],[114.74372,1.86954],[114.69469,1.81063],[114.71115,1.67148],[114.61498,1.57508],[114.58583,1.44665],[114.52646,1.44179],[114.41581,1.51111],[114.2027,1.4213],[114.14945,1.46149],[113.97573,1.45005],[113.85093,1.38715],[113.81508,1.30294],[113.63068,1.21597],[113.53549,1.32127],[113.41908,1.28549],[113.35493,1.35908],[113.106,1.44495],[113.05767,1.55877],[112.87744,1.58118],[112.77536,1.56153],[112.5171,1.57395],[112.20003,1.43709],[112.22581,1.39272],[112.13391,1.13752],[111.934,1.10284],[111.82599,0.98538],[111.66704,1.04281],[111.52219,0.95868],[111.48916,1.03442],[111.40504,1.0094],[111.22607,1.08799],[111.19759,1.06475],[110.9055,1.02835],[110.85815,0.94998],[110.59486,0.858],[110.49064,0.87637],[110.39497,0.99668],[110.30096,0.99575],[110.1922,1.18303],[110.09758,1.19756],[109.97919,1.29865],[109.93117,1.42466],[109.82759,1.48148],[109.66224,1.61881],[109.68554,1.78179],[109.58606,1.79192],[109.538,1.92671]]],[[[99.45833,6.30667],[99.51167,6.48167],[99.68908,6.47146],[99.91691,6.5233],[100.07588,6.40615],[100.15906,6.48065],[100.17157,6.69376],[100.32605,6.6597],[100.36648,6.53967],[100.4962,6.52128],[100.66237,6.45103],[100.73937,6.49207],[100.81258,6.44219],[100.83515,6.29654],[100.90398,6.23379],[100.98414,6.27884],[101.0943,6.26044],[101.12667,6.19264],[101.0868,5.9109],[101.03707,5.91804],[100.98946,5.78393],[101.1192,5.67031],[101.25999,5.71155],[101.27615,5.81155],[101.39691,5.87241],[101.48454,5.86993],[101.58131,5.93436],[101.66236,5.86871],[101.69082,5.75576],[101.79332,5.75066],[101.94402,5.87247],[101.94265,5.98109],[102.05204,6.0785],[102.08029,6.22537],[102.2,6.5],[103.6,5.8],[104.8,2.5],[104.5,1.5],[104.31571,1.28352],[104.12518,1.27582],[104.07647,1.43092],[103.89786,1.42794],[103.81267,1.47847],[103.67389,1.42814],[103.56667,1.1955],[103,1.325],[99,4.5],[99.45833,6.30667]]]]}},MNG:{type:"Feature",id:"MNG",properties:{name:"Mongolia"},geometry:{type:"Polygon",coordinates:[[[87.75126,49.2972],[88.80557,49.47052],[90.71367,50.33181],[92.23471,50.80217],[93.10422,50.49529],[94.14757,50.48054],[94.81595,50.01343],[95.81403,49.97747],[97.25973,49.72606],[98.23176,50.4224],[97.82574,51.011],[98.86149,52.04737],[99.98173,51.63401],[100.88948,51.51686],[102.06522,51.25992],[102.25591,50.51056],[103.67655,50.08997],[104.62155,50.27533],[105.88659,50.40602],[106.8888,50.2743],[107.86818,49.79371],[108.47517,49.28255],[109.40245,49.29296],[110.66201,49.13013],[111.58123,49.37797],[112.89774,49.54357],[114.36246,50.2483],[114.96211,50.14025],[115.4857,49.80518],[116.6788,49.88853],[116.1918,49.1346],[115.48528,48.13538],[115.74284,47.72655],[116.30895,47.85341],[117.29551,47.69771],[118.06414,48.06673],[118.86657,47.74706],[119.77282,47.04806],[119.66327,46.69268],[118.87433,46.80541],[117.4217,46.67273],[116.71787,46.3882],[115.9851,45.72724],[114.46033,45.33982],[113.46391,44.80889],[112.43606,45.01165],[111.87331,45.10208],[111.34838,44.45744],[111.66774,44.07318],[111.82959,43.74312],[111.12968,43.40683],[110.4121,42.87123],[109.2436,42.51945],[107.74477,42.48152],[106.12932,42.13433],[104.96499,41.59741],[104.52228,41.90835],[103.31228,41.90747],[101.83304,42.51487],[100.84587,42.6638],[99.51582,42.52469],[97.45176,42.74889],[96.3494,42.72563],[95.76246,43.31945],[95.30688,44.24133],[94.68893,44.35233],[93.48073,44.97547],[92.13389,45.11508],[90.94554,45.28607],[90.58577,45.71972],[90.97081,46.88815],[90.28083,47.69355],[88.8543,48.06908],[88.01383,48.59946],[87.75126,49.2972]]]}},MMR:{type:"Feature",id:"MMR",properties:{name:"Myanmar"},geometry:{type:"Polygon",coordinates:[[[92.10937,20.85881],[92.3291,21.49396],[92.68066,21.28937],[92.63672,22.08564],[92.98828,22.06528],[93.18604,22.22809],[93.14209,23.09994],[93.38379,23.22115],[93.36182,24.1267],[94.19678,23.92601],[94.70215,25.04579],[94.57031,25.26457],[95.20752,26.03704],[95.05371,26.49024],[97.66846,28.51697],[98.65723,27.50827],[98.56934,25.85922],[97.62451,24.8665],[97.73438,23.88584],[98.83301,24.14675],[98.85498,23.18076],[99.49219,23.05952],[99.1626,22.04491],[100.0415,21.96342],[100.32715,21.49396],[101.09619,21.71868],[101.16211,21.41216],[99.99756,20.36523],[97.91016,19.49766],[97.53662,18.29195],[98.83301,16.21467],[98.50342,15.32657],[98.21777,15.11455],[98.65723,14.24309],[99.18457,13.66734],[99.22852,12.85465],[99.66797,11.65224],[98.4375,9.90392],[97.77832,14.34955],[97.00928,16.80454],[95.42725,15.55954],[94.021,16.04581],[94.21875,18.0832],[92.10937,20.85881]]]}},NPL:{type:"Feature",id:"NPL",properties:{name:"Nepal"},geometry:{type:"Polygon",coordinates:[[[88.12044,27.87654],[88.04313,27.44582],[88.1748,26.8104],[88.06024,26.41462],[87.22747,26.3979],[86.02439,26.63098],[85.25178,26.7262],[84.67502,27.2349],[83.30425,27.36451],[81.99999,27.92548],[81.0572,28.41609],[80.08843,28.79447],[80.47672,29.72987],[81.11126,30.18348],[81.5258,30.42272],[82.32751,30.11527],[83.33711,29.46373],[83.89899,29.32023],[84.23458,28.83989],[85.01164,28.64277],[85.82332,28.20358],[86.95452,27.97426],[88.12044,27.87654]]]}},philippines:{type:"Feature",id:"philippines",properties:{},geometry:{type:"Polygon",coordinates:[[[114.93896,8.23324],[122.01416,21.71868],[127.6062,7.39515],[125.50781,5.14566],[118.89954,4.41761],[119.49829,5.28789],[117.53174,7.39515],[114.93896,8.23324]]]}},russia:{type:"Feature",id:"russia",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[22.7311,54.32754],[20.89224,54.31253],[19.66064,54.42608],[19.88848,54.86616],[21.26845,55.19048],[22.31572,55.0153],[22.75776,54.85657],[22.65105,54.58274],[22.7311,54.32754]]],[[[-180,83],[-169,66.5],[-171,64],[-180,64],[-180,83]]],[[[180,83],[180,64.97971],[179.99281,64.97433],[178.7072,64.53493],[177.41128,64.60821],[178.313,64.07593],[178.90825,63.25197],[179.37034,62.98262],[179.48636,62.56894],[179.22825,62.3041],[177.3643,62.5219],[174.56929,61.76915],[173.68013,61.65261],[172.15,60.95],[170.6985,60.33618],[170.33085,59.88177],[168.90046,60.57355],[166.29498,59.78855],[165.84,60.16],[164.87674,59.7316],[163.53929,59.86871],[163.21711,59.21101],[162.01733,58.24328],[162.05297,57.83912],[163.19191,57.61503],[163.05794,56.15924],[162.12958,56.12219],[161.70146,55.28568],[162.11749,54.85514],[160.36877,54.34433],[160.02173,53.20257],[158.53094,52.95868],[158.23118,51.94269],[156.78979,51.01105],[156.42,51.7],[155.99182,53.15895],[155.43366,55.38103],[155.91442,56.76792],[156.75815,57.3647],[156.81035,57.83204],[158.36433,58.05575],[160.15064,59.31477],[161.87204,60.343],[163.66969,61.1409],[164.47355,62.55061],[163.25842,62.46627],[162.65791,61.6425],[160.12148,60.54423],[159.30232,61.77396],[156.72068,61.43442],[154.21806,59.75818],[155.04375,59.14495],[152.81185,58.88385],[151.26573,58.78089],[151.33815,59.50396],[149.78371,59.65573],[148.54481,59.16448],[145.48722,59.33637],[142.19782,59.03998],[138.95848,57.08805],[135.12619,54.72959],[136.70171,54.60355],[137.19342,53.97732],[138.1647,53.75501],[138.80463,54.25455],[139.90151,54.18968],[141.34531,53.08957],[141.37923,52.23877],[140.59742,51.23967],[140.51308,50.04553],[140.06193,48.44671],[138.55472,46.99965],[138.21971,46.30795],[136.86232,45.1435],[135.51535,43.989],[134.86939,43.39821],[133.53687,42.81147],[132.90627,42.79849],[132.27807,43.28456],[130.93587,42.55274],[130.78,42.22],[130.64,42.395],[130.63387,42.90302],[131.14469,42.92999],[131.28856,44.11152],[131.02519,44.96796],[131.88345,45.32116],[133.09712,45.14409],[133.76964,46.11693],[134.11235,47.21248],[134.50081,47.57845],[135.02631,48.47823],[133.3736,48.18344],[132.50669,47.78896],[130.98726,47.79013],[130.58229,48.72969],[129.39782,49.4406],[127.6574,49.76027],[127.28746,50.7398],[126.93916,51.35389],[126.5644,51.78426],[125.94635,52.7928],[125.06821,53.16105],[123.57147,53.4588],[122.24575,53.43173],[121.00308,53.2514],[120.17709,52.75389],[120.72579,52.51623],[120.7382,51.96411],[120.18208,51.64355],[119.27939,50.58292],[119.28846,50.14288],[117.87924,49.51098],[116.6788,49.88853],[115.4857,49.80518],[114.96211,50.14025],[114.36246,50.2483],[112.89774,49.54357],[111.58123,49.37797],[110.66201,49.13013],[109.40245,49.29296],[108.47517,49.28255],[107.86818,49.79371],[106.8888,50.2743],[105.88659,50.40602],[104.62158,50.27532],[103.67655,50.08997],[102.25589,50.51056],[102.06521,51.25991],[100.88948,51.51686],[99.98173,51.63401],[98.86149,52.04737],[97.82574,51.011],[98.23176,50.4224],[97.25976,49.72605],[95.81402,49.97746],[94.81595,50.01343],[94.14757,50.48054],[93.10421,50.49529],[92.23471,50.80217],[90.71367,50.33181],[88.80557,49.47052],[87.75126,49.2972],[87.35997,49.21498],[86.82936,49.82668],[85.54127,49.69286],[85.11556,50.1173],[84.41638,50.3114],[83.93511,50.88925],[83.383,51.06918],[81.94599,50.8122],[80.56845,51.38834],[80.03556,50.86475],[77.80092,53.40442],[76.52518,54.177],[76.8911,54.49052],[74.38482,53.54685],[73.42568,53.48981],[73.50852,54.03562],[72.22415,54.37665],[71.18013,54.13329],[70.86527,55.16973],[69.06817,55.38525],[68.1691,54.97039],[65.66687,54.60125],[65.17853,54.35423],[61.4366,54.00625],[60.97807,53.66499],[61.69999,52.98],[60.73999,52.71999],[60.92727,52.44755],[59.96753,51.96042],[61.588,51.27266],[61.33742,50.79907],[59.93281,50.84219],[59.64228,50.54544],[58.36332,51.06364],[56.77798,51.04355],[55.71694,50.62171],[54.53288,51.02624],[52.32872,51.71865],[50.76665,51.69276],[48.70238,50.60513],[48.57784,49.87476],[47.54948,50.4547],[46.7516,49.35601],[47.04367,49.15204],[46.46645,48.39415],[47.31524,47.71585],[48.05725,47.74377],[48.69473,47.07563],[48.59325,46.56104],[49.10116,46.39933],[48.64541,45.80629],[47.67591,45.64149],[46.68201,44.6092],[47.59094,43.66016],[47.49252,42.98658],[48.58437,41.80888],[47.98728,41.40582],[47.81567,41.15142],[47.37331,41.21973],[46.68607,41.82714],[46.40495,41.86068],[45.7764,42.09244],[45.47028,42.50278],[44.53762,42.71199],[43.93121,42.55496],[43.75599,42.74083],[42.3944,43.2203],[40.92219,43.38215],[40.07697,43.5531],[39.95501,43.435],[38.68,44.28],[37.53912,44.65721],[36.67546,45.24469],[37.40317,45.40451],[38.23295,46.24087],[37.67372,46.63657],[39.14767,47.04475],[39.1212,47.26336],[38.22354,47.10219],[38.25511,47.5464],[38.77057,47.82562],[39.73828,47.89894],[39.89562,48.23241],[39.67465,48.78382],[40.08079,49.30743],[40.06904,49.60105],[38.59499,49.92646],[38.01063,49.91566],[37.39346,50.38395],[36.62617,50.22559],[35.35612,50.5772],[35.37791,50.77394],[35.02218,51.20757],[34.22482,51.25599],[34.14198,51.56641],[34.39173,51.76888],[33.7527,52.33508],[32.71576,52.23846],[32.41206,52.28869],[32.15944,52.06125],[31.78597,52.10168],[31.54002,52.74205],[31.3052,53.074],[31.49764,53.16743],[32.30452,53.13273],[32.69364,53.35142],[32.4056,53.61805],[31.73127,53.79403],[31.79142,53.97464],[31.38447,54.15706],[30.75753,54.81177],[30.97184,55.08155],[30.87391,55.55098],[29.89629,55.78946],[29.37157,55.67009],[29.22951,55.91834],[28.17671,56.16913],[27.85528,56.75933],[27.77002,57.24426],[27.28818,57.47453],[27.71669,57.7919],[27.42015,58.72457],[28.1317,59.30083],[27.98112,59.47537],[29.1177,60.02805],[28.07,60.50352],[30.21111,61.78003],[31.13999,62.35769],[31.51609,62.86769],[30.03587,63.55281],[30.44468,64.20445],[29.54443,64.94867],[30.21765,65.80598],[29.05459,66.94429],[29.97743,67.6983],[28.44594,68.36461],[28.59193,69.06478],[35,71],[40,83],[180,83]]]]}},LKA:{type:"Feature",id:"LKA",properties:{name:"Sri Lanka"},geometry:{type:"Polygon",coordinates:[[[81.78796,7.52306],[81.63732,6.48177],[81.21802,6.19714],[80.34836,5.96837],[79.87247,6.76346],[79.69517,8.20084],[80.1478,9.82408],[80.83882,9.26843],[81.30432,8.56421],[81.78796,7.52306]]]}},taiwan:{type:"Feature",id:"taiwan",properties:{},geometry:{type:"Polygon",coordinates:[[[119,23.5],[121.7,26],[122.5,25.5],[121.8,21.8],[120,21.5],[119,23.5]]]}},thailand_cnx:{type:"Feature",id:"thailand_cnx",properties:{},geometry:{type:"Polygon",coordinates:[[[98.4375,18.2319],[98.4375,19.2255],[99.5306,19.2255],[99.5306,18.2319],[98.4375,18.2319]]]}},thailand_full:{type:"Feature",id:"thailand_full",properties:{},geometry:{type:"Polygon",coordinates:[[[97.50366,8.39358],[97.7124,9.60075],[99.47021,11.8566],[98.05298,14.84923],[98.32764,16.15137],[97.21802,18.39623],[97.38281,19.73568],[100.2832,20.66363],[101.37085,19.69431],[101.40381,18.27109],[104.08447,18.58377],[105.76538,16.06693],[105.52368,14.15788],[102.854,13.82741],[103.00781,11.69527],[102.12891,5.81276],[101.11542,5.4875],[100.66498,6.42448],[99.13788,6.34806],[97.50366,8.39358]]]}},"al-tirana":{type:"Feature",id:"al-tirana",properties:{},geometry:{type:"Polygon",coordinates:[[[19.77796,41.36244],[19.78028,41.36267],[19.78123,41.36014],[19.78004,41.35915],[19.78099,41.35803],[19.77752,41.35682],[19.78082,41.35409],[19.77658,41.35122],[19.78029,41.34936],[19.7832,41.35026],[19.7899,41.34976],[19.79536,41.34793],[19.80046,41.3502],[19.81074,41.35213],[19.81874,41.35044],[19.82238,41.35173],[19.83428,41.35186],[19.84174,41.35434],[19.84682,41.3589],[19.84829,41.35842],[19.85095,41.36008],[19.85159,41.35903],[19.8561,41.35843],[19.85488,41.3545],[19.85784,41.35167],[19.85518,41.35228],[19.85275,41.35145],[19.85276,41.34956],[19.85151,41.34955],[19.85462,41.34419],[19.85876,41.33995],[19.8642,41.33947],[19.86465,41.33789],[19.86829,41.33772],[19.86999,41.33882],[19.87262,41.33794],[19.87259,41.33606],[19.87543,41.3355],[19.87644,41.33126],[19.87554,41.33042],[19.87232,41.33102],[19.87095,41.32999],[19.86659,41.33088],[19.86535,41.32664],[19.86164,41.32543],[19.85813,41.3214],[19.85489,41.32066],[19.85575,41.31876],[19.84532,41.314],[19.84458,41.31212],[19.85095,41.30156],[19.84975,41.29748],[19.8457,41.29559],[19.83906,41.29791],[19.82955,41.29568],[19.82738,41.29791],[19.82504,41.29827],[19.82605,41.29986],[19.82333,41.30509],[19.82032,41.30525],[19.81821,41.3037],[19.81168,41.30787],[19.81162,41.31002],[19.80709,41.31302],[19.79827,41.31487],[19.79767,41.31238],[19.79374,41.313],[19.78954,41.31035],[19.7852,41.31117],[19.78057,41.3142],[19.77976,41.31244],[19.78765,41.30887],[19.78369,41.30473],[19.77721,41.30247],[19.77515,41.30039],[19.77077,41.30363],[19.76019,41.29972],[19.75706,41.30651],[19.75854,41.30874],[19.75473,41.31208],[19.75643,41.31314],[19.75571,41.31548],[19.76586,41.3199],[19.76813,41.32266],[19.77017,41.32139],[19.76811,41.31882],[19.76922,41.31754],[19.77559,41.31854],[19.77323,41.32284],[19.77378,41.32422],[19.77893,41.32349],[19.77968,41.32518],[19.78451,41.32399],[19.78734,41.32541],[19.78321,41.33328],[19.78343,41.33578],[19.77659,41.33783],[19.78083,41.34567],[19.76839,41.35239],[19.75832,41.35489],[19.76053,41.35931],[19.75484,41.3598],[19.75767,41.36542],[19.76169,41.36185],[19.76434,41.36249],[19.76411,41.36393],[19.76775,41.36369],[19.76857,41.36459],[19.77145,41.364],[19.77204,41.36125],[19.77796,41.36244]]]}},albania:{type:"Feature",id:"albania",properties:{},geometry:{type:"Polygon",coordinates:[[[19.39087,41.86138],[19.40186,42.09007],[19.27002,42.18376],[19.69849,42.67436],[19.81384,42.46399],[20.07202,42.55713],[20.25879,42.33824],[20.34668,42.32606],[20.51697,42.23665],[20.61584,41.92272],[20.52795,41.71803],[20.56091,41.57847],[20.44556,41.54559],[20.56091,41.40566],[20.50049,41.3397],[20.58289,41.09177],[20.65979,41.07521],[20.71472,40.90521],[20.95642,40.92181],[20.98389,40.7431],[21.07178,40.60978],[20.95093,40.47202],[20.85205,40.47202],[20.68726,40.10329],[20.43457,40.07387],[20.33569,39.99396],[20.43457,39.82119],[20.38513,39.77899],[20.28625,39.8001],[20.31921,39.72831],[20.20386,39.63954],[19.97314,39.69451],[20.0116,39.86759],[19.86328,40.04444],[19.35791,40.2921],[19.25354,40.51798],[19.4458,40.3298],[19.50073,40.43859],[19.31396,40.65564],[19.41833,40.90936],[19.53918,40.92181],[19.4458,41.00063],[19.43481,41.15384],[19.50623,41.2489],[19.4458,41.32733],[19.41284,41.4139],[19.51721,41.52092],[19.45129,41.60312],[19.52271,41.57847],[19.58862,41.62366],[19.59961,41.7836],[19.39087,41.86138]]]}},austria:{type:"Feature",id:"austria",properties:{},geometry:{type:"Polygon",coordinates:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]]}},graz:{type:"Feature",id:"graz",properties:{},geometry:{type:"Polygon",coordinates:[[[15.26276,46.94182],[15.26276,47.16918],[15.62943,47.16918],[15.62943,46.94182],[15.26276,46.94182]]]}},belarus:{type:"Feature",id:"belarus",properties:{},geometry:{type:"Polygon",coordinates:[[[23.19351,52.37811],[23.38715,52.57134],[23.67554,52.61806],[23.87329,52.72215],[23.75656,53.20027],[23.42148,53.83956],[23.43521,53.97467],[24.33609,53.99082],[24.73022,54.03762],[24.70825,54.16967],[24.95682,54.18253],[25.48004,54.37176],[25.63385,54.95239],[26.53748,55.24468],[26.27655,55.26973],[26.48804,55.71009],[26.89728,55.87993],[27.56195,55.82597],[27.56195,55.97226],[27.98218,56.20976],[29.64935,55.96304],[30.28107,55.89303],[30.95398,55.64815],[31.20941,54.67065],[32.47009,53.7617],[32.83539,53.3866],[32.22839,53.02635],[31.51978,53.16159],[31.84662,52.06262],[30.8139,51.93411],[30.4953,51.21032],[27.71301,51.46085],[25.85083,51.88666],[24.5874,51.81541],[23.51898,51.41634],[23.45581,51.99841],[23.15918,52.1874],[23.19351,52.37811]]]}},belgium:{type:"Feature",id:"belgium",properties:{},geometry:{type:"Polygon",coordinates:[[[3.08167,51.55146],[3.30963,51.43346],[3.36834,51.36996],[3.37761,51.35956],[3.37589,51.34841],[3.38482,51.34337],[3.38722,51.33887],[3.38688,51.33286],[3.36096,51.31527],[3.3819,51.30207],[3.37641,51.29928],[3.36782,51.29681],[3.38293,51.28726],[3.38327,51.2806],[3.37915,51.27824],[3.38121,51.27598],[3.39031,51.27416],[3.39598,51.26686],[3.40439,51.26449],[3.40937,51.25923],[3.41795,51.26127],[3.42138,51.25848],[3.4267,51.25482],[3.42894,51.24709],[3.44679,51.24279],[3.52592,51.24677],[3.51425,51.2878],[3.52927,51.28935],[3.53434,51.28474],[3.53811,51.28479],[3.54266,51.29177],[3.55717,51.29187],[3.5588,51.2959],[3.56163,51.29644],[3.56489,51.29569],[3.5727,51.29225],[3.57253,51.29107],[3.57571,51.28946],[3.57905,51.28951],[3.58206,51.28876],[3.58214,51.29247],[3.58618,51.29316],[3.58026,51.29869],[3.58987,51.30663],[3.62626,51.29413],[3.64145,51.28914],[3.64411,51.29069],[3.6581,51.29096],[3.6781,51.28345],[3.67905,51.28168],[3.69063,51.28173],[3.69424,51.27668],[3.71801,51.27217],[3.71827,51.27368],[3.72273,51.274],[3.75054,51.27061],[3.75286,51.27104],[3.75681,51.26986],[3.76342,51.26261],[3.76848,51.26106],[3.77123,51.26218],[3.77355,51.2646],[3.79698,51.25665],[3.79071,51.24553],[3.79063,51.21608],[3.80453,51.2143],[3.80796,51.21398],[3.82479,51.21086],[3.8356,51.21516],[3.85225,51.21484],[3.85895,51.21291],[3.89002,51.22473],[3.89568,51.21968],[3.89482,51.2143],[3.88298,51.20764],[3.88762,51.20301],[3.89345,51.20527],[3.89929,51.20398],[3.91542,51.20989],[3.91388,51.21764],[3.92349,51.21989],[3.93105,51.22194],[3.9374,51.21398],[3.94323,51.21721],[3.95748,51.21764],[3.96023,51.22527],[3.97654,51.22667],[3.9846,51.2357],[3.99473,51.23914],[4.00469,51.24311],[4.01636,51.24623],[4.03851,51.24687],[4.04125,51.24397],[4.05842,51.24505],[4.06082,51.24773],[4.16365,51.29391],[4.23815,51.35345],[4.22373,51.35881],[4.21686,51.36878],[4.21635,51.37435],[4.33685,51.37842],[4.34235,51.35988],[4.35093,51.35967],[4.36861,51.35795],[4.38543,51.35592],[4.39505,51.35753],[4.42114,51.36707],[4.42818,51.36642],[4.42337,51.37242],[4.42904,51.37521],[4.38852,51.40702],[4.38097,51.42137],[4.38904,51.42597],[4.39093,51.43304],[4.3935,51.43486],[4.39161,51.44416],[4.37891,51.44502],[4.37719,51.44716],[4.38131,51.45165],[4.38509,51.4508],[4.44157,51.47005],[4.46354,51.4723],[4.47487,51.47978],[4.48654,51.4786],[4.53856,51.48416],[4.55074,51.47283],[4.53238,51.44877],[4.53701,51.42522],[4.57512,51.43411],[4.63469,51.42651],[4.64087,51.42372],[4.65048,51.42747],[4.6673,51.42779],[4.66473,51.44556],[4.69236,51.45326],[4.70146,51.46845],[4.71416,51.47026],[4.71519,51.47304],[4.72781,51.48486],[4.74524,51.48988],[4.74721,51.49368],[4.74781,51.49651],[4.75047,51.49945],[4.75648,51.50196],[4.77253,51.50682],[4.79485,51.5034],[4.82025,51.49784],[4.82643,51.48609],[4.84737,51.48352],[4.84291,51.46449],[4.84909,51.46085],[4.84463,51.4478],[4.83089,51.44438],[4.83742,51.42683],[4.8563,51.41805],[4.88171,51.43325],[4.91741,51.4127],[4.93389,51.42083],[4.90162,51.44053],[4.9387,51.46192],[4.97646,51.44545],[5.02419,51.48523],[5.03225,51.48919],[5.04187,51.4878],[5.04135,51.48053],[5.04856,51.47433],[5.08032,51.47475],[5.10658,51.43047],[5.07294,51.39358],[5.11765,51.36149],[5.12074,51.35592],[5.13268,51.3475],[5.13525,51.31608],[5.1622,51.31135],[5.17241,51.31688],[5.19001,51.32069],[5.19585,51.32123],[5.19988,51.32348],[5.24331,51.30594],[5.2276,51.26841],[5.23842,51.26208],[5.26357,51.26782],[5.29584,51.26267],[5.31567,51.26449],[5.33755,51.26428],[5.34107,51.26686],[5.34399,51.27309],[5.34554,51.27668],[5.4172,51.2632],[5.43222,51.27706],[5.43806,51.27695],[5.44132,51.2827],[5.46398,51.28549],[5.47608,51.29209],[5.47608,51.29536],[5.48226,51.29923],[5.48201,51.301],[5.51625,51.29612],[5.52011,51.28957],[5.54363,51.27298],[5.55711,51.26718],[5.55874,51.2631],[5.55745,51.25316],[5.55651,51.24472],[5.56131,51.22301],[5.63667,51.20355],[5.65401,51.19812],[5.65513,51.1936],[5.65212,51.1929],[5.65753,51.1865],[5.66834,51.18671],[5.67624,51.18548],[5.67761,51.18435],[5.6856,51.18542],[5.68946,51.18623],[5.69815,51.1842],[5.70201,51.18397],[5.70165,51.18275],[5.70645,51.18248],[5.70815,51.18223],[5.70987,51.1812],[5.71431,51.1839],[5.7177,51.18475],[5.72948,51.18601],[5.73031,51.18553],[5.73274,51.18564],[5.73274,51.18615],[5.7345,51.18657],[5.73993,51.18757],[5.74576,51.19032],[5.75769,51.18618],[5.75821,51.1851],[5.76731,51.18413],[5.77821,51.1787],[5.77477,51.17337],[5.7801,51.17289],[5.78078,51.17208],[5.77992,51.17052],[5.77673,51.1702],[5.77585,51.17028],[5.77321,51.16967],[5.77274,51.16925],[5.77192,51.16924],[5.77093,51.1698],[5.76993,51.16905],[5.77059,51.16458],[5.77383,51.16453],[5.77385,51.16558],[5.77638,51.16565],[5.77701,51.16306],[5.7775,51.16298],[5.77808,51.16353],[5.77975,51.16356],[5.78025,51.15935],[5.77797,51.15803],[5.77677,51.15554],[5.77829,51.15502],[5.77907,51.15319],[5.78456,51.15421],[5.79005,51.15798],[5.79512,51.15798],[5.80095,51.15954],[5.80027,51.16094],[5.80361,51.1632],[5.80619,51.16352],[5.8134,51.16051],[5.8146,51.16325],[5.82473,51.16874],[5.83434,51.16314],[5.83589,51.15905],[5.84078,51.15819],[5.84129,51.15523],[5.8564,51.15071],[5.86258,51.14446],[5.85674,51.14037],[5.85159,51.13671],[5.84816,51.12938],[5.83374,51.12744],[5.82241,51.12249],[5.81211,51.11387],[5.82275,51.11171],[5.84026,51.10611],[5.83683,51.0936],[5.82584,51.08929],[5.80559,51.09102],[5.81142,51.07851],[5.80421,51.07031],[5.80868,51.06233],[5.797,51.05564],[5.77709,51.05693],[5.76576,51.03384],[5.78568,51.02412],[5.77263,51.01354],[5.77332,51.00555],[5.76885,50.99345],[5.7589,50.98912],[5.74654,50.97767],[5.72765,50.9647],[5.72834,50.95843],[5.73761,50.96145],[5.75306,50.96232],[5.76851,50.9541],[5.7589,50.94567],[5.73521,50.92446],[5.73177,50.91061],[5.7177,50.90563],[5.70362,50.9078],[5.70122,50.89545],[5.68954,50.88224],[5.68096,50.87726],[5.67169,50.87574],[5.65453,50.87054],[5.64766,50.86274],[5.64766,50.84757],[5.65453,50.83435],[5.66448,50.82437],[5.6971,50.81353],[5.71838,50.80333],[5.72113,50.77642],[5.78018,50.79639],[5.82962,50.77294],[5.9079,50.77381],[6.00403,50.76947],[6.04248,50.76252],[6.05621,50.75123],[6.129,50.73385],[6.16745,50.69037],[6.21689,50.66252],[6.2471,50.65991],[6.28143,50.64424],[6.28693,50.62333],[6.27045,50.59631],[6.24847,50.58542],[6.24058,50.56078],[6.22719,50.5538],[6.21586,50.54965],[6.20419,50.53591],[6.21552,50.52063],[6.22993,50.50295],[6.23989,50.50513],[6.2598,50.50338],[6.27766,50.50731],[6.29139,50.50076],[6.3089,50.50513],[6.3216,50.49923],[6.35078,50.49377],[6.35765,50.48722],[6.34838,50.47936],[6.35147,50.46188],[6.37756,50.45925],[6.38065,50.44657],[6.37619,50.40786],[6.36383,50.39561],[6.35387,50.38028],[6.36246,50.37634],[6.41155,50.34415],[6.41499,50.33363],[6.40675,50.31982],[6.38718,50.31763],[6.36829,50.3025],[6.35765,50.30338],[6.33018,50.31565],[6.31645,50.31478],[6.30444,50.30601],[6.29585,50.29044],[6.29414,50.27354],[6.27628,50.26411],[6.22856,50.25511],[6.21483,50.25094],[6.20659,50.24062],[6.19869,50.23403],[6.17947,50.23139],[6.18221,50.22678],[6.17672,50.22151],[6.19251,50.21206],[6.19801,50.18437],[6.19217,50.17646],[6.15166,50.16656],[6.15509,50.15491],[6.16058,50.14633],[6.15578,50.13554],[6.14376,50.13224],[6.13243,50.12454],[6.10737,50.13378],[6.11012,50.16282],[6.09947,50.16502],[6.08677,50.15425],[6.06583,50.14875],[6.02943,50.15579],[6.01639,50.17294],[5.97931,50.16898],[5.96832,50.12542],[5.94566,50.12278],[5.90378,50.10473],[5.89073,50.06948],[5.86876,50.06243],[5.87837,50.03289],[5.83168,50.01039],[5.84404,49.99935],[5.84747,49.98214],[5.81932,49.95785],[5.78773,49.95255],[5.77263,49.91144],[5.74722,49.89994],[5.7843,49.88977],[5.7946,49.87473],[5.76645,49.86012],[5.75203,49.834],[5.76645,49.80121],[5.79941,49.79855],[5.84404,49.74977],[5.83923,49.72847],[5.87906,49.72892],[5.89622,49.70672],[5.87563,49.67963],[5.91176,49.66218],[5.90567,49.65779],[5.9073,49.65479],[5.90429,49.65213],[5.90507,49.64735],[5.90567,49.64262],[5.90876,49.63868],[5.89854,49.63362],[5.89374,49.63573],[5.88524,49.6319],[5.88799,49.62645],[5.87837,49.62],[5.87829,49.61305],[5.8776,49.60737],[5.84996,49.59675],[5.85202,49.58824],[5.86318,49.58773],[5.86524,49.58974],[5.86962,49.59013],[5.87279,49.58913],[5.87502,49.58295],[5.87073,49.58134],[5.87288,49.57961],[5.87314,49.57677],[5.87451,49.5736],[5.86387,49.56965],[5.86164,49.56603],[5.85288,49.56347],[5.85168,49.56185],[5.84661,49.5608],[5.84773,49.55896],[5.84722,49.55567],[5.84224,49.55233],[5.8267,49.54933],[5.82524,49.55066],[5.82026,49.54599],[5.81623,49.54599],[5.81245,49.54582],[5.80765,49.5486],[5.79941,49.54816],[5.78859,49.55194],[5.77263,49.56141],[5.76181,49.55963],[5.75941,49.54203],[5.7407,49.53724],[5.73521,49.53813],[5.72971,49.54225],[5.7189,49.53802],[5.70156,49.5378],[5.6904,49.54392],[5.67993,49.54348],[5.67787,49.54715],[5.66757,49.54682],[5.66002,49.5505],[5.64526,49.54437],[5.62878,49.53579],[5.6262,49.52287],[5.62346,49.5144],[5.61298,49.50292],[5.60217,49.50671],[5.59359,49.51953],[5.56904,49.52565],[5.56372,49.52409],[5.55462,49.52744],[5.54192,49.51384],[5.50329,49.50504],[5.4875,49.50526],[5.48458,49.50113],[5.47085,49.49322],[5.46209,49.49679],[5.46055,49.50738],[5.45214,49.51083],[5.44304,49.51841],[5.46158,49.52788],[5.46209,49.53735],[5.4372,49.55283],[5.45368,49.56542],[5.44458,49.56586],[5.43549,49.56887],[5.42673,49.5899],[5.42862,49.59358],[5.41523,49.59947],[5.40871,49.60748],[5.39892,49.6096],[5.39652,49.6146],[5.3742,49.62128],[5.37025,49.62105],[5.36047,49.62428],[5.34897,49.62895],[5.34279,49.61505],[5.33781,49.61427],[5.32957,49.61494],[5.32064,49.61271],[5.31378,49.6096],[5.31034,49.61071],[5.30863,49.61694],[5.30279,49.62317],[5.30245,49.62962],[5.30794,49.63851],[5.31738,49.64807],[5.33043,49.65318],[5.30708,49.67085],[5.29284,49.67607],[5.27962,49.68496],[5.2791,49.6884],[5.26829,49.69495],[5.25782,49.69295],[5.2482,49.68529],[5.24117,49.68429],[5.24134,49.68851],[5.23104,49.69007],[5.2173,49.6864],[5.21421,49.68784],[5.20666,49.69451],[5.19722,49.69062],[5.18932,49.6924],[5.17542,49.6924],[5.16306,49.69218],[5.1622,49.6995],[5.1646,49.71083],[5.15963,49.71438],[5.15327,49.71671],[5.15087,49.71249],[5.14263,49.70739],[5.14006,49.71194],[5.13147,49.71205],[5.12529,49.71105],[5.12032,49.71704],[5.12358,49.72637],[5.11723,49.73757],[5.09302,49.76297],[5.08796,49.76475],[5.08452,49.76186],[5.07963,49.76164],[5.07611,49.76109],[5.07139,49.75987],[5.06727,49.76081],[5.06144,49.76192],[5.06092,49.76624],[5.04908,49.76741],[5.00599,49.7816],[5.00547,49.7832],[5.00504,49.78719],[5.00041,49.79312],[4.99741,49.79379],[4.99603,49.79506],[4.99715,49.79672],[4.99672,49.79955],[4.9938,49.79977],[4.98539,49.79888],[4.97895,49.79972],[4.96977,49.8011],[4.96779,49.79756],[4.96179,49.79717],[4.95569,49.80027],[4.94865,49.79811],[4.94814,49.79473],[4.94368,49.79035],[4.94213,49.79035],[4.94132,49.79226],[4.93887,49.7926],[4.93286,49.78977],[4.9329,49.78825],[4.93114,49.78661],[4.92939,49.78686],[4.92102,49.78805],[4.91793,49.78708],[4.91269,49.78573],[4.90475,49.78492],[4.89947,49.78597],[4.89741,49.78836],[4.88913,49.78769],[4.88724,49.78786],[4.88244,49.79049],[4.87939,49.79249],[4.87591,49.79282],[4.87068,49.79268],[4.87188,49.78922],[4.87081,49.78839],[4.86227,49.78805],[4.85712,49.78966],[4.85201,49.79035],[4.84909,49.79368],[4.8563,49.79722],[4.86076,49.80354],[4.86214,49.81373],[4.87364,49.81883],[4.86712,49.82071],[4.86712,49.82625],[4.86506,49.83444],[4.8654,49.83964],[4.85304,49.84042],[4.84943,49.84894],[4.84789,49.86278],[4.84463,49.8703],[4.85561,49.87096],[4.87484,49.89618],[4.87347,49.90459],[4.87999,49.90879],[4.87553,49.92006],[4.85424,49.92957],[4.84325,49.94636],[4.82849,49.94724],[4.78558,49.9563],[4.78523,49.9828],[4.80995,49.99626],[4.81647,50.02671],[4.83021,50.04127],[4.81441,50.04788],[4.8127,50.06794],[4.8357,50.07014],[4.83192,50.09085],[4.84291,50.10363],[4.86626,50.10318],[4.85836,50.1164],[4.88274,50.13664],[4.87072,50.14875],[4.8278,50.14963],[4.82025,50.15579],[4.76875,50.1296],[4.75262,50.10539],[4.70352,50.08424],[4.70112,50.01502],[4.69803,49.99229],[4.63383,49.98037],[4.56963,49.96712],[4.53255,49.94857],[4.51401,49.93973],[4.44122,49.93178],[4.35745,49.94327],[4.31145,49.95564],[4.22974,49.94945],[4.18785,49.95034],[4.16725,49.96801],[4.12331,49.97286],[4.12193,50.01215],[4.14734,50.05273],[4.18167,50.05493],[4.22012,50.07301],[4.1906,50.10252],[4.18922,50.1263],[4.16382,50.1219],[4.11644,50.13158],[4.13841,50.21734],[4.20708,50.25555],[4.1827,50.27025],[4.16382,50.28298],[4.15901,50.27596],[4.17309,50.2685],[4.17309,50.25994],[4.16519,50.25401],[4.13258,50.25489],[4.1312,50.26433],[4.13017,50.27091],[4.11644,50.27464],[4.12262,50.2821],[4.1185,50.2957],[4.09653,50.30864],[4.07696,50.30579],[4.07215,50.31807],[4.05533,50.32946],[4.03679,50.33998],[4.02512,50.35291],[3.98598,50.33911],[3.95748,50.33845],[3.8974,50.32267],[3.88264,50.32377],[3.88092,50.33494],[3.85448,50.33911],[3.84933,50.34875],[3.82942,50.35028],[3.82633,50.34217],[3.80711,50.3413],[3.80608,50.35072],[3.74256,50.34393],[3.73604,50.31149],[3.72437,50.30272],[3.70583,50.29921],[3.68076,50.31894],[3.66428,50.34152],[3.65227,50.37087],[3.66634,50.39123],[3.66325,50.42143],[3.65398,50.4551],[3.62995,50.46712],[3.60832,50.49006],[3.59974,50.48657],[3.55476,50.48853],[3.49915,50.47936],[3.48198,50.48635],[3.50945,50.52085],[3.4758,50.52478],[3.45726,50.50513],[3.43735,50.49945],[3.36662,50.48416],[3.27324,50.52609],[3.25951,50.60154],[3.2341,50.65251],[3.24097,50.67862],[3.24783,50.70037],[3.19565,50.70776],[3.1311,50.77642],[3.06725,50.76296],[2.99652,50.74428],[2.95807,50.67035],[2.82898,50.68602],[2.68341,50.77816],[2.57629,50.81114],[2.5708,50.93939],[2.51862,51.05866],[2.36755,51.2516],[3.08167,51.55146]]]}},be_brussels:{type:"Feature",id:"be_brussels",properties:{},geometry:{type:"Polygon",coordinates:[[[4.37973,50.76382],[4.37853,50.76811],[4.34522,50.77337],[4.34205,50.77164],[4.32952,50.77381],[4.31621,50.78624],[4.31458,50.79454],[4.30282,50.79709],[4.29802,50.80593],[4.28901,50.80691],[4.2854,50.80506],[4.27579,50.80696],[4.27218,50.81011],[4.25802,50.80935],[4.25519,50.8151],[4.24403,50.81548],[4.24343,50.82182],[4.25227,50.82697],[4.25107,50.83288],[4.25467,50.83695],[4.27193,50.84036],[4.28094,50.84215],[4.28042,50.85721],[4.27802,50.85911],[4.27699,50.86713],[4.28274,50.87227],[4.29561,50.88094],[4.29553,50.88262],[4.29149,50.88495],[4.29004,50.88982],[4.30634,50.89274],[4.31647,50.89605],[4.32892,50.90249],[4.34025,50.90411],[4.34857,50.90341],[4.36213,50.9033],[4.3726,50.90032],[4.38119,50.90319],[4.38462,50.91093],[4.39578,50.91407],[4.41543,50.91342],[4.41655,50.90757],[4.4296,50.90103],[4.43595,50.89502],[4.43106,50.89014],[4.44007,50.87845],[4.43183,50.87628],[4.4253,50.86615],[4.44599,50.85992],[4.44968,50.85591],[4.46238,50.85396],[4.46899,50.84573],[4.46959,50.83537],[4.47972,50.82036],[4.45947,50.81661],[4.45921,50.80626],[4.48238,50.79617],[4.4817,50.79134],[4.46427,50.78645],[4.435,50.775],[4.43028,50.77517],[4.38917,50.76377],[4.37973,50.76382]]]}},be_flanders:{type:"Feature",id:"be_flanders",properties:{},geometry:{type:"Polygon",coordinates:[[[2.52239,51.10172],[3.12606,51.34118],[3.17493,51.38246],[3.37615,51.38784],[3.41065,51.3304],[3.40202,51.28548],[3.49114,51.2567],[3.48251,51.30345],[3.57737,51.32322],[3.81309,51.27289],[3.82172,51.23691],[3.93095,51.23691],[4.05456,51.27469],[4.20116,51.35195],[4.16954,51.38067],[4.34202,51.39502],[4.36502,51.46491],[4.53749,51.50072],[4.57199,51.47924],[4.56049,51.44879],[4.63811,51.45058],[4.75022,51.52397],[4.83645,51.50787],[5.0808,51.49893],[5.13541,51.447],[5.10667,51.39143],[5.26477,51.31783],[5.26477,51.28727],[5.4085,51.29267],[5.48612,51.32501],[5.58098,51.28368],[5.58385,51.23511],[5.76783,51.2045],[5.87706,51.16125],[5.70459,50.80293],[5.90581,50.78657],[5.93743,50.73202],[5.90293,50.70108],[5.81382,50.69379],[5.61547,50.76112],[5.50049,50.712],[5.2044,50.7029],[5.16416,50.67558],[5.03768,50.70108],[4.98881,50.75021],[4.91694,50.72656],[4.79046,50.76658],[4.68122,50.77021],[4.66973,50.73566],[4.2874,50.67922],[3.91083,50.6774],[3.71823,50.75203],[3.65499,50.712],[3.53426,50.71018],[3.51413,50.74112],[3.45664,50.74384],[3.37328,50.69562],[3.31004,50.70745],[3.28991,50.73657],[3.16487,50.74294],[3.13181,50.77203],[3.08007,50.76021],[2.87453,50.7393],[2.89609,50.71109],[2.87453,50.69562],[2.79692,50.7029],[2.69918,50.8002],[2.62013,50.79747],[2.56982,50.8583],[2.56695,50.92358],[2.60288,50.94985],[2.5497,50.99601],[2.52239,51.10172]]]}},be_wallonia:{type:"Feature",id:"be_wallonia",properties:{},geometry:{type:"Polygon",coordinates:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]]]}},croatia:{type:"Feature",id:"croatia",properties:{},geometry:{type:"LineString",coordinates:[[18.55316,42.39709],[18.43575,42.48273],[18.44437,42.56076],[18.3609,42.61526],[18.24898,42.61375],[17.90239,42.81647],[17.85896,42.89458],[17.80815,42.92073],[17.7903,42.89961],[17.67975,42.92174],[17.64267,42.88351],[17.53967,42.93531],[17.71339,42.97351],[17.63424,43.09863],[17.43805,43.18365],[17.44734,43.1998],[17.37488,43.2502],[17.26227,43.39108],[17.30151,43.4393],[17.282,43.47769],[17.22656,43.49776],[17.1476,43.49677],[16.39709,44.06983],[16.15253,44.38405],[16.14789,44.48088],[15.90458,44.75089],[15.82858,44.72686],[15.74818,44.81311],[15.78598,44.84029],[15.7338,44.9371],[15.78598,44.96966],[15.75505,45.05587],[15.80439,45.1121],[15.77283,45.16143],[15.81894,45.2072],[15.99747,45.21978],[16.11145,45.08758],[16.29175,44.9865],[16.36047,44.99622],[16.40374,45.10639],[16.46738,45.13326],[16.5105,45.20898],[16.81812,45.17296],[16.92275,45.23503],[17.16882,45.13674],[17.59713,45.09425],[17.66404,45.12204],[17.84756,45.03242],[17.93891,45.07086],[17.93745,45.09903],[18.0011,45.14282],[18.11746,45.06832],[18.2011,45.0684],[18.22841,45.09274],[18.41889,45.09637],[18.46602,45.05359],[18.66267,45.04785],[18.72157,44.98326],[18.77858,44.98426],[18.78491,44.94261],[18.75375,44.95245],[18.73803,44.94119],[18.75065,44.90197],[18.83764,44.84591],[19.01991,44.84386],[18.99843,44.89696],[19.06865,44.88961],[19.16343,44.94855],[19.1011,44.98811],[19.11231,45.08359],[19.08464,45.11852],[19.09331,45.13091],[19.14345,45.119],[19.2041,45.17236],[19.45198,45.16219],[19.42108,45.23622],[19.2687,45.24886],[19.10972,45.30469],[19.09424,45.3367],[18.9792,45.37883],[19.03735,45.40735],[18.99315,45.44969],[19.00341,45.48553],[19.08125,45.47585],[19.10858,45.5144],[19.01686,45.56369],[18.94817,45.54136],[18.89717,45.56551],[18.96652,45.66972],[18.9164,45.70714],[18.82507,45.91724],[18.77838,45.88666],[18.68019,45.91486],[18.43522,45.74655],[18.15765,45.79625],[17.86118,45.77993],[17.66574,45.84483],[17.58087,45.93874],[17.31102,45.97167],[17.17232,46.1551],[16.97456,46.22688],[16.86058,46.35783],[16.72462,46.39715],[16.66077,46.45725],[16.36894,46.55083],[16.24191,46.49508],[16.30028,46.38152],[16.15145,46.40378],[16.04759,46.3891],[16.073,46.34266],[15.79422,46.26439],[15.78049,46.21928],[15.67131,46.23068],[15.60059,46.16509],[15.61913,46.08657],[15.71043,46.04506],[15.68573,45.84315],[15.55939,45.85272],[15.24587,45.72718],[15.34584,45.65341],[15.28061,45.60731],[15.36301,45.48661],[15.16462,45.43061],[14.55276,45.65149],[14.4841,45.54339],[14.33098,45.47073],[14.23361,45.51383],[14.19361,45.48114],[14.07402,45.49231],[13.99868,45.52812],[13.95607,45.5049],[13.98354,45.46061],[13.87695,45.43477],[13.78445,45.47445],[13.67282,45.45244],[13.6,45.46],[13.48,45.55],[13,45],[16,42.2],[18.487,42.33],[18.55316,42.39709]]}},czechia:{type:"Feature",id:"czechia",properties:{},geometry:{type:"Polygon",coordinates:[[[14.3811,51.06902],[15.13916,51.08282],[16.42456,50.70863],[16.68823,50.32442],[16.78711,50.49246],[17.75391,50.35247],[18.58887,49.96536],[18.92944,49.51808],[18.1604,48.98022],[17.00684,48.61839],[15.13916,48.85749],[14.67773,48.55298],[13.85376,48.58206],[12.00806,50.05008],[11.92017,50.35948],[14.3811,51.06902]]]}},denmark:{type:"Feature",id:"denmark",properties:{},geometry:{type:"Polygon",coordinates:[[[7.99805,55.11608],[7.9541,56.94497],[10.62378,57.94401],[12.65625,56.01681],[12.65625,55.91535],[12.82928,55.5566],[12.60956,55.42122],[12.66449,55.25095],[14.82605,55.37911],[15.28198,55.22902],[15.11719,54.85448],[12.87598,54.85922],[12.07672,54.44769],[10.849,54.73414],[10.67871,54.58002],[9.88083,54.83708],[9.73972,54.82265],[9.60823,54.8525],[9.63158,54.87996],[9.59038,54.88668],[9.4994,54.83886],[9.43176,54.82601],[9.41013,54.84242],[9.38198,54.83827],[9.37443,54.82047],[9.34422,54.80108],[9.25152,54.80979],[9.23985,54.84993],[9.13822,54.87483],[9.06338,54.87048],[8.90167,54.90386],[8.85532,54.89517],[8.82408,54.90662],[8.79765,54.90445],[8.77602,54.893],[8.72761,54.89181],[8.67645,54.91195],[8.66066,54.90859],[8.55698,54.92063],[8.47355,55.05537],[7.99805,55.11608]]]}},finland:{type:"Feature",id:"finland",properties:{},geometry:{type:"Polygon",coordinates:[[[24.16992,65.34851],[23.90625,66.14274],[23.68652,66.44311],[23.99414,66.80922],[23.51074,67.27204],[23.37891,67.44123],[23.73047,67.97463],[20.74219,69.03714],[21.18164,69.28726],[21.70898,69.27171],[22.45605,68.73638],[23.15918,68.65655],[23.90625,68.8318],[25.00488,68.59249],[25.40039,68.87936],[25.75195,68.95839],[25.97168,69.70287],[26.45508,69.96044],[27.20215,69.90012],[27.50977,70.0506],[27.86133,70.08056],[28.38867,69.82447],[29.04785,69.71811],[29.26758,69.53452],[28.87207,69.225],[29.0918,69.02141],[28.52051,68.89519],[28.78418,68.84767],[28.52051,68.56038],[28.69629,68.17156],[29.26758,68.0733],[30.05859,67.69277],[29.17969,67.0503],[29.0918,66.8956],[30.14648,65.73063],[29.66309,65.20147],[29.70703,64.79285],[30.05859,64.79285],[30.10254,64.41592],[30.4541,64.30182],[30.05859,63.74363],[31.59668,63.01511],[30.27832,61.89758],[27.81738,60.56538],[27.33398,60.19616],[24.65332,59.88894],[21.84082,59.46741],[20.43457,59.46741],[19.11621,60.19616],[19.2041,60.58697],[20.08301,60.75916],[20.69824,61.14324],[20.96191,61.73153],[19.99512,63.27318],[21.44531,63.66576],[22.93945,64.20638],[23.24707,64.51064],[23.81836,64.66152],[24.16992,65.34851]]]}},france:{type:"Feature",id:"france",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[9.9,42.64836],[9.9,42.02785],[9.63227,41.43244],[9.36968,41.35052],[9.32602,41.3036],[9.27311,41.29196],[9.07196,41.26129],[8.94186,41.27688],[8.8742,41.26232],[8.84542,41.26311],[8.78782,41.25725],[7.3114,41.4242],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24593,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.26331,50.92504],[1.76605,51.17762],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.26696,43.39308],[9.8,43.1],[9.9,42.64836]]]]}},"de-berlin-brandenburg":{type:"Feature",id:"de-berlin-brandenburg",properties:{},geometry:{type:"Polygon",coordinates:[[[11.32141,53.11711],[12.09595,53.36694],[12.88147,53.20274],[13.78235,53.50765],[14.16687,53.41608],[14.10645,53.28164],[14.29871,53.27507],[14.41956,53.32431],[14.19434,52.93871],[14.19434,52.82932],[14.57336,52.60972],[14.57336,52.36218],[14.71619,52.05249],[14.61182,51.84257],[14.76563,51.54975],[14.36462,51.519],[14.1449,51.54975],[13.99109,51.36835],[13.2605,51.39578],[13.07373,51.65211],[13.13965,51.86971],[12.67273,52.01532],[12.40356,52.03222],[12.22229,52.14697],[12.32117,52.50619],[12.16736,52.51956],[12.23877,52.87245],[11.60156,52.96849],[11.32141,53.11711]]]}},"de-ostwestfalen-lippe":{type:"Feature",id:"de-ostwestfalen-lippe",properties:{},geometry:{type:"Polygon",coordinates:[[[8.04337,52.05756],[8.42583,52.19919],[8.43846,52.35394],[8.30866,52.39929],[8.28438,52.4581],[8.67096,52.56967],[9.22028,52.49616],[9.06097,52.28328],[9.47365,51.86716],[9.46266,51.64103],[9.26285,51.46641],[9.15648,51.43569],[8.80348,51.43218],[8.54444,51.46003],[8.42239,51.55658],[8.31076,51.72252],[8.12645,51.86844],[8.04337,52.05756]]]}},germany:{type:"Feature",id:"germany",properties:{},geometry:{type:"Polygon",coordinates:[[[7.05048,52.62973],[7.21252,53.20274],[6.56982,53.61858],[8.30772,55.1467],[8.6483,54.96421],[9.45305,54.83313],[9.95018,54.82838],[11.99913,54.44689],[13.3889,54.89162],[14.15245,54.47562],[14.26231,53.78037],[14.44359,53.27096],[14.36119,53.0668],[14.16344,52.97097],[14.13597,52.84508],[14.62486,52.60555],[14.5919,52.35463],[14.71825,52.24042],[14.74571,52.06516],[14.60838,51.83153],[14.74571,51.69554],[14.76768,51.54206],[14.98741,51.43261],[15.03136,51.27824],[14.94347,51.04744],[14.85558,50.88138],[14.77867,50.81548],[14.64684,50.85017],[14.5974,50.99215],[14.32823,51.07506],[14.32823,50.88138],[13.01537,50.49508],[12.48253,50.38663],[12.33421,50.18305],[12.1804,50.30952],[12.12547,50.25686],[12.22984,50.09856],[12.55394,49.92912],[12.4276,49.75199],[12.5045,49.68807],[12.77916,49.35286],[12.93297,49.36002],[13.03185,49.28841],[13.57018,48.96489],[13.80089,48.81319],[13.75694,48.52297],[13.52074,48.58842],[13.45482,48.57388],[13.40538,48.36994],[13.23509,48.28959],[12.99889,48.24571],[12.75169,48.12118],[12.9879,47.86385],[12.91649,47.71623],[13.04832,47.72362],[13.09776,47.67186],[13.0648,47.50885],[12.93846,47.47173],[12.77367,47.5793],[12.8286,47.60894],[12.70226,47.70144],[12.1859,47.70514],[12.16942,47.62005],[11.86729,47.60524],[11.63109,47.59412],[11.25755,47.40114],[10.98839,47.40486],[10.88402,47.52369],[10.67528,47.55707],[10.45006,47.54594],[10.46654,47.41973],[10.34019,47.3081],[10.19737,47.27457],[10.21385,47.38998],[10.10948,47.3751],[10.08202,47.46431],[9.84581,47.55336],[9.40636,47.55336],[9.09874,47.68388],[8.90236,47.65521],[8.85292,47.70329],[8.80348,47.74025],[8.76915,47.71993],[8.80486,47.70329],[8.79524,47.68388],[8.7307,47.69867],[8.73482,47.7227],[8.71284,47.7384],[8.7513,47.76887],[8.69637,47.76425],[8.65654,47.8067],[8.63594,47.76518],[8.61122,47.80947],[8.57002,47.79286],[8.48763,47.77902],[8.41621,47.71808],[8.41347,47.68111],[8.46428,47.65891],[8.53706,47.67001],[8.60985,47.67741],[8.63457,47.64966],[8.59886,47.64319],[8.61122,47.6219],[8.56865,47.60061],[8.56865,47.6219],[8.52745,47.64041],[8.45879,47.60801],[8.50273,47.58672],[8.38463,47.57004],[8.33107,47.57375],[8.29399,47.61542],[8.2061,47.62653],[8.10173,47.56819],[7.96852,47.5617],[7.92046,47.55429],[7.89024,47.59505],[7.8257,47.58949],[7.81197,47.56726],[7.6815,47.54038],[7.6403,47.56448],[7.69386,47.5756],[7.6815,47.59412],[7.64854,47.60061],[7.61421,47.58394],[7.50641,47.70237],[7.79205,48.60749],[8.22876,48.97481],[6.84174,49.17093],[6.37482,49.48597],[6.53961,49.80963],[6.1441,50.01833],[6.19835,50.21119],[6.41808,50.35159],[6.19835,50.63117],[6.02257,50.77034],[6.02257,51.07506],[6.24229,51.37778],[5.97862,51.81456],[6.1496,51.90022],[6.44073,51.85105],[6.828,51.95611],[6.68518,52.05587],[7.04773,52.23957],[6.99554,52.45768],[6.70166,52.48445],[6.72913,52.64973],[7.05048,52.62973]]]}},hungary:{type:"Feature",id:"hungary",properties:{},geometry:{type:"Polygon",coordinates:[[[18.43643,45.73111],[17.67426,45.83454],[17.57675,45.92823],[17.35153,45.94303],[17.14966,46.16081],[16.52756,46.50028],[16.3147,46.86582],[16.11969,46.86582],[16.28448,46.99337],[16.48224,47.01584],[16.5152,47.1505],[16.42731,47.2177],[16.43829,47.41136],[16.66763,47.44852],[16.67587,47.60616],[16.43829,47.65614],[16.54816,47.75964],[16.71844,47.73563],[16.75003,47.68111],[17.08099,47.70791],[17.04254,47.86293],[17.09473,47.96234],[17.20734,48.02484],[17.75665,47.74486],[18.71246,47.76702],[18.85529,47.82606],[18.77838,47.87767],[18.75641,47.98808],[18.82233,48.04687],[19.50348,48.1056],[19.55566,48.25028],[19.92096,48.14227],[20.34943,48.30329],[20.54718,48.54389],[20.82184,48.58751],[21.14044,48.50751],[21.47003,48.58751],[21.70074,48.36902],[21.8367,48.34073],[22.2171,48.42282],[22.38327,48.24205],[22.50549,48.24845],[22.61948,48.1056],[22.83371,48.11843],[22.90649,47.95406],[22.59064,47.75779],[22.48077,47.81131],[22.42584,47.74486],[22.32147,47.75779],[22.02759,47.51442],[22.03033,47.38161],[21.9397,47.3658],[21.48926,46.75868],[21.52908,46.73233],[21.4151,46.61737],[21.33133,46.61549],[21.10611,46.23875],[20.79575,46.27863],[20.7106,46.15035],[20.25055,46.13227],[19.82758,46.16461],[19.54742,46.17793],[19.51447,46.1018],[18.80997,45.87567],[18.70285,45.91294],[18.43643,45.73111]]]}},italy:{type:"Feature",id:"italy",properties:{},geometry:{type:"Polygon",coordinates:[[[7.6,43.5],[7.49542,43.86523],[7.69043,44.0718],[7.69043,44.19796],[7.42676,44.15068],[6.9873,44.26094],[6.85547,44.55916],[7.03125,44.73113],[7.00928,44.87144],[6.72363,44.91814],[6.5918,45.12005],[7.09717,45.25942],[7.14111,45.41388],[6.96533,45.61404],[6.76758,45.79817],[7.03125,45.9053],[7.55859,45.9817],[7.77832,45.93587],[8.12988,46.13417],[8.08594,46.30141],[8.48145,46.46813],[8.61328,46.13417],[8.81104,46.10371],[9.05273,45.8288],[9.07471,46.11894],[9.27246,46.25585],[9.25049,46.43786],[9.44824,46.49839],[9.49219,46.31658],[9.68994,46.31658],[9.95361,46.36209],[10.06348,46.17983],[10.17334,46.25585],[10.0415,46.453],[10.08545,46.60417],[10.26123,46.66452],[10.45898,46.49839],[10.50293,46.61926],[10.39307,46.70974],[10.41504,46.86019],[10.61279,46.87521],[11.03027,46.76997],[11.16211,46.93526],[11.27197,46.99524],[11.53564,47.01023],[11.7334,46.99524],[12.2168,47.10004],[12.15088,46.93526],[12.43652,46.70974],[12.96387,46.61926],[13.73291,46.54375],[13.71094,46.42271],[13.40332,46.33176],[13.40332,46.22545],[13.66699,46.17983],[13.51318,46.05799],[13.64502,45.96642],[13.5791,45.85941],[13.93066,45.64477],[13.82629,45.5756],[13.6,45.6294],[12.9,45.4],[12.8,45],[18.9,40.3],[18.5,39],[15,36],[11,38],[9.6,43.2],[7.6,43.5]]]}},IT_Lazio:{type:"Feature",id:"IT_Lazio",properties:{},geometry:{type:"Polygon",coordinates:[[[13.23814,42.1301],[13.19363,42.15923],[13.17062,42.15169],[13.12434,42.17797],[13.08798,42.17886],[13.08575,42.14318],[13.0317,42.12309],[13.01946,42.07634],[13.05545,42.01736],[13.10194,42.00898],[13.10589,42.02698],[13.36437,41.92475],[13.384,41.90419],[13.35751,41.8694],[13.38052,41.81709],[13.4169,41.83467],[13.50508,41.8016],[13.52044,41.77297],[13.57182,41.7543],[13.66214,41.81144],[13.70555,41.78747],[13.72956,41.7989],[13.7629,41.7488],[13.81162,41.75426],[13.85645,41.73124],[13.89541,41.73405],[13.98311,41.66238],[14.01182,41.60835],[13.99895,41.57448],[14.02596,41.55567],[14.00526,41.53875],[14.0275,41.52321],[13.97291,41.49404],[13.99278,41.48208],[13.9779,41.46249],[13.90257,41.42273],[13.86123,41.41763],[13.8886,41.40081],[13.8688,41.36272],[13.88974,41.29748],[13.82898,41.28154],[13.83083,41.2502],[13.77126,41.24136],[13.45667,40.77769],[11.52381,41.03693],[11.44922,42.37798],[11.48889,42.43937],[11.61771,42.43604],[11.61626,42.48862],[11.56011,42.51595],[11.58852,42.54226],[11.57917,42.56803],[11.61401,42.55723],[11.64337,42.56635],[11.71111,42.61091],[11.73597,42.60666],[11.74975,42.63965],[11.80478,42.644],[11.77554,42.70951],[11.80156,42.70719],[11.81949,42.74543],[11.74602,42.78576],[11.77424,42.82107],[11.80685,42.79485],[11.8137,42.82267],[11.84851,42.84008],[11.90558,42.8325],[11.92743,42.78092],[11.97948,42.76459],[11.96293,42.72669],[11.9301,42.71295],[11.94133,42.6833],[12.03,42.64324],[12.10666,42.66464],[12.12406,42.64929],[12.16101,42.67691],[12.20434,42.66046],[12.24292,42.62906],[12.22819,42.61077],[12.24626,42.60256],[12.23866,42.57218],[12.27504,42.55991],[12.26676,42.53347],[12.29027,42.51904],[12.27477,42.50921],[12.30735,42.4973],[12.29041,42.49164],[12.32537,42.49476],[12.35123,42.47365],[12.39017,42.49819],[12.41905,42.49765],[12.41244,42.46756],[12.43038,42.45802],[12.41368,42.45517],[12.41365,42.4256],[12.4636,42.42909],[12.44469,42.39882],[12.51169,42.40311],[12.52874,42.36445],[12.60642,42.40245],[12.61481,42.46511],[12.64109,42.4678],[12.6495,42.44331],[12.67465,42.44242],[12.74156,42.47053],[12.71114,42.50079],[12.89273,42.5635],[12.88052,42.60935],[13.00524,42.61622],[13.02522,42.64],[13.06423,42.62427],[13.13,42.66053],[13.14645,42.64714],[13.17506,42.66707],[13.19025,42.73363],[13.25415,42.72145],[13.2645,42.74019],[13.28589,42.74049],[13.35851,42.69533],[13.35059,42.66968],[13.37022,42.6507],[13.4092,42.64383],[13.39493,42.59223],[13.29421,42.5705],[13.28454,42.58349],[13.24686,42.57367],[13.19228,42.58849],[13.15673,42.54102],[13.17934,42.48031],[13.11708,42.44489],[13.19508,42.39017],[13.15427,42.35797],[13.22737,42.32031],[13.23563,42.27871],[13.28229,42.23874],[13.33653,42.22338],[13.34238,42.19939],[13.3808,42.18142],[13.34871,42.17689],[13.35488,42.16769],[13.32819,42.16483],[13.30621,42.13923],[13.23814,42.1301]]]}},IT_Roma_Capitale:{type:"Feature",id:"IT_Roma_Capitale",properties:{},geometry:{type:"Polygon",coordinates:[[[11.6,42.16],[12.28,42.2],[12.52,42.31],[13.27,41.92],[13.15,41.58],[12.6,41.16],[11.6,42.16]]]}},south_tyrol:{type:"Feature",id:"south_tyrol",properties:{},geometry:{type:"Polygon",coordinates:[[[10.45624,46.86582],[10.73639,46.89211],[10.82977,46.80946],[10.96161,46.81322],[11.1319,46.99149],[11.49067,47.01233],[11.68121,47.04018],[11.7691,47.01023],[12.16736,47.115],[12.28546,47.08322],[12.18384,46.98213],[12.30469,46.85831],[12.37335,46.73421],[12.49969,46.67017],[12.34039,46.61737],[12.08771,46.64944],[12.0163,46.52297],[11.8515,46.49272],[11.66336,46.48657],[11.56929,46.34077],[11.399,46.25585],[11.18958,46.21072],[11.13739,46.2867],[11.20193,46.44732],[10.91904,46.42603],[10.61966,46.43833],[10.44113,46.49036],[10.36766,46.68854],[10.45624,46.86582]]]}},trentino:{type:"Feature",id:"trentino",properties:{},geometry:{type:"Polygon",coordinates:[[[10.49332,46.35641],[10.59219,46.46624],[10.76317,46.49697],[10.84076,46.45536],[11.07971,46.54469],[11.23627,46.50123],[11.21086,46.32559],[11.1779,46.27341],[11.23352,46.2473],[11.32416,46.30235],[11.5583,46.40378],[11.62628,46.5069],[11.83502,46.54233],[11.91399,46.44306],[11.85356,46.34124],[11.99158,46.18363],[11.84464,46.08466],[11.72791,46.07704],[11.69907,45.95592],[11.51093,45.97979],[11.28845,45.8814],[11.21567,45.76273],[11.16074,45.68316],[10.90256,45.66013],[10.82016,45.71097],[10.84076,45.81827],[10.51529,45.76752],[10.41504,46.00269],[10.51941,46.2112],[10.49332,46.35641]]]}},norway:{type:"Feature",id:"norway",properties:{},geometry:{type:"Polygon",coordinates:[[[25.98816,69.6179],[25.24109,68.60752],[20.42908,68.97318],[16.9519,67.9499],[13.77686,64.59561],[14.28223,64.47279],[14.08447,63.99524],[13.02979,64.10101],[12.00806,63.2633],[12.14813,61.6586],[12.87323,61.31245],[12.67548,61.0636],[12.26074,61.00241],[12.60681,60.50593],[12.49146,60.08128],[12.17285,59.88756],[11.87622,59.84895],[11.94214,59.69547],[11.6922,59.58998],[11.84601,59.25044],[11.64276,58.89471],[11.45325,58.88194],[11.44775,59.00168],[11.34888,59.11254],[11.18134,59.08009],[11.06186,58.97054],[8,57.5],[3,57.5],[3,83],[40,83],[35,71],[29.61365,69.28629],[27.98767,69.99711],[25.98816,69.6179]]]}},poland:{type:"Feature",id:"poland",properties:{},geometry:{type:"Polygon",coordinates:[[[14.03,52.84],[14.34,53.26],[14.13,54.16],[15.95,54.52],[16.31,54.76],[17.13,54.97],[18.29,55.08],[18.9,54.98],[19.69,54.5],[21.47,54.37],[22.9,54.46],[23.39,54.3],[24.01,53.17],[24.03,52.71],[23.29,52.3],[23.74,52.09],[23.64,51.61],[24.24,50.86],[24.11,50.41],[23.78,50.34],[22.77,49.55],[22.96,48.97],[22.18,49.1],[21.6,49.38],[20.93,49.24],[20.47,49.34],[20.12,49.13],[19.76,49.14],[19.45,49.51],[18.94,49.34],[18.48,49.85],[17.83,49.92],[17.54,50.21],[17.06,50.35],[17.08,50.18],[16.65,50.05],[16.11,50.41],[16.3,50.6],[16.01,50.54],[15.34,50.73],[15.14,50.93],[14.78,50.82],[14.94,51.27],[14.5,51.81],[14.66,52.05],[14.53,52.57],[14.03,52.84]]]}},slovenia:{type:"Feature",id:"slovenia",properties:{},geometry:{type:"Polygon",coordinates:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.37688,45.56647],[13.63953,45.6426],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]]}},spain:{type:"Feature",id:"spain",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-19,29],[-13,30],[-13,29],[-14,27.8],[-19,27],[-19,29]]],[[[-8.89106,41.82289],[-10,44],[-4,44],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[5,40],[4,39],[-2.2,36.5],[-5.6,35.95],[-6,36],[-7.37535,37.15354],[-7.40832,37.16822],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]]]}},sweden:{type:"Feature",id:"sweden",properties:{},geometry:{type:"Polygon",coordinates:[[[10.57159,58.2445],[10.63202,58.9245],[11.35712,59.12804],[11.53839,58.91174],[11.62079,58.92308],[11.75812,59.24341],[11.65649,59.61777],[11.85974,59.7121],[11.82129,59.84481],[11.95862,59.91098],[12.15363,59.91235],[12.44476,60.0895],[12.48322,60.32151],[12.56012,60.50458],[12.36511,60.71217],[12.19482,61.01572],[12.64801,61.09415],[12.82928,61.34276],[12.55463,61.55018],[12.42828,61.54495],[12.12341,61.71331],[12.28546,62.26664],[12.03278,62.60851],[12.10968,62.74718],[12.06024,62.89772],[12.18658,62.99765],[11.95587,63.28183],[12.18109,63.47873],[12.1344,63.59012],[12.659,63.9856],[12.90619,64.0722],[13.20831,64.10461],[13.9801,64.03014],[14.06525,64.46214],[13.60382,64.56968],[14.26025,65.11608],[14.31519,65.23831],[14.45251,65.31412],[14.47998,65.62656],[14.57886,65.80953],[14.49097,66.15163],[14.99634,66.17161],[15.4248,66.29337],[15.33691,66.51107],[16.04004,66.93221],[16.37512,67.06743],[16.35864,67.21467],[16.06201,67.42015],[16.1499,67.52957],[16.37512,67.55266],[16.70471,67.91688],[17.25952,68.13067],[17.88025,67.99523],[18.09448,68.19809],[18.06702,68.54432],[18.39661,68.58848],[19.00085,68.52019],[19.89075,68.39109],[20.13245,68.48798],[19.89075,68.55637],[20.28076,68.78613],[19.99512,69.06268],[20.62134,69.08033],[20.86853,69.03518],[21.24756,68.8437],[21.92322,68.60652],[22.90649,68.39514],[23.73596,67.96639],[23.5437,67.8362],[23.62061,67.47492],[23.79639,67.44544],[23.81287,67.26992],[23.63159,67.23806],[24.04358,66.82868],[23.91174,66.57448],[23.71399,66.31986],[24.22485,65.97333],[24.04358,65.64469],[21.00586,63.63894],[18.57239,61.83023],[19.18762,60.53297],[19.11346,60.18387],[19.66827,59.82687],[19.90173,58.07788],[18.78662,56.9869],[16.73218,56.05977],[15.0238,55.72711],[14.36462,55.31977],[13.1163,55.22276],[12.7002,55.30414],[12.82654,55.57834],[12.84851,55.72402],[12.79358,55.83214],[12.6123,56.0751],[12.49146,56.13331],[12.07947,56.30435],[11.35437,57.67185],[10.57159,58.2445]]]}},east_midlands_uk:{type:"Feature",id:"east_midlands_uk",properties:{},geometry:{type:"Polygon",coordinates:[[[0.03031,53.53488],[0.28564,53.56315],[0.48889,53.10722],[0.27299,52.82421],[0.24507,52.7845],[0.27219,52.77279],[0.18631,52.73533],[0.14206,52.7399],[0.08901,52.72361],[0.06361,52.72737],[0.04413,52.71436],[0.04883,52.68175],[0.02104,52.66476],[-0.03129,52.66151],[-0.06373,52.67521],[-0.08777,52.66676],[-0.10221,52.67218],[-0.14108,52.65149],[-0.18003,52.66054],[-0.19288,52.65242],[-0.20605,52.66805],[-0.26064,52.65139],[-0.28925,52.67025],[-0.335,52.67485],[-0.35023,52.66159],[-0.40569,52.64802],[-0.45065,52.65411],[-0.49897,52.63931],[-0.52006,52.64143],[-0.55014,52.61223],[-0.54419,52.59287],[-0.55813,52.59447],[-0.57192,52.58579],[-0.58149,52.59587],[-0.58865,52.58679],[-0.60303,52.58857],[-0.66093,52.56893],[-0.69783,52.5457],[-0.71564,52.52237],[-0.75723,52.51093],[-0.77488,52.51826],[-0.82013,52.51552],[-0.86871,52.52699],[-0.88346,52.51395],[-0.88214,52.49315],[-0.89806,52.4869],[-0.88241,52.47127],[-0.90065,52.45994],[-0.94219,52.46777],[-0.95192,52.47741],[-1.0007,52.47092],[-1.04452,52.44573],[-1.03429,52.43627],[-1.04987,52.42225],[-1.08439,52.43628],[-1.12928,52.41609],[-1.14947,52.39701],[-1.20141,52.39648],[-1.30715,52.49423],[-1.52226,52.57033],[-1.52716,52.58272],[-1.56075,52.59612],[-1.55447,52.61472],[-1.57139,52.6353],[-1.54714,52.64218],[-1.54245,52.65362],[-1.55281,52.66845],[-1.58965,52.68724],[-1.59082,52.69801],[-1.65505,52.69878],[-1.65662,52.72173],[-1.70372,52.7298],[-1.69687,52.75272],[-1.66654,52.78471],[-1.61113,52.78139],[-1.61435,52.78826],[-1.58887,52.79985],[-1.59183,52.80947],[-1.6105,52.81639],[-1.58536,52.8317],[-1.62672,52.85441],[-1.69028,52.86445],[-1.70061,52.86057],[-1.70435,52.86666],[-1.72527,52.85964],[-1.77712,52.88377],[-1.79092,52.88023],[-1.80186,52.88613],[-1.81171,52.88058],[-1.83295,52.8869],[-1.85422,52.93063],[-1.82982,52.94565],[-1.82678,52.97707],[-1.76257,52.99965],[-1.75775,53.01698],[-1.75978,53.03869],[-1.7847,53.04991],[-1.77566,53.05933],[-1.79424,53.08837],[-1.78373,53.10281],[-1.82144,53.13579],[-1.81254,53.15432],[-1.8393,53.1769],[-1.87403,53.19536],[-1.95671,53.21373],[-1.96237,53.22622],[-1.9896,53.21572],[-1.97486,53.23106],[-2.00948,53.26065],[-2.00679,53.35457],[-2.009,53.36201],[-2.03173,53.36573],[-2.03385,53.37517],[-2.00464,53.38633],[-1.99233,53.41519],[-2.02371,53.42055],[-2.02738,53.43233],[-2.01366,53.43988],[-2.00422,53.43592],[-2.00823,53.44155],[-1.98579,53.45523],[-1.98809,53.48033],[-1.97428,53.48838],[-1.97159,53.50434],[-1.92197,53.50995],[-1.92678,53.52095],[-1.91189,53.53803],[-1.89411,53.5336],[-1.87349,53.54041],[-1.84182,53.51989],[-1.82223,53.52108],[-1.80428,53.537],[-1.77188,53.53384],[-1.74155,53.54105],[-1.72318,53.55991],[-1.66945,53.5532],[-1.65103,53.56166],[-1.61581,53.56305],[-1.59636,53.57692],[-1.59109,53.60677],[-1.55023,53.60421],[-1.53078,53.59311],[-1.51867,53.5997],[-1.49656,53.59736],[-1.49512,53.60317],[-1.48371,53.59485],[-1.44763,53.61272],[-1.40036,53.59865],[-1.3767,53.60646],[-1.35612,53.59535],[-1.35143,53.58106],[-1.30782,53.57535],[-1.25803,53.59198],[-1.24825,53.61634],[-1.21778,53.62429],[-1.21602,53.642],[-1.1886,53.63583],[-1.15503,53.64319],[-1.13504,53.63254],[-1.12095,53.64688],[-0.99046,53.6612],[-0.94448,53.65868],[-0.86533,53.63769],[-0.89792,53.58325],[-0.90111,53.5687],[-0.89099,53.56654],[-0.90126,53.54788],[-0.89233,53.53738],[-0.94654,53.52732],[-0.95001,53.51363],[-0.93209,53.51065],[-0.93557,53.5025],[-0.90047,53.47513],[-0.92046,53.46446],[-0.87373,53.46146],[-0.87192,53.46629],[-0.79748,53.45504],[-0.78436,53.46336],[-0.78439,53.47665],[-0.77157,53.47918],[-0.76811,53.4989],[-0.75211,53.50051],[-0.73959,53.51991],[-0.62449,53.51282],[-0.62975,53.45819],[-0.55179,53.4595],[-0.47175,53.47485],[-0.48663,53.48045],[-0.48838,53.50484],[-0.40507,53.51759],[-0.40814,53.53208],[-0.43066,53.54631],[-0.50123,53.53744],[-0.46702,53.54894],[-0.429,53.5745],[-0.41967,53.56375],[-0.33594,53.5586],[-0.30342,53.59077],[-0.30093,53.61636],[-0.24847,53.59364],[-0.25139,53.58463],[-0.23466,53.58623],[-0.22255,53.56799],[-0.19169,53.56844],[-0.21988,53.53258],[-0.21059,53.53168],[-0.20408,53.51174],[-0.2106,53.48626],[-0.18856,53.48451],[-0.1818,53.46862],[-0.15368,53.46565],[-0.14923,53.44667],[-0.13188,53.43591],[-0.12034,53.43357],[-0.08221,53.45112],[-0.10786,53.46987],[-0.0898,53.47765],[-0.09548,53.48596],[-0.07526,53.48931],[-0.06493,53.51878],[-0.01452,53.51538],[0.03031,53.53488]]]}},"england-west-midlands":{type:"Feature",id:"england-west-midlands",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.28493,52.44175],[-3.12706,52.96995],[-1.95817,53.27605],[-1.1222,52.36367],[-1.59859,51.90733],[-2.65611,51.7761],[-3.10848,51.95414],[-3.28493,52.44175]]]}},london_uk:{type:"Feature",id:"london_uk",properties:{},geometry:{type:"Polygon",coordinates:[[[0.23926,51.43251],[0.23923,51.43329],[0.23926,51.43251],[0.23717,51.4241],[0.205,51.39919],[0.18385,51.37628],[0.16188,51.36621],[0.15614,51.3539],[0.1603,51.31026],[0.14958,51.30173],[0.14213,51.29098],[0.06692,51.27361],[-0.01594,51.26864],[-0.05766,51.2586],[-0.10949,51.25943],[-0.16628,51.26848],[-0.19872,51.25854],[-0.22666,51.2587],[-0.27352,51.28757],[-0.31813,51.30077],[-0.33644,51.31532],[-0.40313,51.30581],[-0.44436,51.31987],[-0.47985,51.3302],[-0.50762,51.37142],[-0.53414,51.39494],[-0.54109,51.42774],[-0.53264,51.43923],[-0.5152,51.46248],[-0.49617,51.48894],[-0.50203,51.53945],[-0.5278,51.55474],[-0.53166,51.5611],[-0.53569,51.57289],[-0.53596,51.5778],[-0.53455,51.58275],[-0.53376,51.58792],[-0.51516,51.6337],[-0.49776,51.65205],[-0.4901,51.66912],[-0.45924,51.67692],[-0.44684,51.69442],[-0.42579,51.71213],[-0.39306,51.715],[-0.38079,51.71654],[-0.34459,51.70948],[-0.2838,51.71515],[-0.26707,51.71395],[-0.23509,51.69056],[-0.22093,51.68445],[-0.17729,51.68441],[-0.10644,51.69165],[-0.05899,51.68257],[0.02324,51.678],[0.0691,51.68854],[0.10856,51.68336],[0.19863,51.65015],[0.25714,51.61353],[0.28187,51.57813],[0.29039,51.55903],[0.26811,51.50265],[0.26882,51.49783],[0.26782,51.49042],[0.2659,51.47443],[0.25509,51.46053],[0.23586,51.44791],[0.23926,51.43251]]]}},united_kingdom:{type:"Feature",id:"united_kingdom",properties:{name:"United Kingdom",source:"OpenStreetMap"},geometry:{type:"Polygon",coordinates:[[[-7.24863,55.06999],[-6.96705,55.19847],[-6.59182,55.36664],[-9.93166,58.01975],[0.32957,61.43878],[2.43894,51.64531],[0.72508,50.42953],[-7.66848,49.03788],[-5.93264,51.46771],[-5.4053,53.54032],[-6.07527,54.0096],[-6.28173,54.11135],[-6.309,54.10669],[-6.31788,54.09098],[-6.33629,54.09472],[-6.33993,54.11189],[-6.3662,54.11374],[-6.36237,54.0766],[-6.37492,54.06914],[-6.37907,54.06909],[-6.37911,54.06907],[-6.37918,54.06902],[-6.39105,54.05885],[-6.41198,54.06306],[-6.44345,54.05649],[-6.45607,54.07252],[-6.47779,54.07709],[-6.4713,54.0663],[-6.51051,54.05268],[-6.53187,54.05968],[-6.55772,54.04917],[-6.58643,54.05757],[-6.59499,54.04462],[-6.62381,54.03646],[-6.66426,54.06917],[-6.66202,54.09283],[-6.64506,54.096],[-6.66127,54.12266],[-6.64886,54.12138],[-6.63961,54.13187],[-6.63436,54.16317],[-6.66539,54.19316],[-6.70601,54.20005],[-6.72106,54.18197],[-6.74076,54.18192],[-6.75617,54.19926],[-6.77562,54.19895],[-6.80097,54.21317],[-6.80042,54.2211],[-6.81617,54.22302],[-6.82774,54.26149],[-6.87804,54.27924],[-6.87229,54.28794],[-6.859,54.28191],[-6.85087,54.29728],[-6.87594,54.34641],[-6.90626,54.3503],[-6.91129,54.37474],[-6.93074,54.37575],[-6.9237,54.38284],[-6.95963,54.39221],[-6.98165,54.40946],[-6.99601,54.40538],[-7.0291,54.42137],[-7.05724,54.41108],[-7.07234,54.38839],[-7.10979,54.36824],[-7.10388,54.35574],[-7.15344,54.33501],[-7.18882,54.33765],[-7.17974,54.32046],[-7.17949,54.30924],[-7.19789,54.31106],[-7.21219,54.29962],[-7.17302,54.28613],[-7.17937,54.2726],[-7.16092,54.27371],[-7.14225,54.25559],[-7.15893,54.24396],[-7.14594,54.23957],[-7.14503,54.22473],[-7.17104,54.2176],[-7.18808,54.22492],[-7.1986,54.21578],[-7.22085,54.21581],[-7.23182,54.20557],[-7.24806,54.20446],[-7.24915,54.19817],[-7.233,54.19784],[-7.25942,54.19225],[-7.25828,54.17737],[-7.24028,54.1697],[-7.25812,54.16451],[-7.26296,54.13741],[-7.29195,54.11911],[-7.30891,54.13211],[-7.28551,54.13626],[-7.30149,54.14421],[-7.28379,54.15386],[-7.27997,54.16797],[-7.2913,54.17196],[-7.33956,54.14672],[-7.30533,54.12336],[-7.31867,54.11329],[-7.32713,54.12458],[-7.34602,54.11645],[-7.3632,54.1316],[-7.39181,54.12013],[-7.37279,54.13963],[-7.42078,54.13705],[-7.40959,54.15646],[-7.44192,54.15409],[-7.46841,54.14081],[-7.47919,54.12227],[-7.5281,54.13574],[-7.54738,54.12214],[-7.56576,54.12659],[-7.57454,54.14151],[-7.61043,54.14378],[-7.62966,54.1703],[-7.66425,54.18797],[-7.67659,54.18196],[-7.68829,54.20197],[-7.68543,54.20776],[-7.7394,54.20353],[-7.74858,54.20942],[-7.80368,54.20707],[-7.81173,54.20073],[-7.86017,54.21728],[-7.86046,54.26026],[-7.87322,54.27945],[-7.86187,54.29343],[-7.88087,54.29188],[-7.9017,54.30143],[-7.91095,54.29595],[-7.9616,54.31247],[-8.00093,54.35846],[-8.03129,54.35671],[-8.05733,54.36572],[-8.08416,54.39741],[-8.16026,54.44028],[-8.14291,54.45092],[-8.17751,54.46476],[-8.11467,54.46903],[-8.11324,54.4764],[-8.09148,54.47653],[-8.09868,54.48433],[-8.08933,54.48708],[-8.04265,54.48763],[-8.04185,54.50638],[-8.00601,54.54594],[-7.9703,54.54705],[-7.94973,54.53363],[-7.85055,54.53313],[-7.82402,54.54427],[-7.83325,54.55223],[-7.79659,54.57163],[-7.79341,54.58188],[-7.76212,54.58588],[-7.75151,54.59878],[-7.69725,54.61007],[-7.70877,54.63495],[-7.74165,54.61797],[-7.75797,54.62503],[-7.77236,54.62149],[-7.81366,54.64411],[-7.82828,54.63305],[-7.85213,54.63078],[-7.85669,54.65057],[-7.89164,54.65594],[-7.9099,54.66828],[-7.91381,54.67596],[-7.89766,54.68701],[-7.92089,54.69596],[-7.91804,54.70282],[-7.8796,54.70269],[-7.83665,54.73642],[-7.81761,54.73378],[-7.8047,54.7186],[-7.78875,54.71964],[-7.75006,54.70428],[-7.73551,54.71683],[-7.7116,54.72611],[-7.69723,54.72356],[-7.63657,54.75151],[-7.60944,54.74415],[-7.59117,54.74438],[-7.57919,54.75047],[-7.57865,54.74191],[-7.5698,54.74384],[-7.54826,54.74101],[-7.53859,54.751],[-7.54804,54.75711],[-7.54795,54.78835],[-7.52847,54.80757],[-7.47096,54.8348],[-7.44188,54.87561],[-7.45258,54.89849],[-7.44727,54.93524],[-7.39202,54.94545],[-7.4072,54.95521],[-7.4027,54.96689],[-7.40705,54.98294],[-7.39135,54.99774],[-7.40558,55.00332],[-7.37023,55.03476],[-7.34516,55.05083],[-7.31828,55.04507],[-7.29947,55.0561],[-7.28944,55.04771],[-7.27251,55.06357],[-7.24863,55.06999]]]}},canada_full:{type:"Feature",id:"canada_full",properties:{},geometry:{type:"Polygon",coordinates:[[[-140.99854,69.64945],[-120.9375,78.7335],[-91.05469,82.7432],[-75.58594,83.40004],[-63.45703,83.15311],[-59.32617,82.37915],[-63.76465,81.42049],[-67.19238,80.79583],[-73.21289,78.85307],[-74.9707,76.33114],[-61.34766,70.75797],[-50.1416,46.67959],[-65.98389,42.85181],[-66.95892,44.48769],[-66.9397,44.81692],[-67.13745,45.15493],[-67.26379,45.18591],[-67.31873,45.1278],[-67.43958,45.21881],[-67.44507,45.58329],[-67.79114,45.67164],[-67.78015,47.07012],[-68.19763,47.35743],[-68.39539,47.35743],[-68.37891,47.29413],[-68.90625,47.17478],[-69.06006,47.23449],[-69.08203,47.43552],[-69.22485,47.46524],[-70.00488,46.70974],[-70.05981,46.41514],[-70.18066,46.36209],[-70.3125,46.21025],[-70.24658,46.14178],[-70.3125,45.97406],[-70.26855,45.91294],[-70.42236,45.80583],[-70.42236,45.72152],[-70.71899,45.49865],[-70.62012,45.38302],[-70.80688,45.4293],[-70.85083,45.22848],[-71.00464,45.3367],[-71.1145,45.25169],[-71.26831,45.29035],[-71.41113,45.24395],[-71.5155,45.0153],[-74.81689,45.0153],[-75.31128,44.84808],[-75.7782,44.51218],[-75.82214,44.4377],[-76.43188,44.09942],[-76.79993,43.63011],[-78.68683,43.63806],[-79.19495,43.45292],[-79.07204,43.26521],[-79.05693,43.25671],[-79.04594,43.13807],[-79.06998,43.12103],[-79.06311,43.11652],[-79.05693,43.10951],[-79.07616,43.08393],[-79.07684,43.07691],[-79.01505,43.06839],[-78.99719,43.05785],[-79.02672,43.02071],[-79.01779,42.98456],[-78.98003,42.97099],[-78.96423,42.95843],[-78.93402,42.95542],[-78.91136,42.93883],[-78.90518,42.90011],[-78.93127,42.82361],[-80.07935,42.38289],[-81.27686,42.20818],[-82.39197,41.68112],[-82.68311,41.67701],[-83.07861,41.86547],[-83.15552,42.03909],[-83.12531,42.12064],[-83.13904,42.23462],[-83.07587,42.31185],[-82.98523,42.33418],[-82.81219,42.37478],[-82.63916,42.56117],[-82.59521,42.54903],[-82.52655,42.61375],[-82.41669,43.00063],[-82.13379,43.59631],[-82.51831,45.34442],[-83.59772,45.82114],[-83.43567,45.99696],[-83.57162,46.10847],[-83.65402,46.12275],[-83.76663,46.10466],[-83.82843,46.11989],[-83.89984,46.06084],[-83.95615,46.05989],[-83.974,46.1018],[-84.00833,46.11609],[-84.00696,46.14559],[-84.07974,46.18934],[-84.10995,46.24065],[-84.0976,46.25585],[-84.11545,46.26724],[-84.12094,46.31564],[-84.10309,46.32038],[-84.13467,46.36115],[-84.14841,46.42082],[-84.10995,46.50359],[-84.12781,46.531],[-84.14085,46.53241],[-84.17313,46.52722],[-84.19373,46.54092],[-84.226,46.53525],[-84.26582,46.49603],[-84.2926,46.49225],[-84.34135,46.50595],[-84.37225,46.50879],[-84.44023,46.49036],[-84.47662,46.45489],[-84.55353,46.45867],[-84.76776,46.62492],[-84.84741,46.88272],[-88.38501,48.31243],[-89.32983,47.96786],[-93.21899,48.64743],[-93.80127,48.5166],[-93.83423,48.63291],[-94.6637,48.75257],[-94.8175,49.32691],[-95.15259,49.38595],[-95.15533,49.00184],[-123.31879,49.00004],[-122.99469,48.7761],[-123.2666,48.69096],[-123.11279,48.37815],[-123.44238,48.22467],[-124.7168,48.49477],[-128.49609,48.74895],[-131.2207,53.61858],[-130.75928,54.73731],[-129.99023,55.27912],[-130.07813,56.10881],[-131.74805,56.63206],[-135.53833,59.80063],[-137.47192,58.90465],[-138.67493,59.78958],[-138.6969,59.90822],[-139.20227,60.09772],[-139.08142,60.35141],[-139.71863,60.33239],[-139.98779,60.18523],[-140.46021,60.30791],[-140.52063,60.22618],[-141.01501,60.30519],[-140.99854,69.64945]]]}},ottawa_gatineau:{type:"Feature",id:"ottawa_gatineau",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.23413,45.50827],[-76.12839,45.55829],[-75.26184,45.58041],[-75.13412,45.39652],[-75.42938,45.32512],[-75.35385,45.17816],[-75.82489,44.93564],[-76.34537,45.36855],[-76.23413,45.50827]]]}},vancouver_metro:{type:"Feature",id:"vancouver_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.32,49],[-123.45,49.38],[-123.26,49.47],[-122.24,49.27],[-122.2,49],[-123.32,49]]]}},cuba:{type:"Feature",id:"cuba",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.5,21.75],[-83.5,23.5],[-80,23.5],[-73.5,20.4],[-74.5,19.5],[-78,19.5],[-85.5,21.75]]]}},nicaragua:{type:"Feature",id:"nicaragua",properties:{},geometry:{type:"Polygon",coordinates:[[[-88,13],[-87.56104,13.13298],[-87.36877,12.99921],[-86.97876,13.02597],[-86.88538,13.28272],[-86.7041,13.29876],[-86.77002,13.76873],[-86.31409,13.77407],[-86.1438,14.046],[-86.01746,14.05133],[-85.75378,13.89141],[-85.16602,14.31761],[-84.96277,14.80144],[-84.4574,14.63674],[-83.39722,15.03499],[-82.5,14.9],[-82.8,12],[-83.676,10.95],[-83.66,10.8],[-83.92,10.7],[-84.688,11.076],[-84.91,10.945],[-85.615,11.215],[-85.7,11.06],[-86,11.06],[-88,13]]]}},boston_metro:{type:"Feature",id:"boston_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-70.5,41.91],[-71,41.91],[-71.42,42.05],[-71.57,42.18],[-71.64,42.4],[-71.57,42.52],[-71.35,42.64],[-71.1,42.7],[-70.5,42.7],[-70.5,41.91]]]}},central_pa:{type:"Feature",id:"central_pa",properties:{},geometry:{type:"Polygon",coordinates:[[[-78.7,41.5],[-77,41.5],[-76,40],[-76,39.72],[-79.3,39.72],[-78.7,41.5]]]}},chattanooga:{type:"Feature",id:"chattanooga",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.634,34.743],[-85.634,35.282],[-84.933,35.282],[-84.933,34.743],[-85.634,34.743]]]}},cleveland:{type:"Feature",id:"cleveland",properties:{},geometry:{type:"Polygon",coordinates:[[[-82.5,41.5],[-80.95,42],[-80.95,41],[-82.5,41],[-82.5,41.5]]]}},colorado:{type:"Feature",id:"colorado",properties:{},geometry:{type:"Polygon",coordinates:[[[-109.05,37],[-109.05,41],[-102.05,41],[-102.05,37],[-109.05,37]]]}},dc_metro:{type:"Feature",id:"dc_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.04437,38.70266],[-77.27783,38.69409],[-77.57172,38.91668],[-77.61017,39.1258],[-77.27509,39.21523],[-77.08694,39.21204],[-76.87546,39.05119],[-76.69968,38.97863],[-76.71066,38.77657],[-76.84662,38.7048],[-77.04437,38.70266]]]}},dfw_metro:{type:"Feature",id:"dfw_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-97.75,32.25],[-97.75,33.4],[-96,33.4],[-96,32.25],[-97.75,32.25]]]}},grand_junction_co:{type:"Feature",id:"grand_junction_co",properties:{},geometry:{type:"Polygon",coordinates:[[[-109,39.4],[-108.1,39.4],[-107.8,39.16],[-107.8,38.7],[-108.1,38.5],[-109,39],[-109,39.4]]]}},la_metro:{type:"Feature",id:"la_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-118.5,33.7],[-118.68,34.23],[-118.5,34.35],[-118,34.2],[-117.3,34.2],[-117.2,34.1],[-117.37,33.9],[-117.74,33.5],[-118.5,33.7]]]}},minneapolis_st_paul_metro:{type:"Feature",id:"minneapolis_st_paul_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-93.801,44.578],[-93.801,45.348],[-92.666,45.348],[-92.666,44.578],[-93.801,44.578]]]}},mt_vernon_wa:{type:"Feature",id:"mt_vernon_wa",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.3,49],[-122,49],[-122,48],[-123.2,48.4],[-123.3,49]]]}},nyc_metro:{type:"Feature",id:"nyc_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.73,40.64],[-73.95,41.38],[-73.6,40.95],[-73.25,41],[-73.25,40.6],[-74.43,40.43],[-74.73,40.64]]]}},philly_metro:{type:"Feature",id:"philly_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.7,40.3],[-75.3,40.4],[-74.7,40.3],[-74.45,40.1],[-74.9,39.55],[-75.5,39.55],[-75.8,39.7218],[-76.23,39.7211],[-75.7,40.3]]]}},phoenix:{type:"Feature",id:"phoenix",properties:{},geometry:{type:"Polygon",coordinates:[[[-113,32.7],[-113,34],[-111.1,34],[-111.1,32.7],[-113,32.7]]]}},portland_me:{type:"Feature",id:"portland_me",properties:{},geometry:{type:"Polygon",coordinates:[[[-70.5,42.9],[-71,43.3],[-71,44.2],[-69.6,44.5],[-69,44],[-70.5,42.9]]]}},portland_or:{type:"Feature",id:"portland_or",properties:{},geometry:{type:"Polygon",coordinates:[[[-124.4,44.8],[-124.4,46.3],[-121.5,46.3],[-121.5,44.8],[-124.4,44.8]]]}},salt_lake_city:{type:"Feature",id:"salt_lake_city",properties:{},geometry:{type:"Polygon",coordinates:[[[-112.6,40.75],[-112.3,41.4],[-111.5,41.4],[-111.1,40.3],[-112,39.75],[-112.6,40.75]]]}},seattle:{type:"Feature",id:"seattle",properties:{},geometry:{type:"Polygon",coordinates:[[[-122.15,47.26],[-122.33,47.26],[-122.54,47.33],[-122.52,47.46],[-122.45,47.55],[-122.45,47.8],[-121.2,47.8],[-121.43,47.38],[-121.43,47.14],[-121.94,47.14],[-122,47.17],[-122,47.17],[-122.1,47.19],[-122.15,47.26]]]}},sf_bay_area:{type:"Feature",id:"sf_bay_area",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.5,38.5],[-122.8,38.8],[-121.7,38.2],[-121.5,36.9],[-123,36.9],[-123.5,38.5]]]}},south_sf_bay_area:{type:"Feature",id:"south_sf_bay_area",properties:{},geometry:{type:"Polygon",coordinates:[[[-121.4566,37.48249],[-121.21628,37.17673],[-121.20529,36.95757],[-121.49368,36.95757],[-121.5596,36.8928],[-121.98257,37.12419],[-122.27234,37.39635],[-122.13501,37.48903],[-121.4566,37.48249]]]}},st_louis:{type:"Feature",id:"st_louis",properties:{},geometry:{type:"Polygon",coordinates:[[[-90.28,39.1],[-89.57,39.05],[-89.57,38.18],[-90.58,38],[-91.37,38.2],[-91.37,38.75],[-90.28,39.1]]]}},tampa_bay:{type:"Feature",id:"tampa_bay",properties:{},geometry:{type:"Polygon",coordinates:[[[-83,28.2],[-82.2,28.2],[-82.2,27.55],[-83,27.55],[-83,28.2]]]}},usa_full:{type:"Feature",id:"usa_full",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-124.76179,48.41301],[-123.22752,48.18499],[-123.32289,49.00429],[-96.01312,49.00605],[-95.11054,49.412],[-93.99811,49.00671],[-89.43531,47.98378],[-88.34922,48.29633],[-87.50645,48.01427],[-83.2814,46.13885],[-82.17616,43.58854],[-82.66248,41.68895],[-79.00601,42.80053],[-79.15798,43.44626],[-78.76239,43.62496],[-76.90231,43.80246],[-75.07988,44.98029],[-72.02225,45.00598],[-71.41227,45.25488],[-70.46149,46.21766],[-69.25051,47.51223],[-67.75966,47.099],[-66.94528,44.71049],[-69.84893,43.26199],[-69.87974,40.99205],[-72.00202,40.99125],[-74.02112,39.57279],[-75.41474,35.05319],[-80.02453,32.01613],[-79.89011,26.85507],[-80.02,24.0071],[-84.01601,24.00527],[-84.01656,25.01258],[-81.99666,25.01349],[-81.9972,25.98268],[-84.01879,28.99618],[-86.02775,30.00475],[-88.01625,30.00389],[-88.01567,28.99443],[-90.90285,28.85645],[-93.74053,29.47421],[-95.55633,28.58761],[-96.80617,27.79782],[-96.95553,25.98216],[-97.43502,25.8266],[-98.01091,25.9928],[-99.23511,26.4476],[-100.00624,28.00822],[-101.25529,29.48105],[-102.1514,29.74757],[-102.71736,29.39206],[-103.25189,28.89087],[-104.58819,29.69979],[-105.02053,30.5361],[-106.20525,31.4467],[-106.28689,31.56133],[-106.42932,31.75206],[-106.48421,31.74645],[-106.53072,31.78209],[-108.18711,31.77551],[-108.19927,31.326],[-111.00893,31.33601],[-114.86123,32.47999],[-117.67593,32.46302],[-119.97759,33.00641],[-122.53697,36.85661],[-124.99343,40.05576],[-124.60595,45.90245],[-124.76179,48.41301]]],[[[-160.57876,22.50629],[-159.00937,22.50702],[-157.50474,21.9985],[-156.29276,21.22259],[-154.68902,19.88057],[-154.62178,18.7587],[-155.99619,18.77902],[-157.50832,20.9958],[-158.74706,21.24398],[-160.57822,21.49846],[-160.57876,22.50629]]],[[[-167.1572,68.722],[-164.9717,68.9947],[-163.0218,69.9707],[-160.4136,70.7398],[-156.1769,71.5633],[-140.9684,69.9535],[-140.9874,61.0119],[-139.1716,60.4127],[-138.0072,59.9918],[-135.123,59.7566],[-131.9759,56.9995],[-130.0071,57.0001],[-130.0044,54.0043],[-133.9948,54.0032],[-138.515,57.9986],[-138.516,58.9953],[-151.5013,58.992],[-151.5003,57.9988],[-151.9963,55.9992],[-158.0191,55.0028],[-159.0076,55.0025],[-162.4025,53.9567],[-171.4689,51.8215],[-177.9993,51.2554],[-178.0001,52.2446],[-173.8197,59.7401],[-172.5143,63.8767],[-169.0075,64.9988],[-169.0087,66.0015],[-168.0022,66.0018],[-164.8554,67.0255],[-167.1572,68.722]]],[[[-68.2,17.8],[-67.9,18.67],[-65.33,18.57],[-64.64,18.36],[-64.32,17.38],[-68.2,17.8]]],[[[146.2,15.4],[144.8,12.9],[144.2,13.2],[145.7,15.6],[146.2,15.4]]],[[[180,52.2],[180,51],[172,52.5],[172,53.5],[180,52.2]]]]}},wyoming:{type:"Feature",id:"wyoming",properties:{},geometry:{type:"Polygon",coordinates:[[[-111.05,41],[-111.05,45],[-104.05,45],[-104.05,41],[-111.05,41]]]}},australia_full:{type:"Feature",id:"australia_full",properties:{},geometry:{type:"Polygon",coordinates:[[[146.07422,-44.43378],[131.66016,-44.65302],[124.54102,-41.44273],[116.45508,-39.36828],[108.80859,-39.16414],[103.18359,-27.60567],[95.27344,-24.04646],[96.30615,-11.15685],[106.25977,-9.92557],[116.47705,-13.98738],[122.77222,-11.65224],[126.43066,-11.48002],[129.26514,-9.92557],[134.89014,-9.92557],[139.46045,-10.14193],[141.55334,-9.99861],[141.7868,-9.77132],[142.229,-9.67115],[142.72614,-9.552],[143.30017,-9.39216],[144.24774,-9.24851],[144.44824,-9.59533],[149.5459,-12.68321],[154.90723,-18.02053],[156.42334,-21.55528],[158.02734,-24.68695],[160.0708,-26.03704],[167.34375,-26.6671],[170.354,-29.11378],[168.2666,-30.63791],[160.15869,-34.03445],[152.18262,-38.41056],[149.94141,-43.51669],[146.07422,-44.43378]]]}},argentina:{type:"Feature",id:"argentina",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.14602,-49.18818],[-72.91615,-48.93261],[-72.53201,-48.80072],[-72.58755,-48.48542],[-72.22624,-48.32339],[-72.49784,-47.96155],[-72.33315,-47.44938],[-71.86801,-47.23376],[-71.94851,-46.80983],[-71.64665,-46.68783],[-71.79939,-46.19141],[-71.6147,-45.97522],[-71.79762,-45.62288],[-71.46813,-45.4921],[-71.32472,-45.306],[-71.56043,-44.97863],[-72.04094,-44.90019],[-72.07396,-44.78023],[-71.46969,-44.73753],[-71.23704,-44.79082],[-71.13226,-44.4711],[-71.36469,-44.38958],[-71.80731,-44.42036],[-71.84736,-44.11002],[-71.64902,-43.94552],[-71.75129,-43.78527],[-71.60784,-43.62836],[-71.93082,-43.45685],[-71.76157,-43.1645],[-72.14281,-42.8979],[-72.1812,-42.69735],[-72.023,-42.41766],[-72.17288,-42.14043],[-71.72931,-42.12447],[-71.91021,-41.34113],[-71.8196,-41.06038],[-71.96387,-40.71955],[-71.8414,-40.4521],[-71.65704,-40.36426],[-71.82818,-40.20778],[-71.59266,-39.90123],[-71.67811,-39.56486],[-71.39497,-39.34179],[-71.42542,-38.92164],[-70.92524,-38.76298],[-70.84044,-38.54138],[-70.97623,-38.44222],[-70.98292,-38.10477],[-71.21191,-37.68901],[-71.11983,-37.4585],[-71.21555,-37.27261],[-71.09237,-37.11444],[-71.11982,-36.69792],[-71.03513,-36.47333],[-70.71285,-36.42687],[-70.70501,-36.27229],[-70.42451,-36.15581],[-70.38755,-35.60868],[-70.43201,-35.31842],[-70.58358,-35.27831],[-70.36203,-35.13645],[-70.21683,-34.61145],[-70.01089,-34.41389],[-70.03094,-34.28805],[-69.79507,-34.24304],[-69.90417,-33.77143],[-69.7705,-33.3611],[-70.00282,-33.32294],[-70.08089,-33.02919],[-70.00121,-32.8846],[-70.17038,-32.62555],[-70.14899,-32.46585],[-70.31918,-32.27335],[-70.35277,-32.0257],[-70.2106,-31.95769],[-70.46072,-31.84116],[-70.56691,-31.60016],[-70.49734,-31.12216],[-70.40805,-31.16633],[-70.23998,-30.61575],[-70.11719,-30.43102],[-69.89853,-30.35557],[-69.87492,-29.7043],[-70.01808,-29.38321],[-69.78724,-29.13008],[-69.68114,-28.47172],[-69.45679,-28.18357],[-69.17254,-27.97088],[-68.94231,-27.52325],[-68.8412,-27.15464],[-68.29854,-27.0389],[-68.2638,-26.91623],[-68.58734,-26.49294],[-68.55754,-26.2871],[-68.38108,-26.17822],[-68.57599,-25.42894],[-68.4999,-25.16149],[-68.34279,-25.1124],[-68.56789,-24.79739],[-68.26201,-24.40457],[-67.32231,-24.0344],[-66.99052,-23.00044],[-67.18066,-22.8138],[-67.02827,-22.54089],[-66.78247,-22.43778],[-66.73899,-22.23893],[-66.28793,-22.08605],[-66.24277,-21.79408],[-66.07589,-21.83493],[-65.74764,-22.10912],[-64.99322,-22.08239],[-64.53579,-22.29137],[-64.29933,-22.86509],[-64.24332,-22.56039],[-63.93139,-22],[-62.80617,-22],[-62.7913,-22.16193],[-62.3009,-22.48659],[-62.20671,-22.70418],[-61.73612,-23.23432],[-61.08824,-23.61393],[-60.9899,-23.81808],[-60.37353,-24.024],[-60.03941,-24.01156],[-59.47554,-24.33261],[-59.35397,-24.47821],[-58.67243,-24.83192],[-58.24167,-24.92801],[-57.76089,-25.17193],[-57.555,-25.4484],[-57.74064,-25.65045],[-57.89112,-25.9662],[-58.08473,-26.11185],[-58.22103,-26.41403],[-58.18996,-26.64518],[-58.31991,-26.85821],[-58.64913,-27.12662],[-58.59905,-27.29984],[-57.87482,-27.27527],[-57.48754,-27.44418],[-56.96564,-27.50202],[-56.84926,-27.6063],[-56.60117,-27.42102],[-56.3749,-27.58903],[-56.29432,-27.42003],[-56.06276,-27.306],[-55.73692,-27.44516],[-55.6057,-27.16241],[-55.42284,-26.99528],[-54.78695,-26.63111],[-54.61874,-26.20893],[-54.67933,-25.99524],[-54.65698,-25.67619],[-54.5842,-25.58952],[-54.4812,-25.62543],[-54.108,-25.495],[-53.86217,-25.65902],[-53.83619,-25.97166],[-53.6411,-26.21559],[-53.73094,-26.5097],[-53.67249,-26.91252],[-53.84355,-27.16453],[-53.959,-27.15804],[-54.21736,-27.38603],[-54.673,-27.57],[-54.814,-27.533],[-54.936,-27.772],[-55.38728,-27.98524],[-55.76677,-28.23982],[-55.69902,-28.42637],[-55.88091,-28.4715],[-56.29651,-28.80272],[-56.42475,-29.07897],[-56.59315,-29.12516],[-56.70164,-29.35913],[-57.328,-29.972],[-57.64923,-30.20184],[-57.63687,-30.33197],[-57.85924,-30.47701],[-57.8096,-30.91332],[-58.08141,-31.45457],[-57.98082,-31.58691],[-58.20653,-31.86773],[-58.10645,-32.24002],[-58.20464,-32.46055],[-58.0841,-32.99782],[-58.36693,-33.12177],[-58.49375,-33.57857],[-58.29507,-34.17809],[-57.9345,-34.4519],[-55.9,-35.6],[-57,-39],[-61,-41],[-63.5,-55],[-66.67094,-55.11906],[-67.27285,-54.90511],[-67.95071,-54.87373],[-68.60967,-54.91369],[-68.60676,-52.65902],[-68.41869,-52.3325],[-69.19014,-52.15044],[-69.48632,-52.15165],[-69.9955,-52.00074],[-71.92259,-51.99991],[-72.29907,-51.69791],[-72.28621,-50.65987],[-72.72636,-50.61667],[-73.06995,-50.78909],[-73.32848,-50.5716],[-73.52199,-50.15397],[-73.44481,-49.79226],[-73.53933,-49.49825],[-73.47299,-49.20464],[-73.14602,-49.18818]]]}},bolivia:{type:"Feature",id:"bolivia",properties:{},geometry:{type:"Polygon",coordinates:[[[-60.17487,-16.26675],[-58.32092,-16.31948],[-58.47336,-16.74472],[-58.39371,-17.18081],[-57.79152,-17.55501],[-57.71187,-17.73103],[-57.55463,-18.22348],[-57.72079,-18.89914],[-57.70775,-19.0381],[-58.11768,-19.75313],[-57.85675,-19.96754],[-58.15338,-20.15201],[-58.17535,-19.83066],[-59.07074,-19.28846],[-59.97025,-19.29494],[-61.78848,-19.65358],[-62.57401,-21.99972],[-63.93082,-22.00736],[-64.24942,-22.60957],[-64.31808,-22.8806],[-64.56528,-22.36595],[-64.62021,-22.21856],[-64.99649,-22.08628],[-65.77446,-22.10027],[-65.92552,-21.93222],[-66.04774,-21.91884],[-66.04225,-21.86022],[-66.2273,-21.78437],[-66.3121,-22.1219],[-66.74057,-22.23635],[-66.7955,-22.44213],[-67.18002,-22.81353],[-67.56351,-22.90085],[-67.81174,-22.87934],[-68.17566,-21.3252],[-68.405,-20.9499],[-68.54095,-20.92681],[-68.55606,-20.7285],[-68.43796,-20.63857],[-68.74557,-20.46369],[-68.72772,-20.08173],[-68.56293,-20.05077],[-68.53134,-19.85779],[-68.69064,-19.74667],[-68.41873,-19.41544],[-68.9296,-18.97448],[-69.12186,-18.14128],[-69.46793,-17.50852],[-69.46793,-17.37489],[-69.63547,-17.27787],[-69.01199,-16.66053],[-69.03877,-16.58487],[-68.93509,-16.2061],[-69.16718,-16.22259],[-69.40201,-15.62634],[-69.13422,-15.23516],[-69.35806,-14.96933],[-68.97903,-14.21979],[-68.87466,-12.88745],[-68.65768,-12.49088],[-69.57264,-10.94456],[-68.74806,-11.00835],[-68.75167,-11.01762],[-68.75201,-11.03716],[-68.76592,-11.04963],[-68.70815,-11.14253],[-68.54576,-11.11036],[-68.24295,-10.95872],[-68.08502,-10.69165],[-67.86736,-10.64036],[-67.71629,-10.71459],[-67.6775,-10.60341],[-67.65947,-10.61792],[-67.58446,-10.50402],[-67.43614,-10.44966],[-67.40593,-10.38314],[-67.31461,-10.37774],[-67.32216,-10.32438],[-67.1953,-10.32277],[-67.18869,-10.33983],[-67.17093,-10.33814],[-66.57921,-9.90392],[-65.86441,-9.75981],[-65.56503,-9.82477],[-65.44968,-9.67318],[-65.29449,-9.85589],[-65.39474,-10.54722],[-65.35629,-10.78474],[-65.2684,-10.88658],[-65.29861,-11.32656],[-65.14481,-11.70939],[-64.36752,-12.4587],[-63.67538,-12.46675],[-61.64841,-13.53453],[-61.06339,-13.52919],[-60.4303,-13.88608],[-60.23804,-15.09864],[-60.57312,-15.09599],[-60.24353,-15.47221],[-60.17487,-16.26675]]]}},bahia:{id:"bahia",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-46.26343,-11.52309],[-46.40625,-11.53923],[-46.51062,-11.50425],[-46.604,-11.3481],[-46.61224,-11.25653],[-46.46668,-11.1811],[-46.42822,-11.02208],[-46.32935,-10.9331],[-46.19751,-10.65521],[-45.84045,-10.47701],[-45.82672,-10.35275],[-45.74707,-10.34194],[-45.70038,-10.26087],[-45.72784,-10.15815],[-45.59326,-10.09326],[-45.41199,-10.43379],[-45.45593,-10.55262],[-45.37903,-10.72538],[-45.15381,-10.8387],[-44.90112,-10.90883],[-44.60999,-10.66601],[-44.34631,-10.54182],[-44.13757,-10.63362],[-44.05518,-10.39057],[-43.96179,-10.42839],[-43.78601,-10.15275],[-43.69263,-10.03918],[-43.69812,-9.95262],[-43.64868,-9.82274],[-43.76404,-9.76861],[-43.8794,-9.54117],[-43.68713,-9.41655],[-43.4729,-9.24851],[-43.3081,-9.37861],[-43.04443,-9.36235],[-42.8302,-9.60617],[-42.33581,-9.31899],[-41.90735,-9.23767],[-41.7865,-9.09125],[-41.40198,-8.71136],[-41.14929,-8.70593],[-41.03943,-8.83351],[-41.01471,-8.82808],[-40.92407,-8.83894],[-40.8197,-9.07226],[-40.68237,-9.14277],[-40.66864,-9.26478],[-40.7428,-9.30002],[-40.75653,-9.42197],[-40.62744,-9.47615],[-40.53131,-9.41384],[-40.47363,-9.39758],[-40.42694,-9.34338],[-40.36102,-9.37319],[-40.29785,-9.09396],[-40.23468,-9.04243],[-40.14679,-9.10481],[-40.07813,-9.05057],[-39.98749,-9.05599],[-39.8996,-8.95833],[-39.90509,-8.82808],[-39.68262,-8.77923],[-39.70459,-8.67063],[-39.65241,-8.65977],[-39.41345,-8.50769],[-39.2926,-8.54843],[-39.23492,-8.6299],[-38.96576,-8.76837],[-38.86963,-8.76837],[-38.71307,-8.83622],[-38.68835,-8.90678],[-38.66913,-8.98275],[-38.61694,-8.96376],[-38.60596,-8.86065],[-38.5675,-8.81723],[-38.47687,-8.84708],[-38.50983,-8.94205],[-38.42194,-9.037],[-38.33679,-8.97461],[-38.28461,-9.00716],[-38.31757,-9.06684],[-38.21045,-9.36235],[-38.04565,-9.4599],[-38.02368,-9.8498],[-37.89185,-9.96885],[-37.74902,-10.31492],[-37.8479,-10.37977],[-37.78198,-10.64981],[-37.93579,-10.73617],[-38.13354,-10.6822],[-38.26538,-10.79014],[-38.02368,-11.31848],[-37.73804,-11.57691],[-37.3645,-11.48002],[-38.50159,-18.11975],[-39.65515,-18.35453],[-40.25391,-17.96828],[-40.23193,-17.79053],[-40.61646,-17.38209],[-40.51758,-16.89917],[-40.13306,-16.45716],[-39.90234,-16.04581],[-40.68237,-15.68651],[-41.08887,-15.73939],[-41.35254,-15.73939],[-41.37451,-15.49603],[-41.80298,-15.09334],[-42.04468,-15.18878],[-43.24219,-14.67925],[-43.50586,-14.78551],[-43.92334,-14.63674],[-43.7915,-14.31761],[-44.35181,-14.24309],[-44.65942,-14.38148],[-45.78003,-15.13576],[-46.10962,-15.29478],[-46.06567,-14.87047],[-45.92285,-14.38148],[-46.24146,-14.14723],[-46.32935,-13.11158],[-46.38428,-12.02858],[-46.26343,-11.52309]]]}},brazil:{type:"Feature",id:"brazil",properties:{},geometry:{type:"Polygon",coordinates:[[[-51.56433,4.29711],[-28.4491,1.04914],[-37.67761,-21.04862],[-52.94861,-34.05721],[-53.56384,-33.71063],[-53.58581,-33.23409],[-53.16833,-32.81036],[-54.11316,-32.08723],[-55.73914,-30.85036],[-56.11267,-31.18931],[-56.11267,-30.90694],[-57.0575,-30.14988],[-57.23328,-30.32073],[-57.73865,-30.26381],[-55.98083,-28.5411],[-54.94812,-27.68839],[-53.80554,-27.18136],[-53.7616,-26.73089],[-53.87146,-26.00249],[-54.20105,-25.88394],[-54.6405,-25.88394],[-54.28894,-24.13171],[-55.43701,-24.18685],[-55.87647,-22.3704],[-58.07373,-22.08564],[-58.24402,-20.06109],[-57.71668,-17.98396],[-58.43628,-17.18278],[-58.50769,-16.38866],[-60.1831,-16.29905],[-60.26001,-15.14637],[-60.49072,-14.09396],[-60.94116,-13.63531],[-61.85303,-13.5926],[-63.58887,-12.56529],[-64.22058,-12.55992],[-65.20386,-11.8996],[-65.4126,-9.74154],[-66.82983,-10.1203],[-68.17566,-10.92501],[-70.6366,-11.18379],[-70.6366,-9.62783],[-71.42761,-9.97426],[-72.74597,-9.88769],[-73.97644,-7.10634],[-72.70752,-4.67498],[-70.15869,-4.23686],[-69.67529,-1.03266],[-70.19714,1.75205],[-67.56042,1.83989],[-66.94519,0.69761],[-63.78113,1.83989],[-64.84131,4.36832],[-63.25378,3.59566],[-60.24353,5.20584],[-60.03479,4.98698],[-59.57886,3.81493],[-59.89746,3.26118],[-60.05676,2.76199],[-59.9469,2.2626],[-59.77661,2.23515],[-59.77661,1.75754],[-58.64502,1.55987],[-55.87647,2.61384],[-53.10791,2.35041],[-51.56433,4.29711]]]}},df_br:{id:"df_br",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-48.20114,-15.49868],[-47.42111,-15.5],[-47.38953,-15.56484],[-47.32361,-15.58865],[-47.33047,-15.63891],[-47.31125,-15.73278],[-47.36755,-15.83189],[-47.3703,-15.927],[-47.36893,-15.99698],[-47.30988,-16.04317],[-48.27805,-16.04713],[-48.24921,-15.94152],[-48.2753,-15.93096],[-48.29041,-15.83189],[-48.22998,-15.77772],[-48.21899,-15.71163],[-48.24097,-15.70898],[-48.23547,-15.66535],[-48.22449,-15.63097],[-48.20251,-15.62568],[-48.20114,-15.49868]]]}},chile:{type:"Feature",id:"chile",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-110,-28],[-110,-26],[-109,-26],[-109,-28],[-110,-28]],[[-69.46999,-17.50394],[-69.67049,-17.66692],[-69.80164,-17.65253],[-69.83047,-17.71337],[-69.82704,-17.75196],[-69.80919,-17.8023],[-69.75494,-17.98135],[-69.82018,-18.1191],[-69.86618,-18.17325],[-69.96918,-18.26065],[-70.19165,-18.33106],[-72.5,-18.3],[-78,-53],[-68,-58],[-65.80412,-55.20392],[-67.30412,-54.90395],[-68.60412,-54.90395],[-68.60412,-52.65417],[-68.42212,-52.39063],[-68.42268,-52.33665],[-68.57786,-52.32931],[-68.58833,-52.31016],[-68.84205,-52.28181],[-69.19421,-52.15445],[-69.49016,-52.15561],[-70.00412,-52.00423],[-71.92097,-52.00391],[-71.95221,-51.97896],[-72.04212,-51.96756],[-71.93324,-51.91854],[-72.03255,-51.8118],[-72.32412,-51.60426],[-72.34531,-50.65403],[-73.32687,-50.52827],[-73.51742,-49.89065],[-72.98733,-48.99351],[-72.68005,-48.89271],[-72.53174,-48.77746],[-72.56195,-48.50569],[-72.24472,-48.34986],[-72.46788,-47.7451],[-72.0504,-47.34557],[-71.87325,-47.12505],[-71.9426,-46.81204],[-71.64974,-46.68289],[-71.82037,-46.1256],[-71.64459,-46.00936],[-71.75291,-45.55168],[-71.47104,-45.49829],[-71.54383,-45.40436],[-71.3895,-45.35287],[-71.33354,-45.28286],[-71.41148,-45.19486],[-71.56494,-44.98326],[-72.03323,-44.88409],[-72.03495,-44.76989],[-71.24908,-44.80425],[-71.07056,-44.47985],[-71.81213,-44.30714],[-71.58417,-43.64303],[-71.8856,-43.45765],[-71.72596,-43.19066],[-72.14344,-42.90363],[-72.04765,-42.54322],[-72.04182,-42.40546],[-72.17194,-42.14686],[-71.73051,-42.11516],[-71.92612,-40.72332],[-71.80252,-40.42081],[-71.70639,-40.425],[-71.66794,-40.30571],[-71.77643,-40.268],[-71.39465,-38.92843],[-70.90816,-38.67251],[-71.189,-37.74167],[-71.04858,-36.49087],[-70.95932,-36.50246],[-70.37876,-36.04743],[-70.43884,-35.32549],[-70.58441,-35.27646],[-70.53875,-35.20551],[-70.3791,-35.17241],[-69.87854,-34.15614],[-69.8703,-33.57458],[-69.78207,-33.33282],[-69.86721,-33.28663],[-69.99561,-33.3268],[-70.08453,-33.03716],[-70.3125,-32.12562],[-70.22736,-31.93934],[-70.46185,-31.84548],[-70.53102,-31.3724],[-70.07904,-30.38828],[-69.88678,-30.35747],[-69.81262,-30.14869],[-69.93347,-30.10118],[-69.94308,-29.24087],[-68.78609,-27.10803],[-68.56567,-27.17525],[-68.25256,-26.96492],[-68.57666,-26.49147],[-68.5437,-26.27987],[-68.37067,-26.17639],[-68.48328,-25.15399],[-68.32397,-25.09928],[-68.5437,-24.79047],[-68.46405,-24.62829],[-68.24432,-24.39338],[-67.32216,-24.03768],[-66.98639,-23.00012],[-67.17728,-22.81416],[-67.55768,-22.89642],[-67.81586,-22.86099],[-68.19489,-21.27018],[-68.405,-20.93964],[-68.53546,-20.8524],[-68.47504,-20.64949],[-68.72772,-20.46948],[-68.73322,-20.38454],[-68.67279,-20.34591],[-68.76549,-20.08237],[-68.56842,-20.05658],[-68.52997,-19.85262],[-68.68309,-19.72793],[-68.40225,-19.41091],[-68.92548,-18.97253],[-69.11087,-18.1328],[-69.06143,-18.06231],[-69.29352,-17.96698],[-69.30931,-17.9121],[-69.30794,-17.83956],[-69.34708,-17.7343],[-69.47205,-17.61065],[-69.46999,-17.50394]]]]}},bogota:{type:"Feature",id:"bogota",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.38,4.7],[-74.17,5],[-73.75,5],[-73.9,4.37],[-74.25,4.31],[-74.38,4.7]]]}},colombia:{type:"Feature",id:"colombia",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.8,11.8],[-71.3,12.7],[-70.9,11.9],[-71.98242,11.65762],[-72.2406,11.14607],[-72.45483,11.10295],[-72.8833,10.43379],[-72.94922,9.83898],[-73.31177,9.20514],[-72.99866,9.29189],[-72.94373,9.09125],[-72.76245,9.12379],[-72.65259,8.61633],[-72.39716,8.36098],[-72.34497,8.00484],[-72.4054,8.04563],[-72.49054,7.945],[-72.4411,7.89875],[-72.45209,7.53676],[-72.43835,7.40605],[-72.18567,7.38426],[-72.14996,7.32161],[-72.18018,7.24532],[-72.03461,7.0273],[-71.12,7.02457],[-71.09528,6.98641],[-70.9964,6.98641],[-70.77942,7.09817],[-70.5542,7.07636],[-70.30701,6.93461],[-70.11475,6.98095],[-69.43016,6.10778],[-69.34914,6.13987],[-69.31,6.0873],[-69.23378,6.08047],[-69.17404,6.15011],[-69.03877,6.22384],[-68.66455,6.14055],[-67.80762,6.288],[-67.45056,6.21155],[-67.47803,6.10232],[-67.40662,6.00946],[-67.60437,5.7909],[-67.63184,5.4629],[-67.82959,5.31524],[-67.79114,4.28068],[-67.62085,3.74915],[-67.5,3.78204],[-67.29126,3.36537],[-67.86255,2.82234],[-67.58789,2.79491],[-67.1759,2.33395],[-66.85181,1.23037],[-67.08801,1.16172],[-67.16766,1.83989],[-67.34894,1.97715],[-67.36816,2.22417],[-67.44781,2.21868],[-67.56866,2.054],[-67.80487,1.98813],[-67.91199,1.81793],[-68.18939,2.01009],[-68.2663,1.85087],[-68.16193,1.73008],[-69.83459,1.71361],[-69.8291,1.08209],[-69.19739,1.06561],[-69.15344,0.62621],[-69.48303,0.73057],[-69.79065,0.58776],[-70.02686,0.57128],[-70.04059,-0.19226],[-69.60937,-0.50262],[-69.55719,-0.65367],[-69.61212,-0.7498],[-69.41986,-1.03541],[-69.40338,-1.37041],[-69.9321,-4.21974],[-69.94995,-4.23275],[-70.06531,-4.08071],[-70.1841,-3.93893],[-70.28641,-3.82246],[-70.35027,-3.80054],[-70.50613,-3.87796],[-70.71075,-3.793],[-70.04883,-2.75102],[-70.8783,-2.23241],[-71.41113,-2.37786],[-71.75171,-2.19124],[-72.36694,-2.48762],[-72.63336,-2.36688],[-72.67456,-2.4595],[-72.93274,-2.4492],[-73.1813,-2.22692],[-73.10028,-2.0842],[-73.14697,-1.79597],[-73.55347,-1.69439],[-73.47382,-1.55437],[-73.64136,-1.26607],[-73.85834,-1.22763],[-74.27582,-0.97774],[-74.42139,-0.51086],[-74.79492,-0.23621],[-75.20142,-0.06592],[-75.27832,-0.12909],[-75.80566,0.04669],[-76.09955,0.32959],[-76.32751,0.42572],[-76.40991,0.37903],[-76.41266,0.23621],[-76.96198,0.27191],[-77.11029,0.36529],[-77.53601,0.40649],[-77.48383,0.65093],[-77.69257,0.73606],[-77.66441,0.81296],[-77.7166,0.85141],[-77.74544,0.83562],[-77.77565,0.83974],[-77.80861,0.82738],[-77.8196,0.80678],[-77.96173,0.82257],[-78.19794,0.94478],[-78.19931,0.99284],[-78.28308,1.05325],[-78.2515,1.08346],[-78.31741,1.19193],[-78.43002,1.1425],[-78.55499,1.2496],[-78.61816,1.24685],[-80,2.5],[-77.7,7.7],[-77.55524,7.51498],[-77.32178,7.87971],[-77.17896,7.93956],[-77.5,8.5],[-75.8,11.8]]]}},ecuador:{type:"Feature",id:"ecuador",properties:{},geometry:{type:"Polygon",coordinates:[[[-82,-3],[-80,2.2],[-77.86079,0.80404],[-77.72072,0.85484],[-77.66287,0.81794],[-77.66424,0.80884],[-77.67385,0.80215],[-77.67729,0.79099],[-77.66184,0.78979],[-77.68587,0.77365],[-77.6972,0.74241],[-77.67523,0.73778],[-77.5573,0.65058],[-77.47353,0.6626],[-77.52159,0.44837],[-76.47583,0.20874],[-76.32202,0.4422],[-76.0199,0.30487],[-75.81665,0.09064],[-75.26733,-0.1181],[-75.31265,-0.16617],[-75.50629,-0.21698],[-75.22888,-0.56441],[-75.20279,-0.97362],[-75.28931,-0.99147],[-75.36072,-0.95027],[-75.64087,-1.62576],[-76.63376,-2.59052],[-77.84637,-3],[-78.2872,-3.42158],[-79.01917,-5.01844],[-79.24301,-4.96581],[-79.62753,-4.42656],[-79.79233,-4.48954],[-80.12535,-4.29784],[-80.36018,-4.49775],[-80.44584,-4.45086],[-80.44739,-4.37692],[-80.33409,-4.21841],[-80.45013,-4.20968],[-80.44928,-4.13024],[-80.48035,-4.09445],[-80.47297,-4.05079],[-80.44739,-3.99719],[-80.39915,-3.98281],[-80.29701,-4.01843],[-80.12878,-3.89718],[-80.16106,-3.86704],[-80.19264,-3.60256],[-80.21633,-3.582],[-80.20706,-3.54705],[-80.21745,-3.5],[-80.22878,-3.50181],[-80.2335,-3.4899],[-80.2456,-3.48759],[-80.24545,-3.48481],[-80.24416,-3.48461],[-80.24386,-3.48247],[-80.24313,-3.48142],[-80.24393,-3.47881],[-80.24079,-3.47723],[-80.2438,-3.46463],[-80.22217,-3.44047],[-80.25238,-3.41],[-82,-3]]]}},paraguay:{type:"Feature",id:"paraguay",properties:{},geometry:{type:"Polygon",coordinates:[[[-54.25873,-24.35961],[-54.58403,-25.58921],[-54.65681,-25.67588],[-54.67916,-25.99493],[-54.61857,-26.20862],[-54.78678,-26.6308],[-55.42267,-26.99497],[-55.60553,-27.1621],[-55.73675,-27.44486],[-55.78857,-27.44309],[-55.89775,-27.34371],[-55.97809,-27.35591],[-56.06259,-27.30569],[-56.29415,-27.41973],[-56.37473,-27.58873],[-56.601,-27.42072],[-56.84909,-27.606],[-56.96547,-27.50172],[-57.48737,-27.44388],[-57.87465,-27.27496],[-58.59888,-27.29953],[-58.64896,-27.12631],[-58.31974,-26.8579],[-58.18979,-26.64487],[-58.22086,-26.41372],[-58.08456,-26.11154],[-57.89095,-25.96589],[-57.74047,-25.65014],[-57.55483,-25.44809],[-57.76072,-25.17162],[-58.2415,-24.9277],[-58.67226,-24.83161],[-59.3538,-24.4779],[-59.47537,-24.3323],[-60.03924,-24.01125],[-60.37336,-24.02369],[-60.98973,-23.81777],[-61.08807,-23.61362],[-61.73595,-23.234],[-62.20654,-22.70386],[-62.30073,-22.48627],[-62.64387,-22.24906],[-62.26072,-21.05983],[-62.26622,-20.56305],[-61.92152,-20.08915],[-61.73647,-19.63289],[-59.97488,-19.29332],[-59.06988,-19.28619],[-58.20814,-19.80515],[-57.83186,-20.9842],[-57.92507,-21.63334],[-57.88113,-21.68734],[-57.90602,-21.71294],[-57.97194,-22.07832],[-56.81013,-22.27099],[-56.56363,-22.20044],[-56.49462,-22.08659],[-56.39677,-22.07641],[-56.26631,-22.24811],[-56.01774,-22.29259],[-55.8526,-22.28227],[-55.78935,-22.38413],[-55.74034,-22.38913],[-55.75132,-22.47989],[-55.7472,-22.50653],[-55.72347,-22.5514],[-55.69845,-22.56298],[-55.69365,-22.57788],[-55.62361,-22.62986],[-55.38191,-24.00601],[-54.65973,-23.82806],[-54.31366,-24.01762],[-54.25873,-24.35961]]]}},peru:{type:"Feature",id:"peru",properties:{},geometry:{type:"Polygon",coordinates:[[[-83,-3],[-80.25238,-3.41],[-80.22217,-3.44047],[-80.2438,-3.46463],[-80.24079,-3.47723],[-80.24393,-3.47881],[-80.24313,-3.48142],[-80.24386,-3.48247],[-80.24416,-3.48461],[-80.24545,-3.48481],[-80.2456,-3.48759],[-80.2335,-3.4899],[-80.22878,-3.50181],[-80.21745,-3.5001],[-80.20706,-3.54705],[-80.21633,-3.582],[-80.19264,-3.60256],[-80.16106,-3.86704],[-80.12878,-3.89718],[-80.29701,-4.01843],[-80.39915,-3.98281],[-80.44739,-3.99719],[-80.47297,-4.05079],[-80.48035,-4.09445],[-80.44928,-4.13024],[-80.45013,-4.20968],[-80.33409,-4.21841],[-80.44739,-4.37692],[-80.44584,-4.45086],[-80.36018,-4.49775],[-80.12535,-4.29784],[-79.79233,-4.48954],[-79.62753,-4.42656],[-79.24301,-4.96581],[-79.01917,-5.01844],[-78.2872,-3.42158],[-77.84637,-3],[-76.63376,-2.59052],[-75.64087,-1.62576],[-75.36072,-0.95027],[-75.56534,-0.13806],[-75.15884,-0.06665],[-74.40628,-0.55553],[-72.92862,-2.39505],[-70.9552,-2.25162],[-70.02686,-2.70987],[-70.70595,-3.78478],[-70.49789,-3.88142],[-70.32349,-3.8088],[-69.95819,-4.23211],[-69.94446,-4.29784],[-69.99802,-4.37316],[-70.10376,-4.29164],[-70.19028,-4.35946],[-71.82999,-4.5662],[-72.86133,-5.25507],[-73.94348,-7.4932],[-72.19116,-9.95803],[-70.61188,-9.57638],[-70.62149,-10.96681],[-69.57161,-10.94557],[-68.65494,-12.49629],[-69.01886,-13.62196],[-68.83896,-14.22445],[-69.38141,-14.86251],[-69.14795,-15.24444],[-69.39926,-15.6151],[-69.19189,-16.17449],[-69.10177,-16.22555],[-68.96152,-16.19456],[-68.78952,-16.34254],[-68.98865,-16.42357],[-69.04015,-16.57368],[-69.01886,-16.65198],[-69.61075,-17.26542],[-69.46896,-17.37423],[-69.46827,-17.49919],[-69.66654,-17.66071],[-69.81262,-17.67281],[-69.75,-18],[-70,-18.27],[-75,-19],[-83,-3]]]}}};
23654 var resources = {"cape-coast-youthmappers":{id:"cape-coast-youthmappers",featureId:"cape_coast_gh",type:"twitter",name:"University of Cape Coast YouthMappers",countryCodes:["gh"],languageCodes:["en"],description:"Follow us on Twitter: {url}",extendedDescription:"This is the official handle for the Youth Mappers chapter of the University of Cape Coast, Ghana. we love maps, open data and helping the vulnerable.",url:"https://twitter.com/YouthmappersUCC",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-gh-facebook":{id:"osm-gh-facebook",featureId:"ghana",type:"facebook",name:"OpenStreetMap Ghana on Facebook",countryCodes:["gh"],languageCodes:["en"],description:"Facebook group for people interested in OpenStreetMap.",extendedDescription:"Mappers in Ghana community, promoting OpenStreetMap and Humanitarian OpenStreetMap Team (HOT) projects in Ghana. Join us.",url:"https://www.facebook.com/OSMGhana/",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-gh-twitter":{id:"osm-gh-twitter",featureId:"ghana",type:"twitter",name:"OpenStreetMap Ghana on Twitter",countryCodes:["gh"],languageCodes:["en"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/osmghana",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"talk-gh":{id:"talk-gh",featureId:"ghana",type:"mailinglist",name:"Talk-gh Mailing List",countryCodes:["gh"],languageCodes:["en"],description:"Talk-gh is the official mailing list for Ghana OSM community.",url:"https://lists.openstreetmap.org/listinfo/talk-gh",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-mg-facebook":{id:"osm-mg-facebook",featureId:"madagascar",type:"facebook",name:"OpenStreetMap Madagascar Facebook Group",countryCodes:["mg"],languageCodes:["mg","fr"],description:"Malagasy Facebook group for people interested in OpenStreetMap.",url:"https://www.facebook.com/groups/1601381123461284/",contacts:[{name:"Brice Ramamonjy",email:"rafaby21@gmail.com"},{name:"Dolly Andriatsiferana",email:"privatemajory@gmail.com"}]},"talk-mg":{id:"talk-mg",featureId:"madagascar",type:"mailinglist",countryCodes:["mg"],languageCodes:["mg","fr"],name:"Talk-mg Mailing List",description:"Place for OpenStreetMap contributors, communities and users in Madagascar to share and discuss.",url:"https://lists.openstreetmap.org/listinfo/talk-mg",contacts:[{name:"Brice Ramamonjy",email:"rafaby21@gmail.com"},{name:"Dolly Andriatsiferana",email:"privatemajory@gmail.com"}]},"OSM-BGD-facebook":{id:"OSM-BGD-facebook",featureId:"BGD",type:"facebook",name:"OpenStreetMap Bangladesh",description:"Improve OpenStreetMap in Bangladesh",extendedDescription:"Mapping in Bangladesh? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://www.facebook.com/groups/osmbd/",contacts:[{name:"Ahasanul Hoque",email:"hoque.ahasan@gmail.com"}]},"OSM-India-facebook":{id:"OSM-India-facebook",featureId:"india_full",type:"facebook",name:"OpenStreetMap India - Participatory neighborhood mapping",description:"Improve OpenStreetMap in India",extendedDescription:"Mapping in India? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://www.facebook.com/groups/mappingindia/",contacts:[{name:"Jinal Foflia",email:"fofliajinal@gmail.com"},{name:"Arun Ganesh",email:"arun.planemad@gmail.com"}],events:[{id:"sotmasia2018",i18n:true,name:"State of the Map Asia 2018",description:"Join the 2018 OpenStreetMap region-wide event at State of the Map Asia in India",where:"Indian Institute of Management, Bangalore, India",when:"2018-11-17",url:"http://stateofthemap.asia/"}]},"OSM-india-mailinglist":{id:"OSM-india-mailinglist",featureId:"india_full",type:"mailinglist",name:"OpenStreetMap India Mailinglist",description:"Talk-in is the official Mailinglist for Indian Community",url:"https://lists.openstreetmap.org/listinfo/talk-in",contacts:[{name:"Arun Ganesh",email:"arun.planemad@gmail.com"}]},"OSM-india-twitter":{id:"OSM-india-twitter",featureId:"india_full",type:"twitter",name:"OpenStreetMap India Twitter",description:"We are just a tweet away: {url}",url:"https://twitter.com/osm_in",contacts:[{name:"Jinal Foflia",email:"fofliajinal@gmail.com"}]},"OSM-India-Puducherry-Facebook":{id:"OSM-India-Puducherry-Facebook",featureId:"india_puducherry",type:"facebook",name:"Free Software Hardware Movement - Facebook",description:"FSHM Facebook page to know about community events, activities",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap. Its FB page is the best way to keep in contact with its events.",url:"https://www.facebook.com/FSHMP",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"OSM-India-Puducherry-Matrix":{id:"OSM-India-Puducherry-Matrix",featureId:"india_puducherry",type:"matrix",name:"Free Software Hardware Movement - Matrix",description:"FSHM Riot group to discuss, share and update mapping activities, events in and around Puducherry",extendedDescription:"FSHM community members share their OSM mapping updates / experiences through the Riot.im group, this group is also used to discuss things related to free software / hardware, technology and activism.",url:"https://riot.im/app/#/room/#fshm:matrix.org",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"OSM-IDN-facebook":{id:"OSM-IDN-facebook",featureId:"IDN",type:"facebook",name:"OpenStreetMap Indonesia",description:"Improve OpenStreetMap in Indonesia",extendedDescription:"Mapping in Indonesia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/osm.id/",contacts:[{name:"Yantisa Akhadi",email:"yantisa.akhadi@hotosm.org"}]},"OSM-japan-facebook":{id:"OSM-japan-facebook",featureId:"japan",type:"facebook",name:"OpenStreetMap Japan Community",countryCodes:["jp"],languageCodes:["jp"],description:"Mappers and OpenStreetMap users in Japan",url:"https://www.facebook.com/groups/osmjapan/",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-japan-mailinglist":{id:"OSM-japan-mailinglist",featureId:"japan",type:"mailinglist",name:"OpenStreetMap Japan Mailinglist",countryCodes:["jp"],languageCodes:["jp"],description:"Talk-ja is an Official Mailinglist for Japanese Community",url:"https://lists.openstreetmap.org/listinfo/talk-ja",contacts:[{name:"OSMF Japan",email:"info@osmf.jp"}]},"OSM-japan-twitter":{id:"OSM-japan-twitter",featureId:"japan",type:"twitter",name:"OpenStreetMap Japan Twitter",countryCodes:["jp"],languageCodes:["jp"],description:"Hashtag on Twitter: {url}",url:"https://twitter.com/hashtag/osmjp",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-japan-website":{id:"OSM-japan-website",featureId:"japan",type:"group",name:"OpenStreetMap Japan",countryCodes:["jp"],languageCodes:["jp"],description:"Mappers and OpenStreetMap users in Japan",url:"https://openstreetmap.jp/",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-korea-telegram":{id:"OSM-korea-telegram",featureId:"korea",type:"telegram",countryCodes:["ko"],languageCodes:["ko","en"],name:"OSM Korea Telegram Channel",description:"Unofficial Channnel for OpenStreetMap contributors, communities and users in Korea to share and discuss.",url:"https://t.me/osmKorea",contacts:[{name:"Yongmin Hong",email:"revi@pobox.com"},{name:"Max N",email:"abonnements@revolwear.com"}]},"OSM-MY-facebook":{id:"OSM-MY-facebook",featureId:"malaysia",type:"facebook",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia on Facebook",description:"For chat about anything related to OpenStreetMap!",url:"https://www.facebook.com/groups/openstreetmapMY/",contacts:[{name:"Mohd Saidin",email:"projekopenstreetmap@hotmail.com"}]},"OSM-MY-forum":{id:"OSM-MY-forum",featureId:"malaysia",type:"forum",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia Forum",description:"Official OpenStreetMap Malaysia Forum",url:"https://forum.openstreetmap.org/viewforum.php?id=60",contacts:[{name:"Mohd Saidin",email:"projekopenstreetmap@hotmail.com"}]},"OSM-MY-matrix":{id:"OSM-MY-matrix",featureId:"malaysia",type:"matrix",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia Riot channel",description:"All mappers are welcome! Sign up at {signupUrl}",signupUrl:"https://riot.im/app/#/register",url:"https://riot.im/app/#/room/#OpenstreetmapMalaysia:matrix.org",contacts:[{name:"Ahmad Amsyar",email:"OfficiallyAhmad@protonmail.ch"}]},"OSM-MNG-facebook":{id:"OSM-MNG-facebook",featureId:"MNG",type:"facebook",name:"OpenStreetMap Mongolia",description:"Improve OpenStreetMap in Mongolia",extendedDescription:"Mapping in Mongolia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/OSM.Mongolia/",contacts:[{name:" ",email:"talk-mn@openstreetmap.org"}]},"OSM-MMR-facebook":{id:"OSM-MMR-facebook",featureId:"MMR",type:"facebook",name:"OpenStreetMap Myanmar",description:"Improve OpenStreetMap in Myanmar",extendedDescription:"Mapping in Myanmar? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/osmmm/",contacts:[{name:"Yan Naung Oak",email:"yan@phandeeyar.org"},{name:"Patrick Oswald",email:"patrickoswald.omm@gmail.com"},{name:"Set Khaing Oo",email:"setkhaing@phandeeyar.org"}]},"OSM-Nepal-facebook":{id:"OSM-Nepal-facebook",featureId:"NPL",type:"facebook",name:"OpenStreetMap Nepal",description:"Improve OpenStreetMap in Nepal",extendedDescription:"Mapping in Nepal? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/mapkathmandu/",contacts:[{name:"Kshitiz Khanal",email:"khanal1990@gmail.com"}]},"OSM-PH-facebook":{id:"OSM-PH-facebook",featureId:"philippines",type:"facebook",countryCodes:["ph"],name:"OpenStreetMap PH Facebook",description:"Welcome to OpenStreetMap Philippines, where we encourage all fellow Filipinos to contribute to the OpenStreetMap project.",url:"https://www.facebook.com/OSMPH/",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-mailinglist":{id:"OSM-PH-mailinglist",featureId:"philippines",type:"mailinglist",countryCodes:["ph"],name:"Talk-ph Mailing List",description:"A mailing list to discuss OpenStreetMap in the Philippines",url:"https://lists.openstreetmap.org/pipermail/talk-ph/",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-slack":{id:"OSM-PH-slack",featureId:"philippines",type:"slack",countryCodes:["ph"],name:"OpenStreetMap PH Slack",description:"All are welcome! Sign up at {signupUrl}",signupUrl:"https://osmph-chat.herokuapp.com/",url:"https://osmph.slack.com",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-telegram":{id:"OSM-PH-telegram",featureId:"philippines",type:"telegram",countryCodes:["ph"],languageCodes:["tl","en"],name:"OpenStreetMap PH Telegram",description:"Un-official, Telegram local community of OpenStreetMap contributors and friends in the Philippines",url:"https://t.me/osmph",contacts:[{name:"Erwin Olario",email:"govvin@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-RU-forum":{id:"OSM-RU-forum",type:"forum",featureId:"russia",countryCodes:["ru"],languageCodes:["ru"],name:"OpenStreetMap RU forum",description:"OpenStreetMap Russia web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=21",contacts:[{name:"Ilya Zverev",email:"ilya@zverev.info"}]},"OSM-RU-telegram":{id:"OSM-RU-telegram",type:"telegram",featureId:"russia",countryCodes:["ru"],languageCodes:["ru"],name:"OpenStreetMap RU telegram",description:"OpenStreetMap Russia telegram chat",url:"https://t.me/ruosm",contacts:[{name:"Ilya Zverev",email:"ilya@zverev.info"}]},"OSM-LKA-facebook":{id:"OSM-LKA-facebook",featureId:"LKA",type:"facebook",name:"OpenStreetMap Sri Lanka",description:"Improve OpenStreetMap in Sri Lanka",extendedDescription:"Mapping in Sri Lanka? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/142058222659672/",contacts:[{name:"Karan Suthakaran",email:"karansuthakaran@yahoo.com"}]},"OSM-TW-facebook":{id:"OSM-TW-facebook",featureId:"taiwan",type:"facebook",name:"OpenStreetMap Taiwan Community",countryCodes:["tw"],languageCodes:["zh-tw"],description:"Facebook Group for Mappers and OpenStreetMap users to discuss matters about Taiwan.",url:"https://www.facebook.com/groups/OpenStreetMap.TW/",contacts:[{name:"Nobody 沒有人 (Public mail)",email:"hiboard@openstreetmap.tw"}]},"OSM-TW-mailinglist":{id:"OSM-TW-mailinglist",featureId:"taiwan",type:"mailinglist",name:"OpenStreetMap Taiwan Mailinglist",countryCodes:["tw"],languageCodes:["zh-tw","en"],description:"Talk-tw is an Official Mailinglist for the Communities to dicuss matters about Taiwan",url:"https://lists.openstreetmap.org/listinfo/talk-tw",contacts:[{name:"Nobody 沒有人 (Public email)",email:"hiboard@openstreetmap.tw"}]},"OSM-TH-CNX-meetup":{id:"OSM-TH-CNX-meetup",featureId:"thailand_cnx",type:"meetup",countryCodes:["th"],languageCodes:["en"],name:"OSM Meetup Chiang Mai",description:"Irregular meeting of the OpenStreetMap community in Chiang Mai",extendedDescription:"Members of the OpenStreetMap community meet every few months in Chiang Mai. Get in contact and check out {url} to see when the next meetup is scheduled",url:"https://forum.openstreetmap.org/viewforum.php?id=46",contacts:[{name:"Team Chiang Mai",email:"meetup-cnx@openstreetmap.in.th"}]},"OSM-TH-facebook":{id:"OSM-TH-facebook",featureId:"thailand_full",type:"facebook",countryCodes:["th"],languageCodes:["en","th"],name:"OpenStreetMap TH Facebook group",description:"Facebook group for OpenStreetMappers in Thailand",url:"https://www.facebook.com/groups/thaiosm/",contacts:[{name:"Theppitak Karoonboonyanan",email:"theppitak@gmail.com"}]},"OSM-TH-forum":{id:"OSM-TH-forum",featureId:"thailand_full",type:"forum",countryCodes:["th"],languageCodes:["en","th"],name:"OpenStreetMap TH forum",description:"OpenStreetMap Thailand web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=46",contacts:[{name:"Stephan Knauss",email:"osm@stephans-server.de"}]},"al-forum":{id:"al-forum",featureId:"albania",type:"forum",countryCodes:["al"],languageCodes:["sq","en"],name:"OSM Albania Forum",description:"OpenStreetMap Albania Forum",url:"https://forum.openstreetmap.org/viewforum.php?id=91",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"al-maptime-tirana":{id:"al-maptime-tirana",featureId:"al-tirana",type:"group",countryCodes:["al"],languageCodes:["sq","en"],name:"Maptime Tirana",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time.",url:"http://maptime.io/tirana/",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"al-telegram":{id:"al-telegram",featureId:"albania",type:"telegram",countryCodes:["al"],languageCodes:["sq","en"],name:"OSM Albania Telegram channel",description:"OpenStreetMap Albania Telegram channel",url:"https://telegram.me/OpenStreetMapAL",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"at-forum":{id:"at-forum",featureId:"austria",type:"forum",name:"OpenStreetMap Austria Forum",countryCodes:["at"],languageCodes:["en","de"],description:"The official forum for OpenStreetMap questions in and around Austria",url:"https://forum.openstreetmap.org/viewforum.php?id=89",contacts:[{name:"emga",email:"emgaosm@gmail.com"}]},"at-mailinglist":{id:"at-mailinglist",featureId:"austria",type:"mailinglist",name:"Talk-at Mailing List",countryCodes:["at"],languageCodes:["de"],description:"Talk-at is the official mailing list for the Austrian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-at",contacts:[{name:"AT community",email:"info@openstreetmap.at"}]},"at-twitter":{id:"at-twitter",featureId:"austria",type:"twitter",name:"OpenStreetMap Austria Twitter",countryCodes:["at"],languageCodes:["de"],description:"OpenStreetMap Austria On Twitter: {url}",url:"https://twitter.com/osm_at",contacts:[{name:"AT Community",email:"info@openstreetmap.at"}]},"osmgraz-meetup":{id:"osmgraz-meetup",featureId:"graz",type:"meetup",countryCodes:["at"],languageCodes:["de","en"],name:"OSM community meetup Graz",description:"Monthly meetup of the OpenStreetMap community in Graz",url:"https://wiki.openstreetmap.org/wiki/Graz/Stammtisch",contacts:[{name:"Michael Maier",email:"michael.maier@secure.mailbox.org"}]},"osmgraz-twitter":{id:"osmgraz-twitter",featureId:"graz",type:"twitter",countryCodes:["at"],languageCodes:["de","en"],name:"OSM community Graz on twitter",description:"OpenStreetMap community in Graz on twitter",url:"https://twitter.com/osmgraz",contacts:[{name:"Michael Maier",email:"michael.maier@secure.mailbox.org"}]},"osm-at":{id:"osm-at",featureId:"austria",type:"group",countryCodes:["at"],languageCodes:["de"],name:"OpenStreetMap Austria",description:"The platform for information on OpenStreetMap in Austria",url:"https://www.openstreetmap.at/",contacts:[{name:"AT community",email:"info@openstreetmap.at"}]},byosm:{id:"byosm",type:"telegram",featureId:"belarus",languageCodes:["ru","be","en"],name:"OpenStreetMap Belarus",description:"OpenStreetMap Belarus telegram chat",url:"https://t.me/byosm",contacts:[{name:"Darafei Praliaskouski",email:"me@komzpa.net"}]},"be-facebook":{id:"be-facebook",featureId:"belgium",type:"facebook",name:"OpenStreetMap BE Community",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Mappers and OpenStreetMap on Facebook in Belgium",url:"https://www.facebook.com/groups/1419016881706058/",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-forum":{id:"be-forum",type:"forum",featureId:"belgium",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap BE forum",description:"OpenStreetMap Belgium web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=29",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-irc":{id:"be-irc",featureId:"belgium",type:"irc",name:"OpenStreetMap Belgium IRC",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Join #osmbe on irc.oftc.net (port 6667)",extendedDescription:"Join #osmbe on irc.oftc.net (port 6667), it is bridged with the Matrix chat channel",url:"https://webchat.oftc.net/?channels=osmbe",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-mailinglist":{id:"be-mailinglist",featureId:"belgium",type:"mailinglist",name:"Talk-be Mailing List",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Talk-be is the official mailing list for the Belgian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-be",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-maptime":{id:"be-maptime",featureId:"belgium",type:"group",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"Maptime Belgium",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time.",url:"http://maptime.io/belgium/",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-matrix":{id:"be-matrix",featureId:"belgium",type:"matrix",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap BE Matrix channel",description:"All mappers are welcome!",extendedDescription:"Most talk is happening at the \"OpenStreetMap Belgium\" channel. You can ask anything there! The other rooms are for specific subjects.",url:"https://riot.im/app/#/group/+osmbe:matrix.org",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-meetup":{id:"be-meetup",featureId:"belgium",type:"meetup",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap Belgium Meetup",description:"Real life meetups of everyone who is interested in OpenStreetMap",extendedDescription:"Physical meetups are great to meet other mappers, ask them questions and to learn a lot. Especially new contributors are very welcome!",url:"https://meetup.com/OpenStreetMap-Belgium/",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-twitter":{id:"be-twitter",featureId:"belgium",type:"twitter",name:"OpenStreetMap Belgium Twitter",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"OSM Belgium on Twitter: @osm_be",url:"https://twitter.com/osm_be",contacts:[{name:"BE community",email:"community@osm.be"}]},"hr-facebook":{id:"hr-facebook",featureId:"croatia",type:"facebook",name:"OpenStreetMap Croatia Facebook group",countryCodes:["hr"],languageCodes:["hr"],description:"OpenStreetMap Croatia Facebook group",url:"https://www.facebook.com/groups/541098862671461",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"hr-irc":{id:"hr-irc",featureId:"croatia",type:"irc",name:"OpenStreetMap Croatia on IRC",countryCodes:["hr"],languageCodes:["hr"],description:"Join #osm-hr on irc.freenode.org (port 6667)",url:"https://webchat.freenode.net/?url=irc://irc.freenode.net/osm-hr",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"hr-mailinglist":{id:"hr-mailinglist",featureId:"croatia",type:"mailinglist",name:"Talk-hr Mailing List",countryCodes:["hr"],languageCodes:["hr"],description:"Talk-hr mailing list",url:"https://lists.openstreetmap.org/listinfo/talk-hr",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"czech-community":{id:"czech-community",featureId:"czechia",type:"group",name:"Czech OSM community",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Map portal, website and contacts on OSM members in Czechia",url:"https://openstreetmap.cz/komunita",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"osmcz-facebook":{id:"osmcz-facebook",featureId:"czechia",type:"facebook",name:"OpenStreetMap CZ on Facebook",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Follow czech community on Facebook - including translated WeeklyOSM!",url:"https://www.facebook.com/osmcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"osmcz-twitter":{id:"osmcz-twitter",featureId:"czechia",type:"twitter",name:"Czech twitter @osmcz",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Follow czech community on Twitter - including translated WeeklyOSM!",url:"https://twitter.com/osmcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"talk-cz-mailinglist":{id:"talk-cz-mailinglist",featureId:"czechia",type:"mailinglist",name:"Czech mailing list (talk-cz)",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Talk-cz is the official mailing list for Czech community",url:"https://openstreetmap.cz/talkcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"dk-forum":{id:"dk-forum",type:"forum",featureId:"denmark",countryCodes:["dk"],languageCodes:["da"],name:"OpenStreetMap Denmark Web Forum",description:"OpenStreetMap Denmark web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=48",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"dk-irc":{id:"dk-irc",featureId:"denmark",type:"irc",name:"OpenStreetMap Denmark IRC",countryCodes:["dk"],languageCodes:["da"],description:"Join #osm-dk on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm-dk",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"dk-mailinglist":{id:"dk-mailinglist",featureId:"denmark",type:"mailinglist",name:"Talk-dk Mailing List",countryCodes:["dk"],languageCodes:["da"],description:"A mailing list to discuss OpenStreetMap in Denmark",url:"https://lists.openstreetmap.org/listinfo/talk-dk",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"fi-forum":{id:"fi-forum",featureId:"finland",type:"forum",countryCodes:["fi"],languageCodes:["fi"],name:"OpenStreetMap FI forum",description:"OpenStreetMap Finland web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=15",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fi-irc":{id:"fi-irc",featureId:"finland",type:"irc",name:"OpenStreetMap Finland IRC",countryCodes:["fi"],languageCodes:["fi"],description:"Join #osm-fi on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm-fi",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fi-mailinglist":{id:"fi-mailinglist",featureId:"finland",type:"mailinglist",name:"Talk-fi Mailing List",countryCodes:["fi"],languageCodes:["fi"],description:"Talk-fi is the official mailing list for the Finnish OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-fi",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fr-facebook":{id:"fr-facebook",featureId:"france",type:"facebook",name:"OpenStreetMap France Facebook page",countryCodes:["fr"],languageCodes:["fr"],description:"OpenStreetMap France Facebook page",url:"https://www.facebook.com/osmfr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-forum":{id:"fr-forum",type:"forum",featureId:"france",countryCodes:["fr"],languageCodes:["fr"],name:"OpenStreetMap France web forum",description:"OpenStreetMap France web forum",url:"https://forum.openstreetmap.fr/",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-irc":{id:"fr-irc",featureId:"france",type:"irc",name:"OpenStreetMap France on IRC",countryCodes:["fr"],languageCodes:["fr"],description:"Join #osm-fr on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm-fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-mailinglist":{id:"fr-mailinglist",featureId:"france",type:"mailinglist",name:"Talk-fr Mailing List",countryCodes:["fr"],languageCodes:["fr"],description:"Talk-fr mailing list",url:"https://lists.openstreetmap.org/listinfo/talk-fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-twitter":{id:"fr-twitter",featureId:"france",type:"twitter",name:"OpenStreetMap France on Twitter",countryCodes:["fr"],languageCodes:["fr"],description:"OpenStreetMap France on Twitter: {url}",url:"https://twitter.com/osm_fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"de-berlin-mailinglist":{id:"de-berlin-mailinglist",featureId:"de-berlin-brandenburg",type:"mailinglist",name:"Berlin Mailing List",countryCodes:["de"],languageCodes:["de"],description:"This is the mailing list for the Berlin OSM community",url:"https://lists.openstreetmap.de/listinfo/berlin",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-berlin-meetup":{id:"de-berlin-meetup",featureId:"de-berlin-brandenburg",type:"meetup",name:"OpenStreetMap Berlin-Brandenburg Meetup",countryCodes:["de"],languageCodes:["de"],description:"Mappers and OpenStreetMap users in the Berlin area",url:"https://www.meetup.com/OSM-Berlin-Brandenburg/",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-berlin-telegram":{id:"de-berlin-telegram",featureId:"de-berlin-brandenburg",type:"telegram",name:"@osmberlin on Telegram",countryCodes:["de"],languageCodes:["de"],description:"OpenStreetMap Berlin Telegram chat",url:"https://t.me/osmberlin",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-berlin-twitter":{id:"de-berlin-twitter",featureId:"de-berlin-brandenburg",type:"twitter",name:"OpenStreetMap Berlin Twitter",countryCodes:["de"],languageCodes:["de"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/osmberlin",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-forum":{id:"de-forum",featureId:"germany",type:"forum",countryCodes:["de"],languageCodes:["de"],name:"OpenStreetMap DE forum",description:"OpenStreetMap Germany web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=14",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-irc":{id:"de-irc",featureId:"germany",type:"irc",name:"OpenStreetMap Germany IRC",countryCodes:["de"],languageCodes:["de"],description:"Join #osm-de on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm-de",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-mailinglist":{id:"de-mailinglist",featureId:"germany",type:"mailinglist",name:"Talk-de Mailing List",countryCodes:["de"],languageCodes:["de"],description:"Talk-de is the official mailing list for the German OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-de",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-ostwestfalen-lippe-mailinglist":{id:"de-ostwestfalen-lippe-mailinglist",featureId:"de-ostwestfalen-lippe",type:"mailinglist",name:"OWL Mailing List",countryCodes:["de"],languageCodes:["de"],description:"This is the mailing list for the Ostwestfalen-Lippe OSM community",url:"https://gt.owl.de/mailman/listinfo/osm",contacts:[{name:"Florian Lohoff",email:"osm-owner@gt.owl.de"}]},"de-telegram":{id:"de-telegram",featureId:"germany",type:"telegram",name:"OpenStreetMap Germany Telegram",countryCodes:["de"],languageCodes:["de"],description:"Join the OpenStreetMap Germany Telegram supergroup at {url}",url:"https://t.me/OSM_de",contacts:[{name:"Max N",email:"abonnements@revolwear.com"}]},"osm-de":{id:"osm-de",featureId:"germany",type:"group",countryCodes:["de"],languageCodes:["de"],name:"OpenStreetMap Germany",description:"The platform for information on OpenStreetMap in Germany",url:"https://www.openstreetmap.de/",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"hu-facebook":{id:"hu-facebook",featureId:"hungary",type:"facebook",name:"OpenStreetMap HU on Facebook",countryCodes:["hu"],languageCodes:["hu"],description:"Mappers and OpenStreetMap Facebook in Hungary",url:"https://www.facebook.com/groups/osm.hu/",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"hu-forum":{id:"hu-forum",featureId:"hungary",type:"forum",countryCodes:["hu"],languageCodes:["hu"],name:"OpenStreetMap HU forum",description:"OpenStreetMap Hungary web forum",url:"https://groups.google.com/forum/#!forum/openstreetmap-hungary",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"hu-meetup":{id:"hu-meetup",featureId:"hungary",type:"meetup",countryCodes:["hu"],languageCodes:["hu"],name:"OpenStreetMap Hungary Meetup",description:"The platform for organizing meetups in Hungary",url:"https://www.meetup.com/OpenStreetMap-Hungary",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"it-facebook":{id:"it-facebook",featureId:"italy",type:"facebook",name:"OpenStreetMap Italy Facebook",countryCodes:["it"],languageCodes:["it"],description:"Join the OpenStreetMap Italy community on Facebook",url:"https://www.facebook.com/OpenStreetMap.Italia/",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-irc":{id:"it-irc",featureId:"italy",type:"irc",name:"OpenStreetMap Italy IRC",countryCodes:["it"],languageCodes:["it"],description:"Join #osm-it on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm-it",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-mailinglist":{id:"it-mailinglist",featureId:"italy",type:"mailinglist",name:"Talk-it Mailing List",countryCodes:["it"],languageCodes:["it"],description:"Talk-it is the official mailing list for the Italian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-it",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-telegram":{id:"it-telegram",type:"telegram",featureId:"italy",countryCodes:["it"],languageCodes:["it"],name:"@OpenStreetMapItalia on Telegram",description:"OpenStreetMap Italy Telegram chat",url:"https://t.me/OpenStreetMapItalia",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-twitter":{id:"it-twitter",featureId:"italy",type:"twitter",name:"OpenStreetMap Italy Twitter",countryCodes:["it"],languageCodes:["it"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapIt",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"OSM-Rome-meetup":{id:"OSM-Rome-meetup",featureId:"IT_Roma_Capitale",type:"group",name:"Incontro Mappatori Romani",countryCodes:["it"],languageCodes:["it"],description:"Improve OpenStreetMap in the Rome area",extendedDescription:"We aim to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Lazio.",url:"https://wiki.openstreetmap.org/wiki/Rome/Incontro",contacts:[{name:"Martin Koppenhoefer",email:"dieterdreist@gmail.com"}]},"South-Tyrol-Mailing-List":{id:"South-Tyrol-Mailing-List",featureId:"south_tyrol",type:"mailinglist",countryCodes:["it"],languageCodes:["de","it","lld","en"],name:"OpenStreetMap mailing list for South Tyrol",description:"OpenStreetMap Italy regional talk list for South Tyrol",url:"https://lists.openstreetmap.org/listinfo/talk-it-southtyrol",contacts:[{name:"Martin Raifer",email:"tyr.asd@gmail.com"}]},"talk-it-lazio":{id:"talk-it-lazio",featureId:"IT_Lazio",type:"mailinglist",countryCodes:["it"],languageCodes:["it"],name:"OpenStreetMap IT Lazio",description:"All are welcome! Sign up at {signupUrl}",extendedDescription:"Mailinglist for Rome and Lazio area.",signupUrl:"https://lists.openstreetmap.org/listinfo/talk-it-lazio",url:"https://lists.openstreetmap.org/listinfo/talk-it-lazio",contacts:[{name:"Martin Koppenhoefer",email:"dieterdreist@gmail.com"}]},"Trentino-Mailing-List":{id:"Trentino-Mailing-List",featureId:"trentino",type:"mailinglist",countryCodes:["it"],languageCodes:["it"],name:"OpenStreetMap mailing list for Trentino",description:"OpenStreetMap Italy regional talk list for Trentino",url:"https://lists.openstreetmap.org/listinfo/talk-it-trentino",contacts:[{name:"Luca Delucchi",email:"lucadeluge@gmail.com"}]},"no-forum":{id:"no-forum",type:"forum",featureId:"norway",countryCodes:["no"],languageCodes:["no"],name:"OpenStreetMap Norway Web Forum",description:"OpenStreetMap Norway web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=68",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}]},"no-irc":{id:"no-irc",featureId:"norway",type:"irc",name:"OpenStreetMap Norway on IRC",countryCodes:["no"],languageCodes:["no"],description:"Chat room for mappers and OpenStreetMap users, developers and enthusiasts in Norway",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}],url:"https://webchat.oftc.net/?channels=osm-no"},"no-mailinglist":{id:"no-mailinglist",featureId:"norway",type:"mailinglist",name:"OpenStreetMap Norway mailing list",countryCodes:["no"],languageCodes:["no"],description:"Mailing list for mappers and OpenStreetMap users, developers and enthusiasts in Norway",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}],url:"https://lists.nuug.no/mailman/listinfo/kart"},"OSM-PL-facebook-group":{id:"OSM-PL-facebook-group",type:"facebook",featureId:"poland",countryCodes:["pl"],languageCodes:["pl"],name:"OpenStreetMap Poland Facebook group",description:"Group for mappers and users of OpenStreetMap in Poland",url:"https://www.facebook.com/groups/500589303317858/",contacts:[{name:"Michał Brzozowski",email:"www.haxor@gmail.com"}]},"OSM-PL-forum":{id:"OSM-PL-forum",type:"forum",featureId:"poland",countryCodes:["pl"],languageCodes:["pl","en"],name:"OpenStreetMap Poland Forum",description:"Forum of Polish OpenStreetMap community",url:"https://forum.openstreetmap.org/viewforum.php?id=23",contacts:[{name:"Daniel Koć",email:"daniel@xn--ko-wla.pl"},{name:"Ryszard Mikke",email:"ryszard.mikke@gmail.com"}]},"si-forum":{id:"si-forum",type:"forum",featureId:"slovenia",countryCodes:["si"],languageCodes:["sl","en"],name:"OpenStreetMap Slovenia Forum",description:"Forum of OpenStreetMap community in Slovenia",url:"https://forum.openstreetmap.org/viewforum.php?id=58",contacts:[{name:"OpenStreetMap Slovenia",email:"talk-si@openstreetmap.org"}]},"si-mailinglist":{id:"si-mailinglist",type:"mailinglist",featureId:"slovenia",countryCodes:["si"],languageCodes:["sl","en"],name:"OpenStreetMap Slovenia mailing list",description:"Mailing list of OpenStreetMap community in Slovenia",url:"https://lists.openstreetmap.org/listinfo/talk-si",contacts:[{name:"OpenStreetMap Slovenia",email:"talk-si@openstreetmap.org"}]},"OSM-ES-mailinglist":{id:"OSM-ES-mailinglist",type:"mailinglist",featureId:"spain",languageCodes:["es"],name:"Talk-es mailing list",description:"A mailing list to discuss OpenStreetMap in Spain",url:"https://lists.openstreetmap.org/listinfo/talk-es",contacts:[{name:"Iván Sánchez",email:"ivansanchez@escomposlinux.org"}]},"OSM-ES-telegram":{id:"OSM-ES-telegram",type:"telegram",featureId:"spain",languageCodes:["es"],name:"@OSMes on Telegram",description:"OpenStreetMap Spain Telegram chat",url:"https://t.me/OSMes",contacts:[{name:"Jorge Sanz",email:"sanchi2@gmail.com"}]},"osm-se":{id:"osm-se",featureId:"sweden",type:"group",countryCodes:["se"],languageCodes:["sv"],name:"OpenStreetMap.se",description:"Provide OSM services and information for the local community in Sweden",url:"http://openstreetmap.se/",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-facebook":{id:"se-facebook",featureId:"sweden",type:"facebook",name:"OpenStreetMap Sweden Facebook",countryCodes:["se"],languageCodes:["sv"],description:"OpenStreetMap Sweden on Facebook",url:"https://www.facebook.com/groups/osmsweden/",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-forum":{id:"se-forum",type:"forum",featureId:"sweden",countryCodes:["se"],languageCodes:["sv"],name:"OpenStreetMap Sweden Web Forum",description:"OpenStreetMap Sweden web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=4",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-irc":{id:"se-irc",featureId:"sweden",type:"irc",name:"OpenStreetMap Sweden IRC",countryCodes:["se"],languageCodes:["sv"],description:"Join #osm.se on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm.se",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-mailinglist":{id:"se-mailinglist",featureId:"sweden",type:"mailinglist",name:"Talk-se Mailing List",countryCodes:["se"],languageCodes:["sv"],description:"A mailing list to discuss OpenStreetMap in Sweden",url:"https://lists.openstreetmap.org/listinfo/talk-se",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-twitter":{id:"se-twitter",featureId:"sweden",type:"twitter",name:"OpenStreetMap Sweden on Twitter",countryCodes:["se"],languageCodes:["sv"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/openstreetmapse",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"Nottingham-OSM-pub-meetup":{id:"Nottingham-OSM-pub-meetup",featureId:"east_midlands_uk",type:"group",name:"East Midlands (Nottingham) Monthly pub meet-up",countryCodes:["gb"],languageCodes:["en"],description:"Social gathering for East Midlands mappers and users",extendedDescription:"A group have been meeting since March 2011, initially in Nottingham, and, more recently in Derby, and from time to time elsewhere in the East Midlands. These are social gatherings, but are an excellent place to come and ask specific questions about OSM either in the area or in general. In the summer months we usually do some light mapping for an hour in the vicinity of our meeting place. The group as a whole has a special interest in mapping public rights of way and from time to time has mapping meetings for this purpose.",url:"https://wiki.openstreetmap.org/wiki/Nottingham/Pub-meetup",contacts:[{name:"Jerry Clough",email:"SK53.osm@gmail.com"}]},"gb-mailinglist":{id:"gb-mailinglist",featureId:"united_kingdom",type:"mailinglist",name:"Talk-gb Mailing List",countryCodes:["gb"],languageCodes:["en","cy"],description:"Talk-gb is the main communication forum list for the British (including Northern Ireland) OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-gb",contacts:[{name:"UK mailing list",email:"talk-gb-owner@lists.openstreetmap.org"}]},"mappa-mercia-group":{id:"mappa-mercia-group",featureId:"england-west-midlands",type:"group",countryCodes:["gb"],languageCodes:["en"],name:"Mappa Mercia local group",description:"A home for OpenStreetMap enthusiasts in the Midlands",extendedDescription:"Mappa Mercia is a project to grow OpenStreetMap in the West Midlands, UK. We run community events, provide training and support local organisations wishing to open up their data.",url:"http://www.mappa-mercia.org/",contacts:[{name:"Brian Prangle",email:"community@mappa-mercia.org"}]},"gb-irc":{id:"gb-irc",featureId:"united_kingdom",type:"irc",name:"OpenStreetMap United Kingdom IRC",countryCodes:["gb"],languageCodes:["en","cy"],description:"Join #osm-gb on irc.oftc.net (port 6667)",extendedDescription:"Join #osm-gb on irc.oftc.net (port 6667), please be patient and wait for a few minutes if you ask a question",url:"https://irc.openstreetmap.org/?chan=osm-gb",contacts:[{name:"UK mailing list",email:"talk-gb-owner@lists.openstreetmap.org"}]},"OSM-CA-Slack":{id:"OSM-CA-Slack",featureId:"canada_full",type:"slack",countryCodes:["ca"],languageCodes:["en","fr"],name:"OSM-CA Slack",description:"All are welcome! Sign up at {signupUrl}.",signupUrl:"https://slackinviteosmcanada.herokuapp.com/",url:"https://osm-ca.slack.com/",contacts:[{name:"Denis Carriere",email:"carriere.denis@gmail.com"}]},"OSM-Vancouver-meetup":{id:"OSM-Vancouver-meetup",featureId:"vancouver_metro",type:"meetup",name:"OpenStreetMap Vancouver",countryCodes:["ca"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Vancouver, BC area",url:"https://www.meetup.com/OpenStreetMap-Vancouver/",contacts:[{name:"Paul Norman",email:"penorman@mac.com"},{name:"Peter Chin",email:"bpchin@gmail.com"}],events:[{name:"April Metrotown Mappy Hour",description:"Mappy Hour is the time and place for discussion of OpenStreetMap, from surveying data to consuming data. Beginners welcome. Bring your questions.",when:"2018-04-27 18:30",where:"Firefighters' Public House, 6515 Bonsor Avenue, Burnaby, BC",url:"https://www.meetup.com/OpenStreetMap-Vancouver/events/qzsbsmyxgbkc/"}]},"OSM-CU-telegram":{id:"OSM-CU-telegram",type:"telegram",featureId:"cuba",countryCodes:["cu"],languageCodes:["es"],name:"OSM Cuba on Telegram",description:"OpenStreetMap Cuba Telegram chat",url:"https://telegram.me/OSM_Cuba",contacts:[{name:"Talk-cu Owner",email:"talk-cu-owner@openstreetmap.org"}]},"OSM-NI-telegram":{id:"OSM-NI-telegram",type:"telegram",featureId:"nicaragua",countryCodes:["ni"],languageCodes:["es"],name:"OSM Nicaragua on Telegram",description:"OpenStreetMap Nicaragua Telegram chat",url:"https://telegram.me/MapaNica",contacts:[{name:"Talk-ni Owner",email:"talk-ni-owner@openstreetmap.org"}]},"Bay-Area-OpenStreetMappers":{id:"Bay-Area-OpenStreetMappers",featureId:"sf_bay_area",type:"meetup",name:"Bay Area OpenStreetMappers",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the Bay Area",extendedDescription:"This group is about growing the OpenStreetMap community here in the Bay Area. Our events are open to everyone, from open source enthusiasts, cyclists, GIS professionals, geocachers, and beyond. Anyone and everyone who is interested in maps, map making and free map data is welcome to join our group as well as attend our events.",url:"https://www.meetup.com/Bay-Area-OpenStreetMappers/",contacts:[{name:"Ben Discoe",email:"bdiscoe@gmail.com"}]},"Central-Pennsylvania-OSM":{id:"Central-Pennsylvania-OSM",featureId:"central_pa",type:"facebook",name:"Central Pennsylvania OSM",countryCodes:["us"],languageCodes:["en"],description:"Online mapping community based out of State College, PA",url:"https://www.facebook.com/CentralPennsylvaniaOSM",contacts:[{name:"Sterling Quinn",email:"sdq107@psu.edu"}]},"Code-for-San-Jose-Slack":{id:"Code-for-San-Jose-Slack",featureId:"south_sf_bay_area",type:"slack",countryCodes:["us"],languageCodes:["en"],name:"Code for San Jose Slack",description:"All are welcome! Sign up at {signupUrl}, then join the #osm channel.",signupUrl:"https://slackin-c4sj.herokuapp.com/",url:"https://codeforsanjose.slack.com/",contacts:[{name:"OSM Bay Area mailing list",email:"talk-us-sfbay@openstreetmap.org"}]},"Dallas-Fort-Worth-OSM":{id:"Dallas-Fort-Worth-OSM",featureId:"dfw_metro",type:"group",name:"Dallas-Fort Worth OSM",countryCodes:["us"],languageCodes:["en"],description:"The OpenStreetMap user group for Dallas-Fort Worth",extendedDescription:"Dallas, Fort Worth, and all the cities in between are abounding with creative and tech-savvy people. The vision for this usergroup is to find new ways to use the amazing resource of OSM.",url:"http://dfwosm.org/",contacts:[{name:"Andrew Matheny",email:"andrewdmatheny@gmail.com"}]},GeoPhilly:{id:"GeoPhilly",featureId:"philly_metro",type:"meetup",name:"GeoPhilly",countryCodes:["us"],languageCodes:["en"],description:"Meetup for map enthusiasts in the Philadelphia area",extendedDescription:"GeoPhilly unites developers, geographers, data geeks, open source enthusiasts, civic hackers and map addicts in our shared love of maps and the stories they tell. If you use maps as part of your work or just want to learn more, this is the meetup for you! Our events aim to be open, friendly, educational and social and range from happy hours to lightning talks or even workshops. Come create a diverse, inspiring geospatial community in the Philadelphia with us!",url:"https://www.meetup.com/GeoPhilly/",contacts:[{name:"Dan Ford",email:"dford@azavea.com"}]},MapMinnesota:{id:"MapMinnesota",featureId:"minneapolis_st_paul_metro",type:"meetup",name:"MapMinnesota",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap enthusiasts in the Twin Cities area",extendedDescription:"Connecting OpenStreetMap enthusiasts in Minnesota and the Twin Cities!",url:"https://www.meetup.com/Map-Minnesota/",contacts:[{name:"Ian Dees",email:"ian.dees@gmail.com"}]},"Mapping-DC-meetup":{id:"Mapping-DC-meetup",featureId:"dc_metro",type:"meetup",name:"Mapping DC",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the DC area",extendedDescription:"We are a group of volunteer mappers who aim to improve the OpenStreetMap in the DC area. We also aim to teach others about the OSM ecosystem, data analytics, cartography, and GIS. We gather every other month at meetups to focus on one area of our city.",url:"https://mappingdc.org/",contacts:[{name:"Brian DeRocher",email:"brian@derocher.org"}],events:[{name:"April Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-04-10 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxgbnb/"},{name:"June Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-06-12 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxjbqb/"},{name:"August Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-08-14 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxlbsb/"},{name:"October Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-10-09 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxnbmb/"}]},"Maptime-ME-meetup":{id:"Maptime-ME-meetup",featureId:"portland_me",type:"meetup",name:"MaptimeME",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users, around Portland, ME",extendedDescription:"Maptime is, rather literally, time for mapmaking. Our mission is to open the doors of cartographic possibility to anyone interested by creating a time and space for collaborative learning, exploration, and map creation using mapping tools and technologies.",url:"https://www.meetup.com/MaptimeME/",contacts:[{name:"Malcolm Toon",email:"malcolm@foreflight.com"}]},"OpenCleveland-meetup":{id:"OpenCleveland-meetup",featureId:"cleveland",type:"meetup",name:"Open Cleveland",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the Cleveland area",extendedDescription:"Open Geo Cleveland aims to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Northeast Ohio. We're also a maptime chapter =)",url:"https://www.meetup.com/open-cleveland/",contacts:[{name:"Will Skora",email:"skorasaurus@gmail.com"},{name:"Anastasia Diamond-Ortiz",email:"anastasia.diamond@gmail.com"}],events:[{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-04-18 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxgbxb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-04-25 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxgbhc/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-02 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbdb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-09 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbmb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-16 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbvb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-23 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbfc/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-30 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbnc/"}]},"OSM-Boston":{id:"OSM-Boston",featureId:"boston_metro",type:"meetup",name:"OpenStreetMap Boston",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Boston area",extendedDescription:"OpenStreetMap is the free and open, wiki-style map of the world, with hundreds of thousands of contributions every day from people like you. Editing the map is simple, and fun! Join us both indoors and outdoors in our effort to create the best map of the Boston area and the rest of the world!",url:"https://www.meetup.com/OpenStreetMap-Boston/",contacts:[{name:"Lars Ahlzen",email:"lars@ahlzen.com"}]},"OSM-Central-Salish-Sea":{id:"OSM-Central-Salish-Sea",featureId:"mt_vernon_wa",type:"meetup",name:"OpenStreetMap Central Salish Sea",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Mount Vernon, WA",extendedDescription:"OpenStreetMap is an map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more. We meet all the time to talk maps, make maps and have fun!",url:"https://www.meetup.com/OpenStreetMap-Central-Salish-Sea/",contacts:[{name:"Clifford Snow",email:"clifford@snowandsnow.us"}]},"OSM-Chattanooga":{id:"OSM-Chattanooga",featureId:"chattanooga",type:"facebook",name:"OSM Chattanooga",countryCodes:["us"],languageCodes:["en"],description:"The OpenStreetMap user group for Chattanooga",url:"https://www.facebook.com/groups/123483951073256",contacts:[{name:"Jenny Park",email:"tennessee@tpl.org"},{name:"Randal Hale",email:"rjhale@northrivergeographic.com"}]},"OSM-Colorado":{id:"OSM-Colorado",featureId:"colorado",type:"meetup",name:"OpenStreetMap Colorado",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the state of Colorado, USA",extendedDescription:"OpenStreetMap (OSM) Colorado is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties.",url:"https://www.meetup.com/OSM-Colorado/",contacts:[{name:"Russell Deffner",email:"russdeffner@gmail.com"}]},"OSM-NYC":{id:"OSM-NYC",featureId:"nyc_metro",type:"meetup",name:"OpenStreetMap NYC",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users, developers and enthusiasts in the New York Metropolitan area",url:"https://www.meetup.com/osm-nyc/",contacts:[{name:"Jeff Ferzoco",email:"jferzoco@carto.com"}]},"OSM-Portland":{id:"OSM-Portland",featureId:"portland_or",type:"meetup",name:"OpenStreetMap Portland",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Portland area",extendedDescription:"OpenStreetMap (OSM) is a map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more, and come join us at a meetup to talk maps, contribute to OSM, and have fun!",url:"https://www.meetup.com/OpenStreetMap-Portland/",contacts:[{name:"Madeline Steele",email:"madeline.steele@gmail.com"}]},"OSM-Seattle":{id:"OSM-Seattle",featureId:"seattle",type:"meetup",name:"OpenStreetMap Seattle",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Seattle area",url:"https://www.meetup.com/OpenStreetMap-Seattle/",contacts:[{name:"Clifford Snow",email:"clifford@snowandsnow.us"},{name:"Chase Stephens",email:"seattlefyi@gmail.com"},{name:"Paul McCombs",email:"pablo@imperium.org"}]},"OSM-SoCal":{id:"OSM-SoCal",featureId:"la_metro",type:"meetup",name:"OpenStreetMap Southern California",countryCodes:["us"],languageCodes:["en"],description:"Let's have some fun, contribute something to Los Angeles, and learn about mapping!",extendedDescription:"OpenStreetMap (OSM) Southern California is for anyone interested in mapping to get together to work with OpenStreetMap. OpenStreetMap, the Wikipedia of maps, is a free open-source map of the world being created by more than 1,000,000 volunteers around the globe. Everyone is welcome. If you don't know OpenStreetMap, we'll teach you. If you have an idea for a mapping project or even a field trip that the group can do, great!",url:"https://www.meetup.com/OSM-Southern-California/",contacts:[{name:"Charlotte Wolter",email:"techlady@techlady.com"}]},"OSM-South-Bay":{id:"OSM-South-Bay",featureId:"south_sf_bay_area",type:"meetup",name:"OSM South Bay",countryCodes:["us"],languageCodes:["en"],description:"Map Nights hosted by Code for San Jose",extendedDescription:"Code for San Jose, the local Code for America brigade, hosts monthly Map Nights on Thursday nights in downtown San José. Meet fellow South Bay mappers, help out with local mapping projects, and hear about other civic tech projects. Programming and GIS skills are not required.",url:"https://www.meetup.com/Code-for-San-Jose/",contacts:[{name:"OSM Bay Area mailing list",email:"talk-us-sfbay@openstreetmap.org"}]},"OSM-Tampa-Bay":{id:"OSM-Tampa-Bay",featureId:"tampa_bay",type:"meetup",name:"OpenStreetMap Tampa Bay",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Tampa Bay area",extendedDescription:"OSM Tampa Bay group for local residents to get together and build out the definitive map of Tampa Bay with OpenStreetMap, the free and editable map of the world. If you're into maps, data, open source, GPS, hiking, cycling, et cetera, you'll love working with OpenStreetMap -- so join in! We'll get together and map and talk about new topics once-a-month or so.",url:"https://www.meetup.com/osmtampabay/",contacts:[{name:"Coleman McCormick",email:"cmccormick@gmail.com"}]},"OSM-US-Slack":{id:"OSM-US-Slack",featureId:"usa_full",type:"slack",countryCodes:["us"],languageCodes:["en"],name:"OpenStreetMap US Slack",description:"All are welcome! Sign up at {signupUrl}",signupUrl:"https://osmus-slack.herokuapp.com/",url:"https://osmus.slack.com",contacts:[{name:"Ian Dees",email:"ian@openstreetmap.us"},{name:"Clifford Snow",email:"clifford@snowandsnow.us"}]},"OSM-US":{id:"OSM-US",featureId:"usa_full",type:"group",countryCodes:["us"],languageCodes:["en"],name:"OpenStreetMap US",description:"We help grow and improve OpenStreetMap in the United States.",extendedDescription:"We support OpenStreetMap by holding annual conferences, providing community resources, building partnerships, and by spreading the word. Join OpenStreetMap US here: {signupUrl}",signupUrl:"https://www.openstreetmap.us/join",url:"https://www.openstreetmap.us/",contacts:[{name:"Ian Dees",email:"ian@openstreetmap.us"},{name:"Bryan Housel",email:"bryan@openstreetmap.us"}],events:[{id:"sotmus2018",i18n:true,name:"State of the Map US 2018",description:"Join the OpenStreetMap community at State of the Map US in Detroit, Michigan. Connect with other mappers, businesses, government agencies, and non profits, all collaborating around the free and editable map of the world.",where:"Detroit, Michigan",when:"2018-oct-05",url:"https://2018.stateofthemap.us/"}]},"OSM-Utah":{id:"OSM-Utah",featureId:"salt_lake_city",type:"meetup",name:"OpenStreetMap Utah",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Salt Lake City area",extendedDescription:"Activities may include things like Learn To Map workshops, mapping parties and outdoor data collection. The events will take place in the SLC area, at least initially. We are looking for seasoned mappers as well as people new to OSM. Join and let's do some mapping!",url:"https://www.meetup.com/OpenStreetMap-Utah/",contacts:[{name:"Martijn van Exel",email:"m@rtijn.org"}]},"OSM-Wyoming":{id:"OSM-Wyoming",featureId:"wyoming",type:"meetup",name:"OpenStreetMap Wyoming",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the state of Wyoming",extendedDescription:"OpenStreetMap (OSM) Wyoming is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties.",url:"https://www.meetup.com/OSM-Wyoming/",contacts:[{name:"Russell Deffner",email:"russdeffner@gmail.com"}]},"PHXGeo-meetup":{id:"PHXGeo-meetup",featureId:"phoenix",type:"meetup",name:"PHXGeo Meetup",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Phoenix, AZ area",extendedDescription:"This is a meetup group for those in the Phoenix area who like maps, GIS, OpenStreetMap, cartography and anything in between.",url:"https://www.meetup.com/PHXGeo/",contacts:[{name:"Ryan Arp",email:"ryan@arpconsultinggroup.com"}]},"PHXGeo-twitter":{id:"PHXGeo-twitter",featureId:"phoenix",type:"twitter",name:"PHXGeo Twitter",countryCodes:["us"],languageCodes:["en"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/phxgeo",contacts:[{name:"Ryan Arp",email:"ryan@arpconsultinggroup.com"}]},"Western-Slope-facebook":{id:"Western-Slope-facebook",featureId:"grand_junction_co",type:"facebook",name:"Western Slope OSM Facebook",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Grand Junction, CO",url:"https://www.facebook.com/wsosm/",contacts:[{name:"Aaron Young",email:"aaron@kaartgroup.com"}]},"Western-Slope-meetup":{id:"Western-Slope-meetup",featureId:"grand_junction_co",type:"meetup",name:"Western Slope OSM Meetup",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Grand Junction, CO",extendedDescription:"The goal of this group is to introduce OpenStreetMap to the community, develop a community of mappers, create the most amazing geodata possible using whatever method we can and finally strategize in order to get this data out into our community. Imagine accurate trail signage! Imagine further development of bike paths! Imagine anything you want, that's the joy of OpenStreetMap!",url:"https://www.meetup.com/Western-Slope-OpenStreetMap/",contacts:[{name:"Aaron Young",email:"aaron@kaartgroup.com"}]},"Maptime-Australia-Slack":{id:"Maptime-Australia-Slack",featureId:"australia_full",type:"slack",countryCodes:["au"],languageCodes:["en"],name:"Maptime Australia Slack",description:"Sign up at {signupUrl}",signupUrl:"https://bit.ly/maptimeau",url:"https://maptimeaustralia.slack.com",contacts:[{name:"David Dean",email:"ddean@ieee.org"},{name:"Philip Mallis",email:"philip.mallis@unimelb.edu.au"},{name:"Edoardo Neerhut",email:"ed@mapillary.com"}]},"talk-au":{id:"talk-au",featureId:"australia_full",type:"mailinglist",countryCodes:["au"],languageCodes:["en"],name:"Talk-au Mailing List",description:"Place for Aussie mappers to chat",url:"https://lists.openstreetmap.org/listinfo/talk-au",contacts:[{name:"Ben Kelley",email:"ben.kelley@gmail.com"},{name:"Steve Bennett",email:"stevagewp@gmail.com"},{name:"Ian Sergeant",email:"inas66+osm@gmail.com"}]},"OSM-AR-facebook":{id:"OSM-AR-facebook",featureId:"argentina",type:"facebook",name:"OpenStreetMap Argentina Facebook",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina community on Facebook",extendedDescription:"News from the local community",url:"https://www.facebook.com/OpenStreetMapArgentina/",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-forum":{id:"OSM-AR-forum",featureId:"argentina",type:"forum",name:"OpenStreetMap Argentina web forum",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina web forum",extendedDescription:"Ideal for long or important discussions. Slow response time.",url:"https://forum.openstreetmap.org/viewforum.php?id=49",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-irc":{id:"OSM-AR-irc",featureId:"argentina",type:"irc",name:"OpenStreetMap Argentina IRC",countryCodes:["ar"],languageCodes:["es"],description:"Join #osm-ar on irc.oftc.net (port 6667)",extendedDescription:"You may find the most geeky user in the community.",url:"https://irc.openstreetmap.org/?chan=osm-ar",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-mailinglist":{id:"OSM-AR-mailinglist",featureId:"argentina",type:"mailinglist",name:"Talk-ar Mailing List",countryCodes:["ar"],languageCodes:["es"],description:"Historic mailing list. Almost unused today.",url:"https://lists.openstreetmap.org/pipermail/talk-ar/",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-telegram":{id:"OSM-AR-telegram",featureId:"argentina",type:"telegram",name:"OpenStreetMap Argentina Telegram",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina community on Telegram",extendedDescription:"The most active channel in the community, ideal for chatting and getting answers to your questions instantly. Everyone is welcome!",url:"https://telegram.me/osm_ar",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-twitter":{id:"OSM-AR-twitter",featureId:"argentina",type:"twitter",name:"OpenStreetMap Argentina Twitter",countryCodes:["ar"],languageCodes:["es"],description:"Follow us on Twitter at {url}",extendedDescription:"News from the local community and OpenStreetMap in general.",url:"https://twitter.com/OpenStreetMapAr",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-BO-mailinglist":{id:"OSM-BO-mailinglist",featureId:"bolivia",type:"mailinglist",name:"Talk-bo Mailing List",countryCodes:["bo"],languageCodes:["es"],description:"Talk-bo is the official mailing list for the Bolivian OpenStreetMap community",extendedDescription:"Mapping in Bolivia? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://lists.openstreetmap.org/pipermail/talk-bo/",contacts:[{name:"Marco Antonio",email:"marcoantoniofrias@gmail.com"}]},"Bahia-telegram":{id:"Bahia-telegram",featureId:"bahia",type:"telegram",name:"OpenStreetMap Bahia Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Bahia community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMBA",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"DF-telegram":{id:"DF-telegram",featureId:"df_br",type:"telegram",name:"OpenStreetMap Brasília Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Brasília community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/osmbsb",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"OSM-br-mailinglist":{id:"OSM-br-mailinglist",featureId:"brazil",type:"mailinglist",name:"Talk-br Mailing List",countryCodes:["br"],languageCodes:["pt"],description:"A mailing list to discuss OpenStreetMap in Brazil",url:"https://lists.openstreetmap.org/pipermail/talk-br/",contacts:[{name:"Arlindo Pereira",email:"nighto@gmail.com"}]},"OSM-br-telegram":{id:"OSM-br-telegram",featureId:"brazil",type:"telegram",name:"OpenStreetMap Brasil Telegram",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Brasil community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMBrasil_Comunidade",contacts:[{name:"Vitor George",email:"vitor.george@gmail.com"}],events:[{id:"webinar_mundogeo",name:"Webinar: OpenStreetMap em Prefeituras e Empresas",description:"Participe do webinar sobre como utilizar o OpenStreeMap em prefeituras e empresas.",where:"Online",when:"2018-05-02 14:30",url:"http://mundogeo.com/webinar/webinar.html"},{id:"mundogeo",name:"Painel OpenStreetMap no MundoGeo #connect",description:"Participe do painel sobre o OpenStreetMap no MundoGeo #connect.",where:"São Paulo, SP, Brasil",when:"2018-05-16 11:00",url:"http://mundogeoconnect.com/2018/atividades-especiais/"}]},"OSM-br-twitter":{id:"OSM-br-twitter",featureId:"brazil",type:"twitter",name:"OpenStreetMap Brasil Twitter",countryCodes:["br"],languageCodes:["pt"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapBR",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"OSM-CL-facebook":{id:"OSM-CL-facebook",featureId:"chile",type:"facebook",name:"OpenStreetMap Chile Facebook",countryCodes:["cl"],languageCodes:["es"],description:"Join the OpenStreetMap Chile community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://www.facebook.com/OpenStreetMap-Chile-145127198882915/",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-mailinglist":{id:"OSM-CL-mailinglist",featureId:"chile",type:"mailinglist",name:"Talk-cl Mailing List",countryCodes:["cl"],languageCodes:["es"],description:"A mailing list to discuss OpenStreetMap in Chile",url:"https://lists.openstreetmap.org/pipermail/talk-cl/",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-telegram":{id:"OSM-CL-telegram",featureId:"chile",type:"telegram",name:"OpenStreetMap Chile Telegram",countryCodes:["cl"],languageCodes:["es"],description:"Join the OpenStreetMap Chile community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMcl",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-twitter":{id:"OSM-CL-twitter",featureId:"chile",type:"twitter",name:"OpenStreetMap Chile Twitter",countryCodes:["cl"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmCL",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"Maptime-Bogota":{id:"Maptime-Bogota",featureId:"bogota",type:"meetup",name:"Maptime Bogotá",countryCodes:["co"],languageCodes:["es"],description:"We're a group of mappers interested in mapping in OpenStreetMap around Bogotá.",extendedDescription:"Learn to collect data in the field and digitize onto OpenStreetMap. It is not necessary to have previous knowledge! You just need the desire to participate, learn, and have fun.",url:"https://www.meetup.com/Maptime-Colombia-OSM/",contacts:[{name:"Andrés Gómez Casanova",email:"angoca@gmail.com"}]},"OSM-CO-facebook":{id:"OSM-CO-facebook",featureId:"colombia",type:"facebook",name:"OpenStreetMap Colombia Facebook",countryCodes:["co"],languageCodes:["es"],description:"Join the OpenStreetMap Colombia community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap. Everyone is welcome!",url:"https://www.facebook.com/groups/OsmCol/",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-mailinglist":{id:"OSM-CO-mailinglist",featureId:"colombia",type:"mailinglist",name:"Talk-co Mailing List",countryCodes:["co"],languageCodes:["es"],description:"A mailing list to discuss OpenStreetMap in Colombia",url:"https://lists.openstreetmap.org/pipermail/talk-co/",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-telegram":{id:"OSM-CO-telegram",type:"telegram",featureId:"colombia",countryCodes:["co"],languageCodes:["es"],name:"OSM Colombia on Telegram",description:"OpenStreetMap Colombia Telegram chat",url:"https://telegram.me/osmco",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-twitter":{id:"OSM-CO-twitter",featureId:"colombia",type:"twitter",name:"OpenStreetMap Colombia Twitter",countryCodes:["co"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapCo",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO":{id:"OSM-CO",featureId:"colombia",type:"group",countryCodes:["co"],languageCodes:["es"],name:"OpenStreetMap Colombia",description:"News of the OpenStreetMap Colombia community and the OSMCo Foundation",url:"https://blog.openstreetmap.co/s657",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-EC-telegram":{id:"OSM-EC-telegram",type:"telegram",featureId:"ecuador",languageCodes:["es"],countryCodes:["ec"],name:"OSM Ecuador on Telegram",description:"OpenStreetMap Ecuador Telegram chat",url:"https://telegram.me/MappingEcuador",contacts:[{name:"Talk-ec Owner",email:"talk-ec-owner@openstreetmap.org"}]},"OSM-PY-telegram":{id:"OSM-PY-telegram",type:"telegram",featureId:"paraguay",languageCodes:["es"],countryCodes:["py"],name:"OSM Paraguay on Telegram",description:"OpenStreetMap Paraguay Telegram chat",url:"https://telegram.me/osm_py",contacts:[{name:"Talk-py Owner",email:"talk-py-owner@openstreetmap.org"}]},"OSM-PE-facebook":{id:"OSM-PE-facebook",featureId:"peru",type:"facebook",name:"OpenStreetMap Peru Facebook",countryCodes:["pe"],languageCodes:["es"],description:"Join the OpenStreetMap Peru community on Facebook",url:"https://www.facebook.com/Osmpe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-mailinglist":{id:"OSM-PE-mailinglist",featureId:"peru",type:"mailinglist",name:"Talk-pe Mailing List",countryCodes:["pe"],languageCodes:["es"],description:"The official mailing list for the OpenStreetMap Peru community",url:"https://lists.openstreetmap.org/pipermail/talk-pe/",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-matrix":{id:"OSM-PE-matrix",featureId:"peru",type:"matrix",name:"OpenStreetMap Peru Matrix Chat",countryCodes:["pe"],languageCodes:["es"],description:"Chat with other members of the OpenStreetMap Peru community in Matrix.",url:"https://matrix.to/#/#osmpe:matrix.org",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-telegram":{id:"OSM-PE-telegram",featureId:"peru",type:"telegram",name:"OpenStreetMap Peru Telegram",countryCodes:["pe"],languageCodes:["es"],description:"Join the OpenStreetMap Peru community on Telegram",url:"https://telegram.me/osmPe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-twitter":{id:"OSM-PE-twitter",featureId:"peru",type:"twitter",name:"OpenStreetMap Peru Twitter",countryCodes:["pe"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmpe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE":{id:"OSM-PE",featureId:"peru",type:"group",name:"OpenStreetMap Peru",countryCodes:["ar"],languageCodes:["es"],description:"News and resources for the OpenStreetMap Peru community",url:"http://osmpe.ourproject.org/",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-Facebook":{id:"OSM-Facebook",type:"facebook",languageCodes:["en"],name:"OpenStreetMap on Facebook",description:"Like us on Facebook for news and updates about OpenStreetMap.",url:"https://www.facebook.com/OpenStreetMap",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},"OSM-help":{id:"OSM-help",type:"forum",languageCodes:["en"],name:"OpenStreetMap Help",description:"Ask a question and get answers on OSM's community-driven question and answer site.",extendedDescription:"{url} is for everyone who needs help with OpenStreetMap. Whether you are a beginner mapper or have a technical question, we're here to help!",url:"https://help.openstreetmap.org/",contacts:[{name:"OSMF Operations",email:"operations@osmfoundation.org"}]},"OSM-Reddit":{id:"OSM-Reddit",type:"reddit",languageCodes:["en"],name:"OpenStreetMap on Reddit",description:"/r/openstreetmap/ is a great place to learn more about OpenStreetMap. Ask us anything!",url:"https://www.reddit.com/r/openstreetmap/",contacts:[{name:"Serge Wroclawski",email:"emacsen@gmail.com"}]},"OSM-Telegram":{id:"OSM-Telegram",type:"telegram",languageCodes:["en"],name:"OpenStreetMap Telegram",description:"Join the OpenStreetMap Telegram global supergroup at {url}",url:"https://t.me/OpenStreetMapOrg",contacts:[{name:"Max N",email:"abonnements@revolwear.com"}]},"OSM-Twitter":{id:"OSM-Twitter",type:"twitter",languageCodes:["en"],name:"OpenStreetMap Twitter",description:"Follow us on Twitter at {url}",url:"https://twitter.com/openstreetmap",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},OSMF:{id:"OSMF",type:"group",languageCodes:["en","nl","fr","it","jp","ru"],name:"OpenStreetMap Foundation",description:"OSMF is a UK-based not-for-profit that supports the OpenStreetMap Project",extendedDescription:"OSMF supports the OpenStreetMap by fundraising, maintaining the servers which power OSM, organizing the annual State of the Map conference, and coordinating the volunteers who keep OSM running. You can show your support and have a voice in the direction of OpenStreetMap by joining as an OSMF member here: {signupUrl}",url:"https://wiki.osmfoundation.org/wiki/Main_Page",signupUrl:"https://join.osmfoundation.org/",contacts:[{name:"OSMF Board",email:"board@osmfoundation.org"}],events:[{id:"sotm2018",i18n:true,name:"State of the Map 2018",description:"Join us for 3 days in Milan, Italy for the annual worldwide OpenStreetMap conference, bringing together everyone in the community to socialize, share, and learn.",where:"Milan, Italy",when:"2018-jul-28",url:"https://2018.stateofthemap.org/"}]}};
23656 var dataImagery = [{id:"sjcgis.org-Aerials_2013_WM",name:"2013 aerial imagery for San Juan County WA",type:"tms",template:"https://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.02167,48.44667],[-122.94666,48.44781],[-122.90151,48.41307],[-122.80263,48.40771],[-122.79199,48.4428],[-122.80881,48.47866],[-122.73912,48.49572],[-122.78547,48.62161],[-122.73088,48.63613],[-122.7556,48.71208],[-122.95747,48.71593],[-122.97086,48.69577],[-122.9997,48.6978],[-123.00348,48.73427],[-123.0433,48.7431],[-123.07626,48.70528],[-123.08485,48.66335],[-123.12845,48.6638],[-123.22698,48.70302],[-123.24655,48.68353],[-123.17445,48.64702],[-123.21514,48.60107],[-123.21393,48.57336],[-123.1808,48.56575],[-123.16621,48.52006],[-123.10235,48.47684],[-123.02167,48.44667]],[[-122.98339,48.78214],[-122.93498,48.76653],[-122.91181,48.73858],[-122.80229,48.73982],[-122.81946,48.75499],[-122.9343,48.79572],[-122.98374,48.79436],[-122.98339,48.78214]]],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:"https://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.02167,48.44667],[-122.94666,48.44781],[-122.90151,48.41307],[-122.80263,48.40771],[-122.79199,48.4428],[-122.80881,48.47866],[-122.73912,48.49572],[-122.78547,48.62161],[-122.73088,48.63613],[-122.7556,48.71208],[-122.95747,48.71593],[-122.97086,48.69577],[-122.9997,48.6978],[-123.00348,48.73427],[-123.0433,48.7431],[-123.07626,48.70528],[-123.08485,48.66335],[-123.12845,48.6638],[-123.22698,48.70302],[-123.24655,48.68353],[-123.17445,48.64702],[-123.21514,48.60107],[-123.21393,48.57336],[-123.1808,48.56575],[-123.16621,48.52006],[-123.10235,48.47684],[-123.02167,48.44667]],[[-122.98339,48.78214],[-122.93498,48.76653],[-122.91181,48.73858],[-122.80229,48.73982],[-122.81946,48.75499],[-122.9343,48.79572],[-122.98374,48.79436],[-122.98339,48.78214]]],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",scaleExtent:[6,14],polygon:[[[-3.04697,54.83947],[-3.05864,55.24157],[-4.04466,55.23296],[-4.07076,55.63654],[-4.61904,55.6253],[-4.64926,56.02834],[-4.48961,56.03217],[-4.52394,56.4367],[-3.86751,56.44581],[-3.84176,56.04944],[-3.44591,56.04982],[-3.43492,55.64429],[-2.79497,55.65049],[-2.80802,56.05749],[-3.20661,56.05327],[-3.21417,56.45682],[-3.73808,56.45075],[-3.74185,56.86175],[-5.07669,56.83171],[-5.03652,56.42949],[-5.16012,56.42493],[-5.12991,56.01798],[-5.92607,55.99456],[-5.85518,55.23335],[-5.2281,55.25136],[-5.21024,55.02765],[-4.65956,55.04181],[-4.64548,54.81633],[-3.04697,54.83947]],[[-1.74835,57.76428],[-1.74065,57.36],[-2.58022,57.35537],[-2.57437,57.04526],[-2.08408,57.04799],[-2.07651,56.64276],[-2.7345,56.63906],[-2.73781,56.81718],[-3.23885,56.81437],[-3.24896,57.35168],[-3.75629,57.34889],[-3.76219,57.65868],[-4.76587,57.64473],[-4.81008,58.26984],[-5.2511,58.26547],[-5.27376,58.66767],[-3.55818,58.69887],[-3.56607,58.9316],[-3.37656,58.93444],[-3.38584,59.20171],[-3.18713,59.20215],[-3.18747,59.24176],[-3.06757,59.24203],[-3.07855,59.42135],[-2.37131,59.42763],[-2.36856,59.0222],[-2.67893,59.02078],[-2.67343,58.83935],[-2.86569,58.83651],[-2.8602,58.53531],[-3.03461,58.53316],[-3.0195,58.13159],[-3.6156,58.11982],[-3.61276,57.97754],[-3.71092,57.97562],[-3.69932,57.75364],[-1.74835,57.76428]],[[-7.07492,56.76319],[-7.73471,56.73566],[-7.7911,57.13994],[-7.70662,57.14343],[-7.76299,57.54311],[-7.60218,57.54968],[-7.62134,57.68452],[-7.72499,57.6803],[-7.73017,57.71673],[-7.60264,57.72191],[-7.59964,57.70083],[-7.48634,57.70544],[-7.49528,57.76813],[-7.37493,57.77301],[-7.39337,57.90201],[-7.23591,57.90838],[-7.24323,57.95948],[-7.13916,57.96369],[-7.14508,58.00495],[-7.23742,58.00122],[-7.23297,57.97018],[-7.31133,57.96702],[-7.31538,57.99525],[-7.24904,57.99792],[-7.28082,58.21856],[-7.07355,58.22687],[-7.0827,58.29018],[-6.80743,58.30119],[-6.82768,58.44074],[-6.50305,58.45366],[-6.51532,58.53792],[-6.16474,58.55184],[-6.10631,58.14894],[-6.33469,58.13976],[-6.27759,57.74145],[-6.96138,57.71366],[-6.93332,57.51615],[-7.10017,57.50933],[-7.05218,57.169],[-7.13111,57.16575],[-7.07492,56.76319]],[[0.41076,50.82087],[0.98102,50.80612],[0.99437,51.01173],[1.45062,50.99998],[1.47712,51.40552],[0.89619,51.42035],[0.88243,51.21039],[0.505,51.22007],[0.52273,51.49042],[-0.63397,51.51063],[-0.63671,51.44563],[-1.09951,51.45248],[-1.11485,51.04814],[-0.52987,51.0394],[-0.52751,51.10203],[0.42806,51.08778],[0.41076,50.82087]],[[-5.39457,51.9619],[-4.79581,51.98051],[-4.78873,51.89403],[-4.20265,51.91228],[-4.22941,52.23828],[-3.6552,52.25602],[-3.62228,51.85483],[-4.21342,51.8364],[-4.18551,51.49342],[-4.77661,51.47485],[-4.78476,51.57525],[-5.08799,51.56574],[-5.09422,51.64242],[-5.3678,51.63385],[-5.39457,51.9619]],[[-1.2389,54.03537],[-0.62779,54.02811],[-0.62004,54.25257],[-0.57268,54.25201],[-0.55865,54.65542],[-1.17998,54.66269],[-1.18782,54.43788],[-1.23221,54.4384],[-1.2389,54.03537]],[[-2.67227,50.97677],[-2.09961,50.98023],[-2.10572,51.37949],[-1.58877,51.38259],[-1.59499,51.78589],[-2.17563,51.78891],[-2.17154,51.38392],[-2.67846,51.38088],[-2.67227,50.97677]],[[-2.60155,53.27155],[-3.22973,53.2685],[-3.23522,53.67231],[-2.60704,53.67533],[-2.60155,53.27155]],[[-0.03942,51.7728],[-0.61563,51.77577],[-0.60465,52.58414],[-0.02843,52.58122],[-0.03942,51.7728]],[[-2.91529,54.03523],[-3.53229,54.02866],[-3.54484,54.43397],[-2.92785,54.44047],[-2.91529,54.03523]],[[-6.30583,57.19689],[-6.3539,57.60015],[-5.69111,57.62295],[-5.64305,57.21995],[-6.30583,57.19689]],[[1.17115,52.57236],[1.19865,52.97594],[1.79788,52.96106],[1.77037,52.55734],[1.17115,52.57236]],[[-2.40225,55.56317],[-2.40088,55.9657],[-1.76084,55.96501],[-1.76222,55.56248],[-2.40225,55.56317]],[[-6.32574,56.38537],[-7.0196,56.35747],[-7.07316,56.76384],[-6.3793,56.79145],[-6.32574,56.38537]],[[-2.42258,54.4431],[-2.42574,54.84188],[-1.79931,54.84354],[-1.79614,54.44477],[-2.42258,54.4431]],[[-3.02701,51.37935],[-3.60589,51.37017],[-3.62237,51.77304],[-3.04349,51.78215],[-3.02701,51.37935]],[[-3.05379,52.18979],[-3.06615,52.59374],[-2.48364,52.60034],[-2.47128,52.19646],[-3.05379,52.18979]],[[-5.67673,51.70425],[-5.67886,51.73101],[-5.4636,51.7376],[-5.46146,51.71084],[-5.67673,51.70425]],[[-5.84427,59.10882],[-5.8469,59.13578],[-5.79558,59.1371],[-5.79294,59.11014],[-5.84427,59.10882]],[[-8.64844,57.77861],[-8.66597,57.87717],[-8.46649,57.88721],[-8.44897,57.78867],[-8.64844,57.77861]],[[-4.52711,59.01532],[-4.52859,59.03319],[-4.47623,59.03434],[-4.47475,59.01646],[-4.52711,59.01532]],[[-7.68062,58.25838],[-7.68655,58.2938],[-7.53445,58.30084],[-7.52852,58.26542],[-7.68062,58.25838]],[[-6.19102,59.08009],[-6.19546,59.11586],[-6.12542,59.11815],[-6.12099,59.08238],[-6.19102,59.08009]],[[-4.42669,59.07112],[-4.42805,59.0887],[-4.37621,59.08976],[-4.37485,59.07218],[-4.42669,59.07112]]]},{id:"ACT2017",name:"ACTmapi Imagery 2017",type:"wms",template:"https://data.actmapi.act.gov.au/arcgis/services/actmapi/imagery2017mga/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:4326",endDate:"2017-05-01T00:00:00.000Z",startDate:"2017-05-01T00:00:00.000Z",scaleExtent:[0,21],polygon:[[[149.085,-35.1171],[149.1509,-35.1157],[149.1509,-35.1335],[149.1736,-35.1335],[149.1739,-35.1512],[149.1957,-35.1512],[149.1962,-35.1689],[149.2177,-35.1683],[149.2192,-35.2048],[149.241,-35.2043],[149.2419,-35.2223],[149.2632,-35.2222],[149.2644,-35.2575],[149.3085,-35.2571],[149.309,-35.2751],[149.3531,-35.2742],[149.3536,-35.2921],[149.3974,-35.2917],[149.3988,-35.3452],[149.3777,-35.3457],[149.3772,-35.3641],[149.3341,-35.3648],[149.3385,-35.5451],[149.1624,-35.5487],[149.1727,-35.9271],[149.0175,-35.9294],[149.0172,-35.9113],[148.9506,-35.9125],[148.9499,-35.8946],[148.9277,-35.8949],[148.9272,-35.8768],[148.9053,-35.8768],[148.9042,-35.8586],[148.8826,-35.859],[148.8805,-35.7695],[148.8361,-35.7698],[148.8359,-35.7521],[148.8138,-35.7524],[148.8131,-35.7343],[148.7909,-35.7347],[148.7911,-35.7167],[148.7688,-35.7167],[148.7617,-35.3924],[148.7839,-35.3921],[148.7822,-35.3022],[148.8041,-35.302],[148.8033,-35.2836],[148.8474,-35.2832],[148.8469,-35.2652],[148.8689,-35.2643],[148.8687,-35.2466],[148.9128,-35.246],[148.9123,-35.2282],[148.9341,-35.228],[148.9329,-35.1919],[148.999,-35.1904],[148.9986,-35.1724],[149.0206,-35.172],[149.0204,-35.154],[149.0637,-35.1532],[149.0635,-35.1355],[149.0857,-35.1348],[149.085,-35.1171]]],terms_url:"https://actmapi-actgov.opendata.arcgis.com/datasets/884456bde6fd46d68e0c05479f55d548",terms_text:"© Jacobs Group (Australia) Pty Ltd and Australian Capital Territory",best:true},{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.98494,50.70723],[5.98494,50.7672],[5.91079,50.82275],[5.75561,50.83533],[5.75423,50.86264],[5.8332,50.93323],[5.85517,51.02661],[5.90941,51.07754],[5.91216,51.18225],[5.87851,51.20807],[5.77414,51.23689],[5.68419,51.24075],[5.62308,51.26998],[5.62308,51.29789],[5.54,51.34724],[5.4473,51.34853],[5.39855,51.32107],[5.31203,51.32322],[5.26671,51.36182],[5.19942,51.37254],[5.18294,51.39611],[5.15891,51.4924],[5.08338,51.53086],[5.03257,51.53983],[4.95566,51.50522],[4.90142,51.50565],[4.83825,51.54367],[4.77096,51.55862],[4.7119,51.54709],[4.64049,51.49667],[4.6144,51.4971],[4.56565,51.53171],[4.48256,51.53043],[4.42626,51.52189],[4.3006,51.46974],[4.29511,51.42566],[4.18113,51.42437],[4.13718,51.39525],[4.13856,51.35067],[4.05204,51.30047],[3.93325,51.27298],[3.86527,51.27084],[3.86321,51.29016],[3.76296,51.32407],[3.59336,51.35925],[3.47732,51.33137],[3.42582,51.39739],[3.23562,51.35153],[3.226,51.36568],[3.17794,51.36182],[3.16009,51.33223],[3.06258,51.30219],[2.75084,51.1702],[2.47001,51.07452],[2.49267,50.99378],[2.53112,50.95573],[2.50915,50.91159],[2.53043,50.82145],[2.5991,50.76416],[2.66501,50.76459],[2.77007,50.66677],[2.8971,50.65894],[2.99186,50.72549],[3.11339,50.72636],[3.23699,50.70592],[3.36265,50.6585],[3.47114,50.70201],[3.63936,50.66721],[3.69842,50.68156],[3.72794,50.71245],[3.81858,50.68418],[3.87488,50.64152],[4.09255,50.64283],[4.15023,50.66329],[4.20653,50.64413],[4.31365,50.64283],[4.45235,50.68766],[4.53475,50.67808],[4.61303,50.69549],[4.67689,50.69592],[4.72701,50.73201],[4.78057,50.73201],[4.79979,50.71288],[4.86228,50.71288],[4.88563,50.69549],[4.96116,50.69549],[5.03119,50.65763],[5.10741,50.65023],[5.2008,50.64892],[5.23581,50.66546],[5.32508,50.6659],[5.36696,50.682],[5.42121,50.66416],[5.52215,50.6746],[5.6224,50.72418],[5.67527,50.69853],[5.73981,50.69723],[5.77277,50.67199],[5.8126,50.66024],[5.90804,50.65981],[5.98494,50.70723]]],terms_text:"Orthophoto Flanders © AGIV",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIVFlandersGRB",name:"AGIV Flanders GRB",type:"tms",template:"https://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:[[[4.40434,50.78177],[4.45538,50.79328],[4.40268,50.8961],[4.331,50.90094],[4.27142,50.82002],[4.30648,50.81244],[4.36348,50.77251],[4.40434,50.78177],[4.43104,50.73831],[4.31859,50.72022],[4.29031,50.69402],[4.14853,50.72834],[3.95877,50.68947],[3.9097,50.69245],[3.89113,50.74333],[3.77568,50.74789],[3.75857,50.78045],[3.67752,50.77062],[3.64047,50.72242],[3.54139,50.73377],[3.54062,50.76307],[3.46005,50.76556],[3.3522,50.70614],[3.30562,50.75466],[3.17839,50.75609],[3.15329,50.78564],[3.02008,50.77312],[2.99943,50.81035],[2.91648,50.75356],[2.85476,50.75745],[2.86521,50.70565],[2.78473,50.7369],[2.713,50.81534],[2.63518,50.8129],[2.59909,50.85306],[2.59031,50.91893],[2.63262,50.94575],[2.57372,51.00842],[2.54165,51.09345],[3.15582,51.32714],[3.18307,51.37128],[3.23443,51.34669],[3.36356,51.37228],[3.38101,51.27446],[3.44201,51.24313],[3.52759,51.24604],[3.51511,51.28753],[3.58984,51.30577],[3.7783,51.26235],[3.79088,51.21429],[3.92412,51.21938],[4.16613,51.2929],[4.26163,51.37647],[4.42065,51.36473],[4.39108,51.45149],[4.54747,51.48571],[4.53541,51.42303],[4.64953,51.42758],[4.76359,51.5088],[4.84188,51.48074],[4.8383,51.42174],[4.89366,51.41698],[4.92785,51.39544],[5.02894,51.48789],[5.08018,51.46948],[5.10202,51.42892],[5.07117,51.3935],[5.13109,51.35137],[5.13448,51.31547],[5.20031,51.32172],[5.24189,51.30534],[5.23036,51.26436],[5.34828,51.27492],[5.41741,51.26229],[5.4863,51.30197],[5.5556,51.26986],[5.56045,51.22233],[5.76027,51.18505],[5.85578,51.14463],[5.75909,51.03588],[5.72665,50.91307],[5.64522,50.8372],[5.68732,50.804],[5.47863,50.72352],[5.41196,50.72368],[5.38908,50.74775],[5.30912,50.71802],[5.16984,50.72257],[5.16508,50.6957],[5.05642,50.71567],[5.00339,50.76594],[4.92545,50.74275],[4.90869,50.76968],[4.83106,50.77028],[4.76014,50.80544],[4.64309,50.79755],[4.65486,50.7552],[4.62021,50.74348],[4.59727,50.76359],[4.52399,50.72724],[4.49455,50.75679],[4.43104,50.73831],[4.40434,50.78177]],[[5.67393,50.75373],[5.88438,50.70114],[5.94172,50.76524],[5.76662,50.78761],[5.67393,50.75373]],[[4.91171,51.43492],[4.93711,51.42614],[4.95891,51.45471],[4.92801,51.46049],[4.91171,51.43492]]],terms_text:"GRB Flanders © AGIV",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIV",name:"AGIV Flanders most recent aerial imagery",type:"tms",template:"https://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:[[[4.7737,50.79368],[4.8379,50.75916],[4.92511,50.73483],[4.98862,50.76264],[5.036,50.73527],[5.0645,50.69875],[5.1644,50.69005],[5.19393,50.71179],[5.3086,50.71245],[5.36422,50.74396],[5.43391,50.70766],[5.54378,50.74396],[5.61141,50.73527],[5.71166,50.73505],[5.77105,50.74092],[5.81946,50.70484],[5.89568,50.70614],[5.9204,50.72831],[5.91971,50.74504],[5.89843,50.77675],[5.81569,50.76351],[5.77517,50.79216],[5.69552,50.79737],[5.69072,50.82319],[5.66325,50.82904],[5.65467,50.86481],[5.72368,50.9012],[5.77174,50.95443],[5.75114,50.97368],[5.78273,51.00048],[5.78032,51.0523],[5.80848,51.05338],[5.80951,51.07668],[5.84315,51.09372],[5.84418,51.1101],[5.82599,51.11851],[5.86959,51.14953],[5.8277,51.17365],[5.792,51.16891],[5.7738,51.19344],[5.666,51.1928],[5.64059,51.21065],[5.5709,51.22829],[5.56231,51.27535],[5.49811,51.30605],[5.47099,51.30219],[5.45794,51.2893],[5.43048,51.28823],[5.41434,51.27363],[5.36593,51.282],[5.33641,51.28265],[5.32577,51.26718],[5.24337,51.27406],[5.24989,51.31335],[5.20972,51.32794],[5.14174,51.31914],[5.14209,51.35367],[5.08647,51.39482],[5.11565,51.43615],[5.08853,51.47508],[5.05214,51.47636],[5.04561,51.4939],[5.02364,51.4939],[5.01609,51.48663],[4.82966,51.48663],[4.83001,51.50009],[4.76855,51.51099],[4.74727,51.50394],[4.658,51.4492],[4.65663,51.43144],[4.53956,51.43379],[4.55466,51.48171],[4.5296,51.48748],[4.46368,51.48235],[4.37167,51.45562],[4.37751,51.40553],[4.4139,51.37511],[4.39776,51.36118],[4.34798,51.36675],[4.34627,51.38497],[4.20344,51.38111],[4.2213,51.3511],[4.15641,51.29832],[4.05101,51.25193],[4.00638,51.25279],[3.95144,51.22205],[3.88484,51.22936],[3.81926,51.21797],[3.80038,51.22872],[3.80107,51.26074],[3.74442,51.28007],[3.63593,51.29746],[3.58615,51.31378],[3.5065,51.28308],[3.51371,51.25021],[3.43921,51.25064],[3.39766,51.27513],[3.37329,51.31678],[3.39114,51.34274],[3.3623,51.37961],[3.24283,51.35474],[3.20266,51.37039],[3.15631,51.35196],[3.14223,51.33051],[2.53318,51.09092],[2.56476,50.9968],[2.61832,50.9527],[2.57781,50.91852],[2.5936,50.88431],[2.58948,50.85051],[2.6245,50.80757],[2.71033,50.8054],[2.78449,50.71853],[2.87375,50.69983],[2.86483,50.74765],[2.92525,50.75156],[2.97263,50.77024],[2.97332,50.79889],[3.00078,50.79759],[3.01383,50.76676],[3.09863,50.76611],[3.13537,50.78196],[3.16832,50.75004],[3.30428,50.74613],[3.31561,50.71484],[3.3678,50.70179],[3.44848,50.75091],[3.53293,50.75156],[3.53328,50.72549],[3.63902,50.7131],[3.69086,50.7672],[3.75163,50.76177],[3.7712,50.73874],[3.87729,50.73983],[3.87969,50.70418],[3.9202,50.68352],[3.99951,50.682],[4.06749,50.68961],[4.16018,50.72049],[4.17632,50.70331],[4.24739,50.68222],[4.31708,50.69418],[4.31846,50.70962],[4.38403,50.71027],[4.38437,50.72353],[4.47226,50.74743],[4.52617,50.71853],[4.55226,50.73766],[4.64908,50.73722],[4.6532,50.78717],[4.72426,50.78218],[4.73731,50.79585],[4.7737,50.79368]]],terms_text:"Orthophoto Flanders most recent © AGIV",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{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",endDate:"2011-01-01T00:00:00.000Z",startDate:"2006-01-01T00:00:00.000Z",scaleExtent:[0,16],polygon:[[[112.28778,-28.78459],[112.71488,-31.13894],[114.11263,-34.17829],[113.60788,-37.39012],[117.17992,-37.45179],[119.31538,-37.42096],[121.72262,-36.70839],[123.81925,-35.76893],[125.9547,-34.3066],[127.97368,-33.7274],[130.07031,-33.24166],[130.10913,-33.8887],[131.00214,-34.04971],[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.36829],[142.3783,-40.64702],[142.49478,-42.07487],[144.009,-44.06013],[147.23161,-44.03222],[149.05645,-42.53431],[149.52237,-40.99959],[149.9494,-40.85292],[150.8036,-38.09627],[151.81313,-38.12682],[156.20052,-22.66771],[156.20052,-20.10109],[156.62761,-17.41763],[155.26869,-17.19521],[154.14272,-19.51662],[153.5215,-18.34139],[153.05558,-16.5636],[152.78379,-15.25677],[152.27905,-13.4135],[151.3472,-12.39177],[149.48354,-12.05024],[146.9598,-9.99241],[135.9719,-9.99241],[130.3032,-10.33636],[128.09016,-12.16414],[125.91588,-12.31591],[124.3239,-11.86033],[122.03323,-11.97429],[118.26706,-16.9353],[115.93747,-19.11357],[114.0738,-21.11863],[113.49141,-22.59603],[112.28778,-28.78459]]],terms_url:"https://data.gov.au/dataset/agri-the-australian-geographic-reference-image",terms_text:"AGRI, Geoscience Australia"},{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.52384,-9.48089],[-35.5236,-9.44515],[-35.51572,-9.44518],[-35.51584,-9.44229],[-35.50542,-9.44238],[-35.50518,-9.43064],[-35.49334,-9.43073],[-35.49304,-9.3982],[-35.4893,-9.39817],[-35.48921,-9.38628],[-35.4854,-9.38634],[-35.48525,-9.37809],[-35.48127,-9.37812],[-35.48114,-9.36987],[-35.47698,-9.36996],[-35.47686,-9.36385],[-35.47459,-9.36388],[-35.47447,-9.36153],[-35.47212,-9.36141],[-35.47206,-9.35917],[-35.46976,-9.3592],[-35.46967,-9.35682],[-35.46653,-9.35676],[-35.46641,-9.35289],[-35.46387,-9.35277],[-35.46387,-9.35119],[-35.44135,-9.35131],[-35.44125,-9.34541],[-35.43177,-9.34538],[-35.43171,-9.33602],[-35.39463,-9.33632],[-35.39442,-9.30125],[-35.38165,-9.30143],[-35.38147,-9.28638],[-35.37799,-9.28626],[-35.37796,-9.2811],[-35.36942,-9.28122],[-35.36921,-9.27261],[-35.35966,-9.27276],[-35.35969,-9.26465],[-35.35051,-9.26474],[-35.35036,-9.25562],[-35.34115,-9.25565],[-35.34118,-9.24501],[-35.31775,-9.24519],[-35.3176,-9.22567],[-35.30292,-9.22579],[-35.30283,-9.2113],[-35.30794,-9.21136],[-35.30785,-9.19979],[-35.29103,-9.19988],[-35.29091,-9.1966],[-35.29018,-9.19669],[-35.28997,-9.16516],[-35.27759,-9.16522],[-35.2775,-9.16417],[-35.27541,-9.1642],[-35.27535,-9.16152],[-35.27375,-9.16149],[-35.27366,-9.15839],[-35.27182,-9.15842],[-35.27185,-9.15729],[-35.27149,-9.15729],[-35.27143,-9.15469],[-35.26965,-9.15463],[-35.26959,-9.15362],[-35.26919,-9.15362],[-35.26907,-9.13159],[-35.26403,-9.13165],[-35.264,-9.12318],[-35.26056,-9.12321],[-35.26053,-9.11781],[-35.256,-9.11784],[-35.25573,-9.08946],[-35.25114,-9.08955],[-35.25108,-9.08651],[-35.25026,-9.08648],[-35.25029,-9.08475],[-35.24449,-9.08478],[-35.24449,-9.07989],[-35.24093,-9.07997],[-35.24081,-9.07312],[-35.23734,-9.07312],[-35.23719,-9.06322],[-35.23655,-9.06322],[-35.23652,-9.04655],[-35.23323,-9.04652],[-35.23332,-9.04345],[-35.2306,-9.04348],[-35.2306,-9.04014],[-35.22897,-9.04008],[-35.229,-9.03835],[-35.22505,-9.03826],[-35.22502,-9.03167],[-35.2223,-9.03161],[-35.22233,-9.02012],[-35.21834,-9.02009],[-35.21831,-9.01341],[-35.21671,-9.01341],[-35.21668,-9.00998],[-35.21176,-9.00998],[-35.21173,-9.00647],[-35.20971,-9.00653],[-35.20974,-9.00438],[-35.20765,-9.00432],[-35.20768,-9.00226],[-35.20566,-9.00226],[-35.20563,-8.99987],[-35.20391,-8.99987],[-35.20394,-8.99785],[-35.20213,-8.99791],[-35.20213,-8.99579],[-35.19844,-8.99582],[-35.19844,-8.99361],[-35.19434,-8.99361],[-35.19428,-8.99122],[-35.19065,-8.99131],[-35.19062,-8.98833],[-35.18766,-8.98842],[-35.18763,-8.98544],[-35.18473,-8.98541],[-35.18467,-8.98255],[-35.18238,-8.98252],[-35.18235,-8.98052],[-35.17951,-8.98061],[-35.17948,-8.97742],[-35.17809,-8.97745],[-35.17803,-8.97306],[-35.17558,-8.97303],[-35.17549,-8.96912],[-35.17293,-8.96909],[-35.17284,-8.96292],[-35.17063,-8.96289],[-35.17048,-8.95579],[-35.16852,-8.95564],[-35.16852,-8.94806],[-35.16794,-8.948],[-35.16791,-8.93995],[-35.16245,-8.93995],[-35.16242,-8.92978],[-35.1587,-8.92981],[-35.15873,-8.92662],[-35.15547,-8.92668],[-35.1555,-8.92378],[-35.15348,-8.92381],[-35.15339,-8.92065],[-35.15131,-8.92062],[-35.15122,-8.91194],[-35.15263,-8.91194],[-35.15263,-8.90821],[-35.15439,-8.90824],[-35.1543,-8.90215],[-35.15593,-8.90212],[-35.15593,-8.90051],[-35.15768,-8.90048],[-35.15774,-8.89905],[-35.15958,-8.89908],[-35.15955,-8.89747],[-35.16139,-8.8975],[-35.16133,-8.89625],[-35.16363,-8.89625],[-35.1636,-8.89526],[-35.16553,-8.89526],[-35.1655,-8.89315],[-35.16794,-8.89315],[-35.16791,-8.89147],[-35.17024,-8.89153],[-35.17027,-8.8904],[-35.17302,-8.89043],[-35.17302,-8.88876],[-35.17791,-8.88876],[-35.17794,-8.88795],[-35.17894,-8.88792],[-35.17894,-8.88891],[-35.17966,-8.88894],[-35.17978,-8.88858],[-35.18099,-8.88861],[-35.18099,-8.88816],[-35.18519,-8.88816],[-35.18519,-8.88897],[-35.18591,-8.889],[-35.18591,-8.88971],[-35.18932,-8.88971],[-35.18947,-8.8893],[-35.19014,-8.88927],[-35.19017,-8.88831],[-35.19071,-8.88831],[-35.19077,-8.88789],[-35.19153,-8.88792],[-35.19156,-8.88619],[-35.19754,-8.88607],[-35.19757,-8.8873],[-35.19968,-8.8873],[-35.19974,-8.88777],[-35.2008,-8.88777],[-35.2008,-8.88822],[-35.2033,-8.88822],[-35.20337,-8.8887],[-35.20563,-8.88861],[-35.20557,-8.88983],[-35.20741,-8.8898],[-35.20744,-8.89022],[-35.21125,-8.89025],[-35.21128,-8.88769],[-35.21245,-8.88777],[-35.21248,-8.88861],[-35.21623,-8.88858],[-35.21623,-8.88748],[-35.21871,-8.88745],[-35.21871,-8.88897],[-35.22136,-8.88897],[-35.22263,-8.88792],[-35.22402,-8.88748],[-35.22453,-8.88763],[-35.22644,-8.88718],[-35.22707,-8.88598],[-35.23311,-8.88446],[-35.23933,-8.88339],[-35.24129,-8.88416],[-35.25011,-8.88515],[-35.25624,-8.88506],[-35.26168,-8.88294],[-35.26161,-8.88094],[-35.26406,-8.88109],[-35.26877,-8.8793],[-35.27421,-8.87748],[-35.2781,-8.87518],[-35.28499,-8.87507],[-35.28502,-8.87581],[-35.2881,-8.87578],[-35.29405,-8.87545],[-35.30782,-8.87208],[-35.31757,-8.86961],[-35.32784,-8.86716],[-35.33206,-8.86614],[-35.34103,-8.86376],[-35.3471,-8.86244],[-35.3522,-8.86113],[-35.35257,-8.86391],[-35.34903,-8.86611],[-35.34496,-8.87205],[-35.34327,-8.87489],[-35.34318,-8.87569],[-35.34381,-8.87668],[-35.34481,-8.8768],[-35.34888,-8.87721],[-35.35042,-8.87781],[-35.35254,-8.87891],[-35.35399,-8.88011],[-35.35577,-8.88252],[-35.35755,-8.88396],[-35.36036,-8.88512],[-35.36114,-8.88509],[-35.3612,-8.88587],[-35.36175,-8.8859],[-35.36178,-8.88777],[-35.36253,-8.88783],[-35.36247,-8.891],[-35.36311,-8.89112],[-35.36311,-8.89482],[-35.3644,-8.89488],[-35.36507,-8.8967],[-35.36637,-8.90022],[-35.36754,-8.90427],[-35.36794,-8.90782],[-35.36863,-8.90917],[-35.37207,-8.91155],[-35.3741,-8.91349],[-35.37277,-8.916],[-35.37262,-8.91817],[-35.37084,-8.92229],[-35.37062,-8.92486],[-35.37235,-8.93038],[-35.37153,-8.93193],[-35.37153,-8.93363],[-35.37171,-8.93387],[-35.37171,-8.94362],[-35.36818,-8.94377],[-35.36815,-8.94505],[-35.36927,-8.94511],[-35.36921,-8.94863],[-35.37078,-8.94872],[-35.37081,-8.95182],[-35.37219,-8.95176],[-35.37222,-8.95528],[-35.37319,-8.95531],[-35.37313,-8.95737],[-35.3744,-8.95737],[-35.37446,-8.96012],[-35.37567,-8.96018],[-35.3757,-8.96205],[-35.37688,-8.96208],[-35.37694,-8.96444],[-35.37781,-8.96444],[-35.37775,-8.96617],[-35.38074,-8.96617],[-35.38074,-8.96331],[-35.38288,-8.96328],[-35.38291,-8.95982],[-35.38542,-8.95985],[-35.38542,-8.95722],[-35.38723,-8.95722],[-35.3872,-8.95406],[-35.38947,-8.95409],[-35.38947,-8.95084],[-35.39158,-8.95087],[-35.39158,-8.94792],[-35.39587,-8.94792],[-35.39581,-8.94651],[-35.3972,-8.94654],[-35.39711,-8.94472],[-35.39838,-8.94469],[-35.39838,-8.93915],[-35.40107,-8.93915],[-35.40106,-8.93895],[-35.40167,-8.93894],[-35.40173,-8.93688],[-35.40236,-8.93688],[-35.40236,-8.93628],[-35.40324,-8.9364],[-35.4033,-8.93583],[-35.40426,-8.9358],[-35.4042,-8.93363],[-35.40574,-8.9336],[-35.40577,-8.93124],[-35.4081,-8.93133],[-35.40804,-8.92927],[-35.40937,-8.9293],[-35.40928,-8.92739],[-35.41085,-8.92742],[-35.41085,-8.92542],[-35.41239,-8.92545],[-35.41236,-8.9239],[-35.41335,-8.92387],[-35.41329,-8.92193],[-35.41523,-8.92196],[-35.41523,-8.91999],[-35.41655,-8.92002],[-35.41655,-8.91755],[-35.4196,-8.91755],[-35.41966,-8.91964],[-35.42184,-8.91964],[-35.42187,-8.92265],[-35.42389,-8.92268],[-35.42392,-8.92513],[-35.42537,-8.92513],[-35.42537,-8.92766],[-35.42724,-8.92766],[-35.42727,-8.92987],[-35.42815,-8.92984],[-35.42818,-8.9316],[-35.42987,-8.93154],[-35.4299,-8.93407],[-35.43141,-8.93407],[-35.43141,-8.9356],[-35.43226,-8.93557],[-35.43229,-8.93586],[-35.4334,-8.93583],[-35.4334,-8.94001],[-35.43434,-8.94004],[-35.43434,-8.94097],[-35.43531,-8.94097],[-35.43534,-8.94261],[-35.43567,-8.94264],[-35.4357,-8.94329],[-35.43627,-8.94332],[-35.43624,-8.94422],[-35.4373,-8.94422],[-35.43727,-8.9452],[-35.43823,-8.9452],[-35.43827,-8.94684],[-35.43902,-8.94687],[-35.43902,-8.94798],[-35.44026,-8.94798],[-35.44032,-8.94953],[-35.44159,-8.94956],[-35.44165,-8.95152],[-35.44273,-8.95152],[-35.44273,-8.95334],[-35.44436,-8.95334],[-35.44436,-8.95498],[-35.44569,-8.95501],[-35.44563,-8.95674],[-35.4472,-8.9568],[-35.44717,-8.95865],[-35.44895,-8.95871],[-35.44892,-8.96],[-35.45101,-8.95994],[-35.45098,-8.96101],[-35.45469,-8.96095],[-35.45466,-8.96235],[-35.46049,-8.96235],[-35.46055,-8.96557],[-35.46653,-8.96548],[-35.46659,-8.96885],[-35.46771,-8.96883],[-35.46774,-8.97053],[-35.4739,-8.97053],[-35.47399,-8.9753],[-35.47791,-8.97521],[-35.47797,-8.97816],[-35.4841,-8.97813],[-35.48416,-8.98201],[-35.49084,-8.98195],[-35.49084,-8.98562],[-35.49721,-8.98562],[-35.49721,-8.99069],[-35.50225,-8.99057],[-35.50234,-8.99567],[-35.50648,-8.99567],[-35.50651,-8.99856],[-35.51204,-8.9985],[-35.51207,-9.00163],[-35.51663,-9.00166],[-35.51666,-9.00617],[-35.52119,-9.00614],[-35.52122,-9.00739],[-35.53127,-9.00733],[-35.53127,-9.01064],[-35.54818,-9.01049],[-35.54818,-9.01359],[-35.56968,-9.01344],[-35.56974,-9.01738],[-35.58575,-9.01732],[-35.58578,-9.01995],[-35.60957,-9.01983],[-35.60954,-9.02302],[-35.62911,-9.02287],[-35.62905,-9.02508],[-35.65221,-9.0249],[-35.65224,-9.02758],[-35.67552,-9.0274],[-35.67555,-9.03056],[-35.68295,-9.03056],[-35.68298,-9.03435],[-35.69128,-9.03432],[-35.69128,-9.03766],[-35.6995,-9.0376],[-35.6995,-9.04034],[-35.70668,-9.04031],[-35.70671,-9.04518],[-35.71115,-9.04518],[-35.71133,-9.06691],[-35.70871,-9.06691],[-35.70877,-9.07869],[-35.70656,-9.07872],[-35.70656,-9.08653],[-35.7043,-9.08653],[-35.70433,-9.09104],[-35.69992,-9.09107],[-35.69989,-9.0956],[-35.69536,-9.09557],[-35.69542,-9.10001],[-35.69092,-9.10013],[-35.69101,-9.10207],[-35.63367,-9.10246],[-35.6337,-9.10541],[-35.62585,-9.10553],[-35.62591,-9.10964],[-35.62231,-9.10964],[-35.62234,-9.11203],[-35.6199,-9.112],[-35.6199,-9.11501],[-35.61473,-9.11507],[-35.61473,-9.11707],[-35.61177,-9.11701],[-35.61181,-9.1182],[-35.6096,-9.11826],[-35.60963,-9.12571],[-35.59976,-9.12583],[-35.59979,-9.12923],[-35.59634,-9.12926],[-35.5964,-9.13502],[-35.59197,-9.13507],[-35.59209,-9.149],[-35.59018,-9.14897],[-35.59015,-9.15108],[-35.6016,-9.15105],[-35.60154,-9.14912],[-35.60552,-9.14912],[-35.60549,-9.14557],[-35.61184,-9.14554],[-35.61184,-9.14235],[-35.6176,-9.14238],[-35.61757,-9.13853],[-35.624,-9.13853],[-35.62397,-9.13466],[-35.63177,-9.13466],[-35.63164,-9.13063],[-35.63922,-9.1306],[-35.63919,-9.12878],[-35.66386,-9.12869],[-35.6638,-9.1261],[-35.71278,-9.12577],[-35.71275,-9.12407],[-35.72426,-9.12401],[-35.71964,-9.15323],[-35.72112,-9.1532],[-35.72124,-9.17258],[-35.72066,-9.17255],[-35.72082,-9.18558],[-35.71212,-9.18566],[-35.7133,-9.34416],[-35.69041,-9.34433],[-35.69065,-9.37189],[-35.68899,-9.37189],[-35.68902,-9.37598],[-35.68757,-9.37598],[-35.68766,-9.38232],[-35.68497,-9.38235],[-35.68503,-9.39093],[-35.68168,-9.39099],[-35.68177,-9.39936],[-35.67715,-9.39933],[-35.67724,-9.4089],[-35.67292,-9.40893],[-35.67301,-9.41754],[-35.66972,-9.4176],[-35.66978,-9.42498],[-35.66722,-9.42498],[-35.66728,-9.4327],[-35.66075,-9.43288],[-35.66075,-9.43705],[-35.6513,-9.43708],[-35.65142,-9.44211],[-35.64514,-9.44217],[-35.64523,-9.44652],[-35.63645,-9.44661],[-35.63645,-9.44992],[-35.62711,-9.45],[-35.62727,-9.46505],[-35.62086,-9.46511],[-35.62092,-9.4722],[-35.60939,-9.47222],[-35.60939,-9.47529],[-35.59674,-9.47535],[-35.59674,-9.47351],[-35.57844,-9.47371],[-35.57847,-9.47595],[-35.57267,-9.47604],[-35.5727,-9.48042],[-35.56823,-9.48048],[-35.56826,-9.48881],[-35.54169,-9.48893],[-35.54163,-9.48071],[-35.52384,-9.48089]]],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.60875,-9.83072],[-36.60784,-9.74047],[-36.61718,-9.74051],[-36.61631,-9.65075],[-36.70737,-9.64977],[-36.70832,-9.74043],[-36.69898,-9.74047],[-36.69997,-9.82968],[-36.60875,-9.83072]]],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:"https://tiles.craig.fr/osm/wmts/1.0.0/ortho_2013/webmercator/{zoom}/{x}/{y}.jpeg",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",scaleExtent:[0,21],polygon:[[[2.94012,44.63388],[2.99719,44.63393],[2.99717,44.64734],[3.01597,44.64735],[3.01593,44.67412],[3.03495,44.67413],[3.0349,44.70152],[3.05363,44.70154],[3.05357,44.7419],[3.07233,44.74191],[3.07222,44.80917],[3.09216,44.80919],[3.09214,44.82213],[3.13014,44.82216],[3.13005,44.87707],[3.14856,44.87709],[3.14858,44.8637],[3.16823,44.86371],[3.16825,44.85003],[3.2064,44.85006],[3.20638,44.86284],[3.24395,44.86287],[3.24393,44.87679],[3.26315,44.87681],[3.26308,44.91752],[3.32004,44.91757],[3.32002,44.93033],[3.33908,44.93035],[3.33906,44.9442],[3.377,44.94423],[3.37702,44.93029],[3.39603,44.9303],[3.39612,44.87627],[3.41483,44.87629],[3.41489,44.83553],[3.43334,44.83554],[3.43338,44.80828],[3.45255,44.80829],[3.45258,44.79463],[3.50893,44.79468],[3.5089,44.80815],[3.60426,44.80823],[3.60422,44.83482],[3.62361,44.83484],[3.62357,44.86166],[3.64248,44.86167],[3.64255,44.8211],[3.66101,44.82112],[3.66103,44.80777],[3.6993,44.8078],[3.69928,44.82099],[3.73611,44.82102],[3.73618,44.77971],[3.77511,44.77974],[3.77515,44.75223],[3.81184,44.75226],[3.81186,44.7392],[3.83118,44.73922],[3.83121,44.72468],[3.88782,44.72472],[3.8878,44.73818],[3.92563,44.73821],[3.9256,44.75167],[3.94541,44.75168],[3.94537,44.77847],[3.96437,44.77848],[3.96435,44.79193],[4.00332,44.79196],[4.0033,44.80526],[4.02169,44.80527],[4.02167,44.81857],[4.05965,44.8186],[4.05961,44.84492],[4.07981,44.84494],[4.07979,44.85735],[4.17388,44.85743],[4.17386,44.87055],[4.19326,44.87056],[4.19323,44.88427],[4.21404,44.88429],[4.214,44.91002],[4.23241,44.91004],[4.23237,44.93731],[4.27155,44.93734],[4.27153,44.9503],[4.32887,44.95034],[4.32878,45.00367],[4.34893,45.00368],[4.3489,45.01707],[4.40608,45.01711],[4.40599,45.071],[4.38847,45.07099],[4.38845,45.0846],[4.40794,45.08461],[4.40792,45.09663],[4.48436,45.09669],[4.48429,45.13705],[4.46636,45.13703],[4.46634,45.1502],[4.48645,45.15022],[4.4864,45.17724],[4.50655,45.17726],[4.50644,45.24501],[4.48813,45.24499],[4.48811,45.25921],[4.46986,45.25919],[4.46984,45.27298],[4.45088,45.27297],[4.45086,45.28642],[4.39368,45.28637],[4.39363,45.31352],[4.37509,45.3135],[4.37507,45.32741],[4.39507,45.32742],[4.39503,45.35458],[4.37679,45.35457],[4.37676,45.36855],[4.35766,45.36853],[4.35763,45.38234],[4.28146,45.38227],[4.28143,45.39688],[4.24446,45.39685],[4.24443,45.41079],[4.14812,45.41071],[4.14814,45.39807],[4.12919,45.39805],[4.12921,45.38409],[4.09021,45.38406],[4.09024,45.37121],[4.01355,45.37115],[4.01353,45.3861],[3.91709,45.38602],[3.91707,45.39974],[3.93757,45.39975],[3.93755,45.41311],[3.97528,45.41315],[3.97526,45.42621],[3.99537,45.42622],[3.9957,45.52096],[3.97778,45.52094],[3.97769,45.57439],[3.95818,45.57437],[3.95815,45.58837],[3.9396,45.58835],[3.93958,45.60262],[3.92023,45.60261],[3.9202,45.61646],[3.88189,45.61643],[3.88185,45.64328],[3.84413,45.64325],[3.84411,45.65709],[3.82617,45.65707],[3.82612,45.68389],[3.80722,45.68387],[3.80713,45.73758],[3.78821,45.73756],[3.78819,45.7518],[3.76885,45.75178],[3.7688,45.77897],[3.75072,45.77895],[3.75058,45.86066],[3.76967,45.86067],[3.76958,45.91433],[3.75166,45.91432],[3.75164,45.92809],[3.7329,45.92807],[3.73285,45.95472],[3.81018,45.95478],[3.81016,45.96823],[3.8496,45.96826],[3.84951,46.02162],[3.83188,46.0216],[3.83179,46.07591],[3.8505,46.07592],[3.85046,46.10295],[3.83247,46.10294],[3.83234,46.18456],[3.81422,46.18455],[3.81415,46.22442],[3.83369,46.22444],[3.83366,46.2381],[3.85289,46.23812],[3.85287,46.25147],[3.89314,46.25151],[3.89312,46.26447],[3.91306,46.26448],[3.91303,46.27793],[3.95189,46.27796],[3.95187,46.29082],[3.97152,46.29084],[3.9715,46.30369],[4.0105,46.30373],[4.01048,46.31776],[4.02983,46.31778],[4.02978,46.34428],[4.0116,46.34427],[4.01146,46.42534],[4.03153,46.42536],[4.03146,46.4658],[4.01324,46.46578],[4.01322,46.47938],[3.99437,46.47936],[3.99435,46.49361],[3.9746,46.4936],[3.97457,46.50753],[3.87754,46.50745],[3.8775,46.53478],[3.85836,46.53476],[3.85833,46.54832],[3.81869,46.54828],[3.81871,46.53553],[3.79924,46.53552],[3.79922,46.54907],[3.76104,46.54904],[3.76092,46.61681],[3.74233,46.61679],[3.74228,46.64396],[3.72286,46.64395],[3.72281,46.67104],[3.70387,46.67102],[3.70385,46.68467],[3.68411,46.68466],[3.68406,46.712],[3.66484,46.71198],[3.66479,46.73904],[3.64576,46.73902],[3.64572,46.76634],[3.62575,46.76632],[3.62573,46.77971],[3.56723,46.77966],[3.56725,46.76631],[3.54715,46.76629],[3.54719,46.73928],[3.52716,46.73927],[3.52723,46.6989],[3.48774,46.69887],[3.48776,46.68594],[3.46796,46.68593],[3.46794,46.69941],[3.46792,46.71279],[3.44865,46.71278],[3.44863,46.72679],[3.35043,46.72671],[3.35048,46.6999],[3.33039,46.69988],[3.33034,46.7272],[3.23272,46.72712],[3.23274,46.71351],[3.2129,46.7135],[3.21293,46.70013],[3.17354,46.7001],[3.1735,46.72751],[3.15412,46.72749],[3.1541,46.74073],[3.11478,46.7407],[3.11475,46.75428],[3.07534,46.75424],[3.0753,46.78135],[3.05597,46.78134],[3.05592,46.80831],[2.99704,46.80826],[2.99702,46.82196],[2.93794,46.82191],[2.93797,46.80826],[2.89866,46.80823],[2.89869,46.79424],[2.87899,46.79422],[2.87901,46.78104],[2.85942,46.78103],[2.85944,46.76771],[2.84004,46.76769],[2.84007,46.75447],[2.7414,46.75439],[2.74138,46.76682],[2.70234,46.76679],[2.70236,46.75389],[2.68266,46.75387],[2.68268,46.74048],[2.66349,46.74046],[2.66351,46.7259],[2.64342,46.72588],[2.64344,46.71309],[2.62414,46.71308],[2.62417,46.69981],[2.60397,46.69979],[2.60399,46.68584],[2.56512,46.68581],[2.56515,46.67261],[2.54593,46.6726],[2.546,46.63215],[2.56592,46.63217],[2.56595,46.61811],[2.54564,46.61809],[2.54569,46.59072],[2.56642,46.59074],[2.56644,46.57754],[2.5855,46.57756],[2.58552,46.56472],[2.56613,46.5647],[2.56616,46.55062],[2.46828,46.55055],[2.4683,46.53582],[2.33212,46.53571],[2.33217,46.50886],[2.31265,46.50884],[2.31267,46.49534],[2.29288,46.49533],[2.2929,46.48182],[2.27487,46.4818],[2.27492,46.45442],[2.25539,46.4544],[2.25553,46.37349],[2.27595,46.37351],[2.27604,46.32087],[2.31456,46.32091],[2.31458,46.30704],[2.35371,46.30707],[2.35373,46.29297],[2.39384,46.293],[2.39389,46.26729],[2.45157,46.26733],[2.4516,46.25349],[2.47094,46.25351],[2.47098,46.22656],[2.49151,46.22657],[2.49155,46.19933],[2.51088,46.19934],[2.51093,46.17278],[2.53117,46.1728],[2.53138,46.05135],[2.55163,46.05137],[2.55166,46.03777],[2.57056,46.03778],[2.57068,45.96994],[2.55144,45.96993],[2.55146,45.95662],[2.53226,45.9566],[2.53228,45.94301],[2.51307,45.94299],[2.51313,45.90203],[2.47494,45.902],[2.47496,45.88882],[2.43619,45.88879],[2.43622,45.87533],[2.41721,45.87531],[2.41725,45.84794],[2.37847,45.84791],[2.3785,45.83397],[2.35952,45.83396],[2.35956,45.80708],[2.37873,45.8071],[2.37875,45.79358],[2.3987,45.79359],[2.39872,45.78035],[2.41825,45.78036],[2.41832,45.74],[2.45722,45.74003],[2.45724,45.7267],[2.47589,45.72671],[2.47591,45.71324],[2.49533,45.71325],[2.49542,45.65913],[2.45769,45.6591],[2.45776,45.61834],[2.43912,45.61833],[2.43919,45.57766],[2.4585,45.57768],[2.45855,45.55053],[2.47809,45.55055],[2.47811,45.53725],[2.49755,45.53726],[2.49759,45.51068],[2.47855,45.51066],[2.47864,45.45613],[2.45978,45.45612],[2.45987,45.40176],[2.42249,45.40173],[2.42247,45.41528],[2.40232,45.41527],[2.40229,45.42882],[2.3256,45.42876],[2.32567,45.38796],[2.34562,45.38798],[2.34566,45.36111],[2.32626,45.36109],[2.32628,45.34721],[2.30738,45.3472],[2.3074,45.3336],[2.28811,45.33358],[2.28813,45.32082],[2.26963,45.3208],[2.26966,45.30621],[2.25066,45.3062],[2.25068,45.29251],[2.23169,45.2925],[2.23171,45.27924],[2.213,45.27922],[2.21305,45.25204],[2.19374,45.25202],[2.19376,45.23811],[2.17561,45.2381],[2.17574,45.15768],[2.15735,45.15767],[2.15744,45.10295],[2.12024,45.10292],[2.12026,45.08955],[2.10067,45.08953],[2.10069,45.07544],[2.08246,45.07543],[2.08255,45.0216],[2.10255,45.02161],[2.1026,44.99445],[2.04574,44.99441],[2.04585,44.92753],[2.06578,44.92755],[2.06589,44.85969],[2.0857,44.8597],[2.08572,44.84581],[2.10556,44.84583],[2.1056,44.81933],[2.12474,44.81934],[2.12477,44.80551],[2.14351,44.80553],[2.14355,44.7786],[2.12561,44.77858],[2.1257,44.72427],[2.10665,44.72426],[2.10671,44.68423],[2.12634,44.68424],[2.12636,44.67074],[2.14598,44.67075],[2.14607,44.61644],[2.18396,44.61648],[2.18398,44.60378],[2.24042,44.60383],[2.24037,44.63095],[2.25948,44.63097],[2.25946,44.64493],[2.31668,44.64498],[2.3167,44.63088],[2.33615,44.6309],[2.33617,44.61758],[2.37242,44.61761],[2.3724,44.63158],[2.41105,44.63161],[2.41107,44.61907],[2.44922,44.61911],[2.4492,44.63232],[2.50486,44.63237],[2.50481,44.65976],[2.52461,44.65977],[2.52457,44.68717],[2.54225,44.68719],[2.54223,44.70122],[2.58071,44.70125],[2.5806,44.76834],[2.61769,44.76837],[2.61762,44.80884],[2.63676,44.80885],[2.63669,44.84929],[2.67331,44.84933],[2.67329,44.86252],[2.69338,44.86253],[2.69333,44.88943],[2.73052,44.88946],[2.73048,44.91645],[2.74992,44.91646],[2.75005,44.83647],[2.80733,44.83652],[2.80731,44.8491],[2.82638,44.84912],[2.8264,44.83628],[2.8457,44.8363],[2.84577,44.79571],[2.86422,44.79573],[2.86426,44.76865],[2.88399,44.76866],[2.88403,44.74197],[2.90203,44.74198],[2.90214,44.67432],[2.92198,44.67434],[2.92202,44.6473],[2.9401,44.64731],[2.94012,44.63388]]],terms_url:"http://ids.craig.fr/geocat/srv/fre/catalog.search?node=srv#/metadata/8cabc987-829c-4c9f-943b-6a0e255cd73",terms_text:"Orthophotographie CRAIG/Sintegra/IGN 2013"},{id:"CRAIG-Auvergne-2016",name:"Auvergne 2016 25cm CRAIG",type:"tms",template:"https://tiles.craig.fr/ortho/wmts/1.0.0/ortho_2016/webmercator/{zoom}/{x}/{y}.jpeg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",scaleExtent:[0,21],polygon:[[[2.49389,46.66829],[2.71362,46.84141],[3.64746,46.80758],[4.04846,46.48327],[4.03747,46.24825],[4.46044,46.25965],[4.4934,46.14559],[4.38354,46.09229],[4.45495,45.69084],[4.76257,45.57176],[4.81201,45.34443],[4.22424,44.84419],[3.86169,44.696],[3.37829,44.80523],[3.33435,44.89091],[3.18054,44.82471],[3.03222,44.60612],[2.92785,44.60221],[2.71911,44.85198],[2.51037,44.60221],[2.12585,44.58265],[2.005,44.97257],[2.30712,45.46784],[2.43347,45.44087],[2.41149,45.72919],[2.34558,45.82402],[2.54882,45.97979],[2.46093,46.22166],[2.21374,46.33935],[2.27828,46.53903],[2.54882,46.56642],[2.49389,46.66829]]],terms_url:"http://ids.craig.fr/geocat/srv/fre/catalog.search?node=srv#/metadata/e37c057b-5884-429b-8bec-5db0baef0ee",terms_text:"CRAIG - IGN -TopoGEODIS - Feder Auvergne-Rhône-Alpes 2016"},{id:"BANO",name:"BANO",type:"tms",template:"https://{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.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://wiki.openstreetmap.org/wiki/FR:WikiProject_France/WikiProject_Base_Adresses_Nationale_Ouverte_(BANO)#Licence_du_r.C3.A9sultat",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.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,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.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at",terms_text:"basemap.at",description:"Basemap of Austria, based on government data.",icon:"https://www.basemap.at/images/logo_basemap.jpg"},{id:"basemap.at-overlay",name:"basemap.at Beschriftungen (annotations)",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmapoverlay/normal/google3857/{zoom}/{y}/{x}.png",scaleExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at/",terms_text:"basemap.at",description:"Annotation overlay provided by basemap.at.",icon:"https://www.basemap.at/images/logo_basemap.jpg",overlay:true},{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.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://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:"https://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.12359,50.56846],[10.14286,50.55078],[10.20281,50.55742],[10.25205,50.51796],[10.32698,50.49345],[10.41048,50.41848],[10.60317,50.33109],[10.62244,50.2271],[10.72521,50.21066],[10.72949,50.24765],[10.85153,50.24354],[10.71879,50.32015],[10.71236,50.36524],[10.85581,50.39664],[10.93717,50.39664],[10.99069,50.36661],[11.12772,50.36661],[11.1791,50.31332],[11.16197,50.29417],[11.24119,50.2928],[11.24975,50.37344],[11.24119,50.47982],[11.35895,50.5234],[11.43816,50.50979],[11.44244,50.48936],[11.42532,50.4771],[11.42532,50.44166],[11.48955,50.42257],[11.49169,50.39801],[11.51952,50.39801],[11.52594,50.37617],[11.59874,50.40347],[11.63727,50.38845],[11.79357,50.4212],[11.83639,50.39255],[11.92203,50.42802],[11.98626,50.38709],[11.98412,50.35705],[12.04835,50.33109],[12.09331,50.32972],[12.1297,50.29828],[12.14041,50.27228],[12.10615,50.25586],[12.11258,50.23532],[12.14897,50.23669],[12.19822,50.20107],[12.22391,50.16406],[12.20464,50.14348],[12.20678,50.10779],[12.24318,50.09955],[12.27743,50.07208],[12.49367,49.98543],[12.49796,49.94136],[12.55576,49.92206],[12.54934,49.86827],[12.48083,49.78817],[12.41018,49.75775],[12.46156,49.70655],[12.5472,49.68023],[12.58788,49.55261],[12.65425,49.53455],[12.66281,49.43302],[12.75274,49.41073],[12.7977,49.34661],[12.90475,49.35638],[12.99681,49.33685],[13.05462,49.27543],[13.13169,49.21952],[13.19164,49.14395],[13.2366,49.12153],[13.29655,49.12293],[13.37148,49.08088],[13.4143,49.02897],[13.4143,48.97981],[13.57916,48.96997],[13.63483,48.94326],[13.67765,48.88698],[13.73759,48.89261],[13.7847,48.83346],[13.84036,48.77423],[13.81681,48.70646],[13.84464,48.70081],[13.8425,48.60038],[13.76543,48.5423],[13.75258,48.50401],[13.67122,48.50543],[13.64339,48.54371],[13.45712,48.5508],[13.45712,48.41598],[13.40574,48.36053],[13.2837,48.27511],[13.09315,48.26941],[12.95827,48.19097],[12.87691,48.18526],[12.772,48.09382],[12.86407,48.01368],[12.89832,47.95492],[12.94543,47.95636],[12.99681,47.88461],[13.01394,47.83434],[12.93472,47.7322],[13.0589,47.72499],[13.11885,47.63851],[13.06532,47.56922],[13.05676,47.47379],[13.00323,47.45208],[12.76772,47.55044],[12.76986,47.63274],[12.73989,47.67312],[12.6671,47.67024],[12.57503,47.6212],[12.48083,47.61975],[12.41446,47.67024],[12.24318,47.67745],[12.2132,47.69186],[12.19179,47.68177],[12.2132,47.66591],[12.21106,47.60388],[12.17467,47.59521],[12.13827,47.60388],[11.89205,47.60388],[11.85137,47.57933],[11.63942,47.58222],[11.59445,47.54899],[11.59017,47.51285],[11.51738,47.49839],[11.4403,47.50417],[11.39534,47.47524],[11.42746,47.44484],[11.3461,47.44339],[11.27973,47.39559],[11.21336,47.38834],[11.24761,47.43181],[11.10203,47.39269],[10.965,47.38979],[10.97785,47.43615],[10.9179,47.47524],[10.8708,47.47524],[10.85581,47.49405],[10.90077,47.5143],[10.87294,47.53598],[10.81085,47.51285],[10.64385,47.54899],[10.59461,47.55477],[10.57962,47.52876],[10.46187,47.54032],[10.46615,47.48392],[10.48756,47.47813],[10.48756,47.41298],[10.45973,47.40283],[10.45973,47.37529],[10.41048,47.37384],[10.40834,47.34339],[10.32056,47.28678],[10.28202,47.27806],[10.28416,47.26208],[10.14714,47.26208],[10.1921,47.30275],[10.19424,47.37384],[10.16641,47.37384],[10.16641,47.34629],[10.10004,47.34339],[10.0615,47.36369],[10.06792,47.41877],[10.09361,47.42601],[10.09576,47.44194],[9.978,47.48537],[9.95659,47.52731],[9.8945,47.52876],[9.85596,47.50851],[9.81743,47.54465],[9.82171,47.57644],[9.77461,47.58222],[9.73821,47.52586],[9.67398,47.53454],[9.58406,47.56488],[9.63972,47.60532],[9.7168,47.60388],[9.85596,47.676],[9.978,47.65582],[10.02938,47.68177],[10.10004,47.66735],[10.13215,47.676],[10.14286,47.70195],[10.0615,47.7725],[10.11288,47.8099],[10.08291,47.85302],[10.1086,47.90902],[10.07649,47.96496],[10.13001,48.02084],[10.13429,48.10669],[10.10004,48.12813],[10.05508,48.26228],[9.96944,48.36765],[10.03153,48.42593],[10.02938,48.46144],[10.12359,48.47705],[10.15356,48.4515],[10.23492,48.51252],[10.31628,48.51678],[10.29915,48.61878],[10.24563,48.6683],[10.27346,48.70646],[10.3698,48.68385],[10.43189,48.69939],[10.45116,48.72765],[10.40192,48.746],[10.44046,48.84896],[10.43403,48.95873],[10.33769,49.02055],[10.24991,49.03599],[10.24991,49.07387],[10.20066,49.10331],[10.25205,49.13274],[10.12359,49.19714],[10.11931,49.26285],[10.15142,49.28939],[10.10432,49.34522],[10.14072,49.39401],[10.1086,49.44555],[10.11074,49.50537],[10.0722,49.53316],[10.01654,49.47616],[9.92662,49.47894],[9.92448,49.55678],[9.89878,49.58177],[9.85596,49.53872],[9.80672,49.55678],[9.86667,49.60675],[9.85382,49.6442],[9.81743,49.66083],[9.83455,49.68993],[9.79602,49.72039],[9.75748,49.70793],[9.74035,49.68577],[9.70609,49.71624],[9.67826,49.71624],[9.68254,49.68854],[9.62045,49.69131],[9.64615,49.78955],[9.55836,49.77434],[9.57121,49.73561],[9.50698,49.75222],[9.49199,49.77987],[9.46844,49.76051],[9.42562,49.77849],[9.40421,49.76466],[9.33356,49.7702],[9.32928,49.73423],[9.4085,49.72593],[9.42776,49.69824],[9.41492,49.6442],[9.38066,49.63865],[9.35925,49.64974],[9.33998,49.63727],[9.31215,49.64836],[9.27789,49.62617],[9.28432,49.60814],[9.2415,49.57483],[9.09805,49.57205],[9.06594,49.60814],[9.10019,49.65113],[9.09163,49.6927],[9.13017,49.71208],[9.13873,49.74253],[9.10876,49.75637],[9.13659,49.79093],[9.10019,49.78955],[9.07236,49.82824],[9.03596,49.83514],[9.01669,50.02671],[8.96317,50.03084],[8.95674,50.05971],[9.00171,50.0707],[9.02097,50.11054],[9.1216,50.12289],[9.15586,50.11328],[9.19654,50.11878],[9.18583,50.13525],[9.23507,50.1476],[9.37638,50.12701],[9.4085,50.0817],[9.52197,50.09543],[9.50484,50.14211],[9.53267,50.16406],[9.48985,50.16954],[9.49413,50.24354],[9.61403,50.22163],[9.66541,50.23532],[9.63544,50.24901],[9.66756,50.27228],[9.74249,50.30922],[9.72964,50.35841],[9.77032,50.42939],[9.86881,50.40074],[9.91805,50.40893],[10.03581,50.47982],[10.03795,50.51115],[10.12359,50.56846]]],terms_url:"https://www.ldbv.bayern.de/",terms_text:"Bayerische Vermessungsverwaltung"},{id:"bavaria-80cm",name:"Bavaria (80 cm)",type:"wms",template:"https://www.geodaten.bayern.de/ogc/ogc_dop80_oa.cgi?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=by_dop80c&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[7,18],polygon:[[[10.12359,50.56846],[10.14286,50.55078],[10.20281,50.55742],[10.25205,50.51796],[10.32698,50.49345],[10.41048,50.41848],[10.60317,50.33109],[10.62244,50.2271],[10.72521,50.21066],[10.72949,50.24765],[10.85153,50.24354],[10.71879,50.32015],[10.71236,50.36524],[10.85581,50.39664],[10.93717,50.39664],[10.99069,50.36661],[11.12772,50.36661],[11.1791,50.31332],[11.16197,50.29417],[11.24119,50.2928],[11.24975,50.37344],[11.24119,50.47982],[11.35895,50.5234],[11.43816,50.50979],[11.44244,50.48936],[11.42532,50.4771],[11.42532,50.44166],[11.48955,50.42257],[11.49169,50.39801],[11.51952,50.39801],[11.52594,50.37617],[11.59874,50.40347],[11.63727,50.38845],[11.79357,50.4212],[11.83639,50.39255],[11.92203,50.42802],[11.98626,50.38709],[11.98412,50.35705],[12.04835,50.33109],[12.09331,50.32972],[12.1297,50.29828],[12.14041,50.27228],[12.10615,50.25586],[12.11258,50.23532],[12.14897,50.23669],[12.19822,50.20107],[12.22391,50.16406],[12.20464,50.14348],[12.20678,50.10779],[12.24318,50.09955],[12.27743,50.07208],[12.49367,49.98543],[12.49796,49.94136],[12.55576,49.92206],[12.54934,49.86827],[12.48083,49.78817],[12.41018,49.75775],[12.46156,49.70655],[12.5472,49.68023],[12.58788,49.55261],[12.65425,49.53455],[12.66281,49.43302],[12.75274,49.41073],[12.7977,49.34661],[12.90475,49.35638],[12.99681,49.33685],[13.05462,49.27543],[13.13169,49.21952],[13.19164,49.14395],[13.2366,49.12153],[13.29655,49.12293],[13.37148,49.08088],[13.4143,49.02897],[13.4143,48.97981],[13.57916,48.96997],[13.63483,48.94326],[13.67765,48.88698],[13.73759,48.89261],[13.7847,48.83346],[13.84036,48.77423],[13.81681,48.70646],[13.84464,48.70081],[13.8425,48.60038],[13.76543,48.5423],[13.75258,48.50401],[13.67122,48.50543],[13.64339,48.54371],[13.45712,48.5508],[13.45712,48.41598],[13.40574,48.36053],[13.2837,48.27511],[13.09315,48.26941],[12.95827,48.19097],[12.87691,48.18526],[12.772,48.09382],[12.86407,48.01368],[12.89832,47.95492],[12.94543,47.95636],[12.99681,47.88461],[13.01394,47.83434],[12.93472,47.7322],[13.0589,47.72499],[13.11885,47.63851],[13.06532,47.56922],[13.05676,47.47379],[13.00323,47.45208],[12.76772,47.55044],[12.76986,47.63274],[12.73989,47.67312],[12.6671,47.67024],[12.57503,47.6212],[12.48083,47.61975],[12.41446,47.67024],[12.24318,47.67745],[12.2132,47.69186],[12.19179,47.68177],[12.2132,47.66591],[12.21106,47.60388],[12.17467,47.59521],[12.13827,47.60388],[11.89205,47.60388],[11.85137,47.57933],[11.63942,47.58222],[11.59445,47.54899],[11.59017,47.51285],[11.51738,47.49839],[11.4403,47.50417],[11.39534,47.47524],[11.42746,47.44484],[11.3461,47.44339],[11.27973,47.39559],[11.21336,47.38834],[11.24761,47.43181],[11.10203,47.39269],[10.965,47.38979],[10.97785,47.43615],[10.9179,47.47524],[10.8708,47.47524],[10.85581,47.49405],[10.90077,47.5143],[10.87294,47.53598],[10.81085,47.51285],[10.64385,47.54899],[10.59461,47.55477],[10.57962,47.52876],[10.46187,47.54032],[10.46615,47.48392],[10.48756,47.47813],[10.48756,47.41298],[10.45973,47.40283],[10.45973,47.37529],[10.41048,47.37384],[10.40834,47.34339],[10.32056,47.28678],[10.28202,47.27806],[10.28416,47.26208],[10.14714,47.26208],[10.1921,47.30275],[10.19424,47.37384],[10.16641,47.37384],[10.16641,47.34629],[10.10004,47.34339],[10.0615,47.36369],[10.06792,47.41877],[10.09361,47.42601],[10.09576,47.44194],[9.978,47.48537],[9.95659,47.52731],[9.8945,47.52876],[9.85596,47.50851],[9.81743,47.54465],[9.82171,47.57644],[9.77461,47.58222],[9.73821,47.52586],[9.67398,47.53454],[9.58406,47.56488],[9.63972,47.60532],[9.7168,47.60388],[9.85596,47.676],[9.978,47.65582],[10.02938,47.68177],[10.10004,47.66735],[10.13215,47.676],[10.14286,47.70195],[10.0615,47.7725],[10.11288,47.8099],[10.08291,47.85302],[10.1086,47.90902],[10.07649,47.96496],[10.13001,48.02084],[10.13429,48.10669],[10.10004,48.12813],[10.05508,48.26228],[9.96944,48.36765],[10.03153,48.42593],[10.02938,48.46144],[10.12359,48.47705],[10.15356,48.4515],[10.23492,48.51252],[10.31628,48.51678],[10.29915,48.61878],[10.24563,48.6683],[10.27346,48.70646],[10.3698,48.68385],[10.43189,48.69939],[10.45116,48.72765],[10.40192,48.746],[10.44046,48.84896],[10.43403,48.95873],[10.33769,49.02055],[10.24991,49.03599],[10.24991,49.07387],[10.20066,49.10331],[10.25205,49.13274],[10.12359,49.19714],[10.11931,49.26285],[10.15142,49.28939],[10.10432,49.34522],[10.14072,49.39401],[10.1086,49.44555],[10.11074,49.50537],[10.0722,49.53316],[10.01654,49.47616],[9.92662,49.47894],[9.92448,49.55678],[9.89878,49.58177],[9.85596,49.53872],[9.80672,49.55678],[9.86667,49.60675],[9.85382,49.6442],[9.81743,49.66083],[9.83455,49.68993],[9.79602,49.72039],[9.75748,49.70793],[9.74035,49.68577],[9.70609,49.71624],[9.67826,49.71624],[9.68254,49.68854],[9.62045,49.69131],[9.64615,49.78955],[9.55836,49.77434],[9.57121,49.73561],[9.50698,49.75222],[9.49199,49.77987],[9.46844,49.76051],[9.42562,49.77849],[9.40421,49.76466],[9.33356,49.7702],[9.32928,49.73423],[9.4085,49.72593],[9.42776,49.69824],[9.41492,49.6442],[9.38066,49.63865],[9.35925,49.64974],[9.33998,49.63727],[9.31215,49.64836],[9.27789,49.62617],[9.28432,49.60814],[9.2415,49.57483],[9.09805,49.57205],[9.06594,49.60814],[9.10019,49.65113],[9.09163,49.6927],[9.13017,49.71208],[9.13873,49.74253],[9.10876,49.75637],[9.13659,49.79093],[9.10019,49.78955],[9.07236,49.82824],[9.03596,49.83514],[9.01669,50.02671],[8.96317,50.03084],[8.95674,50.05971],[9.00171,50.0707],[9.02097,50.11054],[9.1216,50.12289],[9.15586,50.11328],[9.19654,50.11878],[9.18583,50.13525],[9.23507,50.1476],[9.37638,50.12701],[9.4085,50.0817],[9.52197,50.09543],[9.50484,50.14211],[9.53267,50.16406],[9.48985,50.16954],[9.49413,50.24354],[9.61403,50.22163],[9.66541,50.23532],[9.63544,50.24901],[9.66756,50.27228],[9.74249,50.30922],[9.72964,50.35841],[9.77032,50.42939],[9.86881,50.40074],[9.91805,50.40893],[10.03581,50.47982],[10.03795,50.51115],[10.12359,50.56846]]],terms_url:"https://www.ldbv.bayern.de/",terms_text:"Bayerische Vermessungsverwaltung",best:true},{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.12359,50.56846],[10.14286,50.55078],[10.20281,50.55742],[10.25205,50.51796],[10.32698,50.49345],[10.41048,50.41848],[10.60317,50.33109],[10.62244,50.2271],[10.72521,50.21066],[10.72949,50.24765],[10.85153,50.24354],[10.71879,50.32015],[10.71236,50.36524],[10.85581,50.39664],[10.93717,50.39664],[10.99069,50.36661],[11.12772,50.36661],[11.1791,50.31332],[11.16197,50.29417],[11.24119,50.2928],[11.24975,50.37344],[11.24119,50.47982],[11.35895,50.5234],[11.43816,50.50979],[11.44244,50.48936],[11.42532,50.4771],[11.42532,50.44166],[11.48955,50.42257],[11.49169,50.39801],[11.51952,50.39801],[11.52594,50.37617],[11.59874,50.40347],[11.63727,50.38845],[11.79357,50.4212],[11.83639,50.39255],[11.92203,50.42802],[11.98626,50.38709],[11.98412,50.35705],[12.04835,50.33109],[12.09331,50.32972],[12.1297,50.29828],[12.14041,50.27228],[12.10615,50.25586],[12.11258,50.23532],[12.14897,50.23669],[12.19822,50.20107],[12.22391,50.16406],[12.20464,50.14348],[12.20678,50.10779],[12.24318,50.09955],[12.27743,50.07208],[12.49367,49.98543],[12.49796,49.94136],[12.55576,49.92206],[12.54934,49.86827],[12.48083,49.78817],[12.41018,49.75775],[12.46156,49.70655],[12.5472,49.68023],[12.58788,49.55261],[12.65425,49.53455],[12.66281,49.43302],[12.75274,49.41073],[12.7977,49.34661],[12.90475,49.35638],[12.99681,49.33685],[13.05462,49.27543],[13.13169,49.21952],[13.19164,49.14395],[13.2366,49.12153],[13.29655,49.12293],[13.37148,49.08088],[13.4143,49.02897],[13.4143,48.97981],[13.57916,48.96997],[13.63483,48.94326],[13.67765,48.88698],[13.73759,48.89261],[13.7847,48.83346],[13.84036,48.77423],[13.81681,48.70646],[13.84464,48.70081],[13.8425,48.60038],[13.76543,48.5423],[13.75258,48.50401],[13.67122,48.50543],[13.64339,48.54371],[13.45712,48.5508],[13.45712,48.41598],[13.40574,48.36053],[13.2837,48.27511],[13.09315,48.26941],[12.95827,48.19097],[12.87691,48.18526],[12.772,48.09382],[12.86407,48.01368],[12.89832,47.95492],[12.94543,47.95636],[12.99681,47.88461],[13.01394,47.83434],[12.93472,47.7322],[13.0589,47.72499],[13.11885,47.63851],[13.06532,47.56922],[13.05676,47.47379],[13.00323,47.45208],[12.76772,47.55044],[12.76986,47.63274],[12.73989,47.67312],[12.6671,47.67024],[12.57503,47.6212],[12.48083,47.61975],[12.41446,47.67024],[12.24318,47.67745],[12.2132,47.69186],[12.19179,47.68177],[12.2132,47.66591],[12.21106,47.60388],[12.17467,47.59521],[12.13827,47.60388],[11.89205,47.60388],[11.85137,47.57933],[11.63942,47.58222],[11.59445,47.54899],[11.59017,47.51285],[11.51738,47.49839],[11.4403,47.50417],[11.39534,47.47524],[11.42746,47.44484],[11.3461,47.44339],[11.27973,47.39559],[11.21336,47.38834],[11.24761,47.43181],[11.10203,47.39269],[10.965,47.38979],[10.97785,47.43615],[10.9179,47.47524],[10.8708,47.47524],[10.85581,47.49405],[10.90077,47.5143],[10.87294,47.53598],[10.81085,47.51285],[10.64385,47.54899],[10.59461,47.55477],[10.57962,47.52876],[10.46187,47.54032],[10.46615,47.48392],[10.48756,47.47813],[10.48756,47.41298],[10.45973,47.40283],[10.45973,47.37529],[10.41048,47.37384],[10.40834,47.34339],[10.32056,47.28678],[10.28202,47.27806],[10.28416,47.26208],[10.14714,47.26208],[10.1921,47.30275],[10.19424,47.37384],[10.16641,47.37384],[10.16641,47.34629],[10.10004,47.34339],[10.0615,47.36369],[10.06792,47.41877],[10.09361,47.42601],[10.09576,47.44194],[9.978,47.48537],[9.95659,47.52731],[9.8945,47.52876],[9.85596,47.50851],[9.81743,47.54465],[9.82171,47.57644],[9.77461,47.58222],[9.73821,47.52586],[9.67398,47.53454],[9.58406,47.56488],[9.63972,47.60532],[9.7168,47.60388],[9.85596,47.676],[9.978,47.65582],[10.02938,47.68177],[10.10004,47.66735],[10.13215,47.676],[10.14286,47.70195],[10.0615,47.7725],[10.11288,47.8099],[10.08291,47.85302],[10.1086,47.90902],[10.07649,47.96496],[10.13001,48.02084],[10.13429,48.10669],[10.10004,48.12813],[10.05508,48.26228],[9.96944,48.36765],[10.03153,48.42593],[10.02938,48.46144],[10.12359,48.47705],[10.15356,48.4515],[10.23492,48.51252],[10.31628,48.51678],[10.29915,48.61878],[10.24563,48.6683],[10.27346,48.70646],[10.3698,48.68385],[10.43189,48.69939],[10.45116,48.72765],[10.40192,48.746],[10.44046,48.84896],[10.43403,48.95873],[10.33769,49.02055],[10.24991,49.03599],[10.24991,49.07387],[10.20066,49.10331],[10.25205,49.13274],[10.12359,49.19714],[10.11931,49.26285],[10.15142,49.28939],[10.10432,49.34522],[10.14072,49.39401],[10.1086,49.44555],[10.11074,49.50537],[10.0722,49.53316],[10.01654,49.47616],[9.92662,49.47894],[9.92448,49.55678],[9.89878,49.58177],[9.85596,49.53872],[9.80672,49.55678],[9.86667,49.60675],[9.85382,49.6442],[9.81743,49.66083],[9.83455,49.68993],[9.79602,49.72039],[9.75748,49.70793],[9.74035,49.68577],[9.70609,49.71624],[9.67826,49.71624],[9.68254,49.68854],[9.62045,49.69131],[9.64615,49.78955],[9.55836,49.77434],[9.57121,49.73561],[9.50698,49.75222],[9.49199,49.77987],[9.46844,49.76051],[9.42562,49.77849],[9.40421,49.76466],[9.33356,49.7702],[9.32928,49.73423],[9.4085,49.72593],[9.42776,49.69824],[9.41492,49.6442],[9.38066,49.63865],[9.35925,49.64974],[9.33998,49.63727],[9.31215,49.64836],[9.27789,49.62617],[9.28432,49.60814],[9.2415,49.57483],[9.09805,49.57205],[9.06594,49.60814],[9.10019,49.65113],[9.09163,49.6927],[9.13017,49.71208],[9.13873,49.74253],[9.10876,49.75637],[9.13659,49.79093],[9.10019,49.78955],[9.07236,49.82824],[9.03596,49.83514],[9.01669,50.02671],[8.96317,50.03084],[8.95674,50.05971],[9.00171,50.0707],[9.02097,50.11054],[9.1216,50.12289],[9.15586,50.11328],[9.19654,50.11878],[9.18583,50.13525],[9.23507,50.1476],[9.37638,50.12701],[9.4085,50.0817],[9.52197,50.09543],[9.50484,50.14211],[9.53267,50.16406],[9.48985,50.16954],[9.49413,50.24354],[9.61403,50.22163],[9.66541,50.23532],[9.63544,50.24901],[9.66756,50.27228],[9.74249,50.30922],[9.72964,50.35841],[9.77032,50.42939],[9.86881,50.40074],[9.91805,50.40893],[10.03581,50.47982],[10.03795,50.51115],[10.12359,50.56846]]],terms_url:"https://www.ldbv.bayern.de/",terms_text:"Bayerische Vermessungsverwaltung",best:true},{id:"route500hydro",name:"BD Carthage",type:"tms",template:"https://{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.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,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.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]],[[-61.27501,14.90218],[-60.72368,14.90101],[-60.72489,14.36686],[-61.27622,14.36803],[-61.27501,14.90218]],[[-61.92802,16.58618],[-61.92686,15.7394],[-60.88128,15.74072],[-60.88243,16.5875],[-61.92802,16.58618]],[[-53.89344,6.004],[-52.46522,5.4465],[-51.52039,4.51072],[-51.53687,4.11633],[-52.2345,3.10213],[-52.641,2.25162],[-52.92664,2.07597],[-53.72864,2.21869],[-54.20106,2.03205],[-54.8053,2.27358],[-54.31092,2.80589],[-54.31641,3.20085],[-54.12415,3.46408],[-54.12964,3.59567],[-54.42078,4.00127],[-54.58008,4.95962],[-53.89344,6.004]],[[55.08816,-20.77935],[55.95959,-20.77281],[55.96576,-21.49],[55.09434,-21.49651],[55.08816,-20.77935]],[[44.92054,-12.57363],[45.34826,-12.57029],[45.35274,-13.1163],[44.92502,-13.11963],[44.92054,-12.57363]],[[-178.57728,-14.70582],[-178.42568,-14.00334],[-176.34156,-12.83858],[-175.71534,-12.9189],[-175.91858,-13.58726],[-177.84638,-14.64983],[-178.57728,-14.70582]]],terms_url:"https://openstreetmap.fr/bdortho",terms_text:"BDOrtho IGN",best:true,icon:"http://www.ign.fr/institut/sites/all/themes/ign_institut/logo.png"},{id:"Benin_cotonou_pleiade_2016",name:"Benin: Cotonou Pleiade 2016",type:"tms",template:"https://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.31954,6.55745],[2.33645,6.56024],[2.36377,6.56211],[2.36738,6.56068],[2.37777,6.5494],[2.37779,6.53485],[2.36994,6.49332],[2.37038,6.45527],[2.36958,6.45269],[2.36188,6.44177],[2.35392,6.40545],[2.36749,6.4015],[2.39526,6.40072],[2.40128,6.40374],[2.40588,6.40341],[2.42046,6.39383],[2.42485,6.39794],[2.42949,6.39887],[2.43625,6.39628],[2.43958,6.40042],[2.44439,6.40189],[2.45376,6.39899],[2.47145,6.39632],[2.48162,6.39106],[2.49453,6.3874],[2.50893,6.38888],[2.50719,6.39229],[2.5012,6.39162],[2.4963,6.39521],[2.4951,6.40123],[2.49543,6.40401],[2.4983,6.41022],[2.50191,6.41282],[2.51087,6.41321],[2.52219,6.40849],[2.53352,6.40517],[2.5381,6.40961],[2.54111,6.4109],[2.54651,6.41099],[2.54654,6.40651],[2.57639,6.40724],[2.57642,6.41177],[2.58576,6.41196],[2.58868,6.41095],[2.60877,6.39414],[2.6257,6.39488],[2.64555,6.39729],[2.65039,6.39339],[2.65367,6.36823],[2.64312,6.36659],[2.61251,6.36289],[2.56868,6.3607],[2.54683,6.36055],[2.54687,6.35546],[2.50207,6.35461],[2.47064,6.35596],[2.46777,6.35203],[2.46423,6.3502],[2.45254,6.35006],[2.45113,6.34813],[2.44737,6.34629],[2.43757,6.34654],[2.43298,6.33841],[2.43016,6.33707],[2.42245,6.33707],[2.39236,6.34115],[2.39315,6.34115],[2.36528,6.34445],[2.35386,6.3453],[2.34377,6.34458],[2.34094,6.34534],[2.31086,6.36567],[2.28435,6.37465],[2.28147,6.37762],[2.27599,6.39517],[2.27612,6.3982],[2.31529,6.49261],[2.3158,6.55307],[2.31954,6.55745]],[[1.69563,6.25076],[1.7001,6.24712],[1.70418,6.24697],[1.75875,6.25836],[1.77079,6.25995],[1.81712,6.27161],[1.84457,6.27657],[1.85768,6.27945],[1.88843,6.28326],[1.90482,6.28595],[1.90618,6.29435],[1.90083,6.29721],[1.89881,6.29954],[1.89404,6.30085],[1.89048,6.2997],[1.88748,6.29636],[1.88344,6.29622],[1.8697,6.29227],[1.8564,6.29198],[1.85207,6.28675],[1.84991,6.28906],[1.84691,6.29203],[1.84353,6.29333],[1.84041,6.29315],[1.83627,6.29129],[1.8341,6.28733],[1.83417,6.2852],[1.8323,6.28456],[1.82786,6.28644],[1.82182,6.29084],[1.81563,6.28998],[1.81211,6.29143],[1.80758,6.29571],[1.80472,6.29693],[1.80074,6.2971],[1.79776,6.29612],[1.79625,6.29492],[1.7949,6.28965],[1.79641,6.28608],[1.80098,6.28338],[1.79567,6.28013],[1.79156,6.28174],[1.78499,6.28122],[1.78092,6.27753],[1.77588,6.2755],[1.76745,6.27696],[1.75653,6.27496],[1.74833,6.27239],[1.74762,6.27726],[1.74572,6.27938],[1.73948,6.27985],[1.7368,6.27761],[1.73572,6.27892],[1.72902,6.27911],[1.72435,6.27422],[1.72449,6.26786],[1.72556,6.26683],[1.69934,6.26159],[1.69573,6.25726],[1.69563,6.25076]]],best:true},{id:"Berlin-2011",name:"Berlin aerial photography 2011",type:"wms",template:"https://fbinter.stadt-berlin.de/fb/wms/senstadt/k_luftbild2011_20?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[13.48699,52.68076],[13.52584,52.65196],[13.5299,52.64437],[13.54209,52.60921],[13.58109,52.58134],[13.59674,52.55936],[13.63477,52.55121],[13.66547,52.52854],[13.67199,52.50379],[13.65806,52.50372],[13.65796,52.49324],[13.7547,52.4565],[13.76644,52.43884],[13.76627,52.42973],[13.74494,52.39909],[13.65235,52.33133],[13.6417,52.33103],[13.62609,52.35491],[13.59432,52.37455],[13.53198,52.38376],[13.51948,52.39236],[13.48536,52.39227],[13.43552,52.38016],[13.42885,52.37401],[13.38689,52.37388],[13.38642,52.38667],[13.36857,52.38728],[13.37045,52.39349],[13.33968,52.40887],[13.31243,52.39775],[13.30557,52.40452],[13.23622,52.40342],[13.18886,52.40417],[13.17719,52.39067],[13.14859,52.38971],[13.14868,52.38421],[13.11889,52.38385],[13.11935,52.40025],[13.10487,52.40723],[13.07371,52.40668],[13.07367,52.41403],[13.10516,52.47897],[13.11685,52.47881],[13.112,52.55915],[13.11865,52.59156],[13.15251,52.60489],[13.16282,52.60462],[13.21264,52.6321],[13.22139,52.63215],[13.27292,52.66444],[13.31376,52.66442],[13.32714,52.64692],[13.36783,52.6468],[13.39158,52.65382],[13.42728,52.6549],[13.47594,52.68122],[13.48699,52.68076]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2011"},{id:"Berlin-2014",name:"Berlin aerial photography 2014",type:"tms",template:"https://tiles.codefor.de/berlin-2014/{zoom}/{x}/{y}.png",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[13.19746,52.64206],[13.25639,52.64285],[13.2558,52.66101],[13.31391,52.66185],[13.31476,52.64353],[13.37431,52.64462],[13.37386,52.66269],[13.4026,52.663],[13.40332,52.64501],[13.4334,52.64555],[13.43227,52.68001],[13.49082,52.68111],[13.49147,52.66428],[13.52092,52.66457],[13.5216,52.6465],[13.55096,52.6469],[13.55147,52.62938],[13.52219,52.62898],[13.52335,52.59248],[13.58263,52.59329],[13.58307,52.57535],[13.61246,52.57582],[13.61324,52.55784],[13.64268,52.55813],[13.64296,52.5401],[13.67253,52.54048],[13.67375,52.50475],[13.64413,52.5045],[13.64476,52.48608],[13.7037,52.48683],[13.70415,52.46901],[13.73362,52.4692],[13.73399,52.45121],[13.76358,52.45156],[13.76447,52.40209],[13.73546,52.39753],[13.73611,52.37963],[13.70678,52.37935],[13.70731,52.36136],[13.67785,52.36104],[13.67898,52.33017],[13.62102,52.32946],[13.61999,52.36033],[13.59046,52.36007],[13.5901,52.37806],[13.53116,52.37735],[13.53064,52.39525],[13.47168,52.39459],[13.47149,52.4125],[13.44101,52.41219],[13.44257,52.37604],[13.35487,52.37498],[13.35427,52.39306],[13.23667,52.39114],[13.23609,52.40922],[13.17635,52.40836],[13.17752,52.39029],[13.14791,52.38987],[13.14876,52.37459],[13.11971,52.37422],[13.11941,52.38955],[13.08981,52.38899],[13.08938,52.40707],[13.0618,52.40662],[13.06075,52.42408],[13.08842,52.42449],[13.086,52.47853],[13.11546,52.47896],[13.11462,52.49695],[13.1441,52.49729],[13.14332,52.5157],[13.1137,52.51528],[13.11077,52.6047],[13.19862,52.6062],[13.19746,52.64206]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2014"},{id:"Berlin-2015",name:"Berlin aerial photography 2015",type:"tms",template:"https://tiles.codefor.de/berlin-2015/{zoom}/{x}/{y}.png",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[13.11068,52.59538],[13.13975,52.60527],[13.18355,52.61488],[13.21262,52.63315],[13.24167,52.64282],[13.256,52.65201],[13.27004,52.67021],[13.31368,52.67072],[13.32914,52.66204],[13.32948,52.6529],[13.43284,52.65414],[13.44733,52.6816],[13.50561,52.68244],[13.50654,52.65531],[13.53605,52.65572],[13.5376,52.61991],[13.52229,52.61977],[13.52304,52.60165],[13.59776,52.58469],[13.59865,52.55769],[13.62817,52.55805],[13.64303,52.5492],[13.65813,52.54042],[13.67312,52.53144],[13.67356,52.51358],[13.65913,52.51344],[13.65998,52.48643],[13.68931,52.48687],[13.73386,52.46933],[13.73405,52.46034],[13.76362,52.46068],[13.76431,52.42464],[13.74941,52.42474],[13.75045,52.39778],[13.73585,52.39762],[13.70661,52.37944],[13.707,52.3614],[13.67782,52.36125],[13.66405,52.33395],[13.62073,52.33337],[13.62031,52.36042],[13.58986,52.3781],[13.53149,52.37748],[13.53133,52.38641],[13.44223,52.38484],[13.42813,52.3667],[13.38464,52.3662],[13.35432,52.39301],[13.29537,52.39209],[13.29531,52.40103],[13.19171,52.39957],[13.19222,52.39056],[13.14774,52.38996],[13.14839,52.38095],[13.11964,52.38041],[13.0744,52.40683],[13.07392,52.42426],[13.10275,52.43374],[13.10123,52.47874],[13.11558,52.47897],[13.11068,52.59538]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2015"},{id:"Berlin-2016",name:"Berlin aerial photography 2016",type:"tms",template:"https://tiles.codefor.de/berlin-2016/{zoom}/{x}/{y}.png",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2016"},{id:"Berlin-2017",name:"Berlin aerial photography 2017",type:"tms",template:"https://tiles.codefor.de/berlin-2017/{zoom}/{x}/{y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2017",best:true},{id:"Berlin-2017-infrared",name:"Berlin aerial photography 2017 (infrared)",type:"tms",template:"https://tiles.codefor.de/berlin-2017i/{zoom}/{x}/{y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale Color-Infrarot-Orthophotos 2017"},{id:"Bing",name:"Bing aerial imagery",type:"bing",template:"https://www.bing.com/maps",scaleExtent:[0,22],"default":true,description:"Satellite and aerial imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/Bing.png"},{id:"Bologna-Orthophoto-2017",name:"Bologna ortofoto 2017",type:"tms",template:"https://sitmappe.comune.bologna.it/tms/tileserver/Ortofoto2017/{zoom}/{x}/{y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",scaleExtent:[0,19],polygon:[[[11.22962,44.53077],[11.23184,44.52461],[11.24123,44.52167],[11.23251,44.50893],[11.23572,44.50323],[11.25009,44.50116],[11.24765,44.49644],[11.25708,44.49765],[11.25653,44.49294],[11.29461,44.48981],[11.29676,44.4857],[11.28807,44.47586],[11.29226,44.4609],[11.28447,44.45459],[11.28228,44.42572],[11.29347,44.4276],[11.29254,44.43377],[11.31339,44.42103],[11.32504,44.42274],[11.33695,44.42772],[11.33765,44.43167],[11.3315,44.43273],[11.33453,44.43867],[11.34466,44.43594],[11.34498,44.44093],[11.36235,44.45099],[11.37312,44.44935],[11.37498,44.45897],[11.39499,44.46368],[11.4011,44.46122],[11.39464,44.46803],[11.41577,44.48376],[11.42559,44.4845],[11.42717,44.48921],[11.41727,44.4906],[11.43363,44.51312],[11.42692,44.51532],[11.43034,44.5196],[11.42466,44.51959],[11.41987,44.52934],[11.4143,44.52564],[11.40739,44.52851],[11.41487,44.53999],[11.38871,44.54145],[11.39082,44.54553],[11.36474,44.55253],[11.36414,44.55609],[11.3573,44.5519],[11.34375,44.55333],[11.33589,44.54299],[11.33145,44.54734],[11.31349,44.54722],[11.30929,44.5295],[11.29104,44.53581],[11.28179,44.54851],[11.26911,44.53248],[11.25118,44.55578],[11.24499,44.55569],[11.22962,44.53077]]],terms_url:"http://dati.comune.bologna.it/node/3449",terms_text:"© Comune di Bologna cc-by 4.0 ODbL compliant",best:true},{id:"Bonvillars-2013",name:"Bonvillars Orthophoto 2013",type:"tms",template:"http://osmdata.asitvd.ch/tiles/bonvillars2013/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",scaleExtent:[14,20],polygon:[[[6.66713,46.83358],[6.66313,46.83833],[6.67213,46.84191],[6.6749,46.84226],[6.67843,46.83807],[6.66713,46.83358]]],terms_url:"http://osmdata.asitvd.ch/",terms_text:"Bonvillars - Orthophoto technique 2013"},{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.59923,45.04193],[-0.54231,45.02757],[-0.50979,45.00601],[-0.47727,45.00206],[-0.47066,44.97367],[-0.45542,44.95102],[-0.46456,44.91792],[-0.4732,44.91936],[-0.48794,44.90928],[-0.4981,44.89057],[-0.48946,44.87797],[-0.4666,44.87076],[-0.47625,44.84735],[-0.49505,44.83978],[-0.49099,44.83186],[-0.46965,44.82537],[-0.49709,44.80446],[-0.52453,44.80013],[-0.5103,44.76767],[-0.53469,44.76515],[-0.56213,44.75107],[-0.5601,44.74169],[-0.5728,44.74133],[-0.59465,44.7601],[-0.63429,44.73989],[-0.65004,44.77705],[-0.67901,44.77489],[-0.68816,44.77922],[-0.71509,44.76839],[-0.75168,44.7471],[-0.76336,44.75577],[-0.73846,44.77561],[-0.74202,44.78571],[-0.72779,44.81239],[-0.73999,44.82861],[-0.76438,44.82933],[-0.803,44.82176],[-0.8401,44.82753],[-0.83908,44.84014],[-0.87567,44.85023],[-0.88532,44.85852],[-0.88685,44.88769],[-0.86601,44.88697],[-0.84569,44.89669],[-0.83349,44.92764],[-0.81825,44.92764],[-0.80198,44.92224],[-0.79843,44.9485],[-0.78725,44.94814],[-0.75574,44.97007],[-0.72169,44.95785],[-0.69578,44.93087],[-0.68866,44.93447],[-0.67139,44.93267],[-0.66935,44.94095],[-0.62514,44.95066],[-0.63226,44.95893],[-0.63124,44.9672],[-0.60024,44.96756],[-0.55146,44.97834],[-0.54079,44.97726],[-0.55451,44.99739],[-0.59364,45.01751],[-0.60787,45.03403],[-0.59923,45.04193]]],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.59923,45.04193],[-0.54231,45.02757],[-0.50979,45.00601],[-0.47727,45.00206],[-0.47066,44.97367],[-0.45542,44.95102],[-0.46456,44.91792],[-0.4732,44.91936],[-0.48794,44.90928],[-0.4981,44.89057],[-0.48946,44.87797],[-0.4666,44.87076],[-0.47625,44.84735],[-0.49505,44.83978],[-0.49099,44.83186],[-0.46965,44.82537],[-0.49709,44.80446],[-0.52453,44.80013],[-0.5103,44.76767],[-0.53469,44.76515],[-0.56213,44.75107],[-0.5601,44.74169],[-0.5728,44.74133],[-0.59465,44.7601],[-0.63429,44.73989],[-0.65004,44.77705],[-0.67901,44.77489],[-0.68816,44.77922],[-0.71509,44.76839],[-0.75168,44.7471],[-0.76336,44.75577],[-0.73846,44.77561],[-0.74202,44.78571],[-0.72779,44.81239],[-0.73999,44.82861],[-0.76438,44.82933],[-0.803,44.82176],[-0.8401,44.82753],[-0.83908,44.84014],[-0.87567,44.85023],[-0.88532,44.85852],[-0.88685,44.88769],[-0.86601,44.88697],[-0.84569,44.89669],[-0.83349,44.92764],[-0.81825,44.92764],[-0.80198,44.92224],[-0.79843,44.9485],[-0.78725,44.94814],[-0.75574,44.97007],[-0.72169,44.95785],[-0.69578,44.93087],[-0.68866,44.93447],[-0.67139,44.93267],[-0.66935,44.94095],[-0.62514,44.95066],[-0.63226,44.95893],[-0.63124,44.9672],[-0.60024,44.96756],[-0.55146,44.97834],[-0.54079,44.97726],[-0.55451,44.99739],[-0.59364,45.01751],[-0.60787,45.03403],[-0.59923,45.04193]]],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.96968,-9.2928],[-35.97063,-9.20261],[-35.97727,-9.20264],[-35.98365,-9.2027],[-35.98765,-9.20266],[-35.99159,-9.20274],[-36.00498,-9.20284],[-36.01473,-9.20293],[-36.01651,-9.20296],[-36.01871,-9.20293],[-36.02487,-9.20286],[-36.02892,-9.20297],[-36.03308,-9.20289],[-36.03769,-9.20294],[-36.04581,-9.203],[-36.05161,-9.20305],[-36.05457,-9.20301],[-36.06022,-9.20304],[-36.06191,-9.20304],[-36.0618,-9.21319],[-36.06167,-9.21806],[-36.06156,-9.21915],[-36.06163,-9.22156],[-36.06144,-9.22277],[-36.06139,-9.22716],[-36.06134,-9.23227],[-36.0614,-9.23391],[-36.06145,-9.23494],[-36.06131,-9.23646],[-36.06133,-9.23773],[-36.06142,-9.23905],[-36.06145,-9.24133],[-36.06136,-9.2423],[-36.06141,-9.24358],[-36.06139,-9.2453],[-36.06126,-9.24726],[-36.06123,-9.24949],[-36.06127,-9.25107],[-36.06121,-9.25517],[-36.06119,-9.25795],[-36.06107,-9.25945],[-36.06109,-9.26183],[-36.06106,-9.26493],[-36.06086,-9.27146],[-36.06083,-9.2751],[-36.06074,-9.28274],[-36.0608,-9.29234],[-36.06074,-9.29363],[-36.05477,-9.29357],[-36.04621,-9.29349],[-36.03941,-9.29348],[-36.03501,-9.29339],[-36.02979,-9.29341],[-36.02167,-9.29332],[-36.01278,-9.29328],[-36.00468,-9.29321],[-35.99678,-9.29314],[-35.98969,-9.29312],[-35.98483,-9.29305],[-35.98305,-9.29289],[-35.98173,-9.29294],[-35.97884,-9.29282],[-35.96968,-9.2928]]],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.3176,49.32726],[-123.44053,49.32682],[-123.44072,49.33844],[-123.43984,49.34304],[-123.44013,49.34354],[-123.44011,49.34399],[-123.44063,49.34445],[-123.44047,49.34558],[-123.43978,49.34606],[-123.43897,49.34613],[-123.43729,49.35672],[-123.43748,49.37108],[-123.43353,49.37094],[-123.43304,49.37373],[-123.43327,49.37512],[-123.43228,49.3761],[-123.43175,49.37917],[-123.43143,49.37959],[-123.43078,49.38239],[-123.43134,49.38274],[-123.43121,49.38385],[-123.43004,49.38459],[-123.41899,49.38471],[-123.41922,49.41352],[-123.39725,49.41357],[-123.39728,49.42435],[-123.40069,49.42433],[-123.40077,49.57035],[-123.40008,49.57035],[-123.40108,49.59338],[-123.37604,49.59328],[-123.37698,49.67561],[-123.35073,49.67564],[-123.3508,49.70868],[-123.33289,49.70872],[-123.33279,49.72563],[-123.30071,49.72556],[-123.30092,49.73754],[-123.2886,49.73764],[-123.28878,49.82492],[-123.2998,49.82492],[-123.30117,49.84978],[-123.32182,49.85067],[-123.32733,49.85777],[-123.32767,49.97589],[-123.30083,49.97522],[-123.30072,50.0997],[-123.25017,50.10074],[-123.25091,50.27549],[-123.02243,50.27556],[-123.02249,50.32549],[-123.00093,50.32547],[-123.00078,50.34239],[-122.9775,50.34234],[-122.97748,50.35043],[-122.95081,50.3505],[-122.95079,50.3712],[-122.93252,50.37115],[-122.9321,50.39979],[-122.88742,50.39997],[-122.88734,50.42561],[-122.66202,50.4257],[-122.66231,50.39945],[-122.59903,50.39924],[-122.59883,50.37552],[-122.57248,50.37537],[-122.57356,50.24939],[-122.59904,50.24946],[-122.59915,50.22657],[-122.6185,50.22664],[-122.61857,50.22441],[-122.64906,50.22451],[-122.64922,50.19935],[-122.73086,50.19938],[-122.73116,50.12443],[-122.74904,50.12451],[-122.74905,50.0903],[-122.76878,50.09034],[-122.76898,49.94945],[-122.99905,49.94947],[-122.99912,49.87546],[-122.97759,49.87546],[-122.97781,49.69951],[-122.99924,49.69948],[-122.99925,49.65165],[-123.02215,49.65165],[-123.02212,49.59951],[-123.04919,49.59946],[-123.04919,49.59405],[-123.06646,49.59404],[-123.06636,49.54519],[-123.06999,49.54512],[-123.0699,49.54132],[-123.07068,49.53928],[-123.07089,49.53799],[-123.07115,49.53688],[-123.07111,49.53581],[-123.07138,49.53282],[-123.07165,49.53211],[-123.07171,49.53139],[-123.07203,49.53042],[-123.07396,49.53035],[-123.0748,49.5295],[-123.07482,49.52881],[-123.07434,49.52806],[-123.07353,49.52746],[-123.07337,49.52704],[-123.07329,49.52559],[-123.07371,49.52496],[-123.07362,49.52449],[-123.09926,49.52449],[-123.09916,49.47545],[-123.07105,49.47553],[-123.07109,49.4663],[-123.07392,49.46631],[-123.07422,49.4505],[-123.07463,49.45009],[-123.07465,49.44933],[-123.0746,49.44902],[-123.07446,49.44869],[-123.07433,49.44799],[-123.07424,49.44777],[-123.07431,49.44475],[-123.07471,49.44476],[-123.07464,49.43773],[-122.99965,49.43774],[-122.99965,49.43692],[-122.86062,49.44153],[-122.81026,49.4424],[-122.8099,49.37667],[-122.40361,49.37666],[-122.40363,49.37719],[-122.26474,49.3773],[-122.26354,49.23601],[-122.21557,49.23614],[-122.0581,49.23588],[-121.95383,49.29665],[-121.94009,49.30454],[-121.92358,49.31423],[-121.89909,49.32254],[-121.88834,49.32598],[-121.8553,49.33636],[-121.8327,49.34415],[-121.76713,49.36544],[-121.67367,49.36546],[-121.64042,49.37438],[-121.5962,49.38605],[-121.58612,49.38792],[-121.52137,49.39946],[-121.51174,49.40384],[-121.46793,49.4229],[-121.44168,49.43456],[-121.42243,49.43458],[-121.34629,49.39323],[-121.34801,49.34124],[-121.5135,49.32058],[-121.60317,49.27717],[-121.65841,49.18561],[-121.67995,49.16541],[-121.78158,49.07026],[-121.80762,49.06225],[-121.9394,49.06362],[-121.97255,49.04242],[-121.99214,49.03329],[-122.00353,49.02734],[-122.01786,49.02411],[-122.11086,48.99928],[-122.14931,48.99953],[-122.14927,48.99915],[-122.19914,48.9996],[-122.19918,48.9992],[-122.23436,48.99948],[-122.23436,49.00017],[-122.39947,49.00124],[-122.45213,49.00163],[-122.45213,49.00088],[-122.45841,49.00093],[-122.45848,48.99931],[-122.49925,48.9995],[-122.49925,48.99929],[-122.54926,48.99951],[-122.54926,48.99932],[-122.65808,48.99942],[-122.65811,48.9954],[-122.70676,48.99553],[-122.75198,48.99564],[-122.79221,48.99572],[-122.79219,48.99943],[-123.03504,48.99957],[-123.03504,49.0001],[-123.03971,49.00005],[-123.03974,49.00018],[-123.04855,49.00013],[-123.04853,49.00047],[-123.05571,49.00045],[-123.05563,49.00023],[-123.06414,49.00013],[-123.06416,48.99994],[-123.0749,48.99969],[-123.07507,49.00062],[-123.08996,49.00037],[-123.10923,48.99994],[-123.12712,49.0003],[-123.136,48.99987],[-123.13627,49.00058],[-123.15385,48.99981],[-123.15405,49.00068],[-123.171,49.00013],[-123.20009,48.99968],[-123.20034,49.04978],[-123.21088,49.04972],[-123.21122,49.05199],[-123.20705,49.05209],[-123.20789,49.06079],[-123.21917,49.0601],[-123.21896,49.06127],[-123.22518,49.06127],[-123.22539,49.06224],[-123.22971,49.06203],[-123.22981,49.06859],[-123.23319,49.06873],[-123.2335,49.07059],[-123.24931,49.07025],[-123.24973,49.08026],[-123.27514,49.0804],[-123.27514,49.08709],[-123.29948,49.0873],[-123.29944,49.08025],[-123.32545,49.08039],[-123.32544,49.11547],[-123.2751,49.15033],[-123.27518,49.18733],[-123.27881,49.18711],[-123.27889,49.19107],[-123.30048,49.19107],[-123.30042,49.26229],[-123.31262,49.26224],[-123.3126,49.27149],[-123.31543,49.27147],[-123.31566,49.28189],[-123.31747,49.28188],[-123.3175,49.29185],[-123.31904,49.29185],[-123.31907,49.2986],[-123.32023,49.29857],[-123.32028,49.30197],[-123.32227,49.30196],[-123.32239,49.31183],[-123.3254,49.31181],[-123.32539,49.32017],[-123.31927,49.3202],[-123.31922,49.32467],[-123.31794,49.32466],[-123.31799,49.32541],[-123.3176,49.32726]]],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",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[19.04767,47.48789],[19.05157,47.4899],[19.06434,47.4792],[19.0665,47.47632],[19.06766,47.47343],[19.06837,47.47077],[19.06846,47.46876],[19.06722,47.46501],[19.05683,47.45259],[19.0549,47.44906],[19.05176,47.43499],[19.04863,47.429],[19.04384,47.42968],[19.04023,47.42932],[19.03509,47.43818],[19.03221,47.43779],[19.0252,47.442],[19.0207,47.44576],[19.01915,47.44658],[19.01545,47.44759],[19.01347,47.44361],[19.01266,47.44271],[19.01178,47.44247],[19.0119,47.44188],[19.0098,47.43944],[19.0057,47.43111],[19.00046,47.43097],[18.99534,47.42821],[18.97545,47.42818],[18.97343,47.42904],[18.97361,47.42998],[18.97548,47.43067],[18.97719,47.43402],[18.97823,47.43817],[18.97733,47.44657],[18.97004,47.44988],[18.96861,47.45142],[18.97568,47.45506],[18.97586,47.45556],[18.97625,47.45584],[18.97658,47.45594],[18.97763,47.45597],[18.98017,47.45605],[18.98162,47.46067],[18.97793,47.46857],[18.96867,47.47643],[18.97745,47.48194],[18.98035,47.48169],[18.98565,47.4782],[18.98907,47.47838],[18.99117,47.47898],[18.99177,47.48102],[18.99288,47.48182],[18.99836,47.48238],[18.99902,47.483],[19.004,47.48189],[19.00416,47.48399],[19.01027,47.48535],[19.01237,47.48404],[19.0138,47.48351],[19.01674,47.48465],[19.0163,47.48539],[19.01689,47.48595],[19.01808,47.48605],[19.02108,47.48492],[19.02124,47.48612],[19.02301,47.48741],[19.02637,47.48885],[19.02995,47.48904],[19.03135,47.48855],[19.03189,47.48759],[19.03286,47.48712],[19.03364,47.48702],[19.03514,47.48725],[19.03585,47.48729],[19.03616,47.48751],[19.03665,47.48767],[19.03748,47.48774],[19.03847,47.48737],[19.03918,47.48679],[19.04105,47.48649],[19.04181,47.48737],[19.04387,47.4881],[19.04542,47.48817],[19.04695,47.4881],[19.04767,47.48789]]],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",endDate:"2017-03-01T00:00:00.000Z",startDate:"2017-03-01T00:00:00.000Z",polygon:[[[19.04767,47.48789],[19.05157,47.4899],[19.06434,47.4792],[19.0665,47.47632],[19.06766,47.47343],[19.06837,47.47077],[19.06846,47.46876],[19.06722,47.46501],[19.05683,47.45259],[19.0549,47.44906],[19.05176,47.43499],[19.04863,47.429],[19.04384,47.42968],[19.04023,47.42932],[19.03509,47.43818],[19.03221,47.43779],[19.0252,47.442],[19.0207,47.44576],[19.01915,47.44658],[19.01545,47.44759],[19.01347,47.44361],[19.01266,47.44271],[19.01178,47.44247],[19.0119,47.44188],[19.0098,47.43944],[19.0057,47.43111],[19.00046,47.43097],[18.99534,47.42821],[18.97545,47.42818],[18.97343,47.42904],[18.97361,47.42998],[18.97548,47.43067],[18.97719,47.43402],[18.97823,47.43817],[18.97733,47.44657],[18.97004,47.44988],[18.96861,47.45142],[18.97568,47.45506],[18.97586,47.45556],[18.97625,47.45584],[18.97658,47.45594],[18.97763,47.45597],[18.98017,47.45605],[18.98162,47.46067],[18.97793,47.46857],[18.96867,47.47643],[18.97745,47.48194],[18.98035,47.48169],[18.98565,47.4782],[18.98907,47.47838],[18.99117,47.47898],[18.99177,47.48102],[18.99288,47.48182],[18.99836,47.48238],[18.99902,47.483],[19.004,47.48189],[19.00416,47.48399],[19.01027,47.48535],[19.01237,47.48404],[19.0138,47.48351],[19.01674,47.48465],[19.0163,47.48539],[19.01689,47.48595],[19.01808,47.48605],[19.02108,47.48492],[19.02124,47.48612],[19.02301,47.48741],[19.02637,47.48885],[19.02995,47.48904],[19.03135,47.48855],[19.03189,47.48759],[19.03286,47.48712],[19.03364,47.48702],[19.03514,47.48725],[19.03585,47.48729],[19.03616,47.48751],[19.03665,47.48767],[19.03748,47.48774],[19.03847,47.48737],[19.03918,47.48679],[19.04105,47.48649],[19.04181,47.48737],[19.04387,47.4881],[19.04542,47.48817],[19.04695,47.4881],[19.04767,47.48789]]],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.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,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 : 2018",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.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,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.10753,-9.43884],[-36.10752,-9.43421],[-36.10767,-9.42959],[-36.10779,-9.42361],[-36.10769,-9.41927],[-36.10781,-9.41391],[-36.10803,-9.41094],[-36.1081,-9.40965],[-36.10811,-9.40747],[-36.10816,-9.40693],[-36.10819,-9.40418],[-36.10811,-9.40176],[-36.10817,-9.40002],[-36.10827,-9.39952],[-36.10827,-9.39646],[-36.10833,-9.39475],[-36.10832,-9.39273],[-36.10836,-9.3904],[-36.10841,-9.38447],[-36.10847,-9.38165],[-36.10846,-9.37767],[-36.10835,-9.37573],[-36.10845,-9.37432],[-36.10849,-9.37234],[-36.10845,-9.3697],[-36.10867,-9.36278],[-36.10863,-9.36102],[-36.10873,-9.35928],[-36.10874,-9.35736],[-36.10855,-9.35479],[-36.1087,-9.3523],[-36.10871,-9.34996],[-36.10873,-9.34893],[-36.11269,-9.34908],[-36.11726,-9.34912],[-36.12138,-9.34905],[-36.12806,-9.3491],[-36.13217,-9.34906],[-36.13694,-9.34915],[-36.14025,-9.34914],[-36.14134,-9.34932],[-36.14458,-9.34916],[-36.14684,-9.34914],[-36.14842,-9.34905],[-36.15276,-9.34907],[-36.154,-9.34922],[-36.15627,-9.34923],[-36.16026,-9.34921],[-36.16086,-9.34929],[-36.166,-9.34933],[-36.16938,-9.34942],[-36.17176,-9.34936],[-36.17628,-9.34945],[-36.18028,-9.34937],[-36.18227,-9.34946],[-36.18826,-9.34938],[-36.19039,-9.34945],[-36.19354,-9.34946],[-36.19552,-9.34941],[-36.19918,-9.34951],[-36.19926,-9.35146],[-36.19913,-9.35234],[-36.19912,-9.35353],[-36.19919,-9.35646],[-36.19922,-9.35771],[-36.1993,-9.35832],[-36.19933,-9.36112],[-36.19922,-9.36177],[-36.19918,-9.36258],[-36.19931,-9.364],[-36.19926,-9.36499],[-36.19922,-9.36563],[-36.19928,-9.3666],[-36.19917,-9.36796],[-36.19917,-9.36868],[-36.19922,-9.36911],[-36.19912,-9.37017],[-36.19887,-9.37149],[-36.19886,-9.37264],[-36.19902,-9.37322],[-36.19915,-9.37504],[-36.19911,-9.37688],[-36.19896,-9.37747],[-36.19899,-9.37915],[-36.19917,-9.38053],[-36.19919,-9.38124],[-36.19926,-9.38175],[-36.19928,-9.38302],[-36.19913,-9.38374],[-36.19908,-9.38592],[-36.19879,-9.38787],[-36.19881,-9.38935],[-36.19902,-9.39092],[-36.19904,-9.392],[-36.19899,-9.39348],[-36.1988,-9.39451],[-36.19867,-9.39705],[-36.19845,-9.39949],[-36.19864,-9.40313],[-36.19866,-9.40476],[-36.19865,-9.40836],[-36.19875,-9.40902],[-36.19857,-9.41058],[-36.19859,-9.41273],[-36.19874,-9.41446],[-36.19868,-9.41711],[-36.1986,-9.41902],[-36.19846,-9.41965],[-36.1985,-9.42235],[-36.19871,-9.42429],[-36.19858,-9.42697],[-36.1984,-9.42895],[-36.19857,-9.43412],[-36.19871,-9.4347],[-36.19865,-9.43595],[-36.19857,-9.43626],[-36.19859,-9.43667],[-36.19876,-9.43749],[-36.19889,-9.43905],[-36.19882,-9.43995],[-36.1785,-9.43977],[-36.17718,-9.43968],[-36.17265,-9.43967],[-36.17099,-9.43971],[-36.16396,-9.43963],[-36.15386,-9.4395],[-36.13983,-9.4393],[-36.12875,-9.43913],[-36.11497,-9.43892],[-36.10753,-9.43884]]],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:"https://{switch:a,b,c,d}.tile.osm-tools.org/osm/{zoom}/{x}/{y}.png",scaleExtent:[0,20],polygon:[[[92.10238,20.81356],[93.56905,24.09755],[94.1733,23.92695],[95.19503,26.70727],[96.75509,27.52867],[97.58456,28.5806],[98.73812,27.51405],[98.74362,25.87992],[97.67794,24.75774],[97.96359,24.04238],[98.82052,24.16272],[99.52364,22.95934],[100.36959,21.50514],[101.79232,22.48305],[105.36288,23.33311],[106.81857,22.84801],[108.19735,21.36197],[107.43895,18.85398],[117.14537,7.46562],[119.6173,5.28754],[118.12315,4.05023],[117.25523,4.36249],[115.86546,4.34606],[115.50841,3.02498],[114.5526,1.5101],[113.54186,1.25748],[112.96507,1.5705],[112.24547,1.5101],[111.67418,1.01583],[110.4547,0.90049],[109.49889,1.9219],[103.22569,1.12568],[100.46263,3.23889],[97.6721,8.05888],[93.89281,15.93987],[92.10238,20.81356]]],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.30643,-9.82332],[-36.30603,-9.78597],[-36.30602,-9.78263],[-36.30609,-9.78168],[-36.30604,-9.78081],[-36.3059,-9.77531],[-36.30586,-9.76496],[-36.30545,-9.73336],[-36.39634,-9.73248],[-36.39627,-9.73744],[-36.39636,-9.74336],[-36.39644,-9.75535],[-36.3966,-9.75856],[-36.39665,-9.75979],[-36.39655,-9.76244],[-36.39661,-9.76489],[-36.39658,-9.76648],[-36.39661,-9.76684],[-36.39659,-9.7696],[-36.3967,-9.77896],[-36.39675,-9.78464],[-36.39684,-9.79067],[-36.39693,-9.79681],[-36.39703,-9.80298],[-36.39719,-9.82033],[-36.39722,-9.82234],[-36.39392,-9.82233],[-36.35375,-9.82279],[-36.34822,-9.82286],[-36.31697,-9.82317],[-36.31191,-9.82324],[-36.30879,-9.82327],[-36.30643,-9.82332]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"canaan_drone_red_cross_201712",name:"Canaan - American Red Cross, Dec-2017",type:"tms",template:"https://tiles.openaerialmap.org/5ac65a9f91b5310010e0d489/0/5ac65a9f91b5310010e0d48a/{zoom}/{x}/{y}.png",endDate:"2017-12-20T00:00:00.000Z",startDate:"2017-12-11T00:00:00.000Z",scaleExtent:[0,21],polygon:[[[-72.26734,18.63561],[-72.2636,18.6373],[-72.26116,18.64141],[-72.25983,18.64588],[-72.25811,18.64742],[-72.24502,18.64795],[-72.23433,18.64807],[-72.22734,18.6482],[-72.21953,18.65438],[-72.2161,18.65446],[-72.21584,18.66222],[-72.21725,18.66739],[-72.21889,18.67019],[-72.22309,18.66958],[-72.22343,18.67312],[-72.22502,18.6732],[-72.22545,18.67609],[-72.23288,18.67597],[-72.23339,18.67877],[-72.23674,18.67857],[-72.23854,18.67975],[-72.24,18.68129],[-72.24463,18.68207],[-72.24682,18.6817],[-72.24605,18.67698],[-72.25094,18.67698],[-72.25511,18.67902],[-72.25961,18.67898],[-72.26081,18.67743],[-72.27038,18.67711],[-72.27901,18.67682],[-72.28373,18.67893],[-72.28613,18.68154],[-72.29665,18.68178],[-72.30184,18.68568],[-72.3012,18.68824],[-72.30802,18.69324],[-72.30948,18.69308],[-72.31699,18.69682],[-72.32806,18.70528],[-72.3384,18.69902],[-72.34012,18.69666],[-72.33961,18.69426],[-72.33377,18.68357],[-72.33135,18.68192],[-72.32551,18.68093],[-72.32027,18.67741],[-72.31626,18.67477],[-72.31167,18.672],[-72.308,18.66995],[-72.30534,18.66926],[-72.30068,18.66499],[-72.29796,18.66479],[-72.29609,18.66129],[-72.29315,18.65999],[-72.29519,18.65497],[-72.28414,18.64962],[-72.27804,18.64523],[-72.27487,18.64212],[-72.27352,18.64057],[-72.2706,18.63901],[-72.26734,18.63561]]],terms_url:"http://americanredcross.github.io/",terms_text:"American Red Cross",description:"Drone imagery collected December 2017 for Canaan, Haiti by American Red Cross in coordination with the Haitian Red Cross."},{id:"Geneve-SITG-2011",name:"Canton de Génève 5cm (SITG 2011)",type:"wms",template:"https://ge.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.18221,46.22618],[6.18348,46.22772],[6.18929,46.23329],[6.19196,46.23858],[6.19253,46.24239],[6.19061,46.24397],[6.19046,46.24654],[6.19256,46.25045],[6.19186,46.25262],[6.19325,46.256],[6.19287,46.25776],[6.19543,46.26181],[6.1979,46.26454],[6.20045,46.26569],[6.20917,46.26634],[6.21716,46.27388],[6.22046,46.27895],[6.2275,46.28649],[6.23433,46.28955],[6.23643,46.2932],[6.24074,46.29774],[6.23958,46.30396],[6.2413,46.30529],[6.2432,46.30453],[6.24513,46.30492],[6.24627,46.30372],[6.24983,46.3027],[6.25032,46.3014],[6.24938,46.30018],[6.25146,46.29647],[6.25063,46.29451],[6.25223,46.29382],[6.25429,46.2907],[6.25231,46.28735],[6.25032,46.2868],[6.24974,46.28574],[6.24636,46.28433],[6.24323,46.28428],[6.23985,46.28098],[6.23934,46.27627],[6.24372,46.27356],[6.25113,46.26258],[6.26244,46.2553],[6.26301,46.25457],[6.262,46.25215],[6.26736,46.24887],[6.27732,46.25211],[6.27725,46.25298],[6.2832,46.25503],[6.28231,46.25568],[6.28278,46.25677],[6.28868,46.26046],[6.29154,46.2644],[6.29457,46.26556],[6.29729,46.26489],[6.29783,46.2631],[6.29541,46.25827],[6.29663,46.2566],[6.3024,46.2558],[6.30678,46.25753],[6.311,46.25666],[6.30768,46.25184],[6.31046,46.25057],[6.31011,46.24749],[6.31156,46.24386],[6.29606,46.22501],[6.29012,46.22241],[6.27773,46.21493],[6.26707,46.21276],[6.25668,46.20926],[6.25089,46.20574],[6.25076,46.20456],[6.2495,46.20404],[6.24643,46.20454],[6.24251,46.20364],[6.23594,46.20541],[6.23347,46.20509],[6.22889,46.20172],[6.22323,46.20005],[6.22355,46.19881],[6.22257,46.19791],[6.21935,46.19765],[6.21688,46.19448],[6.21259,46.19189],[6.20727,46.19137],[6.20588,46.18908],[6.2034,46.18806],[6.20282,46.18642],[6.20035,46.18504],[6.19905,46.18296],[6.19615,46.18288],[6.1885,46.17967],[6.18751,46.17539],[6.18982,46.16584],[6.1748,46.15694],[6.1688,46.15624],[6.15829,46.15195],[6.15434,46.15141],[6.14952,46.14933],[6.14805,46.14748],[6.14832,46.14619],[6.14561,46.14417],[6.14244,46.14493],[6.13768,46.14217],[6.13692,46.14071],[6.13074,46.13946],[6.12598,46.13966],[6.12014,46.14181],[6.1077,46.14203],[6.10537,46.14313],[6.09746,46.14325],[6.09151,46.15095],[6.07476,46.14795],[6.07188,46.14908],[6.05295,46.15046],[6.04973,46.1468],[6.04862,46.14153],[6.04571,46.13916],[6.04287,46.14006],[6.04013,46.13894],[6.03783,46.13716],[6.03647,46.13381],[6.03531,46.13344],[6.03,46.13816],[6.02079,46.14024],[6.01693,46.14191],[6.01282,46.14119],[6.00814,46.14171],[6.00364,46.14088],[5.99338,46.1432],[5.98728,46.14171],[5.98464,46.14232],[5.98309,46.13712],[5.97603,46.1319],[5.97314,46.13081],[5.97037,46.13108],[5.96536,46.12882],[5.96163,46.12976],[5.9573,46.12767],[5.95575,46.12836],[5.95484,46.13214],[5.9589,46.13553],[5.96446,46.13738],[5.96517,46.13845],[5.9631,46.14241],[5.96383,46.14656],[5.97157,46.1558],[5.97884,46.16721],[5.98022,46.17354],[5.98322,46.17507],[5.98537,46.17478],[5.98754,46.17306],[5.99029,46.17955],[5.9936,46.18203],[5.98976,46.18692],[5.98287,46.18822],[5.98068,46.1904],[5.96282,46.1963],[5.96225,46.19719],[5.96465,46.20022],[5.97164,46.20302],[5.96985,46.20383],[5.96794,46.20675],[5.97227,46.21418],[5.97364,46.21563],[5.97897,46.21821],[6.00857,46.24444],[6.01422,46.24855],[6.06593,46.28345],[6.11511,46.31511],[6.12573,46.31843],[6.12972,46.31568],[6.12978,46.31407],[6.13604,46.30896],[6.14179,46.30555],[6.15393,46.30014],[6.17157,46.29507],[6.17125,46.29223],[6.17277,46.28629],[6.17018,46.28533],[6.16834,46.28109],[6.17201,46.27554],[6.1722,46.27301],[6.1691,46.26785],[6.16746,46.26217],[6.16531,46.26195],[6.16455,46.26274],[6.15943,46.25898],[6.15532,46.25216],[6.15387,46.25212],[6.15273,46.25037],[6.15311,46.2477],[6.15494,46.24591],[6.1521,46.23878],[6.15217,46.23273],[6.15034,46.22659],[6.15454,46.22191],[6.15483,46.22044],[6.15296,46.21738],[6.154,46.21355],[6.1571,46.21097],[6.16263,46.21043],[6.16387,46.2097],[6.16911,46.21191],[6.16867,46.21318],[6.17073,46.21478],[6.17471,46.21603],[6.18221,46.22618]],[[6.18834,46.34901],[6.18696,46.34862],[6.18195,46.35015],[6.17961,46.352],[6.17142,46.35444],[6.17022,46.35911],[6.17415,46.36036],[6.17272,46.36189],[6.17348,46.36288],[6.17999,46.36547],[6.1877,46.36132],[6.19447,46.36175],[6.19905,46.36086],[6.20113,46.35634],[6.20258,46.35567],[6.20791,46.35583],[6.21374,46.35379],[6.21247,46.35085],[6.20846,46.34665],[6.2086,46.33991],[6.20659,46.33792],[6.20493,46.33861],[6.20348,46.33793],[6.19181,46.34333],[6.19318,46.34787],[6.19076,46.3477],[6.18834,46.34901]],[[6.18182,46.34281],[6.18016,46.34318],[6.1752,46.34532],[6.17341,46.34398],[6.17324,46.34054],[6.1714,46.33952],[6.16588,46.34254],[6.16564,46.34339],[6.17091,46.35054],[6.17341,46.35029],[6.17458,46.35192],[6.17587,46.35205],[6.18579,46.34593],[6.18182,46.34281]]],terms_url:"http://ge.ch/sitg/donnees/conditions-d-utilisation/open-data",terms_text:"Orthophotos du SITG 2011"},{id:"CTFRIBOURG2016",name:"Canton Fribourg 2016",type:"tms",template:"https://mapproxy.osm.ch/tiles/fribourg_2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",scaleExtent:[1,21],polygon:[[[6.79478,46.57542],[6.79949,46.57407],[6.80256,46.57491],[6.80336,46.57687],[6.80427,46.57664],[6.80489,46.57792],[6.80794,46.57761],[6.8094,46.57885],[6.81084,46.57896],[6.81322,46.57823],[6.81153,46.58099],[6.8142,46.58396],[6.81411,46.58567],[6.8206,46.58368],[6.82371,46.57747],[6.82693,46.57796],[6.82927,46.57637],[6.83485,46.57533],[6.83744,46.57677],[6.83691,46.57748],[6.83982,46.57896],[6.84239,46.58244],[6.84532,46.58276],[6.84644,46.58394],[6.84857,46.58331],[6.85087,46.58113],[6.85262,46.58197],[6.85996,46.57987],[6.86554,46.57725],[6.86507,46.57623],[6.8679,46.57515],[6.87446,46.56497],[6.8845,46.56195],[6.88686,46.56341],[6.89214,46.5679],[6.89918,46.56671],[6.89885,46.56499],[6.89393,46.55991],[6.88822,46.55815],[6.86839,46.54164],[6.86498,46.53896],[6.86015,46.53597],[6.85563,46.54086],[6.85501,46.54144],[6.85087,46.54111],[6.8407,46.53819],[6.83032,46.53744],[6.82783,46.54298],[6.82553,46.54357],[6.81278,46.52707],[6.81088,46.52513],[6.81534,46.52139],[6.8181,46.5165],[6.82263,46.51411],[6.82429,46.51207],[6.83034,46.51246],[6.83239,46.50544],[6.83503,46.50231],[6.84126,46.49706],[6.84294,46.49632],[6.84554,46.49667],[6.84775,46.49369],[6.84891,46.49337],[6.85729,46.49305],[6.86276,46.49384],[6.86634,46.50079],[6.87244,46.50431],[6.88168,46.51257],[6.8967,46.52044],[6.89773,46.52005],[6.89711,46.51766],[6.89767,46.51483],[6.89522,46.51079],[6.89572,46.50773],[6.89974,46.51039],[6.90142,46.51233],[6.92517,46.50769],[6.92759,46.50467],[6.93363,46.50167],[6.93674,46.50096],[6.95614,46.49949],[6.97239,46.48879],[6.97581,46.4784],[6.97783,46.47289],[6.97815,46.46833],[6.97906,46.46107],[6.98016,46.45896],[6.99212,46.44891],[6.98361,46.43873],[6.98394,46.43799],[6.98746,46.43794],[7.01786,46.44707],[7.02103,46.45729],[7.06583,46.48904],[7.0724,46.4864],[7.10037,46.48699],[7.12279,46.49869],[7.1264,46.50317],[7.13096,46.50466],[7.13624,46.50861],[7.13704,46.51308],[7.14005,46.51688],[7.14044,46.51988],[7.14318,46.52183],[7.1437,46.52475],[7.1453,46.52701],[7.14835,46.52846],[7.15834,46.52681],[7.16346,46.52855],[7.16709,46.53101],[7.18234,46.53837],[7.19218,46.54656],[7.20081,46.54169],[7.20108,46.543],[7.20765,46.53291],[7.21417,46.53762],[7.21811,46.54211],[7.22171,46.54481],[7.22311,46.5476],[7.22543,46.54923],[7.2322,46.55123],[7.23614,46.554],[7.24047,46.55424],[7.24705,46.55623],[7.25574,46.56029],[7.26385,46.56752],[7.2681,46.57369],[7.28136,46.58411],[7.2992,46.5791],[7.30805,46.58132],[7.31254,46.58917],[7.3207,46.59183],[7.31479,46.60042],[7.3162,46.60937],[7.31826,46.61615],[7.3178,46.61856],[7.31213,46.6217],[7.31327,46.63662],[7.32284,46.63731],[7.32684,46.63873],[7.32975,46.64171],[7.32787,46.64616],[7.321,46.65465],[7.32345,46.65526],[7.32914,46.65459],[7.33116,46.65522],[7.33403,46.65471],[7.34549,46.6553],[7.34756,46.65307],[7.35063,46.65164],[7.35079,46.64799],[7.35456,46.64669],[7.3558,46.64533],[7.35528,46.64193],[7.35714,46.63927],[7.35877,46.64418],[7.36209,46.64683],[7.36229,46.64791],[7.36608,46.64898],[7.37747,46.65636],[7.36933,46.65564],[7.36953,46.65748],[7.37103,46.65907],[7.37083,46.66085],[7.37187,46.66283],[7.37122,46.66375],[7.37252,46.66757],[7.37108,46.66942],[7.37649,46.67503],[7.37293,46.68012],[7.37777,46.68357],[7.37587,46.68645],[7.376,46.6878],[7.38027,46.69018],[7.37693,46.69272],[7.3686,46.69265],[7.3649,46.69505],[7.36261,46.69928],[7.3598,46.69802],[7.34598,46.69895],[7.34604,46.7019],[7.34939,46.70555],[7.35037,46.70874],[7.35021,46.71119],[7.34903,46.71249],[7.34065,46.71464],[7.33277,46.71491],[7.32868,46.71641],[7.31011,46.71815],[7.30785,46.71717],[7.30002,46.72247],[7.29683,46.72737],[7.29685,46.73565],[7.29834,46.74013],[7.30304,46.74517],[7.30454,46.74816],[7.30486,46.75026],[7.30335,46.7514],[7.30309,46.75261],[7.30359,46.75919],[7.29987,46.76375],[7.29881,46.76513],[7.29307,46.77136],[7.29532,46.77537],[7.29639,46.77729],[7.30081,46.77905],[7.30053,46.78064],[7.30113,46.78134],[7.30447,46.78321],[7.30447,46.78415],[7.30207,46.78638],[7.30351,46.78887],[7.30201,46.79079],[7.30159,46.79283],[7.30732,46.79872],[7.31044,46.80823],[7.31537,46.81246],[7.32028,46.8149],[7.32047,46.81564],[7.32072,46.82011],[7.31981,46.82515],[7.32891,46.829],[7.3302,46.82968],[7.33123,46.83177],[7.33103,46.8328],[7.32926,46.83563],[7.32333,46.84041],[7.30755,46.84704],[7.30775,46.84808],[7.30613,46.84999],[7.31207,46.85557],[7.31351,46.85936],[7.31739,46.8606],[7.32087,46.86154],[7.32576,46.85681],[7.323,46.85476],[7.32603,46.85163],[7.33181,46.8512],[7.33536,46.85043],[7.33678,46.84979],[7.33821,46.84946],[7.34726,46.85375],[7.34934,46.85331],[7.35167,46.85502],[7.35444,46.85875],[7.35772,46.86065],[7.35925,46.86311],[7.35794,46.86513],[7.35838,46.8688],[7.35738,46.8701],[7.35386,46.87129],[7.35253,46.87555],[7.35339,46.88676],[7.34843,46.88934],[7.32573,46.89373],[7.30935,46.89152],[7.29618,46.89377],[7.28938,46.89377],[7.28639,46.89269],[7.28245,46.8898],[7.2802,46.8896],[7.27259,46.89249],[7.26634,46.89361],[7.25931,46.89797],[7.24433,46.90037],[7.24314,46.89792],[7.23633,46.89809],[7.23203,46.90029],[7.2309,46.9024],[7.23032,46.90394],[7.22351,46.90276],[7.21755,46.89735],[7.21244,46.90173],[7.2088,46.9026],[7.20781,46.90913],[7.20578,46.91477],[7.20692,46.92481],[7.2111,46.92527],[7.21854,46.92434],[7.2342,46.92939],[7.23411,46.93669],[7.23477,46.93827],[7.2302,46.93995],[7.2282,46.93881],[7.22555,46.93633],[7.2174,46.93307],[7.2093,46.93334],[7.20823,46.93323],[7.2058,46.94023],[7.2055,46.94112],[7.20951,46.94188],[7.21027,46.94302],[7.21044,46.94569],[7.21011,46.94781],[7.20885,46.95435],[7.21102,46.95652],[7.20838,46.95768],[7.20742,46.95967],[7.19764,46.96065],[7.19459,46.96135],[7.19463,46.9629],[7.19552,46.96416],[7.19633,46.96365],[7.19794,46.96445],[7.1993,46.9638],[7.20646,46.96413],[7.20745,46.96751],[7.21422,46.96692],[7.21467,46.97133],[7.21739,46.97147],[7.21686,46.97271],[7.22247,46.97454],[7.22163,46.97556],[7.22821,46.97836],[7.23569,46.98456],[7.23486,46.98675],[7.22594,46.9924],[7.22625,46.99868],[7.22575,46.99915],[7.21779,47.00641],[7.21299,47.0068],[7.09058,46.978],[7.03295,46.98265],[6.73785,46.81195],[6.73908,46.71021],[6.81908,46.65533],[6.82741,46.65982],[6.82089,46.65179],[6.81729,46.64923],[6.81851,46.6478],[6.81458,46.64747],[6.81344,46.64953],[6.81194,46.6492],[6.81081,46.65038],[6.80674,46.65059],[6.80203,46.64889],[6.79891,46.64914],[6.79879,46.64781],[6.80367,46.64567],[6.80325,46.6448],[6.8038,46.64451],[6.80321,46.64376],[6.80171,46.64421],[6.79895,46.63959],[6.79692,46.63314],[6.79838,46.63016],[6.80043,46.62991],[6.80065,46.62843],[6.80172,46.62854],[6.80228,46.62775],[6.80197,46.62507],[6.80355,46.62124],[6.80244,46.61877],[6.80296,46.61615],[6.80185,46.61555],[6.80389,46.60903],[6.80239,46.60142],[6.79833,46.59986],[6.8002,46.59362],[6.80124,46.5925],[6.79848,46.58616],[6.79948,46.58559],[6.79894,46.58205],[6.79611,46.57932],[6.79626,46.57728],[6.79478,46.57542]]],terms_text:"Canton Fribourg 2016 'orthophoto technique'"},{id:"Canvec",name:"Canvec - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/canvec_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=canvec&STYLES=&SRS={proj}&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.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-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:"Canvec_French",name:"Canvec - French",type:"wms",template:"https://maps.geogratis.gc.ca/wms/canvec_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=canvec&STYLES=&SRS={proj}&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.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-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.03321,-9.45741],[-36.03322,-9.45581],[-36.03336,-9.45483],[-36.0334,-9.45291],[-36.03327,-9.45141],[-36.03336,-9.44287],[-36.0335,-9.43821],[-36.03353,-9.42881],[-36.03363,-9.42027],[-36.03389,-9.41091],[-36.03389,-9.40032],[-36.03401,-9.3888],[-36.03413,-9.38528],[-36.03428,-9.38265],[-36.03417,-9.37849],[-36.03444,-9.36688],[-36.05246,-9.3671],[-36.05791,-9.36711],[-36.0716,-9.36727],[-36.08622,-9.36731],[-36.103,-9.3675],[-36.11652,-9.36755],[-36.12515,-9.36768],[-36.12522,-9.37473],[-36.12521,-9.37721],[-36.12511,-9.38038],[-36.12514,-9.38529],[-36.12505,-9.39026],[-36.12504,-9.39477],[-36.12506,-9.40172],[-36.12499,-9.40382],[-36.1248,-9.40679],[-36.12463,-9.41123],[-36.12474,-9.4136],[-36.12456,-9.4163],[-36.12459,-9.42461],[-36.12466,-9.42691],[-36.12465,-9.42925],[-36.12457,-9.4297],[-36.12464,-9.43538],[-36.12438,-9.44109],[-36.12446,-9.44387],[-36.12452,-9.44579],[-36.12438,-9.44736],[-36.12448,-9.44856],[-36.12448,-9.45095],[-36.12436,-9.45392],[-36.12434,-9.45791],[-36.11758,-9.45783],[-36.1089,-9.45778],[-36.10419,-9.4578],[-36.10116,-9.45773],[-36.0953,-9.45773],[-36.08461,-9.45767],[-36.07361,-9.45757],[-36.05726,-9.45741],[-36.04816,-9.45747],[-36.04177,-9.45739],[-36.03767,-9.45739],[-36.03321,-9.45741]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"COS2010_v1.0",name:"Carta de Uso do Solo 2010 (WMS)",type:"wms",template:"http://mapas.dgterritorio.pt/wms-inspire/cos2010v1?language=por&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=COS2010_v1.0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2010-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",scaleExtent:[14,18],polygon:[[[-7.31278,36.98391],[-7.44461,37.5718],[-7.1933,37.97019],[-6.97357,38.00807],[-6.90628,38.24142],[-7.06627,38.20743],[-7.27158,38.45628],[-7.20429,38.72356],[-7.0134,38.85468],[-6.91315,39.03839],[-6.97357,39.13113],[-7.17957,39.23651],[-7.28668,39.48497],[-7.44873,39.61838],[-7.34162,39.60886],[-6.99692,39.64906],[-6.81839,40.0192],[-7.01065,40.19986],[-6.85272,40.24285],[-6.76209,40.35073],[-6.77994,40.8886],[-6.88637,41.01151],[-6.79642,41.01721],[-6.63849,41.21689],[-6.4531,41.24116],[-6.29311,41.38763],[-6.15715,41.5908],[-6.31165,41.68932],[-6.51215,41.71188],[-6.49841,41.88081],[-6.56296,41.97991],[-6.80191,42.00951],[-7.20497,42.00135],[-7.22763,41.8849],[-7.36908,41.87058],[-7.72751,41.92885],[-7.92526,41.94009],[-8.07907,41.84706],[-8.1601,41.91812],[-8.01796,42.05031],[-8.19924,42.18681],[-8.39356,42.1023],[-8.66066,42.07886],[-8.88382,41.88081],[-9.17084,41.86956],[-9.04175,41.43655],[-9.01978,40.65981],[-9.15711,40.26695],[-9.81903,39.52099],[-9.74213,38.6512],[-9.12964,37.88136],[-9.27246,36.99378],[-9.09394,36.68604],[-7.80579,36.74989],[-7.31278,36.98391]]],terms_url:"http://www.dgterritorio.pt/dados_abertos/cos/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"Cartoriviera-2012",name:"Cartoriviera - Orthophoto 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/cartoriviera2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",scaleExtent:[14,20],polygon:[[[7.02235,46.42856],[7.0224,46.42045],[7.02176,46.41955],[7.02225,46.41954],[7.02161,46.41749],[7.02242,46.4174],[7.02242,46.41681],[7.02113,46.41443],[7.02164,46.41259],[7.0216,46.41188],[7.01918,46.41055],[7.01896,46.41004],[7.01757,46.40826],[7.01426,46.40696],[7.00948,46.40695],[7.00952,46.40451],[7.00368,46.40153],[6.97052,46.40139],[6.97056,46.39354],[6.96507,46.38333],[6.89379,46.383],[6.89327,46.39209],[6.8968,46.4],[6.89678,46.40097],[6.89395,46.401],[6.89768,46.40888],[6.89246,46.41386],[6.89237,46.41807],[6.8949,46.4193],[6.89285,46.41948],[6.89395,46.42312],[6.89225,46.42339],[6.89219,46.42802],[6.88743,46.428],[6.87652,46.43163],[6.86624,46.43633],[6.84003,46.44591],[6.83504,46.44934],[6.827,46.45204],[6.82695,46.45379],[6.81953,46.45655],[6.80361,46.45993],[6.78775,46.46253],[6.78697,46.5246],[6.82604,46.5248],[6.82609,46.52662],[6.83907,46.5267],[6.83888,46.55006],[6.90658,46.55042],[6.912,46.54301],[6.91083,46.53983],[6.90979,46.53512],[6.90931,46.53517],[6.90867,46.53373],[6.91195,46.53297],[6.91335,46.53604],[6.9268,46.53364],[6.92723,46.5349],[6.93714,46.53311],[6.93691,46.5327],[6.94028,46.53196],[6.94164,46.53477],[6.94309,46.53455],[6.94345,46.53528],[6.95641,46.53003],[6.95632,46.52733],[6.95111,46.52725],[6.95301,46.52611],[6.94341,46.52605],[6.94343,46.52546],[7.01629,46.52568],[7.02158,46.52211],[7.02196,46.47355],[7.07099,46.47368],[7.07402,46.4719],[7.07383,46.4326],[7.05947,46.43233],[7.05278,46.42879],[7.02235,46.42856]]],terms_url:"https://map.cartoriviera.ch/?baselayer_ref=orthos_2012_mobile&baselayer_opacity=100",terms_text:"Cartoriviera"},{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.88463,28.44606],[-17.89395,28.52255],[-18.02125,28.74819],[-18.02241,28.80384],[-17.9424,28.87261],[-17.89118,28.87371],[-17.89033,28.85151],[-17.76759,28.85378],[-17.76698,28.83122],[-17.74127,28.832],[-17.73949,28.76422],[-17.71398,28.76497],[-17.71293,28.73037],[-17.75744,28.69318],[-17.75708,28.67413],[-17.74579,28.67435],[-17.74573,28.61656],[-17.75197,28.58337],[-17.76225,28.5592],[-17.78331,28.54167],[-17.78316,28.49366],[-17.80861,28.4925],[-17.80601,28.4469],[-17.88463,28.44606]],[[-18.1661,27.78516],[-18.16349,27.69492],[-18.08898,27.69634],[-18.08734,27.67387],[-18.03641,27.67537],[-18.03501,27.63026],[-17.959,27.6324],[-17.86033,27.7926],[-17.86303,27.83688],[-17.8884,27.83649],[-17.88913,27.85905],[-17.99065,27.85675],[-18.03868,27.76558],[-18.11464,27.76379],[-18.11546,27.78636],[-18.1661,27.78516]],[[-17.36038,28.06398],[-17.36297,28.17572],[-17.33756,28.17637],[-17.33846,28.2213],[-17.18579,28.22388],[-17.08208,28.13518],[-17.08084,28.068],[-17.13154,28.06681],[-17.15633,28.02146],[-17.23211,28.02037],[-17.23199,27.99804],[-17.25768,27.99784],[-17.25785,28.01997],[-17.30867,28.01923],[-17.36038,28.06398]],[[-16.92782,28.32758],[-16.92866,28.37219],[-16.87767,28.37293],[-16.87807,28.39542],[-16.52143,28.42261],[-16.44571,28.49113],[-16.44625,28.53597],[-16.42059,28.53627],[-16.42092,28.55884],[-16.34433,28.55976],[-16.3446,28.58221],[-16.19125,28.58372],[-16.19162,28.60684],[-16.12793,28.60782],[-16.1278,28.59218],[-16.09951,28.5925],[-16.09934,28.51638],[-16.16481,28.51612],[-16.16475,28.49386],[-16.23858,28.44847],[-16.26535,28.44761],[-16.26586,28.403],[-16.31675,28.40176],[-16.31631,28.38019],[-16.34208,28.37951],[-16.34083,28.2893],[-16.41584,28.19761],[-16.4151,28.13113],[-16.51533,28.01648],[-16.61684,28.01532],[-16.61681,27.99305],[-16.71842,27.99192],[-16.7191,28.03714],[-16.7447,28.03679],[-16.74534,28.08181],[-16.7707,28.08161],[-16.8224,28.1259],[-16.82317,28.17087],[-16.8487,28.17075],[-16.85028,28.26079],[-16.87565,28.26055],[-16.87608,28.28322],[-16.90151,28.28277],[-16.90239,28.32793],[-16.92782,28.32758]],[[-15.85374,27.90089],[-15.8542,27.99018],[-15.82895,27.99066],[-15.82911,28.03558],[-15.7783,28.03632],[-15.75328,28.08143],[-15.72788,28.08157],[-15.72826,28.17186],[-15.49897,28.1728],[-15.49874,28.15041],[-15.44978,28.15075],[-15.45016,28.19614],[-15.39728,28.19614],[-15.39644,28.03836],[-15.37103,28.03802],[-15.37065,28.01532],[-15.34578,28.01532],[-15.34548,27.92544],[-15.3708,27.92524],[-15.37057,27.83521],[-15.39598,27.83474],[-15.421,27.78797],[-15.47181,27.78939],[-15.47188,27.76665],[-15.52277,27.76678],[-15.54771,27.72161],[-15.62361,27.72134],[-15.62415,27.74199],[-15.70075,27.74335],[-15.80167,27.81105],[-15.85374,27.90089]],[[-14.52156,28.04678],[-14.52244,28.11841],[-14.41575,28.11561],[-14.21688,28.22788],[-14.21537,28.33903],[-14.16417,28.45283],[-14.11151,28.4748],[-14.03358,28.72267],[-13.95652,28.74494],[-13.95617,28.76659],[-13.82902,28.76643],[-13.82896,28.78798],[-13.80007,28.78793],[-13.8013,28.71899],[-13.82757,28.71935],[-13.82786,28.6518],[-13.80258,28.6519],[-13.80339,28.53842],[-13.82885,28.53847],[-13.83151,28.39702],[-13.91582,28.22414],[-13.98564,28.22357],[-14.03696,28.17958],[-14.13871,28.17999],[-14.13866,28.15791],[-14.21537,28.15781],[-14.21472,28.11189],[-14.29132,28.04524],[-14.33197,28.03687],[-14.44578,28.04698],[-14.44666,28.0658],[-14.49628,28.06826],[-14.49593,28.04585],[-14.52156,28.04678]],[[-13.80066,28.84566],[-13.80093,28.82311],[-13.77569,28.82305],[-13.69729,28.88982],[-13.69729,28.91277],[-13.60725,28.9118],[-13.43886,29.00024],[-13.43746,29.13513],[-13.4117,29.13499],[-13.41056,29.22298],[-13.45928,29.25559],[-13.45974,29.2942],[-13.50913,29.29456],[-13.51006,29.31635],[-13.56354,29.31729],[-13.56406,29.27138],[-13.53892,29.2712],[-13.53897,29.25004],[-13.56613,29.25013],[-13.5666,29.203],[-13.51565,29.20223],[-13.51565,29.18206],[-13.5398,29.18278],[-13.54089,29.13753],[-13.65782,29.13685],[-13.71322,29.09351],[-13.76634,29.09345],[-13.85025,29.01659],[-13.85182,28.98343],[-13.85244,28.91486],[-13.90131,28.89245],[-13.9024,28.84698],[-13.80066,28.84566]],[[1.64799,38.99907],[1.73217,38.99936],[1.73147,39.04417],[1.64895,39.04319],[1.64816,39.12764],[1.39486,39.12657],[1.39544,39.08642],[1.22811,39.08526],[1.22911,39.0029],[1.14487,39.0018],[1.14528,38.832],[1.31136,38.83316],[1.31219,38.79065],[1.39469,38.79162],[1.39519,38.75296],[1.31128,38.75193],[1.31259,38.62388],[1.6489,38.62511],[1.64807,38.71115],[1.58456,38.71012],[1.58116,38.70054],[1.54915,38.70028],[1.51972,38.70921],[1.50355,38.72532],[1.48133,38.91551],[1.55189,38.92544],[1.56673,38.95666],[1.64874,38.95833],[1.64799,38.99907]],[[2.54507,39.41667],[2.43933,39.41611],[2.43871,39.48469],[2.43902,39.49934],[2.31223,39.49934],[2.31192,39.54179],[2.22907,39.541],[2.22835,39.62606],[2.34601,39.62709],[2.92704,39.96016],[3.14566,39.96005],[3.14608,40.00198],[3.23139,40.00198],[3.23129,39.83292],[3.14823,39.83316],[3.14844,39.79357],[3.48148,39.79318],[3.48035,39.5959],[3.31506,39.47846],[3.31462,39.37855],[3.08302,39.24994],[2.97986,39.25015],[2.97904,39.3335],[2.72874,39.33342],[2.72885,39.45814],[2.64569,39.45774],[2.64538,39.49966],[2.54528,39.49942],[2.54507,39.41667]],[[3.81204,40.04344],[3.72908,40.0438],[3.72862,39.95842],[3.81266,39.9576],[3.81228,39.91644],[3.9609,39.91598],[4.19381,39.79131],[4.31503,39.79058],[4.31599,39.83293],[4.39874,39.83204],[4.39737,39.91858],[4.3158,39.91933],[4.31619,40.0434],[4.2319,40.04436],[4.23248,40.08478],[4.14915,40.08611],[4.14906,40.12552],[4.0628,40.12722],[4.06242,40.08499],[3.81287,40.08529],[3.81204,40.04344]],[[-8.89106,41.82289],[-9.1092,42.57511],[-9.03655,42.73066],[-9.08834,42.72696],[-9.14661,42.77503],[-9.21855,42.90163],[-9.2761,42.86051],[-9.30991,42.93113],[-9.27898,42.9822],[-9.30991,43.06004],[-9.25236,43.10417],[-9.2315,43.17032],[-9.14733,43.21018],[-9.06748,43.19916],[-9.03367,43.24267],[-8.99842,43.24477],[-8.99986,43.29558],[-8.93727,43.30553],[-8.92936,43.32699],[-8.8639,43.32908],[-8.87613,43.37407],[-8.82217,43.37354],[-8.78548,43.31914],[-8.70635,43.305],[-8.60996,43.3296],[-8.55097,43.32332],[-8.52435,43.3364],[-8.52507,43.36465],[-8.45745,43.39184],[-8.36105,43.41118],[-8.36033,43.46342],[-8.33444,43.57974],[-8.27761,43.57088],[-8.06467,43.72392],[-7.99921,43.7234],[-7.9172,43.78264],[-7.85605,43.79146],[-7.83591,43.73743],[-7.66284,43.80982],[-7.31889,43.67827],[-7.19975,43.58308],[-6.24882,43.6075],[-6.12293,43.57901],[-5.85204,43.6799],[-5.60363,43.57087],[-5.28553,43.56191],[-5.17875,43.49916],[-4.90899,43.48367],[-4.61562,43.4192],[-4.18399,43.42492],[-3.80295,43.51954],[-3.74,43.48693],[-3.56128,43.54236],[-3.1083,43.38163],[-2.93857,43.46246],[-2.74524,43.47551],[-2.30462,43.31706],[-1.9854,43.3563],[-1.85528,43.39725],[-1.7698,43.39644],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[3.23049,42.37644],[3.31415,42.37604],[3.31412,42.33399],[3.39785,42.33404],[3.39739,42.29009],[3.31389,42.29084],[3.31397,42.20702],[3.14759,42.2073],[3.14759,42.12606],[3.23055,42.126],[3.24668,41.95294],[3.19452,41.85589],[3.06054,41.76474],[2.78358,41.63718],[2.26293,41.42716],[2.16492,41.29893],[1.86008,41.22322],[1.3763,41.11627],[1.17937,41.04646],[1.08585,41.04849],[0.75854,40.81956],[0.9114,40.73376],[0.87813,40.67514],[0.66502,40.53587],[0.55801,40.55022],[0.43392,40.37576],[0.26756,40.19192],[0.16415,40.06472],[0.07513,40.01447],[0.01039,39.89522],[-0.09392,39.81169],[-0.18474,39.63117],[-0.29085,39.50363],[-0.28636,39.33343],[-0.18564,39.17746],[-0.21352,39.15585],[-0.11101,38.97222],[0.00949,38.88268],[0.12189,38.87218],[0.23429,38.79864],[0.25587,38.72642],[0.09581,38.61338],[-0.0022,38.60706],[-0.05705,38.52691],[-0.27197,38.47624],[-0.37987,38.39312],[-0.38347,38.33813],[-0.45091,38.33108],[-0.50487,38.28309],[-0.48238,38.19481],[-0.42933,38.16583],[-0.45451,38.14886],[-0.584,38.17219],[-0.61367,38.11986],[-0.63705,37.96122],[-0.68111,37.94562],[-0.73237,37.88107],[-0.72158,37.78306],[-0.68831,37.734],[-0.66415,37.62315],[-0.71939,37.58784],[-0.91963,37.53758],[-1.11071,37.51641],[-1.33832,37.52867],[-1.44089,37.39037],[-1.6767,37.27652],[-1.85408,36.91229],[-2.06835,36.69291],[-2.21588,36.66192],[-2.37219,36.78018],[-2.68129,36.65911],[-2.92015,36.66756],[-3.09402,36.71263],[-3.46108,36.65488],[-3.72804,36.69291],[-4.37435,36.66333],[-4.65712,36.44042],[-4.9188,36.45313],[-5.16995,36.35135],[-5.28411,36.19702],[-5.26809,36.12418],[-5.35248,36.12247],[-5.35161,36.04014],[-5.43658,36.03889],[-5.43532,36.00344],[-5.68886,36.00365],[-5.68996,36.04053],[-5.85506,36.03856],[-5.85668,36.12421],[-5.93848,36.12215],[-5.94003,36.16556],[-5.99834,36.1645],[-6.03573,36.1781],[-6.07752,36.22241],[-6.15061,36.28646],[-6.23154,36.37701],[-6.33585,36.53106],[-6.32146,36.58163],[-6.40419,36.6235],[-6.47433,36.74897],[-6.41588,36.79939],[-6.49052,36.91738],[-6.62989,37.0194],[-6.87448,37.10838],[-7.04264,37.18507],[-7.26474,37.18435],[-7.37535,37.15354],[-7.40832,37.16822],[-7.42029,37.21183],[-7.42492,37.23505],[-7.43805,37.2452],[-7.44597,37.33261],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]]},{id:"Chorzow-buildings",name:"Chorzów: Buildings",type:"wms",template:"http://e-odgik.chorzow.eu/services/wms/wms_funkcje_bud/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=3,2,1,8,7,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.94562,50.31836],[18.94349,50.32385],[18.95466,50.32599],[18.96426,50.33307],[18.96521,50.33777],[18.98692,50.33621],[18.98468,50.32501],[18.99777,50.32204],[18.99686,50.31716],[18.98774,50.31736],[18.98695,50.30989],[18.99736,50.30031],[18.99744,50.29722],[19.00546,50.29548],[19.0073,50.28342],[19.00574,50.27871],[18.99236,50.27091],[18.96792,50.28661],[18.96215,50.27972],[18.96169,50.27337],[18.95824,50.27291],[18.95492,50.26193],[18.96014,50.24927],[18.95672,50.2452],[18.95555,50.23891],[18.94132,50.243],[18.93475,50.25314],[18.93324,50.26032],[18.93262,50.26588],[18.9296,50.26774],[18.92976,50.27131],[18.92669,50.27289],[18.92632,50.27623],[18.93071,50.27619],[18.93437,50.28729],[18.92383,50.29533],[18.92635,50.29986],[18.91905,50.30212],[18.91955,50.30576],[18.92463,50.31192],[18.9262,50.31883],[18.94562,50.31836]]],terms_text:"Urząd Miasta Chorzowa"},{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.44866,-33.89362],[18.44859,-33.90264],[18.4702,-33.90277],[18.48139,-33.84724],[18.44925,-33.80107],[18.42815,-33.73564],[18.43914,-33.71772],[18.40719,-33.65899],[18.33224,-33.57752],[18.33245,-33.55045],[18.354,-33.55059],[18.35425,-33.5236],[18.36524,-33.52366],[18.36503,-33.5148],[18.37601,-33.51477],[18.37605,-33.5058],[18.42966,-33.50594],[18.4297,-33.48785],[18.44049,-33.48789],[18.4406,-33.46988],[18.49437,-33.4701],[18.49433,-33.47916],[18.51583,-33.47917],[18.51574,-33.48819],[18.52647,-33.4883],[18.52632,-33.52435],[18.54793,-33.52443],[18.54795,-33.51539],[18.56937,-33.5155],[18.56937,-33.52448],[18.58012,-33.52453],[18.58007,-33.5426],[18.59078,-33.5426],[18.59074,-33.56064],[18.57995,-33.56053],[18.57988,-33.56962],[18.5907,-33.56962],[18.59065,-33.57868],[18.62301,-33.57873],[18.62292,-33.58773],[18.66597,-33.58789],[18.66593,-33.61493],[18.67672,-33.61497],[18.67658,-33.65103],[18.6873,-33.65102],[18.68734,-33.66004],[18.69807,-33.66009],[18.69807,-33.66907],[18.75204,-33.66925],[18.75208,-33.64219],[18.77364,-33.64225],[18.77371,-33.63319],[18.82746,-33.6333],[18.82752,-33.6603],[18.81667,-33.66029],[18.8166,-33.67832],[18.80581,-33.67831],[18.80581,-33.70539],[18.8274,-33.70544],[18.82733,-33.72347],[18.83812,-33.72343],[18.83804,-33.74139],[18.81652,-33.74137],[18.81637,-33.79551],[18.80559,-33.79551],[18.80551,-33.81357],[18.79476,-33.81355],[18.79472,-33.83154],[18.77311,-33.83152],[18.77313,-33.84052],[18.76236,-33.84052],[18.76227,-33.90359],[18.75146,-33.90352],[18.75108,-33.98478],[18.76191,-33.9848],[18.76178,-34.02988],[18.7726,-34.0299],[18.77258,-34.03891],[18.79403,-34.03894],[18.79388,-34.0407],[18.79845,-34.04119],[18.80324,-34.04118],[18.80341,-34.03892],[18.81594,-34.03897],[18.81634,-34.02993],[18.83798,-34.03165],[18.838,-34.03],[18.84842,-34.03001],[18.84847,-34.02185],[18.85993,-34.02347],[18.85986,-34.02101],[18.86827,-34.02208],[18.86819,-34.02117],[18.88546,-34.02343],[18.88518,-34.02132],[18.90252,-34.02103],[18.90258,-34.012],[18.91342,-34.012],[18.91348,-33.99396],[18.94588,-33.99403],[18.94586,-34.0031],[18.96743,-34.003],[18.96747,-34.01208],[18.97822,-34.01208],[18.97833,-34.02114],[18.98914,-34.02114],[18.98916,-34.03913],[19.00002,-34.03913],[19.00002,-34.05718],[19.01084,-34.05725],[19.01079,-34.08414],[19,-34.08413],[19.00002,-34.0932],[18.98915,-34.09317],[18.98918,-34.1022],[18.97832,-34.10218],[18.97832,-34.11123],[18.9675,-34.11121],[18.96749,-34.12925],[18.9566,-34.12924],[18.95656,-34.13824],[18.96742,-34.13831],[18.96742,-34.14732],[18.98918,-34.1473],[18.98918,-34.1653],[18.97827,-34.16529],[18.97832,-34.17429],[18.96742,-34.17427],[18.96746,-34.1833],[18.95656,-34.18332],[18.95656,-34.19236],[18.94574,-34.19232],[18.9457,-34.20132],[18.93487,-34.20137],[18.93489,-34.21933],[18.90236,-34.21935],[18.90176,-34.23626],[18.88784,-34.23735],[18.88942,-34.25541],[18.88059,-34.25534],[18.87927,-34.26443],[18.86969,-34.26441],[18.86971,-34.27344],[18.83714,-34.27342],[18.83712,-34.26438],[18.84802,-34.2644],[18.84803,-34.23739],[18.81549,-34.21028],[18.81565,-34.17413],[18.85488,-34.15627],[18.76176,-34.08405],[18.65337,-34.07748],[18.47974,-34.11012],[18.44637,-34.13423],[18.44445,-34.16409],[18.436,-34.16405],[18.43597,-34.18202],[18.44681,-34.18211],[18.44673,-34.19111],[18.46593,-34.19121],[18.48662,-34.24539],[18.47889,-34.25437],[18.486,-34.25437],[18.46771,-34.29941],[18.48922,-34.34458],[18.50011,-34.34458],[18.49992,-34.36262],[18.46743,-34.36251],[18.46737,-34.35349],[18.3916,-34.31707],[18.39177,-34.29002],[18.37016,-34.28087],[18.37068,-34.21789],[18.34923,-34.18162],[18.32747,-34.18149],[18.32767,-34.16346],[18.31187,-34.15438],[18.3114,-34.14353],[18.32367,-34.13469],[18.34993,-34.10421],[18.33932,-34.08828],[18.36125,-34.05972],[18.35505,-34.05538],[18.34275,-34.06433],[18.32,-34.06443],[18.29607,-34.04513],[18.30682,-34.02526],[18.32877,-34.0192],[18.32892,-34.00125],[18.33974,-34.00127],[18.3398,-33.98663],[18.36287,-33.97351],[18.36381,-33.92925],[18.37262,-33.92927],[18.37284,-33.91776],[18.39773,-33.89335],[18.44866,-33.89362]]],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.44866,-33.89362],[18.44859,-33.90264],[18.4702,-33.90277],[18.48139,-33.84724],[18.44925,-33.80107],[18.42815,-33.73564],[18.43914,-33.71772],[18.40719,-33.65899],[18.33224,-33.57752],[18.33245,-33.55045],[18.354,-33.55059],[18.35425,-33.5236],[18.36524,-33.52366],[18.36503,-33.5148],[18.37601,-33.51477],[18.37605,-33.5058],[18.42966,-33.50594],[18.4297,-33.48785],[18.44049,-33.48789],[18.4406,-33.46988],[18.49437,-33.4701],[18.49433,-33.47916],[18.51583,-33.47917],[18.51574,-33.48819],[18.52647,-33.4883],[18.52632,-33.52435],[18.54793,-33.52443],[18.54795,-33.51539],[18.56937,-33.5155],[18.56937,-33.52448],[18.58012,-33.52453],[18.58007,-33.5426],[18.59078,-33.5426],[18.59074,-33.56064],[18.57995,-33.56053],[18.57988,-33.56962],[18.5907,-33.56962],[18.59065,-33.57868],[18.62301,-33.57873],[18.62292,-33.58773],[18.66597,-33.58789],[18.66593,-33.61493],[18.67672,-33.61497],[18.67658,-33.65103],[18.6873,-33.65102],[18.68734,-33.66004],[18.69807,-33.66009],[18.69807,-33.66907],[18.75204,-33.66925],[18.75208,-33.64219],[18.77364,-33.64225],[18.77371,-33.63319],[18.82746,-33.6333],[18.82752,-33.6603],[18.81667,-33.66029],[18.8166,-33.67832],[18.80581,-33.67831],[18.80581,-33.70539],[18.8274,-33.70544],[18.82733,-33.72347],[18.83812,-33.72343],[18.83804,-33.74139],[18.81652,-33.74137],[18.81637,-33.79551],[18.80559,-33.79551],[18.80551,-33.81357],[18.79476,-33.81355],[18.79472,-33.83154],[18.77311,-33.83152],[18.77313,-33.84052],[18.76236,-33.84052],[18.76227,-33.90359],[18.75146,-33.90352],[18.75108,-33.98478],[18.76191,-33.9848],[18.76178,-34.02988],[18.7726,-34.0299],[18.77258,-34.03891],[18.79403,-34.03894],[18.79388,-34.0407],[18.79845,-34.04119],[18.80324,-34.04118],[18.80341,-34.03892],[18.81594,-34.03897],[18.81634,-34.02993],[18.83798,-34.03165],[18.838,-34.03],[18.84842,-34.03001],[18.84847,-34.02185],[18.85993,-34.02347],[18.85986,-34.02101],[18.86827,-34.02208],[18.86819,-34.02117],[18.88546,-34.02343],[18.88518,-34.02132],[18.90252,-34.02103],[18.90258,-34.012],[18.91342,-34.012],[18.91348,-33.99396],[18.94588,-33.99403],[18.94586,-34.0031],[18.96743,-34.003],[18.96747,-34.01208],[18.97822,-34.01208],[18.97833,-34.02114],[18.98914,-34.02114],[18.98916,-34.03913],[19.00002,-34.03913],[19.00002,-34.05718],[19.01084,-34.05725],[19.01079,-34.08414],[19,-34.08413],[19.00002,-34.0932],[18.98915,-34.09317],[18.98918,-34.1022],[18.97832,-34.10218],[18.97832,-34.11123],[18.9675,-34.11121],[18.96749,-34.12925],[18.9566,-34.12924],[18.95656,-34.13824],[18.96742,-34.13831],[18.96742,-34.14732],[18.98918,-34.1473],[18.98918,-34.1653],[18.97827,-34.16529],[18.97832,-34.17429],[18.96742,-34.17427],[18.96746,-34.1833],[18.95656,-34.18332],[18.95656,-34.19236],[18.94574,-34.19232],[18.9457,-34.20132],[18.93487,-34.20137],[18.93489,-34.21933],[18.90236,-34.21935],[18.90176,-34.23626],[18.88784,-34.23735],[18.88942,-34.25541],[18.88059,-34.25534],[18.87927,-34.26443],[18.86969,-34.26441],[18.86971,-34.27344],[18.83714,-34.27342],[18.83712,-34.26438],[18.84802,-34.2644],[18.84803,-34.23739],[18.81549,-34.21028],[18.81565,-34.17413],[18.85488,-34.15627],[18.76176,-34.08405],[18.65337,-34.07748],[18.47974,-34.11012],[18.44637,-34.13423],[18.44445,-34.16409],[18.436,-34.16405],[18.43597,-34.18202],[18.44681,-34.18211],[18.44673,-34.19111],[18.46593,-34.19121],[18.48662,-34.24539],[18.47889,-34.25437],[18.486,-34.25437],[18.46771,-34.29941],[18.48922,-34.34458],[18.50011,-34.34458],[18.49992,-34.36262],[18.46743,-34.36251],[18.46737,-34.35349],[18.3916,-34.31707],[18.39177,-34.29002],[18.37016,-34.28087],[18.37068,-34.21789],[18.34923,-34.18162],[18.32747,-34.18149],[18.32767,-34.16346],[18.31187,-34.15438],[18.3114,-34.14353],[18.32367,-34.13469],[18.34993,-34.10421],[18.33932,-34.08828],[18.36125,-34.05972],[18.35505,-34.05538],[18.34275,-34.06433],[18.32,-34.06443],[18.29607,-34.04513],[18.30682,-34.02526],[18.32877,-34.0192],[18.32892,-34.00125],[18.33974,-34.00127],[18.3398,-33.98663],[18.36287,-33.97351],[18.36381,-33.92925],[18.37262,-33.92927],[18.37284,-33.91776],[18.39773,-33.89335],[18.44866,-33.89362]]],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:"Zuerich-aerial_2011",name:"City of Zürich Orthophoto 2011",type:"wms",template:"https://www.gis.stadt-zuerich.ch/maps/services/wms/WMS-ZH-STZH-OGD/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_2011&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,21],polygon:[[[8.44624,47.44143],[8.63178,47.43968],[8.62895,47.31377],[8.44381,47.31555],[8.44624,47.44143]]],terms_text:"Stadt Zürich Open Government Data"},{id:"Zuerich-overview",name:"City of Zürich Overview map (Steets, buildings, house numbers)",type:"wms",template:"https://www.gis.stadt-zuerich.ch/maps/services/wms/WMS-ZH-STZH-OGD/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Uebersichtsplan&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[0,21],polygon:[[[8.45788,47.44582],[8.57392,47.44477],[8.57362,47.43124],[8.60266,47.43096],[8.6023,47.41746],[8.6318,47.41716],[8.6295,47.33628],[8.57162,47.33678],[8.57152,47.32292],[8.54236,47.3236],[8.54212,47.31013],[8.48418,47.31062],[8.48478,47.33762],[8.45582,47.33787],[8.45609,47.35135],[8.42713,47.35161],[8.42864,47.43259],[8.45745,47.43231],[8.45788,47.44582]]],terms_text:"Stadt Zürich Open Government Data"},{id:"Czech_CUZK-KM",name:"Czech CUZK:KM",type:"wms",template:"https://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.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],overlay:true},{id:"Czech_CUZK-KM-tms",name:"Czech CUZK:KM tiles proxy",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_cuzk.php/{zoom}/{x}/{y}.png",scaleExtent:[13,18],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],overlay:true},{id:"Czech_pLPIS",name:"Czech pLPIS",type:"wms",template:"http://eagri.cz/public/app/wms/plpis.fcgi?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LPIS_FB4,LPIS_FB4_KOD&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:4326",polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]]},{id:"Czech_RUIAN-budovy",name:"Czech RUIAN budovy",type:"tms",template:"https://tile.poloha.net/budovy/{zoom}/{x}/{y}.png",scaleExtent:[12,20],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],terms_url:"https://poloha.net/",terms_text:"Czech RUIAN"},{id:"Czech_RUIAN-parcely",name:"Czech RUIAN parcely",type:"tms",template:"https://tile.poloha.net/parcely/{zoom}/{x}/{y}.png",scaleExtent:[12,20],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],terms_url:"https://poloha.net/",terms_text:"Czech RUIAN"},{id:"Czestochowa-buildings",name:"Częstochowa: Buildings",type:"wms",template:"http://geoportal.czestochowa.um.gov.pl/isdp/scripts/isdp.dll/wms?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ieg_budynek&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[19.08183,50.8554],[19.0888,50.86563],[19.11082,50.86616],[19.10961,50.86092],[19.11709,50.85933],[19.11531,50.86283],[19.11997,50.86327],[19.1227,50.85452],[19.12938,50.85519],[19.12566,50.86165],[19.13364,50.86147],[19.14318,50.86815],[19.1498,50.87916],[19.16507,50.8794],[19.16816,50.88501],[19.17265,50.88477],[19.18346,50.87706],[19.18084,50.86562],[19.18711,50.84712],[19.19973,50.84395],[19.19637,50.83678],[19.19358,50.83357],[19.19454,50.83145],[19.20696,50.82985],[19.20838,50.82484],[19.21831,50.82571],[19.22564,50.82475],[19.23075,50.82509],[19.2308,50.82666],[19.23351,50.82683],[19.23303,50.82335],[19.21868,50.80115],[19.21753,50.79272],[19.22592,50.78822],[19.20889,50.77561],[19.19891,50.76355],[19.19521,50.75182],[19.19074,50.75211],[19.18245,50.7545],[19.16504,50.7535],[19.16417,50.75586],[19.14559,50.75805],[19.14282,50.75543],[19.13021,50.75786],[19.127,50.75314],[19.1216,50.75363],[19.12066,50.74981],[19.10348,50.75228],[19.09598,50.75201],[19.0956,50.74912],[19.09351,50.7488],[19.09285,50.75027],[19.08442,50.74986],[19.08473,50.74349],[19.08382,50.73741],[19.07878,50.73668],[19.07503,50.73465],[19.07284,50.73708],[19.07153,50.74042],[19.0685,50.74339],[19.06632,50.74233],[19.06392,50.74554],[19.06595,50.7466],[19.06548,50.7496],[19.06202,50.75041],[19.06018,50.74455],[19.04257,50.74466],[19.0333,50.74827],[19.01869,50.76252],[19.01554,50.77044],[19.01101,50.7718],[19.01353,50.77766],[19.01159,50.78077],[19.01081,50.78759],[19.01362,50.79262],[19.01972,50.79555],[19.01896,50.80703],[19.03439,50.80116],[19.03453,50.804],[19.02593,50.80731],[19.02308,50.81499],[19.03154,50.81614],[19.02909,50.82435],[19.03787,50.82584],[19.03921,50.84083],[19.04676,50.84934],[19.05993,50.8532],[19.06209,50.8596],[19.06492,50.86134],[19.08183,50.8554]]],terms_text:"Urząd Miasta Częstochowy"},{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.07732,47.69597],[19.07799,47.69598],[19.09462,47.69446],[19.08056,47.59587],[19.07434,47.58909],[19.07952,47.58883],[19.07717,47.57241],[19.05779,47.57209],[19.07732,47.69597]]],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:"wms",template:"https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2012/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:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[-75.01771,38.45189],[-75.74174,38.44996],[-75.807,39.73907],[-75.75559,39.80106],[-75.64692,39.85638],[-75.47115,39.84646],[-75.37726,39.81478],[-75.48746,39.67181],[-75.50901,39.43446],[-75.39327,39.27784],[-75.30707,39.01667],[-75.19317,38.82219],[-75.05341,38.80876],[-75.01771,38.45189]]],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:"Delaware2017Orthophotography",name:"Delaware 2017 Orthophotography",type:"wms",template:"https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2017/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:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",polygon:[[[-75.01771,38.45189],[-75.74174,38.44996],[-75.807,39.73907],[-75.75559,39.80106],[-75.64692,39.85638],[-75.47115,39.84646],[-75.37726,39.81478],[-75.48746,39.67181],[-75.50901,39.43446],[-75.39327,39.27784],[-75.30707,39.01667],[-75.19317,38.82219],[-75.05341,38.80876],[-75.01771,38.45189]]],terms_url:"https://firstmap.delaware.gov/arcgis/rest/services/DE_Imagery/DE_Imagery_2017/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.94962,-9.42957],[-37.94834,-9.33972],[-38.03903,-9.33834],[-38.04034,-9.42846],[-37.94962,-9.42957]]],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.94577,-21.31404],[-40.6231,-20.86278],[-40.38882,-20.65177],[-40.22209,-20.29831],[-39.80383,-19.66412],[-39.69603,-19.42573],[-39.67304,-19.30437],[-39.70538,-18.61384],[-39.65292,-18.33096],[-40.22281,-17.97587],[-40.34282,-17.9198],[-40.45278,-17.91502],[-40.46499,-17.92049],[-40.48368,-17.90408],[-40.50164,-17.90681],[-40.51602,-17.88903],[-40.53326,-17.88903],[-40.54548,-17.90134],[-40.58932,-17.91502],[-40.58932,-17.93211],[-40.61519,-17.93416],[-40.62956,-17.9868],[-40.64609,-17.9868],[-40.65903,-18.00731],[-40.68777,-18.00594],[-40.70574,-18.01756],[-40.71365,-18.00184],[-40.72155,-17.99774],[-40.75102,-18.00252],[-40.76754,-17.99842],[-40.76754,-17.98133],[-40.80923,-17.94852],[-40.82432,-17.96014],[-40.83151,-17.94989],[-40.86528,-17.9827],[-40.88397,-17.96766],[-40.90912,-17.98475],[-40.77761,-18.10775],[-40.77832,-18.15146],[-40.79054,-18.15351],[-40.8351,-18.14531],[-40.89547,-18.10365],[-40.93283,-18.12755],[-40.95583,-18.1255],[-40.95296,-18.14463],[-40.96014,-18.15009],[-40.96374,-18.14326],[-40.97955,-18.13643],[-40.99248,-18.15009],[-40.99105,-18.16307],[-41.00901,-18.16307],[-41.05788,-18.1658],[-41.05788,-18.17536],[-41.09597,-18.19243],[-41.09597,-18.2054],[-41.1089,-18.21291],[-41.09812,-18.22997],[-41.10531,-18.2327],[-41.09884,-18.25591],[-41.12903,-18.27502],[-41.16137,-18.30572],[-41.15059,-18.37394],[-41.16424,-18.37939],[-41.16424,-18.4019],[-41.15059,-18.40735],[-41.15849,-18.41144],[-41.17358,-18.41144],[-41.18868,-18.44485],[-41.02123,-18.46667],[-41.04638,-18.60362],[-41.03776,-18.61452],[-41.05788,-18.62678],[-41.0471,-18.64857],[-41.03488,-18.65402],[-40.99895,-18.67716],[-40.94505,-18.69418],[-40.94433,-18.76973],[-40.92134,-18.81055],[-40.93715,-18.82347],[-40.94721,-18.82143],[-40.97092,-18.83572],[-41.08375,-18.83232],[-41.10675,-18.83572],[-41.11753,-18.80783],[-41.13118,-18.79286],[-41.23611,-18.7949],[-41.2512,-18.81667],[-41.2476,-18.85544],[-41.2203,-18.87992],[-41.20808,-18.87992],[-41.20664,-18.86632],[-41.16424,-18.867],[-41.15634,-18.88876],[-41.12903,-18.9044],[-41.12112,-18.92412],[-41.0392,-18.98665],[-41.07585,-19.00567],[-41.06507,-19.06342],[-40.96877,-19.12726],[-40.96158,-19.15102],[-40.92996,-19.206],[-40.94649,-19.22296],[-40.94793,-19.24264],[-40.92565,-19.26299],[-40.94936,-19.2786],[-40.92277,-19.31048],[-40.94361,-19.35252],[-40.93427,-19.381],[-40.95727,-19.39184],[-40.9738,-19.42641],[-40.95439,-19.46165],[-40.97883,-19.50298],[-41.01332,-19.50298],[-41.04638,-19.48333],[-41.05429,-19.48401],[-41.04135,-19.56664],[-41.09238,-19.58966],[-41.14627,-19.656],[-41.16496,-19.65871],[-41.17933,-19.6939],[-41.19658,-19.74599],[-41.16999,-19.80618],[-41.18939,-19.82375],[-41.18868,-19.88526],[-41.21239,-19.89743],[-41.22964,-19.90216],[-41.24689,-19.93324],[-41.25479,-19.92919],[-41.26988,-19.93797],[-41.30653,-19.93392],[-41.31516,-19.96972],[-41.3245,-19.97647],[-41.313,-20.01226],[-41.33672,-20.05548],[-41.34822,-20.08653],[-41.3554,-20.12094],[-41.37768,-20.15805],[-41.38702,-20.18638],[-41.41074,-20.19448],[-41.4208,-20.20257],[-41.7636,-20.2046],[-41.78516,-20.28483],[-41.85055,-20.3246],[-41.86349,-20.37513],[-41.85127,-20.38187],[-41.84337,-20.40949],[-41.80887,-20.42498],[-41.80672,-20.47211],[-41.83115,-20.47885],[-41.81103,-20.54212],[-41.83115,-20.55086],[-41.86205,-20.61814],[-41.82109,-20.64437],[-41.85343,-20.68068],[-41.87139,-20.72102],[-41.8678,-20.73849],[-41.88002,-20.73984],[-41.88289,-20.76739],[-41.85415,-20.77478],[-41.83331,-20.7983],[-41.80887,-20.80905],[-41.78444,-20.80569],[-41.75138,-20.82382],[-41.74707,-20.87487],[-41.72335,-20.87554],[-41.74132,-20.92723],[-41.72335,-20.97757],[-41.74347,-21.09763],[-41.7291,-21.12579],[-41.594,-21.16332],[-41.57244,-21.18678],[-41.49051,-21.18879],[-41.48332,-21.20085],[-41.43948,-21.22095],[-41.41289,-21.20956],[-41.34965,-21.21291],[-41.27994,-21.2464],[-41.24473,-21.23234],[-41.17718,-21.25511],[-41.09238,-21.2243],[-41.04854,-21.25913],[-41.01548,-21.25578],[-41.00254,-21.28726],[-40.94577,-21.31404]]],terms_url:"https://der.es.gov.br",terms_text:"Departamento de Estradas de Rodagem do Estado do Espírito Santo",overlay:true},{id:"db-inspire-2013-11",name:"Deutsche Bahn VzG lines January 2017",type:"wms",template:"https://wms.michreichert.de/vzg-strecken-2017?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=vzg_strecken,station_codes,level_crossings&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-11-01T00:00:00.000Z",startDate:"2013-11-01T00:00:00.000Z",polygon:[[[8.19422,48.97504],[7.97355,49.02623],[7.94677,49.06313],[7.44328,49.18928],[7.05679,49.11163],[6.94302,49.21345],[6.81633,49.16389],[6.68209,49.24061],[6.3501,49.46202],[6.35353,49.57302],[6.42632,49.67177],[6.50254,49.71885],[6.45241,50.61258],[6.03871,50.71215],[6.00369,50.753],[6.05742,50.8559],[6.0787,50.90247],[6.0727,51.06792],[6.17123,51.33853],[6.22548,51.36554],[6.15715,51.5509],[6.12763,51.91069],[6.79985,51.86661],[7.02851,52.31255],[6.72947,52.64179],[7.07486,52.75269],[7.20532,53.18442],[7.04464,53.33106],[6.5173,53.65785],[8.23529,54.99001],[11.92257,54.52963],[14.1679,54.59631],[14.46591,53.24712],[14.14318,52.83946],[14.64375,52.58613],[14.57646,52.32756],[14.74537,52.06577],[14.66847,51.7353],[14.7234,51.53927],[15.03926,51.28745],[14.98845,51.09207],[14.88922,50.93856],[14.81593,50.87729],[14.63671,50.89116],[14.59311,50.91887],[14.57217,51.01076],[14.26283,51.06473],[14.28086,50.98024],[14.22816,50.85796],[13.69532,50.72883],[13.03442,50.50085],[12.49077,50.34582],[12.32632,50.29277],[12.35379,50.21462],[12.32701,50.16363],[12.1677,50.34889],[12.07707,50.2524],[12.18195,50.21136],[12.26014,50.09069],[12.53892,49.4164],[12.88808,49.3385],[13.21287,49.12439],[13.73952,48.83688],[13.45371,48.56222],[13.40555,48.37812],[13.03648,48.25986],[12.71376,48.10856],[12.93108,47.9376],[13.00455,47.84506],[12.90671,47.73249],[13.05228,47.59329],[12.15792,47.7087],[12.20393,47.61667],[12.17783,47.59815],[11.61753,47.60093],[11.26666,47.39124],[10.9247,47.46811],[10.91578,47.55623],[10.59031,47.5567],[10.29848,47.39937],[9.78144,47.61274],[9.74024,47.52842],[9.00278,47.69137],[8.68933,47.72371],[8.63809,47.70261],[8.63079,47.69359],[8.62127,47.69177],[8.62414,47.68221],[8.61243,47.68115],[8.35382,47.61367],[8.27485,47.619],[8.23709,47.61023],[8.22808,47.60583],[8.20284,47.61555],[8.10834,47.58251],[8.08568,47.5583],[8.06714,47.56444],[8.04981,47.55645],[8.02749,47.55112],[7.98097,47.55494],[7.91917,47.54787],[7.88862,47.58888],[7.81257,47.57122],[7.79455,47.55558],[7.71404,47.54063],[7.66043,47.54485],[7.65219,47.54702],[7.63439,47.56173],[7.61499,47.55669],[7.5834,47.57048],[7.58559,47.5845],[7.59366,47.60048],[7.58761,47.608],[7.51491,47.6652],[7.5434,47.81539],[7.57671,48.02454],[7.56812,48.06012],[7.80639,48.52438],[7.79987,48.58029],[7.80665,48.60106],[8.11014,48.84977],[8.19422,48.97504]]],terms_url:"https://data.deutschebahn.com/dataset/data-streckennetz",terms_text:"Data CC-BY 4.0 Deutsche Bahn AG",overlay:true},{id:"db-inspire-2015-11",name:"Deutsche Bahn VzG lines Nov 2015",type:"wms",template:"https://wms.michreichert.de/vzg-strecken-2015?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=vzg_strecken,station_codes,level_crossings&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-11-01T00:00:00.000Z",startDate:"2015-11-01T00:00:00.000Z",polygon:[[[8.19422,48.97504],[7.97355,49.02623],[7.94677,49.06313],[7.44328,49.18928],[7.05679,49.11163],[6.94302,49.21345],[6.81633,49.16389],[6.68209,49.24061],[6.3501,49.46202],[6.35353,49.57302],[6.42632,49.67177],[6.50254,49.71885],[6.45241,50.61258],[6.03871,50.71215],[6.00369,50.753],[6.05742,50.8559],[6.0787,50.90247],[6.0727,51.06792],[6.17123,51.33853],[6.22548,51.36554],[6.15715,51.5509],[6.12763,51.91069],[6.79985,51.86661],[7.02851,52.31255],[6.72947,52.64179],[7.07486,52.75269],[7.20532,53.18442],[7.04464,53.33106],[6.5173,53.65785],[8.23529,54.99001],[11.92257,54.52963],[14.1679,54.59631],[14.46591,53.24712],[14.14318,52.83946],[14.64375,52.58613],[14.57646,52.32756],[14.74537,52.06577],[14.66847,51.7353],[14.7234,51.53927],[15.03926,51.28745],[14.98845,51.09207],[14.88922,50.93856],[14.81593,50.87729],[14.63671,50.89116],[14.59311,50.91887],[14.57217,51.01076],[14.26283,51.06473],[14.28086,50.98024],[14.22816,50.85796],[13.69532,50.72883],[13.03442,50.50085],[12.49077,50.34582],[12.32632,50.29277],[12.35379,50.21462],[12.32701,50.16363],[12.1677,50.34889],[12.07707,50.2524],[12.18195,50.21136],[12.26014,50.09069],[12.53892,49.4164],[12.88808,49.3385],[13.21287,49.12439],[13.73952,48.83688],[13.45371,48.56222],[13.40555,48.37812],[13.03648,48.25986],[12.71376,48.10856],[12.93108,47.9376],[13.00455,47.84506],[12.90671,47.73249],[13.05228,47.59329],[12.15792,47.7087],[12.20393,47.61667],[12.17783,47.59815],[11.61753,47.60093],[11.26666,47.39124],[10.9247,47.46811],[10.91578,47.55623],[10.59031,47.5567],[10.29848,47.39937],[9.78144,47.61274],[9.74024,47.52842],[9.00278,47.69137],[8.68933,47.72371],[8.63809,47.70261],[8.63079,47.69359],[8.62127,47.69177],[8.62414,47.68221],[8.61243,47.68115],[8.35382,47.61367],[8.27485,47.619],[8.23709,47.61023],[8.22808,47.60583],[8.20284,47.61555],[8.10834,47.58251],[8.08568,47.5583],[8.06714,47.56444],[8.04981,47.55645],[8.02749,47.55112],[7.98097,47.55494],[7.91917,47.54787],[7.88862,47.58888],[7.81257,47.57122],[7.79455,47.55558],[7.71404,47.54063],[7.66043,47.54485],[7.65219,47.54702],[7.63439,47.56173],[7.61499,47.55669],[7.5834,47.57048],[7.58559,47.5845],[7.59366,47.60048],[7.58761,47.608],[7.51491,47.6652],[7.5434,47.81539],[7.57671,48.02454],[7.56812,48.06012],[7.80639,48.52438],[7.79987,48.58029],[7.80665,48.60106],[8.11014,48.84977],[8.19422,48.97504]]],terms_url:"https://data.deutschebahn.com/dataset/data-streckennetz",terms_text:"Data CC-BY 4.0 Deutsche Bahn AG",overlay:true},{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:"DigitalGlobe-Premium is a mosaic composed of DigitalGlobe basemap with select regions filled with +Vivid or custom area of interest imagery, 50cm resolution or better, and refreshed more frequently with ongoing updates.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png"},{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 13 and higher.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png",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:"DigitalGlobe-Standard is a curated set of imagery covering 86% of the earth’s landmass, with 30-60cm resolution where available, backfilled by Landsat. Average age is 2.31 years, with some areas updated 2x per year.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png"},{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 13 and higher.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png",overlay:true},{id:"drone-imagery-2014",name:"Drone Imagery 2014 (Haiti)",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/haiti_2014/{zoom}/{x}/{y}",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[-72.3286,18.69461],[-72.33034,18.69412],[-72.33117,18.69284],[-72.33413,18.68542],[-72.33452,18.68414],[-72.33443,18.68355],[-72.33375,18.68235],[-72.32147,18.67721],[-72.32027,18.67698],[-72.31909,18.67713],[-72.3183,18.67804],[-72.31508,18.68457],[-72.31394,18.689],[-72.31553,18.68993],[-72.3286,18.69461]],[[-72.34695,18.61833],[-72.34553,18.62166],[-72.34355,18.62447],[-72.34245,18.62553],[-72.34076,18.62658],[-72.33786,18.62639],[-72.33649,18.62597],[-72.33589,18.62504],[-72.33482,18.62559],[-72.33472,18.6255],[-72.33459,18.62513],[-72.33343,18.62438],[-72.33174,18.62469],[-72.3313,18.62457],[-72.33126,18.62321],[-72.33088,18.62276],[-72.33066,18.62277],[-72.32985,18.62345],[-72.32862,18.62186],[-72.32829,18.6218],[-72.32817,18.62193],[-72.32809,18.6218],[-72.32734,18.62261],[-72.32541,18.62101],[-72.32422,18.62122],[-72.32396,18.61869],[-72.32354,18.61815],[-72.32325,18.61818],[-72.32351,18.61877],[-72.32058,18.62031],[-72.32043,18.61993],[-72.31978,18.62066],[-72.31807,18.61907],[-72.31742,18.61958],[-72.31523,18.61782],[-72.31463,18.61844],[-72.31324,18.6165],[-72.31275,18.61677],[-72.31232,18.6172],[-72.31198,18.61704],[-72.31042,18.61764],[-72.31062,18.61564],[-72.30996,18.61526],[-72.30936,18.61623],[-72.30786,18.61542],[-72.30669,18.61623],[-72.30604,18.61704],[-72.30419,18.61545],[-72.30288,18.61688],[-72.30191,18.61637],[-72.30131,18.61552],[-72.30118,18.6158],[-72.30087,18.61546],[-72.30076,18.61567],[-72.30062,18.6156],[-72.30012,18.61609],[-72.29198,18.61365],[-72.29194,18.61347],[-72.29143,18.61342],[-72.29094,18.61323],[-72.29105,18.61199],[-72.29057,18.61152],[-72.28772,18.61145],[-72.28801,18.6096],[-72.2865,18.60968],[-72.28635,18.60799],[-72.28448,18.60844],[-72.28436,18.60789],[-72.283,18.60808],[-72.283,18.60658],[-72.2828,18.60676],[-72.2816,18.60537],[-72.28106,18.60533],[-72.27973,18.60682],[-72.27805,18.60525],[-72.27793,18.6053],[-72.2778,18.60524],[-72.2772,18.60638],[-72.27589,18.60564],[-72.27544,18.60629],[-72.27385,18.60508],[-72.27341,18.60508],[-72.27241,18.60593],[-72.27099,18.60442],[-72.27047,18.60429],[-72.27038,18.60446],[-72.27024,18.60427],[-72.27011,18.60433],[-72.26862,18.60368],[-72.26778,18.6037],[-72.26751,18.60429],[-72.2655,18.60318],[-72.26539,18.60336],[-72.26515,18.60309],[-72.26471,18.603],[-72.26436,18.60331],[-72.26312,18.60193],[-72.26258,18.60188],[-72.262,18.60251],[-72.26139,18.60184],[-72.26106,18.60182],[-72.26106,18.60148],[-72.26014,18.6005],[-72.25994,18.60049],[-72.25803,18.60079],[-72.2576,18.60054],[-72.25691,18.60094],[-72.25413,18.59992],[-72.25093,18.59739],[-72.25062,18.59676],[-72.25033,18.59701],[-72.24451,18.59231],[-72.24215,18.58872],[-72.24167,18.58756],[-72.24077,18.58654],[-72.24147,18.58592],[-72.2413,18.58543],[-72.2395,18.58424],[-72.24007,18.58358],[-72.2382,18.58197],[-72.23868,18.58157],[-72.2385,18.58119],[-72.23703,18.58054],[-72.23612,18.57894],[-72.23646,18.57825],[-72.23636,18.5777],[-72.23467,18.57684],[-72.2353,18.57562],[-72.235,18.57499],[-72.23335,18.57423],[-72.23399,18.57293],[-72.23182,18.57169],[-72.23188,18.57137],[-72.23175,18.57127],[-72.23198,18.5708],[-72.23072,18.5694],[-72.23097,18.56874],[-72.23082,18.56844],[-72.23046,18.56855],[-72.23009,18.56754],[-72.22942,18.56715],[-72.22972,18.56651],[-72.22961,18.566],[-72.22908,18.56612],[-72.22848,18.56396],[-72.22818,18.56395],[-72.22733,18.56421],[-72.2265,18.56179],[-72.22623,18.56191],[-72.22436,18.55908],[-72.22471,18.55882],[-72.22357,18.55689],[-72.22379,18.55675],[-72.22325,18.55579],[-72.22387,18.55544],[-72.22382,18.55528],[-72.22458,18.55483],[-72.22453,18.55439],[-72.22625,18.55408],[-72.22705,18.55349],[-72.22692,18.55333],[-72.2271,18.55324],[-72.22687,18.55273],[-72.22592,18.55308],[-72.22465,18.55027],[-72.22483,18.5501],[-72.22457,18.54956],[-72.22327,18.55014],[-72.22261,18.54869],[-72.2208,18.54918],[-72.22051,18.54852],[-72.22034,18.54865],[-72.2201,18.54845],[-72.21952,18.54876],[-72.21862,18.54755],[-72.2174,18.5478],[-72.21714,18.54733],[-72.21694,18.54734],[-72.21583,18.54517],[-72.21505,18.54533],[-72.21477,18.54494],[-72.21442,18.54218],[-72.21421,18.54233],[-72.21293,18.5401],[-72.21199,18.5404],[-72.21188,18.54025],[-72.21145,18.53781],[-72.21085,18.53797],[-72.21028,18.53545],[-72.20993,18.53465],[-72.20942,18.53478],[-72.20942,18.53456],[-72.20851,18.53472],[-72.2057,18.53039],[-72.20444,18.52693],[-72.20438,18.52643],[-72.20418,18.52637],[-72.20399,18.52572],[-72.20263,18.5222],[-72.20182,18.5197],[-72.20148,18.51742],[-72.20301,18.51606],[-72.20503,18.51506],[-72.20767,18.51432],[-72.20936,18.5142],[-72.2095,18.51448],[-72.21082,18.51416],[-72.21095,18.51444],[-72.21189,18.51412],[-72.21266,18.51403],[-72.21277,18.51417],[-72.21462,18.51393],[-72.21697,18.51569],[-72.21731,18.51648],[-72.21787,18.51642],[-72.21818,18.51975],[-72.21798,18.51984],[-72.21909,18.52189],[-72.22031,18.52152],[-72.22096,18.52382],[-72.22209,18.52355],[-72.22251,18.52685],[-72.22229,18.52693],[-72.22271,18.52726],[-72.22289,18.52707],[-72.2231,18.52722],[-72.22404,18.52681],[-72.22551,18.52936],[-72.22596,18.5297],[-72.22642,18.52964],[-72.2265,18.53018],[-72.2275,18.53118],[-72.22673,18.53171],[-72.22885,18.53383],[-72.22811,18.53435],[-72.22981,18.53623],[-72.22912,18.5367],[-72.22935,18.53731],[-72.23059,18.53875],[-72.23222,18.54189],[-72.23215,18.5421],[-72.23258,18.54324],[-72.23311,18.54304],[-72.2342,18.54558],[-72.23436,18.5455],[-72.23554,18.54776],[-72.23571,18.54779],[-72.23601,18.54899],[-72.23839,18.55165],[-72.23747,18.55231],[-72.23951,18.55397],[-72.23918,18.55413],[-72.2407,18.55661],[-72.24014,18.5568],[-72.24079,18.55824],[-72.24063,18.55835],[-72.24067,18.55845],[-72.24117,18.55815],[-72.24161,18.55898],[-72.24216,18.55882],[-72.24242,18.56062],[-72.24262,18.56101],[-72.24294,18.56089],[-72.24399,18.56371],[-72.24466,18.56356],[-72.24475,18.56413],[-72.24536,18.56445],[-72.2449,18.56525],[-72.24518,18.56549],[-72.245,18.56581],[-72.24499,18.56607],[-72.24543,18.56633],[-72.24559,18.56618],[-72.24588,18.56662],[-72.24687,18.56727],[-72.24662,18.56749],[-72.24781,18.56897],[-72.24728,18.56938],[-72.24859,18.57137],[-72.24894,18.57159],[-72.24865,18.57222],[-72.2488,18.57219],[-72.24885,18.5723],[-72.24945,18.57197],[-72.25068,18.57411],[-72.25147,18.5737],[-72.25251,18.57598],[-72.25339,18.57551],[-72.25491,18.57848],[-72.25462,18.57863],[-72.25467,18.57878],[-72.25505,18.57894],[-72.25495,18.57913],[-72.256,18.58074],[-72.2563,18.58054],[-72.25752,18.58237],[-72.25769,18.58227],[-72.2578,18.5824],[-72.25808,18.5823],[-72.25857,18.5821],[-72.25862,18.58222],[-72.25889,18.58219],[-72.25894,18.58302],[-72.25958,18.58445],[-72.25984,18.58472],[-72.26072,18.58443],[-72.26094,18.58565],[-72.2622,18.58722],[-72.26351,18.58643],[-72.2643,18.58738],[-72.26474,18.58708],[-72.26594,18.58862],[-72.26756,18.58877],[-72.26742,18.58917],[-72.27039,18.58893],[-72.27021,18.5903],[-72.2722,18.59048],[-72.27211,18.59145],[-72.27381,18.59188],[-72.27384,18.59168],[-72.27729,18.59169],[-72.28014,18.59129],[-72.28059,18.59048],[-72.28106,18.59071],[-72.28226,18.58989],[-72.28286,18.59047],[-72.28367,18.58966],[-72.28401,18.59014],[-72.28468,18.59029],[-72.2851,18.58997],[-72.2857,18.59062],[-72.28661,18.59068],[-72.28681,18.59014],[-72.28728,18.59032],[-72.28741,18.59013],[-72.28801,18.59052],[-72.28991,18.59071],[-72.29077,18.58997],[-72.29196,18.59186],[-72.2945,18.59148],[-72.29454,18.59361],[-72.29654,18.59322],[-72.29689,18.59586],[-72.2976,18.59675],[-72.29824,18.59722],[-72.29871,18.5962],[-72.30053,18.59733],[-72.30081,18.59675],[-72.30113,18.59691],[-72.30131,18.59676],[-72.30175,18.59721],[-72.30303,18.59774],[-72.3033,18.59729],[-72.30394,18.59761],[-72.30394,18.59736],[-72.30555,18.59794],[-72.30598,18.59756],[-72.30703,18.59838],[-72.30723,18.59799],[-72.30862,18.59833],[-72.30938,18.59752],[-72.31013,18.5981],[-72.31037,18.59739],[-72.3121,18.5983],[-72.3122,18.59807],[-72.31424,18.59902],[-72.31456,18.59873],[-72.31524,18.59922],[-72.31681,18.59952],[-72.31662,18.60004],[-72.31958,18.60072],[-72.31907,18.60202],[-72.32042,18.60247],[-72.32061,18.60242],[-72.32082,18.60267],[-72.3211,18.6027],[-72.32105,18.60298],[-72.32144,18.60347],[-72.32368,18.60322],[-72.32375,18.60432],[-72.32584,18.60436],[-72.32588,18.60522],[-72.32617,18.60585],[-72.32864,18.60525],[-72.32897,18.60527],[-72.32916,18.60727],[-72.33006,18.60812],[-72.3294,18.60867],[-72.33004,18.60959],[-72.33282,18.60949],[-72.33258,18.61058],[-72.33302,18.61005],[-72.3335,18.61054],[-72.33477,18.61035],[-72.33485,18.61167],[-72.33735,18.61174],[-72.33725,18.61237],[-72.33767,18.61298],[-72.34038,18.61306],[-72.34016,18.6138],[-72.34153,18.61384],[-72.34258,18.61457],[-72.3426,18.61512],[-72.34306,18.61499],[-72.34682,18.61792],[-72.34695,18.61833]],[[-72.72363,19.09461],[-72.72302,19.09518],[-72.72206,19.0965],[-72.72169,19.09612],[-72.72164,19.0962],[-72.72132,19.09609],[-72.72073,19.0967],[-72.7198,19.09587],[-72.71965,19.09591],[-72.7197,19.09601],[-72.71955,19.09602],[-72.71911,19.09623],[-72.71906,19.09627],[-72.71904,19.09625],[-72.71888,19.09631],[-72.71886,19.09626],[-72.71817,19.09643],[-72.71776,19.09679],[-72.71756,19.09657],[-72.71693,19.09705],[-72.71713,19.09735],[-72.71495,19.0988],[-72.71479,19.09852],[-72.71483,19.09849],[-72.7148,19.0984],[-72.71455,19.09859],[-72.71449,19.09851],[-72.71413,19.09877],[-72.71413,19.09893],[-72.71419,19.09891],[-72.71417,19.09978],[-72.71324,19.09971],[-72.71287,19.09974],[-72.71295,19.09967],[-72.71278,19.09968],[-72.71278,19.09977],[-72.71282,19.09976],[-72.71285,19.09988],[-72.71266,19.09989],[-72.71266,19.09987],[-72.71245,19.09987],[-72.71182,19.09991],[-72.71178,19.10012],[-72.71157,19.10009],[-72.71147,19.10102],[-72.71042,19.10086],[-72.71039,19.10119],[-72.7103,19.1012],[-72.71031,19.10151],[-72.7097,19.10156],[-72.7097,19.10162],[-72.70917,19.10169],[-72.70917,19.1021],[-72.70828,19.10211],[-72.70809,19.10289],[-72.70788,19.10284],[-72.70798,19.10367],[-72.70724,19.1038],[-72.70731,19.10501],[-72.70723,19.10501],[-72.70736,19.10565],[-72.70637,19.10584],[-72.7062,19.10714],[-72.70588,19.10706],[-72.70591,19.10747],[-72.7053,19.10757],[-72.7054,19.10813],[-72.70568,19.10809],[-72.70568,19.10928],[-72.70591,19.11013],[-72.70589,19.11022],[-72.70574,19.11025],[-72.70574,19.11116],[-72.70538,19.11114],[-72.70557,19.11247],[-72.70499,19.11256],[-72.70537,19.11361],[-72.7047,19.11388],[-72.70496,19.11563],[-72.70418,19.11564],[-72.70442,19.11762],[-72.70371,19.11764],[-72.70371,19.1178],[-72.70352,19.11779],[-72.70339,19.12227],[-72.70264,19.12205],[-72.70253,19.12301],[-72.70289,19.12592],[-72.70308,19.12595],[-72.70316,19.12864],[-72.70234,19.12997],[-72.70206,19.1301],[-72.69987,19.1305],[-72.69325,19.13064],[-72.687,19.13075],[-72.68456,19.13073],[-72.68338,19.13056],[-72.6828,19.1297],[-72.68203,19.1283],[-72.68201,19.12715],[-72.68158,19.12714],[-72.68187,19.12508],[-72.68185,19.12507],[-72.68215,19.12414],[-72.68253,19.12295],[-72.68265,19.12243],[-72.68263,19.12185],[-72.68302,19.12185],[-72.68301,19.12132],[-72.68286,19.12133],[-72.68293,19.11947],[-72.68251,19.11946],[-72.68256,19.11803],[-72.68265,19.11751],[-72.68265,19.11703],[-72.68318,19.11704],[-72.68319,19.11685],[-72.68371,19.11687],[-72.68384,19.11684],[-72.684,19.11685],[-72.68398,19.11689],[-72.68426,19.11688],[-72.68426,19.11679],[-72.68481,19.11674],[-72.68546,19.11667],[-72.68557,19.11664],[-72.68551,19.11664],[-72.6856,19.11662],[-72.68595,19.11658],[-72.68596,19.11654],[-72.68608,19.11654],[-72.68661,19.11663],[-72.68662,19.11656],[-72.68713,19.11665],[-72.68721,19.11666],[-72.68721,19.11663],[-72.6878,19.11666],[-72.68779,19.11659],[-72.68833,19.11663],[-72.68832,19.11658],[-72.68928,19.11657],[-72.6897,19.11656],[-72.68998,19.11644],[-72.6902,19.11644],[-72.69019,19.11615],[-72.69027,19.11563],[-72.69029,19.11541],[-72.69017,19.11543],[-72.69018,19.11493],[-72.69018,19.11458],[-72.69019,19.11445],[-72.69022,19.11433],[-72.6902,19.11406],[-72.68972,19.11398],[-72.68968,19.11397],[-72.68973,19.11415],[-72.68974,19.1142],[-72.68937,19.11417],[-72.68872,19.11412],[-72.688,19.11412],[-72.68758,19.11409],[-72.68759,19.11401],[-72.68736,19.11403],[-72.68711,19.11406],[-72.68682,19.11406],[-72.68677,19.11405],[-72.68591,19.11422],[-72.68554,19.11421],[-72.68557,19.11369],[-72.68554,19.11308],[-72.68533,19.11314],[-72.6852,19.11316],[-72.68519,19.1132],[-72.68504,19.11325],[-72.68495,19.1127],[-72.68474,19.11278],[-72.68468,19.11277],[-72.68446,19.11281],[-72.68416,19.1128],[-72.6836,19.11254],[-72.68353,19.11102],[-72.68363,19.11007],[-72.68338,19.11003],[-72.68344,19.10974],[-72.68295,19.1096],[-72.68305,19.10892],[-72.68111,19.10826],[-72.68112,19.1081],[-72.67965,19.10781],[-72.67968,19.10765],[-72.67923,19.10749],[-72.67916,19.10802],[-72.67838,19.10755],[-72.67779,19.10753],[-72.67775,19.10769],[-72.67623,19.10765],[-72.67606,19.10762],[-72.67621,19.10797],[-72.67549,19.10804],[-72.67548,19.1079],[-72.67431,19.10804],[-72.67432,19.10795],[-72.67398,19.10794],[-72.67382,19.10798],[-72.6739,19.10864],[-72.67319,19.10856],[-72.67307,19.10852],[-72.67284,19.10855],[-72.67276,19.10855],[-72.67286,19.10907],[-72.67284,19.10915],[-72.67251,19.10903],[-72.67236,19.10906],[-72.6723,19.10905],[-72.67224,19.10913],[-72.67179,19.10912],[-72.67051,19.10679],[-72.6704,19.10401],[-72.67048,19.10396],[-72.67032,19.10223],[-72.67034,19.1016],[-72.67062,19.09856],[-72.67121,19.09697],[-72.67278,19.09595],[-72.67277,19.09629],[-72.67364,19.09636],[-72.6736,19.09662],[-72.67484,19.09623],[-72.67489,19.09666],[-72.67566,19.09655],[-72.67566,19.09648],[-72.67655,19.09642],[-72.67772,19.09626],[-72.67786,19.09675],[-72.67784,19.09689],[-72.67826,19.09677],[-72.67837,19.09698],[-72.67858,19.09698],[-72.67853,19.09665],[-72.67878,19.09666],[-72.67861,19.09635],[-72.67927,19.09633],[-72.67973,19.0962],[-72.68015,19.09604],[-72.68058,19.09598],[-72.68029,19.09501],[-72.68072,19.095],[-72.68066,19.09474],[-72.68048,19.09418],[-72.68037,19.09335],[-72.68064,19.09335],[-72.68064,19.09266],[-72.67973,19.09263],[-72.67972,19.09269],[-72.67943,19.09266],[-72.67966,19.09132],[-72.67977,19.09107],[-72.68249,19.0892],[-72.68272,19.08907],[-72.68506,19.0888],[-72.68508,19.08888],[-72.68616,19.08873],[-72.6862,19.08887],[-72.68718,19.08866],[-72.68717,19.0886],[-72.68849,19.08844],[-72.68852,19.08847],[-72.69006,19.0884],[-72.69018,19.08871],[-72.69227,19.08828],[-72.69229,19.08887],[-72.69218,19.08924],[-72.69222,19.08928],[-72.69277,19.08923],[-72.69279,19.08933],[-72.69335,19.08934],[-72.69289,19.0888],[-72.69274,19.0883],[-72.69496,19.08857],[-72.69571,19.08831],[-72.69579,19.08892],[-72.69625,19.08904],[-72.69649,19.08889],[-72.69849,19.08845],[-72.69849,19.08866],[-72.6988,19.08858],[-72.69885,19.08895],[-72.69884,19.08903],[-72.69926,19.08895],[-72.70023,19.08884],[-72.70023,19.08893],[-72.70088,19.08892],[-72.7014,19.08887],[-72.70128,19.08828],[-72.70257,19.08859],[-72.70282,19.08874],[-72.70309,19.08883],[-72.70293,19.08855],[-72.70341,19.08862],[-72.70557,19.08863],[-72.70552,19.08906],[-72.70665,19.08889],[-72.70666,19.08938],[-72.70902,19.08917],[-72.70898,19.0891],[-72.71116,19.08894],[-72.71121,19.0892],[-72.71281,19.08912],[-72.71286,19.0898],[-72.71502,19.08882],[-72.71569,19.08838],[-72.71573,19.08847],[-72.7161,19.08824],[-72.71598,19.08795],[-72.71653,19.0877],[-72.71653,19.08761],[-72.71579,19.08781],[-72.71676,19.08727],[-72.71671,19.08717],[-72.71815,19.08638],[-72.71795,19.08602],[-72.71954,19.08518],[-72.71954,19.08511],[-72.72217,19.08467],[-72.72327,19.08506],[-72.72622,19.08712],[-72.72763,19.0891],[-72.72752,19.08973],[-72.72548,19.09295],[-72.72482,19.09403],[-72.72399,19.09495],[-72.72363,19.09461]],[[-72.06537,19.65239],[-72.06565,19.6518],[-72.06603,19.65128],[-72.06697,19.65109],[-72.0676,19.6511],[-72.07102,19.65223],[-72.0719,19.65254],[-72.07189,19.65255],[-72.07264,19.6528],[-72.07262,19.65284],[-72.07268,19.65286],[-72.07269,19.65283],[-72.0733,19.65305],[-72.07393,19.65327],[-72.07416,19.65347],[-72.07418,19.65351],[-72.07435,19.65395],[-72.07432,19.65425],[-72.07419,19.65495],[-72.07399,19.65583],[-72.07384,19.65648],[-72.07307,19.65805],[-72.07274,19.65866],[-72.0727,19.65869],[-72.07228,19.65915],[-72.07221,19.65917],[-72.07196,19.65916],[-72.0714,19.65909],[-72.07012,19.65866],[-72.07017,19.65856],[-72.06983,19.65852],[-72.06984,19.65848],[-72.06939,19.65841],[-72.06944,19.65823],[-72.06941,19.65823],[-72.06937,19.65836],[-72.06842,19.65807],[-72.06707,19.65759],[-72.06451,19.65663],[-72.06434,19.65632],[-72.06421,19.65547],[-72.06422,19.65541],[-72.06472,19.65379],[-72.06487,19.65351],[-72.06537,19.65239]],[[-72.23222,18.69173],[-72.23182,18.69172],[-72.23115,18.69168],[-72.23128,18.69161],[-72.23072,18.69152],[-72.23068,18.69147],[-72.23135,18.69159],[-72.23157,18.69149],[-72.23162,18.69137],[-72.23165,18.69134],[-72.23165,18.69164],[-72.23222,18.69173]],[[-72.2406,18.69192],[-72.23953,18.6921],[-72.23891,18.69207],[-72.23878,18.69207],[-72.23856,18.692],[-72.23818,18.69192],[-72.23186,18.69054],[-72.22977,18.69113],[-72.21709,18.68967],[-72.21618,18.68724],[-72.21599,18.68673],[-72.21602,18.68659],[-72.2159,18.68601],[-72.21581,18.68593],[-72.21561,18.68483],[-72.21569,18.6847],[-72.21578,18.68435],[-72.21595,18.68347],[-72.21629,18.68289],[-72.2164,18.68221],[-72.21633,18.68211],[-72.21641,18.68208],[-72.21642,18.68189],[-72.21694,18.6813],[-72.21685,18.68096],[-72.21693,18.68099],[-72.21722,18.68091],[-72.21734,18.6808],[-72.21731,18.67964],[-72.21749,18.67958],[-72.21749,18.67946],[-72.21747,18.67908],[-72.21743,18.67853],[-72.21739,18.6785],[-72.21718,18.6786],[-72.2171,18.67856],[-72.21708,18.67838],[-72.21724,18.67767],[-72.21724,18.67745],[-72.21721,18.67744],[-72.21681,18.67754],[-72.21671,18.67688],[-72.21662,18.67612],[-72.21642,18.67621],[-72.21601,18.67548],[-72.21596,18.67551],[-72.21589,18.67549],[-72.21552,18.6756],[-72.2154,18.67561],[-72.21529,18.6757],[-72.21521,18.67571],[-72.21491,18.67472],[-72.21464,18.67387],[-72.21456,18.6737],[-72.21447,18.67348],[-72.21413,18.67301],[-72.21427,18.67293],[-72.21413,18.67271],[-72.21383,18.67278],[-72.21339,18.67181],[-72.21178,18.67209],[-72.21169,18.67172],[-72.21135,18.67183],[-72.21116,18.67196],[-72.21077,18.67121],[-72.21058,18.67129],[-72.20984,18.66963],[-72.20972,18.6697],[-72.20966,18.66968],[-72.20918,18.66838],[-72.20895,18.66773],[-72.2093,18.66606],[-72.20937,18.66571],[-72.20974,18.66536],[-72.21031,18.66477],[-72.21021,18.66416],[-72.21042,18.66401],[-72.2111,18.66329],[-72.21167,18.66268],[-72.21179,18.66236],[-72.21206,18.66242],[-72.21193,18.66185],[-72.21188,18.66155],[-72.21199,18.66147],[-72.21239,18.66137],[-72.21331,18.66103],[-72.21393,18.66039],[-72.21376,18.65992],[-72.21355,18.65956],[-72.21376,18.65943],[-72.21349,18.65869],[-72.21296,18.65736],[-72.21357,18.6572],[-72.21312,18.65639],[-72.21281,18.65534],[-72.21317,18.6551],[-72.21308,18.65459],[-72.21347,18.65438],[-72.21374,18.65436],[-72.21382,18.65416],[-72.2135,18.65353],[-72.21304,18.65171],[-72.21345,18.65143],[-72.21341,18.65133],[-72.21364,18.65105],[-72.21418,18.65077],[-72.21378,18.65016],[-72.21364,18.64989],[-72.21372,18.64975],[-72.21429,18.64943],[-72.21379,18.64934],[-72.21362,18.64922],[-72.21382,18.64869],[-72.21354,18.64765],[-72.21331,18.64717],[-72.21366,18.64552],[-72.21389,18.64539],[-72.21377,18.6451],[-72.214,18.64399],[-72.21412,18.64378],[-72.21437,18.64347],[-72.2158,18.64222],[-72.21601,18.64217],[-72.21761,18.64218],[-72.21778,18.64272],[-72.21798,18.64256],[-72.21816,18.64236],[-72.21821,18.6422],[-72.22119,18.64222],[-72.22125,18.6423],[-72.22135,18.64224],[-72.2215,18.64223],[-72.22293,18.64229],[-72.22299,18.64235],[-72.22311,18.64227],[-72.22717,18.64249],[-72.22828,18.64281],[-72.22811,18.6432],[-72.22848,18.64325],[-72.22919,18.64258],[-72.2304,18.64263],[-72.23711,18.64295],[-72.23719,18.64317],[-72.23807,18.64322],[-72.23828,18.64298],[-72.23988,18.64306],[-72.24332,18.6434],[-72.24367,18.64387],[-72.24518,18.64437],[-72.2456,18.64364],[-72.24562,18.64372],[-72.24574,18.64363],[-72.24723,18.64378],[-72.24853,18.64441],[-72.24918,18.64397],[-72.25155,18.64418],[-72.25382,18.64516],[-72.2546,18.64564],[-72.25517,18.64642],[-72.2554,18.64807],[-72.25531,18.64812],[-72.2552,18.64828],[-72.2555,18.64881],[-72.25586,18.64847],[-72.25603,18.64856],[-72.25625,18.64848],[-72.25685,18.64755],[-72.25965,18.64494],[-72.26253,18.64336],[-72.26304,18.64362],[-72.26388,18.64308],[-72.26486,18.64445],[-72.26525,18.64373],[-72.26533,18.64378],[-72.26576,18.64259],[-72.26652,18.64289],[-72.26641,18.64135],[-72.26714,18.64137],[-72.26737,18.6407],[-72.26824,18.64023],[-72.26853,18.6403],[-72.26901,18.63988],[-72.26908,18.63978],[-72.26948,18.63958],[-72.27214,18.63895],[-72.27383,18.63988],[-72.27375,18.64004],[-72.27476,18.64088],[-72.27501,18.64054],[-72.27622,18.64161],[-72.27639,18.64131],[-72.27652,18.64138],[-72.27845,18.643],[-72.27896,18.64273],[-72.2823,18.64457],[-72.28387,18.64607],[-72.28384,18.64611],[-72.28412,18.64641],[-72.28401,18.64647],[-72.28455,18.6471],[-72.28538,18.64803],[-72.28569,18.64785],[-72.28642,18.64857],[-72.28724,18.64936],[-72.28775,18.65003],[-72.28724,18.65028],[-72.28768,18.65089],[-72.28708,18.65122],[-72.28656,18.65188],[-72.28736,18.6532],[-72.2872,18.65332],[-72.2873,18.65355],[-72.28905,18.65383],[-72.28882,18.65459],[-72.28889,18.6546],[-72.28878,18.65512],[-72.29013,18.65481],[-72.29084,18.65766],[-72.2902,18.65767],[-72.29076,18.66015],[-72.28998,18.66022],[-72.29045,18.66151],[-72.29022,18.66161],[-72.29033,18.66256],[-72.29138,18.66227],[-72.29155,18.66276],[-72.29368,18.66243],[-72.29377,18.663],[-72.29441,18.66289],[-72.29444,18.66273],[-72.29656,18.66246],[-72.29662,18.66262],[-72.29708,18.66261],[-72.29692,18.66184],[-72.30025,18.66195],[-72.30141,18.66311],[-72.30141,18.66397],[-72.30192,18.66392],[-72.30197,18.66454],[-72.30311,18.66471],[-72.30471,18.66632],[-72.30471,18.66668],[-72.30505,18.66666],[-72.30529,18.66692],[-72.30519,18.66768],[-72.30607,18.66759],[-72.30749,18.66901],[-72.30782,18.67109],[-72.30784,18.67216],[-72.30757,18.67405],[-72.30716,18.67526],[-72.30674,18.67537],[-72.30687,18.67599],[-72.30657,18.67612],[-72.30611,18.67602],[-72.30585,18.67705],[-72.30607,18.67726],[-72.3061,18.67744],[-72.30635,18.678],[-72.30609,18.67871],[-72.30587,18.67881],[-72.3059,18.67951],[-72.30556,18.68062],[-72.30395,18.68368],[-72.30377,18.68373],[-72.30139,18.68415],[-72.29912,18.68452],[-72.29899,18.68432],[-72.29826,18.6844],[-72.29828,18.6845],[-72.29502,18.68412],[-72.29419,18.68422],[-72.29408,18.68376],[-72.29202,18.68398],[-72.29191,18.68364],[-72.29101,18.68377],[-72.29095,18.68347],[-72.29037,18.68378],[-72.29035,18.68363],[-72.28936,18.68384],[-72.28913,18.68345],[-72.28766,18.6835],[-72.2877,18.68329],[-72.28538,18.68344],[-72.2849,18.68243],[-72.28449,18.68243],[-72.28376,18.68198],[-72.28268,18.68186],[-72.2822,18.68284],[-72.28268,18.68296],[-72.28164,18.68413],[-72.28111,18.68523],[-72.28129,18.68628],[-72.28089,18.68726],[-72.28036,18.68726],[-72.28036,18.68762],[-72.2715,18.688],[-72.2715,18.68774],[-72.27171,18.6875],[-72.27193,18.68611],[-72.2713,18.68611],[-72.27115,18.68635],[-72.27115,18.68735],[-72.26903,18.68805],[-72.26661,18.68821],[-72.26315,18.68817],[-72.25798,18.6868],[-72.25503,18.68501],[-72.25415,18.68242],[-72.25408,18.68278],[-72.25266,18.68732],[-72.25106,18.68819],[-72.24828,18.68927],[-72.24695,18.68917],[-72.24718,18.68966],[-72.24628,18.68966],[-72.24632,18.68997],[-72.24527,18.69032],[-72.24487,18.69045],[-72.24361,18.69036],[-72.24351,18.69029],[-72.24321,18.6903],[-72.24318,18.69051],[-72.24324,18.69061],[-72.24325,18.691],[-72.24303,18.69122],[-72.24166,18.69171],[-72.24149,18.69178],[-72.2406,18.69192]],[[-72.27545,18.56614],[-72.27419,18.56701],[-72.27356,18.56701],[-72.27297,18.56706],[-72.27227,18.56707],[-72.27191,18.56707],[-72.27178,18.56718],[-72.2709,18.56724],[-72.27064,18.56724],[-72.26998,18.56708],[-72.26875,18.56671],[-72.2684,18.56661],[-72.26809,18.56639],[-72.26781,18.56611],[-72.26744,18.5652],[-72.26739,18.56308],[-72.26738,18.5626],[-72.26742,18.56195],[-72.26799,18.56064],[-72.26822,18.56014],[-72.26856,18.55975],[-72.26871,18.55962],[-72.2702,18.55963],[-72.27181,18.55967],[-72.27491,18.55982],[-72.27579,18.55986],[-72.27588,18.55999],[-72.2758,18.56491],[-72.27578,18.56541],[-72.27575,18.56556],[-72.27552,18.56608],[-72.27545,18.56614]],[[-72.33318,18.56014],[-72.33166,18.55959],[-72.33021,18.55904],[-72.32919,18.55866],[-72.3292,18.55861],[-72.32887,18.55838],[-72.32868,18.55826],[-72.3282,18.55827],[-72.32815,18.55828],[-72.3261,18.55752],[-72.32604,18.5575],[-72.32604,18.55745],[-72.32589,18.55732],[-72.32551,18.5573],[-72.32437,18.55688],[-72.32411,18.55678],[-72.32379,18.55662],[-72.32348,18.55633],[-72.32315,18.55628],[-72.32174,18.55556],[-72.32143,18.55541],[-72.3205,18.55488],[-72.32019,18.5547],[-72.32007,18.55453],[-72.31984,18.55412],[-72.31984,18.55385],[-72.31998,18.55322],[-72.32046,18.55124],[-72.32056,18.55083],[-72.32066,18.55047],[-72.32068,18.55039],[-72.32111,18.54857],[-72.32127,18.54791],[-72.32147,18.54719],[-72.32153,18.54699],[-72.322,18.5458],[-72.32203,18.54575],[-72.32354,18.54486],[-72.3236,18.54483],[-72.3236,18.54481],[-72.32486,18.54407],[-72.32534,18.54378],[-72.32533,18.5439],[-72.32534,18.54392],[-72.32555,18.54416],[-72.32588,18.54452],[-72.3259,18.54453],[-72.32621,18.54452],[-72.3266,18.54452],[-72.32666,18.54398],[-72.32669,18.54367],[-72.32666,18.54361],[-72.32666,18.54356],[-72.32669,18.54356],[-72.32677,18.5436],[-72.32704,18.54363],[-72.32714,18.5432],[-72.32713,18.54314],[-72.32704,18.54317],[-72.32697,18.54316],[-72.32698,18.54296],[-72.32697,18.54293],[-72.32697,18.54281],[-72.32728,18.54263],[-72.32814,18.5424],[-72.32864,18.54226],[-72.3297,18.54228],[-72.32979,18.54228],[-72.33174,18.54279],[-72.33242,18.54298],[-72.33329,18.54319],[-72.33328,18.54321],[-72.33529,18.54372],[-72.33589,18.54387],[-72.33689,18.54504],[-72.33734,18.54555],[-72.33761,18.546],[-72.33783,18.54639],[-72.33788,18.54658],[-72.33791,18.54693],[-72.33792,18.54705],[-72.33763,18.54705],[-72.33749,18.54705],[-72.33751,18.54753],[-72.33751,18.54764],[-72.33747,18.54764],[-72.33748,18.54773],[-72.33742,18.54773],[-72.33739,18.54776],[-72.33735,18.54773],[-72.33734,18.54774],[-72.33726,18.54774],[-72.33725,18.54782],[-72.33725,18.54804],[-72.33728,18.548],[-72.3373,18.54798],[-72.3373,18.54796],[-72.33737,18.54788],[-72.33739,18.54789],[-72.33741,18.5478],[-72.33744,18.5478],[-72.33755,18.5477],[-72.33752,18.54764],[-72.33773,18.54741],[-72.33775,18.54741],[-72.33775,18.54737],[-72.33789,18.54721],[-72.3389,18.54828],[-72.33902,18.54842],[-72.34008,18.55026],[-72.34014,18.55034],[-72.34028,18.55068],[-72.34041,18.55099],[-72.34029,18.55156],[-72.34021,18.55185],[-72.33985,18.55283],[-72.33973,18.55315],[-72.33927,18.55425],[-72.33914,18.55457],[-72.33915,18.55458],[-72.3391,18.5547],[-72.33896,18.55506],[-72.33847,18.55626],[-72.33842,18.55625],[-72.33844,18.55631],[-72.33832,18.55661],[-72.33822,18.55686],[-72.33821,18.55687],[-72.33816,18.55699],[-72.33815,18.55698],[-72.33807,18.557],[-72.33803,18.557],[-72.33806,18.55726],[-72.338,18.55742],[-72.33716,18.5593],[-72.33709,18.55945],[-72.33843,18.55931],[-72.33929,18.55922],[-72.33982,18.55941],[-72.33983,18.55943],[-72.34028,18.55975],[-72.34092,18.5598],[-72.34096,18.5598],[-72.34413,18.5609],[-72.3446,18.56107],[-72.34472,18.56111],[-72.34472,18.56109],[-72.34829,18.5623],[-72.34912,18.5626],[-72.35035,18.56335],[-72.35302,18.56496],[-72.35333,18.56616],[-72.35351,18.56901],[-72.35337,18.56949],[-72.35156,18.57185],[-72.35042,18.57341],[-72.35036,18.57338],[-72.34849,18.57592],[-72.34815,18.57636],[-72.34756,18.57636],[-72.34753,18.57634],[-72.34746,18.57647],[-72.34745,18.57639],[-72.34705,18.57703],[-72.34659,18.57672],[-72.34649,18.57683],[-72.34544,18.57618],[-72.34365,18.57629],[-72.34361,18.57636],[-72.34354,18.57631],[-72.34258,18.5764],[-72.34252,18.57699],[-72.3428,18.57707],[-72.343,18.57715],[-72.3429,18.57737],[-72.34338,18.5774],[-72.34321,18.57803],[-72.34324,18.57803],[-72.3432,18.57816],[-72.3444,18.57852],[-72.34395,18.57972],[-72.34414,18.57976],[-72.34377,18.58067],[-72.34424,18.58074],[-72.34398,18.58155],[-72.34388,18.58181],[-72.34392,18.5818],[-72.34371,18.5823],[-72.34375,18.58229],[-72.34371,18.58237],[-72.34283,18.58355],[-72.3424,18.58413],[-72.34238,18.58411],[-72.34234,18.58411],[-72.34209,18.58403],[-72.34207,18.58434],[-72.342,18.58433],[-72.34192,18.58474],[-72.34192,18.58477],[-72.34118,18.58575],[-72.3408,18.58627],[-72.34024,18.58655],[-72.33983,18.58675],[-72.33542,18.58843],[-72.33539,18.58845],[-72.33539,18.58843],[-72.33517,18.58851],[-72.3346,18.58806],[-72.33372,18.58896],[-72.33361,18.58917],[-72.33295,18.58941],[-72.33253,18.58912],[-72.33252,18.58916],[-72.33168,18.58889],[-72.33157,18.5891],[-72.33152,18.58918],[-72.33153,18.58917],[-72.33152,18.5892],[-72.33158,18.58929],[-72.33161,18.58934],[-72.33136,18.58951],[-72.33134,18.58953],[-72.33135,18.58954],[-72.3313,18.58963],[-72.33132,18.58976],[-72.33112,18.58977],[-72.33118,18.58983],[-72.33097,18.59017],[-72.33011,18.5905],[-72.32965,18.59068],[-72.32418,18.59182],[-72.3238,18.59189],[-72.32228,18.59068],[-72.32079,18.58947],[-72.32076,18.58801],[-72.32078,18.588],[-72.32078,18.58706],[-72.32073,18.58691],[-72.32073,18.58626],[-72.32092,18.58625],[-72.32081,18.58589],[-72.32074,18.58593],[-72.3207,18.58531],[-72.32114,18.58437],[-72.32185,18.58274],[-72.32202,18.58277],[-72.3222,18.58276],[-72.32211,18.58251],[-72.32196,18.58249],[-72.32242,18.5815],[-72.32245,18.5815],[-72.32295,18.58034],[-72.32368,18.579],[-72.32465,18.57947],[-72.32575,18.57852],[-72.32661,18.5778],[-72.32721,18.57838],[-72.32824,18.57817],[-72.32848,18.57756],[-72.32855,18.5776],[-72.32938,18.57666],[-72.32907,18.57629],[-72.32936,18.57607],[-72.32877,18.57563],[-72.32975,18.57451],[-72.32968,18.57443],[-72.32989,18.57408],[-72.32994,18.57359],[-72.3296,18.57363],[-72.32997,18.57247],[-72.33009,18.57153],[-72.33017,18.57152],[-72.33047,18.57045],[-72.3314,18.57052],[-72.33167,18.56999],[-72.33027,18.56999],[-72.33025,18.57003],[-72.33006,18.57004],[-72.3297,18.57],[-72.32981,18.56877],[-72.32877,18.56765],[-72.32858,18.56749],[-72.32877,18.56711],[-72.32912,18.5668],[-72.32897,18.56664],[-72.32938,18.56572],[-72.32946,18.56554],[-72.33052,18.56424],[-72.33056,18.56424],[-72.33056,18.5642],[-72.33105,18.56367],[-72.33112,18.56374],[-72.33111,18.56376],[-72.33117,18.56377],[-72.33131,18.56391],[-72.33153,18.5641],[-72.33154,18.56385],[-72.33161,18.56365],[-72.33168,18.56329],[-72.33169,18.56322],[-72.33171,18.56319],[-72.33181,18.5628],[-72.33187,18.5626],[-72.33299,18.56123],[-72.33318,18.561],[-72.33365,18.56064],[-72.33393,18.56042],[-72.33367,18.56033],[-72.33367,18.56027],[-72.33332,18.56011],[-72.33318,18.56014]],[[-72.31173,18.56168],[-72.31195,18.56259],[-72.31221,18.56365],[-72.31259,18.56628],[-72.31254,18.5663],[-72.31264,18.56654],[-72.31266,18.56682],[-72.3127,18.56687],[-72.31276,18.56734],[-72.31256,18.56746],[-72.31232,18.56754],[-72.31229,18.56757],[-72.31199,18.5677],[-72.31216,18.56801],[-72.31227,18.56815],[-72.31231,18.56828],[-72.31239,18.56841],[-72.31291,18.56909],[-72.31281,18.56916],[-72.31306,18.56945],[-72.31309,18.56956],[-72.31323,18.57061],[-72.31325,18.57137],[-72.31325,18.57213],[-72.31234,18.57268],[-72.31117,18.57341],[-72.30971,18.5739],[-72.30911,18.5739],[-72.30894,18.57369],[-72.3086,18.57389],[-72.30712,18.57389],[-72.307,18.57357],[-72.30666,18.57388],[-72.30605,18.57389],[-72.30581,18.57367],[-72.30555,18.57388],[-72.3007,18.57387],[-72.30059,18.57369],[-72.30044,18.57386],[-72.29691,18.57388],[-72.29518,18.57386],[-72.295,18.57371],[-72.29473,18.57341],[-72.29387,18.5722],[-72.29341,18.57156],[-72.29338,18.57142],[-72.2933,18.57075],[-72.29338,18.57008],[-72.29349,18.56992],[-72.29361,18.56978],[-72.29361,18.56985],[-72.29378,18.56959],[-72.29364,18.56957],[-72.29345,18.56951],[-72.29358,18.56919],[-72.29389,18.56859],[-72.29373,18.56847],[-72.29359,18.56827],[-72.29359,18.5681],[-72.29379,18.5679],[-72.29403,18.56774],[-72.29387,18.56762],[-72.29368,18.56743],[-72.29396,18.56457],[-72.29411,18.56426],[-72.29401,18.56418],[-72.29402,18.5638],[-72.29412,18.56283],[-72.29451,18.56209],[-72.29462,18.56196],[-72.29767,18.5617],[-72.29849,18.56192],[-72.29864,18.56184],[-72.29857,18.56174],[-72.2988,18.56157],[-72.30144,18.56133],[-72.30181,18.56176],[-72.30228,18.56125],[-72.30275,18.56122],[-72.30427,18.56126],[-72.30505,18.56147],[-72.30522,18.5613],[-72.30609,18.56132],[-72.30821,18.56138],[-72.31173,18.56168]]]},{id:"DroneImageryCanaanHaitiNovember2015",name:"Drone Imagery Canaan(Haiti) November 2015",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/haiti_canaan_nov2015/{zoom}/{x}/{y}",endDate:"2015-11-01T00:00:00.000Z",startDate:"2015-11-01T00:00:00.000Z",polygon:[[[-72.23109,18.67676],[-72.23101,18.67675],[-72.23108,18.67675],[-72.23104,18.67669],[-72.23105,18.67665],[-72.23151,18.67663],[-72.23153,18.67665],[-72.23146,18.67676],[-72.23285,18.67669],[-72.23506,18.67641],[-72.23507,18.67638],[-72.23507,18.67635],[-72.23505,18.67635],[-72.23511,18.6762],[-72.23509,18.67614],[-72.23523,18.67613],[-72.23522,18.67611],[-72.23523,18.67606],[-72.2352,18.67598],[-72.23515,18.6758],[-72.23629,18.67565],[-72.23625,18.67553],[-72.23624,18.67551],[-72.23648,18.67548],[-72.23648,18.67565],[-72.23648,18.67581],[-72.23689,18.67575],[-72.2372,18.67571],[-72.23747,18.67567],[-72.23772,18.67563],[-72.23805,18.6756],[-72.23854,18.67555],[-72.23888,18.67552],[-72.239,18.67551],[-72.23897,18.67565],[-72.23897,18.67571],[-72.23901,18.67576],[-72.239,18.67576],[-72.23902,18.67584],[-72.23905,18.67589],[-72.23929,18.67587],[-72.23981,18.67581],[-72.24059,18.67571],[-72.24142,18.67561],[-72.24177,18.67556],[-72.24179,18.67553],[-72.2421,18.67551],[-72.24272,18.67545],[-72.24276,18.67536],[-72.24278,18.67537],[-72.24279,18.67537],[-72.24299,18.67536],[-72.24334,18.67535],[-72.24339,18.67535],[-72.2434,18.67534],[-72.24372,18.67532],[-72.24424,18.67525],[-72.24443,18.67509],[-72.2474,18.67253],[-72.24731,18.67233],[-72.24681,18.67157],[-72.2469,18.67061],[-72.24652,18.67055],[-72.24661,18.66991],[-72.24669,18.66991],[-72.24688,18.66884],[-72.24707,18.66789],[-72.24709,18.66749],[-72.24728,18.66743],[-72.24716,18.66691],[-72.24717,18.66642],[-72.24703,18.66644],[-72.24701,18.66616],[-72.24971,18.66598],[-72.24947,18.66475],[-72.24989,18.66489],[-72.24989,18.66507],[-72.25113,18.66515],[-72.25102,18.66548],[-72.25111,18.66548],[-72.25111,18.66559],[-72.25219,18.66551],[-72.25387,18.66554],[-72.25387,18.66563],[-72.25551,18.66559],[-72.25638,18.66484],[-72.25719,18.66359],[-72.25763,18.66208],[-72.25768,18.65694],[-72.25779,18.64996],[-72.25713,18.64563],[-72.25696,18.64517],[-72.25564,18.64352],[-72.2493,18.64358],[-72.2482,18.64361],[-72.24637,18.64397],[-72.24629,18.64462],[-72.24454,18.64436],[-72.24442,18.64527],[-72.24311,18.6455],[-72.24326,18.64639],[-72.24286,18.64794],[-72.24272,18.64801],[-72.24282,18.6482],[-72.24257,18.64894],[-72.24109,18.64902],[-72.24109,18.64918],[-72.2405,18.64906],[-72.24036,18.6495],[-72.2403,18.64863],[-72.23753,18.64915],[-72.23664,18.64899],[-72.23666,18.64883],[-72.23582,18.64888],[-72.23488,18.64878],[-72.23487,18.64893],[-72.2338,18.649],[-72.23384,18.64932],[-72.23262,18.64927],[-72.2325,18.64824],[-72.23028,18.64837],[-72.23028,18.64821],[-72.22743,18.64815],[-72.2263,18.64775],[-72.22608,18.64845],[-72.22583,18.64841],[-72.22576,18.64828],[-72.22417,18.64849],[-72.22417,18.64805],[-72.22166,18.64804],[-72.21921,18.6485],[-72.21767,18.64995],[-72.21719,18.6509],[-72.21637,18.65422],[-72.21633,18.65888],[-72.21633,18.66198],[-72.2171,18.66448],[-72.21737,18.66441],[-72.21814,18.66454],[-72.21864,18.66568],[-72.21837,18.66588],[-72.21881,18.66817],[-72.21881,18.66893],[-72.21846,18.66888],[-72.21884,18.67018],[-72.22015,18.67173],[-72.22175,18.67311],[-72.22175,18.67288],[-72.2225,18.67317],[-72.22257,18.67357],[-72.22241,18.67368],[-72.22489,18.67588],[-72.2287,18.67693],[-72.23073,18.6768],[-72.23111,18.67678],[-72.23109,18.67676]]]},{id:"drone-imagery-2016",name:"Drone Imagery Matthew(Haiti) October 2016",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/haiti_uav_201610/{zoom}/{x}/{y}",endDate:"2016-10-01T00:00:00.000Z",startDate:"2016-10-01T00:00:00.000Z",polygon:[[[-74.11291,18.64948],[-74.10903,18.64598],[-74.10873,18.64446],[-74.1095,18.64452],[-74.1095,18.64181],[-74.10968,18.64187],[-74.11053,18.64103],[-74.10988,18.64034],[-74.11005,18.64014],[-74.11005,18.64009],[-74.11011,18.64002],[-74.10949,18.63959],[-74.1095,18.63924],[-74.10904,18.63926],[-74.10894,18.63917],[-74.10905,18.63912],[-74.10898,18.63899],[-74.10782,18.63839],[-74.10823,18.63775],[-74.10812,18.63764],[-74.10786,18.63774],[-74.10768,18.63733],[-74.10748,18.63719],[-74.10722,18.63559],[-74.10901,18.63394],[-74.11678,18.62847],[-74.11952,18.62815],[-74.12251,18.63132],[-74.12731,18.63703],[-74.12684,18.6374],[-74.12731,18.63771],[-74.12768,18.63756],[-74.13403,18.64671],[-74.13401,18.64897],[-74.13087,18.65167],[-74.13076,18.65153],[-74.13053,18.65179],[-74.13054,18.65195],[-74.12878,18.65342],[-74.1274,18.65412],[-74.12514,18.65497],[-74.11997,18.65432],[-74.11938,18.65429],[-74.11291,18.64948]],[[-74.11305,18.4922],[-74.10884,18.49216],[-74.10118,18.49095],[-74.10105,18.49057],[-74.10131,18.4902],[-74.10101,18.48996],[-74.10142,18.48933],[-74.10099,18.48931],[-74.1009,18.48886],[-74.10166,18.48725],[-74.10108,18.48713],[-74.10133,18.48664],[-74.10058,18.48654],[-74.10048,18.48552],[-74.10062,18.4849],[-74.10037,18.48478],[-74.10012,18.4827],[-74.09994,18.48123],[-74.10033,18.48114],[-74.10242,18.48116],[-74.10492,18.48149],[-74.10771,18.48189],[-74.1099,18.48226],[-74.10987,18.48243],[-74.10992,18.48246],[-74.11018,18.48232],[-74.11196,18.48261],[-74.11247,18.48278],[-74.11316,18.48382],[-74.1134,18.48521],[-74.11349,18.48709],[-74.11338,18.48704],[-74.11336,18.48717],[-74.11349,18.48727],[-74.11355,18.48931],[-74.11349,18.48949],[-74.1135,18.48951],[-74.11349,18.48952],[-74.11347,18.48951],[-74.11334,18.48957],[-74.11336,18.48962],[-74.11341,18.48958],[-74.11344,18.48959],[-74.11349,18.48956],[-74.11352,18.48957],[-74.11355,18.48956],[-74.11357,18.48998],[-74.11359,18.49067],[-74.11354,18.49108],[-74.11322,18.492],[-74.11305,18.4922]],[[-74.10198,18.24954],[-74.09767,18.24744],[-74.09419,18.2474],[-74.09338,18.24885],[-74.09638,18.25292],[-74.09934,18.25335],[-74.10198,18.24954]],[[-74.02901,18.59744],[-74.02881,18.60255],[-74.00847,18.60182],[-74.00867,18.59671],[-74.02901,18.59744]],[[-73.91991,18.07466],[-73.91468,18.07482],[-73.91535,18.07742],[-73.91478,18.08009],[-73.91997,18.08014],[-73.91924,18.07802],[-73.91999,18.07637],[-73.91991,18.07466]],[[-74.22365,18.3081],[-74.22061,18.30272],[-74.21902,18.30278],[-74.21592,18.30364],[-74.21615,18.30804],[-74.22365,18.3081]],[[-74.00508,18.17646],[-74.00072,18.17657],[-74.00186,18.18175],[-74.00269,18.18344],[-74.00653,18.18336],[-74.00715,18.18218],[-74.00649,18.18056],[-74.0052,18.17922],[-74.00508,18.17646]],[[-74.0653,18.22881],[-74.06361,18.2268],[-74.06114,18.22672],[-74.05968,18.22853],[-74.06281,18.23083],[-74.06446,18.23034],[-74.0653,18.22881]],[[-74.11371,18.47184],[-74.11002,18.47177],[-74.10959,18.47536],[-74.11341,18.47497],[-74.11371,18.47184]],[[-73.95852,18.47452],[-73.95446,18.47465],[-73.95548,18.4794],[-73.95965,18.47878],[-73.95852,18.47452]],[[-74.16719,18.27229],[-74.16196,18.27232],[-74.16175,18.27303],[-74.16255,18.27452],[-74.16372,18.27542],[-74.16341,18.27749],[-74.16404,18.27854],[-74.16756,18.27868],[-74.16742,18.27592],[-74.16775,18.27416],[-74.16719,18.27229]],[[-74.11091,18.45286],[-74.10701,18.45258],[-74.10684,18.4586],[-74.11102,18.45781],[-74.11091,18.45286]],[[-73.76854,18.18022],[-73.75773,18.18006],[-73.73559,18.19311],[-73.73567,18.20143],[-73.74563,18.20191],[-73.74468,18.22311],[-73.77121,18.22417],[-73.77129,18.20844],[-73.76915,18.2064],[-73.76854,18.18022]],[[-74.13455,18.60914],[-74.1388,18.60929],[-74.13871,18.61165],[-74.13447,18.6115],[-74.13455,18.60914]],[[-74.04228,18.20945],[-74.042,18.20484],[-74.04155,18.20239],[-74.03959,18.20051],[-74.03836,18.20028],[-74.03764,18.20242],[-74.03792,18.20562],[-74.03918,18.20932],[-74.04228,18.20945]],[[-74.08668,18.61121],[-74.08669,18.61217],[-74.09146,18.61689],[-74.09211,18.61603],[-74.09313,18.61699],[-74.09603,18.62025],[-74.09627,18.6206],[-74.0967,18.62202],[-74.09337,18.62651],[-74.09237,18.62754],[-74.08862,18.62596],[-74.08863,18.62561],[-74.08778,18.62561],[-74.08661,18.6251],[-74.08662,18.62368],[-74.08514,18.62367],[-74.08462,18.62289],[-74.08463,18.62175],[-74.08339,18.62174],[-74.08261,18.62057],[-74.08262,18.61982],[-74.07659,18.6198],[-74.07658,18.61596],[-74.07255,18.61591],[-74.07259,18.61403],[-74.07062,18.61402],[-74.06858,18.6129],[-74.06855,18.61208],[-74.06614,18.61207],[-74.06414,18.61206],[-74.0625,18.61105],[-74.06254,18.61011],[-74.05927,18.61013],[-74.0545,18.60876],[-74.05451,18.60817],[-74.05168,18.60816],[-74.04932,18.60776],[-74.04647,18.60664],[-74.04646,18.6062],[-74.04243,18.6062],[-74.04133,18.60592],[-74.03625,18.60378],[-74.03597,18.60345],[-74.03642,18.60252],[-74.03719,18.6019],[-74.04003,18.60217],[-74.05608,18.60473],[-74.05851,18.6054],[-74.05861,18.60623],[-74.0611,18.60627],[-74.06481,18.60745],[-74.06518,18.60686],[-74.06679,18.60802],[-74.0696,18.60885],[-74.07142,18.60711],[-74.07239,18.60736],[-74.07515,18.61024],[-74.07701,18.61019],[-74.07798,18.61096],[-74.07901,18.61013],[-74.08109,18.61234],[-74.08234,18.60896],[-74.08383,18.60922],[-74.08513,18.60977],[-74.08668,18.61121]],[[-74.45922,18.4663],[-74.45589,18.46471],[-74.44779,18.47],[-74.44693,18.4713],[-74.44726,18.47934],[-74.44554,18.47915],[-74.44515,18.48326],[-74.43968,18.4839],[-74.439,18.48762],[-74.44299,18.49004],[-74.44906,18.49104],[-74.45382,18.49311],[-74.45571,18.49635],[-74.45786,18.49725],[-74.46052,18.49523],[-74.46241,18.49143],[-74.46198,18.48799],[-74.45537,18.48597],[-74.45526,18.47111],[-74.45944,18.46871],[-74.45922,18.4663]],[[-74.41888,18.57551],[-74.41499,18.57331],[-74.41045,18.57648],[-74.40824,18.58233],[-74.40954,18.58894],[-74.4112,18.59195],[-74.41081,18.59689],[-74.41663,18.60063],[-74.42178,18.59671],[-74.42146,18.59416],[-74.41745,18.59419],[-74.41753,18.59067],[-74.41538,18.59002],[-74.41533,18.58382],[-74.41652,18.58382],[-74.41756,18.5814],[-74.41756,18.57967],[-74.41924,18.57754],[-74.41888,18.57551]]]},{id:"Erlangen-2011",name:"Erlangen Luftbild (2011 5,0 cm)",type:"wms",template:"https://secure.erlangen.de/arcgiser/services/Luftbilder2011/MapServer/WmsServer?FORMAT=image/jpeg&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.92791,49.53196],[10.97194,49.52969],[10.97821,49.53568],[10.99934,49.53589],[11.03214,49.53089],[11.04425,49.54317],[11.03842,49.55239],[11.03663,49.57167],[11.04029,49.58572],[11.07287,49.58587],[11.07243,49.63486],[11.0054,49.6344],[11.00397,49.62599],[10.9748,49.62541],[10.94293,49.64563],[10.92532,49.64876],[10.91002,49.63793],[10.92235,49.60463],[10.91949,49.57823],[10.91135,49.57095],[10.91256,49.5606],[10.92907,49.55674],[10.92791,49.53196]]],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/jpeg&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.92791,49.53196],[10.9726,49.52939],[10.97909,49.53475],[10.99934,49.53589],[11.03214,49.53089],[11.04425,49.54317],[11.03842,49.55239],[11.03743,49.57873],[11.0568,49.592],[11.05748,49.61358],[11.04681,49.61447],[11.04788,49.6187],[11.00308,49.62367],[10.98107,49.62339],[10.98069,49.62617],[10.96737,49.62781],[10.96539,49.63415],[10.94293,49.64563],[10.92532,49.64876],[10.91002,49.63793],[10.92235,49.60463],[10.91949,49.57823],[10.91135,49.57095],[10.91256,49.5606],[10.92907,49.55674],[10.92791,49.53196]]],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/jpeg&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.53765],[10.99101,49.53392],[10.99389,49.53835],[11.02784,49.53254],[11.0346,49.53462],[11.03407,49.53759],[11.04318,49.54321],[11.03557,49.55303],[11.0384,49.55842],[11.03508,49.56929],[11.03791,49.58659],[11.04797,49.5902],[11.04922,49.5937],[11.05749,49.59521],[11.05623,49.59905],[11.05127,49.6003],[11.05351,49.60904],[11.04309,49.61381],[11.04076,49.61823],[11.0285,49.61735],[11.01929,49.61896],[11.0152,49.61372],[11.00581,49.61448],[11.00639,49.61931],[11.00083,49.6221],[10.9856,49.61651],[10.97837,49.61753],[10.9737,49.62495],[10.96539,49.62557],[10.96063,49.62856],[10.96382,49.63176],[10.95474,49.6379],[10.94837,49.637],[10.94185,49.64377],[10.9273,49.64837],[10.92063,49.63963],[10.91136,49.63773],[10.92429,49.60505],[10.92205,49.58004],[10.91221,49.57008],[10.91441,49.5618],[10.92353,49.55842],[10.92712,49.55976],[10.93345,49.55892],[10.93071,49.54467],[10.93067,49.53225],[10.9406,49.53325],[10.95488,49.53021],[10.97199,49.53126],[10.97664,49.53765]]],terms_text:"© Stadt Erlangen | © Geocart GmbH",best:true},{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:"https://osmlab.github.io/editor-layer-index/sources/world/EsriImageryClarity.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/world/EsriImageryClarity.png"},{id:"maaamet.ee-pohi_vr2",name:"Estonia Basemap (Maaamet)",type:"wms",template:"https://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.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti põhikaart"},{id:"Maaamet-Estonia_Cadastre",name:"Estonia Cadastre (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=of10000,TOPOYKSUS_6569,TOPOYKSUS_6573&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti katastrikaart ortofoto alusel"},{id:"maaamet.ee-cir_ngr",name:"Estonia Forestry (Maaamet)",type:"wms",template:"https://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:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti metsanduslik ortofoto"},{id:"maaamet.ee-reljeef",name:"Estonia Hillshading (Maaamet)",type:"wms",template:"https://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:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti reljeefikaart"},{id:"maaamet.ee-orto",name:"Estonia Ortho (Maaamet)",type:"tms",template:"https://tiles.maaamet.ee/tm/tms/1.0.0/foto@GMC/{zoom}/{x}/{-y}.png",scaleExtent:[14,18],polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],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.71382,-9.43476],[-36.71477,-9.34443],[-36.80586,-9.34498],[-36.80525,-9.43542],[-36.71382,-9.43476]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"Fiez-2013",name:"Fiez Orthophoto 2013",type:"tms",template:"http://osmdata.asitvd.ch/tiles/fiez2013/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",scaleExtent:[14,20],polygon:[[[6.62313,46.82339],[6.62899,46.82484],[6.62882,46.82674],[6.62531,46.83274],[6.62382,46.83317],[6.61839,46.83194],[6.62313,46.82339]]],terms_url:"http://osmdata.asitvd.ch/",terms_text:"Fiez - Orthophoto technique 2013"},{id:"fiskeridir-akvakultur",name:"Fiskeridirektoratet Aquaculture overlay",type:"wms",template:"https://ogc.fiskeridir.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_262&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[3,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.fiskeridir.no/Kart",terms_text:"© Fiskeridirektoratet",description:"Aquaculture/marine farms (licensed sites, may not yet have any installations)",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Emblem_of_the_Norwegian_Directorate_of_Fisheries.svg/175px-Emblem_of_the_Norwegian_Directorate_of_Fisheries.svg.png",overlay:true},{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.11391,46.8691],[16.17897,46.90662],[16.20004,46.94151],[16.22175,46.93554],[16.24628,46.94639],[16.25532,46.96421],[16.27647,46.96261],[16.29058,47.01398],[16.30162,46.99923],[16.34146,46.99652],[16.35052,47.01063],[16.3734,46.99859],[16.41277,47.00475],[16.43327,46.99274],[16.44781,47.00389],[16.48,46.99412],[16.5122,47.00117],[16.46356,47.03227],[16.44786,47.02275],[16.43912,47.02966],[16.44567,47.03887],[16.52032,47.0561],[16.47321,47.07362],[16.46372,47.09392],[16.5008,47.11006],[16.50004,47.12329],[16.52953,47.12874],[16.51716,47.14969],[16.45495,47.14259],[16.46487,47.16833],[16.45556,47.18756],[16.43056,47.1847],[16.4195,47.19491],[16.41892,47.21071],[16.43713,47.2097],[16.44263,47.23371],[16.43131,47.25276],[16.46715,47.25317],[16.48923,47.27989],[16.46463,47.33385],[16.4337,47.35281],[16.45851,47.36705],[16.44546,47.40702],[16.48317,47.40936],[16.49638,47.38927],[16.51709,47.41002],[16.57491,47.40542],[16.58073,47.41917],[16.66185,47.4556],[16.67064,47.47422],[16.65234,47.50034],[16.68956,47.51016],[16.71478,47.5402],[16.66354,47.56773],[16.6732,47.60495],[16.65953,47.6061],[16.65276,47.62285],[16.63142,47.62832],[16.57391,47.61967],[16.51474,47.6462],[16.49675,47.63931],[16.42546,47.66217],[16.44374,47.67421],[16.44805,47.69647],[16.4747,47.68116],[16.48722,47.69798],[16.55217,47.72255],[16.53638,47.73678],[16.54798,47.75154],[16.60952,47.76037],[16.63441,47.75908],[16.65729,47.74149],[16.72094,47.73536],[16.75341,47.68282],[16.83016,47.68106],[16.83943,47.70451],[16.86689,47.72115],[16.87668,47.68765],[17.09374,47.70777],[17.07066,47.72854],[17.0516,47.79385],[17.07495,47.8085],[17.04714,47.82856],[17.05195,47.83777],[17.01055,47.85818],[17.01639,47.86733],[17.08575,47.87462],[17.11317,47.92716],[17.09171,47.93429],[17.11838,47.96011],[17.09466,47.97088],[17.20103,48.01999],[17.24177,48.02247],[17.25795,47.99865],[17.33465,47.99312],[17.40299,47.94785],[17.45392,47.88526],[17.52674,47.86551],[17.56758,47.81513],[17.6084,47.82189],[17.70858,47.75668],[17.77987,47.73949],[17.8661,47.74575],[17.90013,47.73926],[17.94687,47.74467],[17.97087,47.75784],[18.00441,47.74634],[18.03806,47.75768],[18.29588,47.73146],[18.45407,47.76512],[18.49316,47.75276],[18.55908,47.766],[18.64609,47.75909],[18.72607,47.78904],[18.74118,47.81382],[18.792,47.82309],[18.84854,47.81672],[18.85588,47.82608],[18.82801,47.83429],[18.81357,47.85555],[18.76353,47.8716],[18.75686,47.89684],[18.77675,47.95509],[18.75525,47.97635],[18.81574,47.99344],[18.82,48.03968],[18.83327,48.04824],[18.87494,48.04707],[18.88667,48.05868],[18.90898,48.05114],[18.9439,48.05886],[18.98161,48.0536],[19.01486,48.07818],[19.05852,48.05735],[19.08436,48.07278],[19.1074,48.0656],[19.13529,48.07415],[19.24137,48.05365],[19.25578,48.07156],[19.30311,48.08871],[19.3866,48.09191],[19.40002,48.0823],[19.45405,48.10144],[19.46735,48.08393],[19.49442,48.10991],[19.49238,48.13966],[19.51282,48.15466],[19.50452,48.17344],[19.52897,48.19036],[19.52604,48.20313],[19.5775,48.21601],[19.63083,48.25007],[19.64452,48.23917],[19.66986,48.23921],[19.69122,48.20389],[19.72113,48.20147],[19.74618,48.21651],[19.78716,48.19253],[19.79873,48.19482],[19.80528,48.18373],[19.78242,48.16504],[19.79481,48.15353],[19.82133,48.16908],[19.84528,48.16274],[19.85517,48.17843],[19.86013,48.16941],[19.89875,48.16631],[19.91454,48.14686],[19.8983,48.1249],[19.93738,48.13112],[19.97439,48.166],[19.98871,48.16217],[20.02904,48.17768],[20.04945,48.1672],[20.07299,48.17961],[20.07004,48.1917],[20.13409,48.22518],[20.13319,48.25398],[20.20616,48.25098],[20.20383,48.26191],[20.22847,48.26278],[20.23495,48.27993],[20.28686,48.26164],[20.32571,48.27279],[20.33746,48.30167],[20.36566,48.31661],[20.38408,48.35118],[20.40983,48.36586],[20.40253,48.38256],[20.42053,48.40386],[20.41623,48.41854],[20.50793,48.48936],[20.50651,48.53442],[20.53747,48.52788],[20.54649,48.54429],[20.58659,48.53576],[20.65387,48.56141],[20.83636,48.58284],[20.8378,48.57421],[20.85044,48.58163],[20.84533,48.5665],[20.86815,48.55182],[20.92232,48.55945],[20.93463,48.53834],[20.95588,48.53396],[20.9562,48.52167],[20.98158,48.51777],[21.01511,48.53231],[21.06632,48.52589],[21.11745,48.49105],[21.16087,48.5215],[21.17963,48.51823],[21.22106,48.5375],[21.30549,48.52225],[21.31338,48.55084],[21.32688,48.55413],[21.31938,48.5612],[21.41545,48.55895],[21.42266,48.57882],[21.44061,48.5851],[21.51409,48.55107],[21.54202,48.5084],[21.61393,48.50942],[21.62019,48.46983],[21.66355,48.41796],[21.66456,48.39216],[21.70174,48.3807],[21.71187,48.35762],[21.81741,48.33279],[21.8352,48.33464],[21.83721,48.36325],[21.8843,48.35605],[21.88484,48.36754],[21.89788,48.36256],[21.8998,48.37022],[21.92819,48.3616],[21.92681,48.3709],[21.9492,48.37873],[21.99446,48.37732],[22.02133,48.39275],[22.0546,48.37753],[22.07649,48.38724],[22.08674,48.37156],[22.13591,48.38052],[22.13106,48.39123],[22.15277,48.39624],[22.15619,48.40931],[22.21257,48.42565],[22.23714,48.41004],[22.26549,48.40987],[22.23988,48.38701],[22.26757,48.36116],[22.31781,48.35454],[22.31329,48.32507],[22.33729,48.30791],[22.33843,48.27921],[22.38475,48.23396],[22.40064,48.2492],[22.43284,48.25252],[22.45639,48.24231],[22.4899,48.25342],[22.49722,48.23955],[22.51615,48.23797],[22.53111,48.20943],[22.57114,48.19614],[22.56164,48.18161],[22.59824,48.14476],[22.59028,48.10734],[22.67545,48.092],[22.73472,48.11985],[22.75762,48.12006],[22.77039,48.10902],[22.77232,48.12187],[22.80277,48.12211],[22.80253,48.10708],[22.82543,48.11751],[22.83644,48.08025],[22.86113,48.07503],[22.8678,48.05243],[22.88204,48.05481],[22.86597,48.01132],[22.83556,47.9906],[22.84076,47.98136],[22.87257,47.97527],[22.86973,47.96596],[22.89157,47.96724],[22.89744,47.95406],[22.84733,47.90776],[22.79281,47.89086],[22.75869,47.89414],[22.77775,47.84225],[22.71363,47.83609],[22.68019,47.78775],[22.61112,47.77175],[22.549,47.77222],[22.48121,47.81089],[22.45131,47.80339],[22.43133,47.73981],[22.35662,47.74862],[22.31777,47.76609],[22.31762,47.74337],[22.28514,47.72928],[22.26432,47.73107],[22.259,47.69791],[22.23068,47.6932],[22.17965,47.59161],[22.12892,47.5979],[22.09428,47.55836],[22.07826,47.56213],[22.05345,47.54748],[22.07122,47.53807],[22.06179,47.5288],[22.04513,47.53989],[22.03672,47.53267],[22.00719,47.48362],[22.03279,47.45084],[22.02388,47.39086],[22.01198,47.3758],[21.96274,47.38105],[21.93825,47.37253],[21.87779,47.28578],[21.88728,47.27305],[21.85349,47.23976],[21.85807,47.18736],[21.81248,47.16675],[21.79241,47.10598],[21.72683,47.09839],[21.6976,47.05792],[21.65042,47.04083],[21.68887,47.002],[21.66787,46.97123],[21.68149,46.96521],[21.6382,46.93305],[21.59845,46.92747],[21.61429,46.88673],[21.60167,46.86682],[21.52033,46.83737],[21.51861,46.80007],[21.48318,46.76502],[21.52634,46.73932],[21.52937,46.72097],[21.49233,46.68597],[21.47284,46.69591],[21.4299,46.69394],[21.43096,46.67814],[21.45467,46.66086],[21.41624,46.64262],[21.4098,46.62181],[21.3657,46.63795],[21.33005,46.63182],[21.31397,46.61767],[21.30124,46.59087],[21.32079,46.58286],[21.2743,46.54074],[21.26003,46.50216],[21.27442,46.47673],[21.29645,46.4763],[21.31743,46.45073],[21.28952,46.41548],[21.29633,46.40696],[21.22501,46.41369],[21.20642,46.40338],[21.19926,46.3479],[21.17623,46.33577],[21.1805,46.30445],[21.11554,46.30185],[21.10305,46.26246],[21.07088,46.2539],[21.06608,46.24294],[21.03662,46.24804],[21.02467,46.26653],[20.96082,46.2623],[20.94658,46.2793],[20.92507,46.27662],[20.92181,46.26181],[20.87327,46.28776],[20.77565,46.27596],[20.74905,46.25085],[20.76186,46.20456],[20.7274,46.20775],[20.73411,46.19394],[20.71405,46.16605],[20.68436,46.14478],[20.65492,46.14977],[20.63945,46.12676],[20.54505,46.17909],[20.50148,46.19033],[20.49494,46.17099],[20.45923,46.14288],[20.39751,46.15747],[20.36853,46.15286],[20.35571,46.16963],[20.29681,46.15215],[20.2549,46.11585],[20.24848,46.1301],[20.23301,46.12417],[20.18174,46.16011],[20.1365,46.14495],[20.10097,46.17728],[20.06362,46.14373],[20.03461,46.14589],[20.01581,46.17684],[19.93541,46.17642],[19.85335,46.15],[19.81797,46.12817],[19.75854,46.14798],[19.69821,46.18793],[19.68277,46.18004],[19.66151,46.19044],[19.63174,46.1693],[19.56765,46.17911],[19.5604,46.16658],[19.50266,46.14245],[19.52712,46.12103],[19.4645,46.09538],[19.46658,46.08204],[19.416,46.04605],[19.3804,46.03587],[19.36409,46.0523],[19.2819,46.0148],[19.29653,45.98812],[19.28565,45.9969],[19.14799,45.99634],[19.13384,46.0371],[19.10487,46.04017],[19.06604,46.0002],[19.07968,45.96364],[19.00598,45.95907],[19.00927,45.92366],[18.90613,45.93538],[18.87946,45.91668],[18.86471,45.92085],[18.86856,45.91134],[18.82768,45.90517],[18.822,45.91459],[18.80751,45.90361],[18.80925,45.87962],[18.79562,45.87845],[18.70489,45.91819],[18.67002,45.91084],[18.65966,45.91689],[18.66513,45.89928],[18.64128,45.88904],[18.65502,45.87424],[18.62777,45.87338],[18.61484,45.85314],[18.62367,45.83985],[18.57324,45.81376],[18.57498,45.80043],[18.55972,45.8038],[18.52235,45.78269],[18.49067,45.79472],[18.48219,45.7655],[18.45628,45.76952],[18.44508,45.76052],[18.44685,45.73713],[18.40763,45.73971],[18.39189,45.7617],[18.36423,45.77294],[18.33942,45.74716],[18.29682,45.76122],[18.24405,45.76123],[18.23073,45.77903],[18.19087,45.78788],[18.16819,45.77627],[18.12465,45.78963],[18.10681,45.77083],[18.08189,45.76452],[17.99588,45.79573],[17.93021,45.78633],[17.90668,45.79257],[17.86531,45.76701],[17.82627,45.81],[17.80898,45.8041],[17.78091,45.81749],[17.76034,45.81192],[17.74086,45.8296],[17.66329,45.83818],[17.62762,45.89794],[17.57007,45.93582],[17.43783,45.95038],[17.4259,45.92727],[17.41081,45.93997],[17.39215,45.93021],[17.38287,45.94757],[17.34762,45.94234],[17.34388,45.96053],[17.35377,45.9525],[17.39054,45.95819],[17.38742,45.96618],[17.35835,45.96427],[17.37549,45.96869],[17.37519,45.98811],[17.36357,45.99154],[17.35672,45.97358],[17.33396,45.99608],[17.33198,45.97289],[17.313,45.96653],[17.32365,45.98878],[17.29877,45.98387],[17.3042,46.00211],[17.25797,46.01103],[17.29632,46.02852],[17.25415,46.03001],[17.27096,46.05671],[17.23248,46.0592],[17.25251,46.06647],[17.23131,46.07903],[17.20199,46.07655],[17.23313,46.09896],[17.2104,46.10017],[17.21297,46.11386],[17.17593,46.10846],[17.17434,46.12876],[17.18652,46.13323],[17.1811,46.15055],[17.15623,46.15858],[17.15929,46.16968],[17.1261,46.16845],[17.12274,46.17898],[17.07525,46.18895],[17.06616,46.2023],[16.97354,46.2252],[16.97395,46.24311],[16.95041,46.24153],[16.88624,46.28146],[16.87137,46.32528],[16.88021,46.3357],[16.86154,46.34524],[16.86562,46.35565],[16.8522,46.35172],[16.84986,46.36262],[16.83529,46.36382],[16.83765,46.3748],[16.82617,46.3671],[16.79334,46.38739],[16.75921,46.37766],[16.72987,46.40149],[16.71821,46.38987],[16.67729,46.44945],[16.66318,46.4487],[16.66637,46.4583],[16.61879,46.46199],[16.60447,46.47608],[16.5236,46.50538],[16.53258,46.5314],[16.51767,46.53635],[16.50841,46.56527],[16.483,46.56604],[16.4834,46.5786],[16.44557,46.61095],[16.42486,46.61316],[16.38594,46.64425],[16.39154,46.66373],[16.41985,46.65848],[16.42863,46.69397],[16.36892,46.70401],[16.37983,46.71539],[16.37109,46.72229],[16.35706,46.71424],[16.3186,46.75414],[16.33054,46.77521],[16.31216,46.778],[16.31277,46.79731],[16.34064,46.80519],[16.35084,46.83006],[16.34033,46.84688],[16.3015,46.85951],[16.29139,46.87283],[16.23323,46.87667],[16.15609,46.85371],[16.12657,46.85691],[16.11391,46.8691]]],terms_url:"https://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.11391,46.8691],[16.17897,46.90662],[16.20004,46.94151],[16.22175,46.93554],[16.24628,46.94639],[16.25532,46.96421],[16.27647,46.96261],[16.29058,47.01398],[16.30162,46.99923],[16.34146,46.99652],[16.35052,47.01063],[16.3734,46.99859],[16.41277,47.00475],[16.43327,46.99274],[16.44781,47.00389],[16.48,46.99412],[16.5122,47.00117],[16.46356,47.03227],[16.44786,47.02275],[16.43912,47.02966],[16.44567,47.03887],[16.52032,47.0561],[16.47321,47.07362],[16.46372,47.09392],[16.5008,47.11006],[16.50004,47.12329],[16.52953,47.12874],[16.51716,47.14969],[16.45495,47.14259],[16.46487,47.16833],[16.45556,47.18756],[16.43056,47.1847],[16.4195,47.19491],[16.41892,47.21071],[16.43713,47.2097],[16.44263,47.23371],[16.43131,47.25276],[16.46715,47.25317],[16.48923,47.27989],[16.46463,47.33385],[16.4337,47.35281],[16.45851,47.36705],[16.44546,47.40702],[16.48317,47.40936],[16.49638,47.38927],[16.51709,47.41002],[16.57491,47.40542],[16.58073,47.41917],[16.66185,47.4556],[16.67064,47.47422],[16.65234,47.50034],[16.68956,47.51016],[16.71478,47.5402],[16.66354,47.56773],[16.6732,47.60495],[16.65953,47.6061],[16.65276,47.62285],[16.63142,47.62832],[16.57391,47.61967],[16.51474,47.6462],[16.49675,47.63931],[16.42546,47.66217],[16.44374,47.67421],[16.44805,47.69647],[16.4747,47.68116],[16.48722,47.69798],[16.55217,47.72255],[16.53638,47.73678],[16.54798,47.75154],[16.60952,47.76037],[16.63441,47.75908],[16.65729,47.74149],[16.72094,47.73536],[16.75341,47.68282],[16.83016,47.68106],[16.83943,47.70451],[16.86689,47.72115],[16.87668,47.68765],[17.09374,47.70777],[17.07066,47.72854],[17.0516,47.79385],[17.07495,47.8085],[17.04714,47.82856],[17.05195,47.83777],[17.01055,47.85818],[17.01639,47.86733],[17.08575,47.87462],[17.11317,47.92716],[17.09171,47.93429],[17.11838,47.96011],[17.09466,47.97088],[17.20103,48.01999],[17.24177,48.02247],[17.25795,47.99865],[17.33465,47.99312],[17.40299,47.94785],[17.45392,47.88526],[17.52674,47.86551],[17.56758,47.81513],[17.6084,47.82189],[17.70858,47.75668],[17.77987,47.73949],[17.8661,47.74575],[17.90013,47.73926],[17.94687,47.74467],[17.97087,47.75784],[18.00441,47.74634],[18.03806,47.75768],[18.29588,47.73146],[18.45407,47.76512],[18.49316,47.75276],[18.55908,47.766],[18.64609,47.75909],[18.72607,47.78904],[18.74118,47.81382],[18.792,47.82309],[18.84854,47.81672],[18.85588,47.82608],[18.82801,47.83429],[18.81357,47.85555],[18.76353,47.8716],[18.75686,47.89684],[18.77675,47.95509],[18.75525,47.97635],[18.81574,47.99344],[18.82,48.03968],[18.83327,48.04824],[18.87494,48.04707],[18.88667,48.05868],[18.90898,48.05114],[18.9439,48.05886],[18.98161,48.0536],[19.01486,48.07818],[19.05852,48.05735],[19.08436,48.07278],[19.1074,48.0656],[19.13529,48.07415],[19.24137,48.05365],[19.25578,48.07156],[19.30311,48.08871],[19.3866,48.09191],[19.40002,48.0823],[19.45405,48.10144],[19.46735,48.08393],[19.49442,48.10991],[19.49238,48.13966],[19.51282,48.15466],[19.50452,48.17344],[19.52897,48.19036],[19.52604,48.20313],[19.5775,48.21601],[19.63083,48.25007],[19.64452,48.23917],[19.66986,48.23921],[19.69122,48.20389],[19.72113,48.20147],[19.74618,48.21651],[19.78716,48.19253],[19.79873,48.19482],[19.80528,48.18373],[19.78242,48.16504],[19.79481,48.15353],[19.82133,48.16908],[19.84528,48.16274],[19.85517,48.17843],[19.86013,48.16941],[19.89875,48.16631],[19.91454,48.14686],[19.8983,48.1249],[19.93738,48.13112],[19.97439,48.166],[19.98871,48.16217],[20.02904,48.17768],[20.04945,48.1672],[20.07299,48.17961],[20.07004,48.1917],[20.13409,48.22518],[20.13319,48.25398],[20.20616,48.25098],[20.20383,48.26191],[20.22847,48.26278],[20.23495,48.27993],[20.28686,48.26164],[20.32571,48.27279],[20.33746,48.30167],[20.36566,48.31661],[20.38408,48.35118],[20.40983,48.36586],[20.40253,48.38256],[20.42053,48.40386],[20.41623,48.41854],[20.50793,48.48936],[20.50651,48.53442],[20.53747,48.52788],[20.54649,48.54429],[20.58659,48.53576],[20.65387,48.56141],[20.83636,48.58284],[20.8378,48.57421],[20.85044,48.58163],[20.84533,48.5665],[20.86815,48.55182],[20.92232,48.55945],[20.93463,48.53834],[20.95588,48.53396],[20.9562,48.52167],[20.98158,48.51777],[21.01511,48.53231],[21.06632,48.52589],[21.11745,48.49105],[21.16087,48.5215],[21.17963,48.51823],[21.22106,48.5375],[21.30549,48.52225],[21.31338,48.55084],[21.32688,48.55413],[21.31938,48.5612],[21.41545,48.55895],[21.42266,48.57882],[21.44061,48.5851],[21.51409,48.55107],[21.54202,48.5084],[21.61393,48.50942],[21.62019,48.46983],[21.66355,48.41796],[21.66456,48.39216],[21.70174,48.3807],[21.71187,48.35762],[21.81741,48.33279],[21.8352,48.33464],[21.83721,48.36325],[21.8843,48.35605],[21.88484,48.36754],[21.89788,48.36256],[21.8998,48.37022],[21.92819,48.3616],[21.92681,48.3709],[21.9492,48.37873],[21.99446,48.37732],[22.02133,48.39275],[22.0546,48.37753],[22.07649,48.38724],[22.08674,48.37156],[22.13591,48.38052],[22.13106,48.39123],[22.15277,48.39624],[22.15619,48.40931],[22.21257,48.42565],[22.23714,48.41004],[22.26549,48.40987],[22.23988,48.38701],[22.26757,48.36116],[22.31781,48.35454],[22.31329,48.32507],[22.33729,48.30791],[22.33843,48.27921],[22.38475,48.23396],[22.40064,48.2492],[22.43284,48.25252],[22.45639,48.24231],[22.4899,48.25342],[22.49722,48.23955],[22.51615,48.23797],[22.53111,48.20943],[22.57114,48.19614],[22.56164,48.18161],[22.59824,48.14476],[22.59028,48.10734],[22.67545,48.092],[22.73472,48.11985],[22.75762,48.12006],[22.77039,48.10902],[22.77232,48.12187],[22.80277,48.12211],[22.80253,48.10708],[22.82543,48.11751],[22.83644,48.08025],[22.86113,48.07503],[22.8678,48.05243],[22.88204,48.05481],[22.86597,48.01132],[22.83556,47.9906],[22.84076,47.98136],[22.87257,47.97527],[22.86973,47.96596],[22.89157,47.96724],[22.89744,47.95406],[22.84733,47.90776],[22.79281,47.89086],[22.75869,47.89414],[22.77775,47.84225],[22.71363,47.83609],[22.68019,47.78775],[22.61112,47.77175],[22.549,47.77222],[22.48121,47.81089],[22.45131,47.80339],[22.43133,47.73981],[22.35662,47.74862],[22.31777,47.76609],[22.31762,47.74337],[22.28514,47.72928],[22.26432,47.73107],[22.259,47.69791],[22.23068,47.6932],[22.17965,47.59161],[22.12892,47.5979],[22.09428,47.55836],[22.07826,47.56213],[22.05345,47.54748],[22.07122,47.53807],[22.06179,47.5288],[22.04513,47.53989],[22.03672,47.53267],[22.00719,47.48362],[22.03279,47.45084],[22.02388,47.39086],[22.01198,47.3758],[21.96274,47.38105],[21.93825,47.37253],[21.87779,47.28578],[21.88728,47.27305],[21.85349,47.23976],[21.85807,47.18736],[21.81248,47.16675],[21.79241,47.10598],[21.72683,47.09839],[21.6976,47.05792],[21.65042,47.04083],[21.68887,47.002],[21.66787,46.97123],[21.68149,46.96521],[21.6382,46.93305],[21.59845,46.92747],[21.61429,46.88673],[21.60167,46.86682],[21.52033,46.83737],[21.51861,46.80007],[21.48318,46.76502],[21.52634,46.73932],[21.52937,46.72097],[21.49233,46.68597],[21.47284,46.69591],[21.4299,46.69394],[21.43096,46.67814],[21.45467,46.66086],[21.41624,46.64262],[21.4098,46.62181],[21.3657,46.63795],[21.33005,46.63182],[21.31397,46.61767],[21.30124,46.59087],[21.32079,46.58286],[21.2743,46.54074],[21.26003,46.50216],[21.27442,46.47673],[21.29645,46.4763],[21.31743,46.45073],[21.28952,46.41548],[21.29633,46.40696],[21.22501,46.41369],[21.20642,46.40338],[21.19926,46.3479],[21.17623,46.33577],[21.1805,46.30445],[21.11554,46.30185],[21.10305,46.26246],[21.07088,46.2539],[21.06608,46.24294],[21.03662,46.24804],[21.02467,46.26653],[20.96082,46.2623],[20.94658,46.2793],[20.92507,46.27662],[20.92181,46.26181],[20.87327,46.28776],[20.77565,46.27596],[20.74905,46.25085],[20.76186,46.20456],[20.7274,46.20775],[20.73411,46.19394],[20.71405,46.16605],[20.68436,46.14478],[20.65492,46.14977],[20.63945,46.12676],[20.54505,46.17909],[20.50148,46.19033],[20.49494,46.17099],[20.45923,46.14288],[20.39751,46.15747],[20.36853,46.15286],[20.35571,46.16963],[20.29681,46.15215],[20.2549,46.11585],[20.24848,46.1301],[20.23301,46.12417],[20.18174,46.16011],[20.1365,46.14495],[20.10097,46.17728],[20.06362,46.14373],[20.03461,46.14589],[20.01581,46.17684],[19.93541,46.17642],[19.85335,46.15],[19.81797,46.12817],[19.75854,46.14798],[19.69821,46.18793],[19.68277,46.18004],[19.66151,46.19044],[19.63174,46.1693],[19.56765,46.17911],[19.5604,46.16658],[19.50266,46.14245],[19.52712,46.12103],[19.4645,46.09538],[19.46658,46.08204],[19.416,46.04605],[19.3804,46.03587],[19.36409,46.0523],[19.2819,46.0148],[19.29653,45.98812],[19.28565,45.9969],[19.14799,45.99634],[19.13384,46.0371],[19.10487,46.04017],[19.06604,46.0002],[19.07968,45.96364],[19.00598,45.95907],[19.00927,45.92366],[18.90613,45.93538],[18.87946,45.91668],[18.86471,45.92085],[18.86856,45.91134],[18.82768,45.90517],[18.822,45.91459],[18.80751,45.90361],[18.80925,45.87962],[18.79562,45.87845],[18.70489,45.91819],[18.67002,45.91084],[18.65966,45.91689],[18.66513,45.89928],[18.64128,45.88904],[18.65502,45.87424],[18.62777,45.87338],[18.61484,45.85314],[18.62367,45.83985],[18.57324,45.81376],[18.57498,45.80043],[18.55972,45.8038],[18.52235,45.78269],[18.49067,45.79472],[18.48219,45.7655],[18.45628,45.76952],[18.44508,45.76052],[18.44685,45.73713],[18.40763,45.73971],[18.39189,45.7617],[18.36423,45.77294],[18.33942,45.74716],[18.29682,45.76122],[18.24405,45.76123],[18.23073,45.77903],[18.19087,45.78788],[18.16819,45.77627],[18.12465,45.78963],[18.10681,45.77083],[18.08189,45.76452],[17.99588,45.79573],[17.93021,45.78633],[17.90668,45.79257],[17.86531,45.76701],[17.82627,45.81],[17.80898,45.8041],[17.78091,45.81749],[17.76034,45.81192],[17.74086,45.8296],[17.66329,45.83818],[17.62762,45.89794],[17.57007,45.93582],[17.43783,45.95038],[17.4259,45.92727],[17.41081,45.93997],[17.39215,45.93021],[17.38287,45.94757],[17.34762,45.94234],[17.34388,45.96053],[17.35377,45.9525],[17.39054,45.95819],[17.38742,45.96618],[17.35835,45.96427],[17.37549,45.96869],[17.37519,45.98811],[17.36357,45.99154],[17.35672,45.97358],[17.33396,45.99608],[17.33198,45.97289],[17.313,45.96653],[17.32365,45.98878],[17.29877,45.98387],[17.3042,46.00211],[17.25797,46.01103],[17.29632,46.02852],[17.25415,46.03001],[17.27096,46.05671],[17.23248,46.0592],[17.25251,46.06647],[17.23131,46.07903],[17.20199,46.07655],[17.23313,46.09896],[17.2104,46.10017],[17.21297,46.11386],[17.17593,46.10846],[17.17434,46.12876],[17.18652,46.13323],[17.1811,46.15055],[17.15623,46.15858],[17.15929,46.16968],[17.1261,46.16845],[17.12274,46.17898],[17.07525,46.18895],[17.06616,46.2023],[16.97354,46.2252],[16.97395,46.24311],[16.95041,46.24153],[16.88624,46.28146],[16.87137,46.32528],[16.88021,46.3357],[16.86154,46.34524],[16.86562,46.35565],[16.8522,46.35172],[16.84986,46.36262],[16.83529,46.36382],[16.83765,46.3748],[16.82617,46.3671],[16.79334,46.38739],[16.75921,46.37766],[16.72987,46.40149],[16.71821,46.38987],[16.67729,46.44945],[16.66318,46.4487],[16.66637,46.4583],[16.61879,46.46199],[16.60447,46.47608],[16.5236,46.50538],[16.53258,46.5314],[16.51767,46.53635],[16.50841,46.56527],[16.483,46.56604],[16.4834,46.5786],[16.44557,46.61095],[16.42486,46.61316],[16.38594,46.64425],[16.39154,46.66373],[16.41985,46.65848],[16.42863,46.69397],[16.36892,46.70401],[16.37983,46.71539],[16.37109,46.72229],[16.35706,46.71424],[16.3186,46.75414],[16.33054,46.77521],[16.31216,46.778],[16.31277,46.79731],[16.34064,46.80519],[16.35084,46.83006],[16.34033,46.84688],[16.3015,46.85951],[16.29139,46.87283],[16.23323,46.87667],[16.15609,46.85371],[16.12657,46.85691],[16.11391,46.8691]]],terms_url:"https://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:"https://{switch:a,b,c,d}.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:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Cyclo",name:"Freemap.sk Cyclo",type:"tms",template:"https://{switch:a,b,c,d}.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:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Hiking",name:"Freemap.sk Hiking",type:"tms",template:"https://{switch:a,b,c,d}.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:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Ski",name:"Freemap.sk Ski",type:"tms",template:"https://{switch:a,b,c,d}.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:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"fta-digiroad-functional",name:"FTA Road Network",type:"wms",template:"https://extranet.liikennevirasto.fi/inspirepalvelu/beta/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dr_tielinkki_toim_lk&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[3,20],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.liikennevirasto.fi/web/en/open-data/digiroad/",terms_text:"© Liikennevirasto",description:"Digiroad national road network from the Finnish Transport Agency, functional road classes.",icon:"https://www.liikennevirasto.fi/livi-theme/images/general/liikennevirasto_logo_2x.png",overlay:true},{id:"gaza_pleiades_20140706",name:"Gaza Strip - Pléiades - 2014/07/06",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/gaza_pleiades_20140706/{zoom}/{x}/{y}",endDate:"2014-07-06T00:00:00.000Z",startDate:"2014-07-06T00:00:00.000Z",scaleExtent:[0,22],polygon:[[[34.49022,31.59487],[34.49339,31.59263],[34.5678,31.5401],[34.5653,31.53226],[34.55613,31.52552],[34.54729,31.5121],[34.53011,31.5066],[34.5255,31.50251],[34.51369,31.50067],[34.505,31.49543],[34.4887,31.48263],[34.48532,31.48028],[34.47962,31.47778],[34.47471,31.47207],[34.4674,31.46448],[34.46576,31.46275],[34.45308,31.45139],[34.44585,31.4441],[34.44216,31.44327],[34.43798,31.44112],[34.43226,31.43458],[34.43164,31.43265],[34.4268,31.42804],[34.42211,31.42437],[34.41326,31.41862],[34.41329,31.41758],[34.41174,31.41604],[34.40918,31.41542],[34.4067,31.41295],[34.40506,31.41295],[34.40197,31.4112],[34.40134,31.40986],[34.39492,31.40391],[34.39351,31.40113],[34.38824,31.39599],[34.38037,31.38951],[34.38074,31.38791],[34.37407,31.37915],[34.37338,31.37422],[34.37159,31.37209],[34.37214,31.37093],[34.37158,31.36972],[34.3704,31.36909],[34.36827,31.36992],[34.36685,31.36914],[34.36497,31.36137],[34.37438,31.30609],[34.36708,31.29074],[34.34339,31.27846],[34.33119,31.26149],[34.31931,31.25317],[34.29093,31.24009],[34.26762,31.21894],[34.25915,31.22131],[34.231,31.26295],[34.21113,31.32157],[34.2434,31.34554],[34.29954,31.39629],[34.34172,31.43251],[34.36439,31.45715],[34.41099,31.50162],[34.42619,31.52686],[34.44463,31.54193],[34.49022,31.59487]]],terms_url:"https://wiki.openstreetmap.org/wiki/2014_Gaza_Strip",terms_text:"Copyright CNES 2014, Distribution Airbus Defence and Space"},{id:"gaza_pleiades_20140706_nir",name:"Gaza Strip - Pléiades - 2014/07/06 (NIR)",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/gaza_pleiades_20140706_nir/{zoom}/{x}/{y}",endDate:"2014-07-06T00:00:00.000Z",startDate:"2014-07-06T00:00:00.000Z",scaleExtent:[0,22],polygon:[[[34.49022,31.59487],[34.49339,31.59263],[34.5678,31.5401],[34.5653,31.53226],[34.55613,31.52552],[34.54729,31.5121],[34.53011,31.5066],[34.5255,31.50251],[34.51369,31.50067],[34.505,31.49543],[34.4887,31.48263],[34.48532,31.48028],[34.47962,31.47778],[34.47471,31.47207],[34.4674,31.46448],[34.46576,31.46275],[34.45308,31.45139],[34.44585,31.4441],[34.44216,31.44327],[34.43798,31.44112],[34.43226,31.43458],[34.43164,31.43265],[34.4268,31.42804],[34.42211,31.42437],[34.41326,31.41862],[34.41329,31.41758],[34.41174,31.41604],[34.40918,31.41542],[34.4067,31.41295],[34.40506,31.41295],[34.40197,31.4112],[34.40134,31.40986],[34.39492,31.40391],[34.39351,31.40113],[34.38824,31.39599],[34.38037,31.38951],[34.38074,31.38791],[34.37407,31.37915],[34.37338,31.37422],[34.37159,31.37209],[34.37214,31.37093],[34.37158,31.36972],[34.3704,31.36909],[34.36827,31.36992],[34.36685,31.36914],[34.36497,31.36137],[34.37438,31.30609],[34.36708,31.29074],[34.34339,31.27846],[34.33119,31.26149],[34.31931,31.25317],[34.29093,31.24009],[34.26762,31.21894],[34.25915,31.22131],[34.231,31.26295],[34.21113,31.32157],[34.2434,31.34554],[34.29954,31.39629],[34.34172,31.43251],[34.36439,31.45715],[34.41099,31.50162],[34.42619,31.52686],[34.44463,31.54193],[34.49022,31.59487]]],terms_url:"https://wiki.openstreetmap.org/wiki/2014_Gaza_Strip",terms_text:"Copyright CNES 2014, Distribution Airbus Defence and Space"},{id:"Geobase_Hydrography",name:"Geobase Hydrography - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/hydro_network_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nhn:nhn&STYLES=&SRS={proj}&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.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-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]]],overlay:true},{id:"Geobase_Hydrography_French",name:"Geobase Hydrography - French",type:"wms",template:"https://maps.geogratis.gc.ca/wms/hydro_network_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nhn:nhn&STYLES=&SRS={proj}&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.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-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]]],overlay:true},{id:"Geobase_Roads",name:"Geobase Roads - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/roads_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=roads&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[4,20],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.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-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_French",name:"Geobase Roads - French",type:"wms",template:"https://cartes.geogratis.gc.ca/wms/roads_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=routes&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[4,20],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.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-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:"https://gis.bmlfuw.gv.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.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"http://geoimage.at",terms_text:"geoimage.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/GeoimageatMaxRes.png"},{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.07962,46.10959],[-0.94115,46.01474],[-0.56306,45.15178],[-0.7266,45.08425],[-0.87904,45.34094],[-0.99794,45.33779],[-0.95558,44.69982],[-1.15862,44.19865],[-1.21512,44.20558],[-1.24654,44.1162],[-1.27903,44.03937],[-1.28825,44.02304],[-1.32117,43.94094],[-1.32151,43.92296],[-1.3092,43.92337],[-1.3085,43.91439],[-1.28366,43.91514],[-1.28302,43.90624],[-1.2761,43.90655],[-1.28211,43.89254],[-1.30102,43.85159],[-1.30384,43.8424],[-1.30923,43.83498],[-1.33474,43.76946],[-1.34407,43.74875],[-1.3456,43.74214],[-1.34673,43.73688],[-1.43284,43.53152],[-1.42806,43.46812],[-1.60627,43.40591],[-1.6061,43.36012],[-1.77441,43.30357],[-1.82995,43.38484],[-1.58551,43.46856],[-1.35706,44.03374],[-1.40217,44.06461],[-1.33584,44.22832],[-1.21836,44.23033],[-1.16795,44.41097],[-1.30744,44.41847],[-1.16979,45.59107],[-1.48685,46.06042],[-1.36364,46.09146],[-1.60176,46.17019],[-1.64442,46.22375],[-1.58595,46.30426],[-1.51008,46.33888],[-1.75643,46.42214],[-2.1872,46.81857],[-2.16423,46.85534],[-2.23654,46.9337],[-2.39769,46.96718],[-2.282,47.07631],[-2.12563,47.01875],[-2.09013,47.06562],[-2.18487,47.10698],[-2.2647,47.10763],[-2.24489,47.18562],[-2.56779,47.24467],[-2.66727,47.46686],[-2.74787,47.47122],[-2.75771,47.43461],[-2.89321,47.4629],[-2.90369,47.50905],[-3.03383,47.53833],[-3.07113,47.51185],[-3.01653,47.49873],[-3.12502,47.42693],[-3.18803,47.48441],[-3.22791,47.61132],[-3.2967,47.63161],[-3.2876,47.67154],[-3.34074,47.66893],[-3.38912,47.59473],[-3.55087,47.63827],[-3.53384,47.72488],[-3.76577,47.76476],[-3.77595,47.7371],[-3.91168,47.75915],[-3.8959,47.79911],[-3.97236,47.81526],[-3.99722,47.7975],[-3.97956,47.76268],[-3.8945,47.72193],[-3.9162,47.67831],[-4.10163,47.70921],[-4.08989,47.78944],[-4.03798,47.79909],[-4.04125,47.83109],[-4.08765,47.84221],[-4.14781,47.82525],[-4.14314,47.78847],[-4.35162,47.7415],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.63576,48.07798],[-4.60147,48.11469],[-4.385,48.10962],[-4.38955,48.14543],[-4.30925,48.15009],[-4.31268,48.17694],[-4.46369,48.18468],[-4.49748,48.1453],[-4.5921,48.14758],[-4.57537,48.22488],[-4.67101,48.2331],[-4.65434,48.31049],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.81465,48.39413],[-4.83515,48.54319],[-4.63387,48.66373],[-3.96692,48.77978],[-3.94939,48.74715],[-3.6502,48.75356],[-3.65853,48.82527],[-3.53931,48.85834],[-3.54444,48.90297],[-3.40954,48.91866],[-3.40755,48.87366],[-3.02769,48.9275],[-2.67861,48.58841],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.80392,48.66126],[-1.61161,48.68582],[-1.71645,49.24781],[-1.8026,49.32721],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.17134,49.55412],[-1.27353,49.55245],[-1.1328,49.3934],[-0.93059,49.40804],[-0.74827,49.35976],[-0.38935,49.34167],[-0.24704,49.29995],[-0.12454,49.29353],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.4521,51.12144],[2.59286,51.12124],[2.60683,51.05779],[1.7976,50.89906],[1.66458,50.82379],[1.70786,50.1282],[1.05936,49.85],[0.61607,49.79062],[0.24731,49.65027],[0.1709,49.53174],[0.57065,49.49622],[0.41115,49.3396],[0.19504,49.35736],[0.01718,49.25479],[-0.24453,49.26312],[-0.38408,49.30495],[-0.74091,49.32438],[-0.9954,49.37133],[-1.05453,49.25175],[-1.27704,49.29022],[-1.25966,49.43463],[-1.39141,49.53985],[-1.27535,49.62056],[-1.29775,49.65946],[-1.4905,49.57139],[-1.77517,49.63398],[-1.74601,49.48155],[-1.51294,49.24691],[-1.48261,48.72607],[-1.30574,48.72531],[-1.28323,48.59731],[-2.76114,48.43471],[-3.00174,48.67646],[-3.21062,48.72097],[-3.95404,48.56051],[-4.15643,48.60792],[-4.44475,48.55852],[-4.63683,48.48299],[-4.6319,48.44727],[-4.25022,48.43088],[-4.06141,48.21805],[-4.1757,48.05165],[-4.31904,48.0141],[-4.26781,47.89977],[-3.88484,47.98172],[-3.76375,47.86403],[-2.32727,47.52634],[-2.36911,47.3339],[-1.74067,47.33507],[-1.77062,47.20451],[-2.03678,47.21942],[-2.0968,47.15548],[-1.88786,47.01239],[-2.08797,46.83007],[-2.01214,46.83436],[-1.84079,46.69651],[-1.87318,46.65484],[-1.68859,46.50392],[-1.62117,46.51513],[-1.42428,46.41675],[-1.01761,46.35917],[-1.07962,46.10959]],[[-2.41232,46.69242],[-2.37197,46.67611],[-2.26749,46.68033],[-2.27007,46.70705],[-2.29827,46.73286],[-2.41655,46.73711],[-2.41232,46.69242]],[[-3.06018,47.40542],[-2.82587,47.29635],[-2.78787,47.33417],[-3.02436,47.44563],[-3.06018,47.40542]],[[-3.26482,47.4295],[-3.3343,47.35928],[-3.29614,47.34133],[-3.31489,47.30057],[-3.19941,47.24492],[-3.16567,47.27751],[-3.08686,47.23612],[-3.00637,47.30855],[-3.26482,47.4295]],[[-1.93966,48.86346],[-1.93993,48.91179],[-1.701,48.91105],[-1.69726,48.86173],[-1.93966,48.86346]]],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.98385,46.18807],[-0.89497,46.15628],[-0.93455,46.10163],[-0.84388,46.06949],[-0.88241,46.01637],[-0.53787,45.89558],[-0.63498,45.76444],[-0.86666,45.8479],[-0.76264,45.6245],[-0.69695,45.62659],[-0.69397,45.60184],[-0.68755,45.60174],[-0.688,45.50986],[-0.63799,45.50892],[-0.63978,45.44747],[-0.61574,45.44695],[-0.61619,45.38586],[-0.58544,45.38596],[-0.58529,45.32334],[-0.55379,45.32344],[-0.55275,45.19661],[-0.49094,45.19577],[-0.49184,45.13315],[-0.45661,45.13325],[-0.45512,45.07161],[-0.41611,45.07089],[-0.41621,45.02696],[-0.2907,44.98278],[-0.22,45.06771],[-0.12252,45.02563],[-0.18925,44.94591],[-0.09266,44.91019],[-0.14521,44.8392],[-0.15491,44.84238],[-0.19387,44.78678],[-0.43541,44.87317],[-0.39048,44.68413],[-0.58798,44.66014],[-0.66628,44.99129],[-0.77838,44.99263],[-0.77764,45.05389],[-0.81584,45.05321],[-0.81838,45.11962],[-0.88393,45.12051],[-0.88171,45.18081],[-0.93438,45.18185],[-0.9328,45.24484],[-1.00163,45.24439],[-1.00247,45.30827],[-1.0524,45.31013],[-1.04828,45.36911],[-1.06412,45.36911],[-1.05039,45.18252],[-1.10761,44.80787],[-1.01514,44.80113],[-1.01946,44.76914],[-0.93365,44.76149],[-0.9404,44.7018],[-0.96035,44.56434],[-1.01408,44.56765],[-1.09916,44.1456],[-1.22689,44.14022],[-1.21853,44.03249],[-1.30762,44.029],[-1.39572,43.74301],[-1.31296,43.72951],[-1.37439,43.53109],[-1.34589,43.50606],[-1.59964,43.35423],[-1.76549,43.25548],[-1.79281,43.28038],[-1.80281,43.40425],[-1.72832,43.45033],[-1.58531,43.489],[-1.33584,44.22832],[-1.30744,44.41847],[-1.22511,45.44416],[-1.48685,46.06042],[-1.60176,46.17019],[-1.64442,46.22375],[-1.75643,46.42214],[-2.03483,46.61895],[-2.3466,46.62382],[-2.46561,46.71196],[-2.3233,46.83812],[-2.45286,46.93856],[-2.31733,47.16214],[-2.92848,47.28413],[-2.96742,47.22147],[-3.35602,47.32474],[-3.18803,47.48441],[-3.22791,47.61132],[-3.38912,47.59473],[-3.9162,47.67831],[-4.10163,47.70921],[-4.14314,47.78847],[-4.37619,47.71067],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.60147,48.11469],[-4.5921,48.14758],[-4.67101,48.2331],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.83515,48.54319],[-4.63117,48.66129],[-3.96692,48.77978],[-3.94939,48.74715],[-3.67013,48.89508],[-3.54444,48.90297],[-3.40954,48.91866],[-3.33344,48.90458],[-3.02769,48.9275],[-2.80207,48.79793],[-2.69353,48.76722],[-2.45786,48.70896],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.7243,48.75828],[-1.70557,48.84512],[-1.90304,48.86288],[-1.91027,48.92348],[-1.68714,48.93249],[-1.74277,49.24473],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.18545,49.54836],[-0.96463,49.42509],[-0.74429,49.36802],[-0.39014,49.3622],[-0.24976,49.3158],[-0.13342,49.31293],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.59712,51.17355],[2.66071,51.0196],[2.07124,50.92022],[2.05937,50.94709],[1.7976,50.89906],[1.68089,50.8717],[1.65569,50.59729],[1.75357,50.5932],[1.72295,50.24702],[1.82156,50.24262],[1.80149,50.05116],[1.54565,50.06311],[1.54155,50.01267],[1.42462,50.01747],[1.42667,50.05276],[1.03838,49.84609],[0.9827,49.88916],[0.57961,49.82133],[0.42063,49.76297],[0.4281,49.75445],[0.20831,49.67269],[0.14765,49.57767],[0.13461,49.5809],[0.11117,49.54365],[0.56598,49.52045],[0.5632,49.49989],[0.63001,49.49666],[0.61478,49.37441],[0.54825,49.37851],[0.54254,49.33461],[0.45741,49.33938],[0.45843,49.34492],[0.32597,49.35456],[0.32846,49.38128],[0.28011,49.38433],[0.27689,49.36334],[0.21095,49.36658],[0.20817,49.35084],[0.14326,49.35532],[0.13769,49.3115],[0.07204,49.31532],[0.0675,49.28713],[0.00274,49.29076],[0.00508,49.25711],[-0.02027,49.26036],[-0.03492,49.1973],[-0.19448,49.21463],[-0.38966,49.12726],[-0.45369,49.18792],[-0.3561,49.23214],[-0.82088,49.28331],[-0.99778,49.30149],[-1.16728,49.24545],[-1.19515,49.28183],[-1.26768,49.24099],[-1.34114,49.2975],[-1.24768,49.35025],[-1.44583,49.60689],[-1.81105,49.61757],[-1.77479,49.44333],[-1.72775,49.46509],[-1.5339,49.29098],[-1.47909,49.29233],[-1.47608,49.24027],[-1.43557,49.20326],[-1.47225,49.1822],[-1.45091,48.75725],[-1.31155,48.76408],[-1.30533,48.70216],[-1.2584,48.70421],[-1.25229,48.64353],[-1.23519,48.64435],[-1.2269,48.56824],[-1.85218,48.53086],[-1.84908,48.4975],[-1.92326,48.49187],[-1.92813,48.44096],[-2.04272,48.43601],[-2.03889,48.48191],[-2.2895,48.46102],[-2.3021,48.52433],[-2.40863,48.51618],[-2.42035,48.56954],[-2.43084,48.57852],[-2.49083,48.54924],[-2.47353,48.53326],[-2.54978,48.49647],[-2.54005,48.48747],[-2.70681,48.40746],[-3.02979,48.69115],[-4.01034,48.53179],[-4.05342,48.64412],[-4.38281,48.57349],[-4.35482,48.5118],[-4.38853,48.50473],[-4.13495,48.44868],[-4.16411,48.38936],[-4.01832,48.35685],[-4.04733,48.29918],[-3.98814,48.2867],[-4.0214,48.21606],[-4.03634,48.21958],[-4.06623,48.16028],[-4.16675,48.18247],[-4.18331,48.14934],[-4.17232,48.1065],[-4.20111,48.10285],[-4.18643,48.04389],[-4.18806,48.04061],[-4.35686,48.02305],[-4.25657,47.93997],[-4.23363,47.93497],[-4.21371,47.97598],[-4.21854,47.97726],[-4.1806,48.05569],[-3.6172,47.93124],[-2.17991,47.58642],[-2.25449,47.44501],[-2.30182,47.4568],[-2.32043,47.42092],[-2.30372,47.41755],[-2.34753,47.33499],[-2.36219,47.33837],[-2.38079,47.3039],[-2.35852,47.29854],[-2.29962,47.29784],[-2.29742,47.3618],[-2.13199,47.35852],[-2.13478,47.39107],[-2.01565,47.39623],[-2.01404,47.38095],[-1.92862,47.38254],[-1.92891,47.37956],[-1.8322,47.38184],[-1.82986,47.34165],[-1.73608,47.34304],[-1.73418,47.305],[-1.64084,47.30639],[-1.64011,47.29427],[-1.58355,47.29566],[-1.58531,47.33708],[-1.4612,47.33966],[-1.46003,47.32924],[-1.37211,47.33221],[-1.36054,47.11239],[-1.48567,47.11149],[-1.48582,47.11877],[-1.66897,47.11688],[-1.66971,47.12864],[-1.72553,47.12764],[-1.72612,47.13761],[-1.93975,47.13263],[-1.94019,47.1422],[-1.9925,47.14309],[-1.81066,47.00588],[-1.94723,46.92078],[-1.92891,46.90677],[-1.99529,46.86461],[-1.73652,46.66839],[-1.77535,46.64386],[-1.82678,46.64174],[-1.82473,46.62071],[-1.18192,46.39987],[-0.91261,46.3048],[-0.95481,46.2489],[-0.94235,46.24424],[-0.98385,46.18807]],[[3.14769,42.40072],[3.14949,42.40015],[3.15305,42.40052],[3.15804,42.40243],[3.1877,42.42805],[3.14227,42.5248],[3.06837,42.54635],[3.04884,42.6942],[3.0799,43.03073],[3.22641,43.18727],[3.40916,43.26032],[3.52104,43.25877],[3.66429,43.37628],[3.73841,43.39054],[4.00979,43.53607],[4.17692,43.45636],[4.54355,43.43349],[4.54943,43.35401],[4.83506,43.30891],[4.97506,43.38309],[5.03219,43.31928],[5.25919,43.31928],[5.31082,43.20504],[5.35682,43.18645],[5.36882,43.16785],[5.40232,43.16211],[5.41382,43.17123],[5.40919,43.19921],[5.54232,43.18827],[5.60582,43.14797],[5.6197,43.1529],[5.63832,43.17159],[5.67157,43.1674],[5.69095,43.13411],[5.77607,43.10637],[5.7762,43.09432],[5.75407,43.08328],[5.75707,43.0725],[5.77032,43.06465],[5.85933,43.03469],[5.8877,43.06273],[5.9567,43.06109],[5.96383,43.09277],[6.00033,43.09186],[6.01745,43.06849],[6.10233,43.07415],[6.10483,43.0526],[6.0666,43.04318],[6.06722,43.03785],[6.1427,43.00923],[6.15676,42.98715],[6.19635,42.97331],[6.22221,42.9801],[6.26891,42.99651],[6.25515,43.03627],[6.2019,43.02713],[6.18378,43.09188],[6.30153,43.09909],[6.32478,43.07974],[6.37778,43.08011],[6.38866,43.13395],[6.51341,43.14608],[6.57704,43.17881],[6.62291,43.14563],[6.69779,43.19969],[6.68016,43.23357],[6.72116,43.26007],[6.72241,43.27472],[6.67054,43.29192],[6.68741,43.33113],[6.72416,43.34267],[6.75291,43.409],[6.79104,43.39674],[6.90629,43.41672],[6.96767,43.50273],[6.96617,43.52812],[7.00617,43.53845],[7.03554,43.4982],[7.06892,43.5001],[7.09079,43.51642],[7.06267,43.53672],[7.08254,43.5456],[7.1238,43.53074],[7.1558,43.5437],[7.1433,43.62284],[7.16867,43.64636],[7.2138,43.63469],[7.25417,43.68497],[7.3403,43.66744],[7.36442,43.6894],[7.35305,43.7082],[7.4163,43.71091],[7.45405,43.74506],[7.4943,43.74524],[7.57943,43.78424],[7.60552,43.78603],[7.60368,43.78898],[7.59588,43.79528],[7.59628,43.79549],[7.53853,43.84195],[7.45996,43.79988],[7.44781,43.80934],[7.32353,43.74806],[7.30822,43.76357],[6.64878,43.3885],[6.66865,43.37178],[6.51003,43.27803],[6.56584,43.22509],[6.12681,43.10527],[5.48229,43.24939],[5.47267,43.2309],[5.41567,43.24657],[5.45267,43.3451],[4.80191,43.48158],[4.76416,43.39244],[4.65716,43.42368],[4.67228,43.45608],[4.43203,43.52419],[4.41453,43.49255],[4.16102,43.56433],[4.14452,43.57067],[4.14165,43.57393],[4.18677,43.59946],[4.10565,43.68196],[3.79689,43.52165],[3.77851,43.51313],[3.76464,43.50597],[3.76201,43.50334],[3.74226,43.49328],[3.71601,43.52075],[3.26213,43.28143],[3.24638,43.29735],[3.18388,43.28052],[3.10675,43.24083],[3.15475,43.19419],[2.90625,43.19383],[2.90675,42.76189],[2.94613,42.76208],[2.9465,42.61516],[2.99238,42.61497],[2.99238,42.5125],[3.041,42.51259],[3.04121,42.50093],[3.09086,42.50082],[3.14769,42.40072]],[[6.35945,43.02321],[6.42477,43.02444],[6.45244,43.03504],[6.46985,43.05461],[6.51121,43.05765],[6.52156,43.04318],[6.48364,43.02444],[6.47179,43.00725],[6.41178,42.9918],[6.39852,42.98048],[6.35178,42.99905],[6.35945,43.02321]]],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.98385,46.18807],[-0.89497,46.15628],[-0.93455,46.10163],[-0.84388,46.06949],[-0.88241,46.01637],[-0.53787,45.89558],[-0.63498,45.76444],[-0.86666,45.8479],[-0.76264,45.6245],[-0.69695,45.62659],[-0.69397,45.60184],[-0.68755,45.60174],[-0.688,45.50986],[-0.63799,45.50892],[-0.63978,45.44747],[-0.61574,45.44695],[-0.61619,45.38586],[-0.58544,45.38596],[-0.58529,45.32334],[-0.55379,45.32344],[-0.55275,45.19661],[-0.49094,45.19577],[-0.49184,45.13315],[-0.45661,45.13325],[-0.45512,45.07161],[-0.41611,45.07089],[-0.41621,45.02696],[-0.2907,44.98278],[-0.22,45.06771],[-0.12252,45.02563],[-0.18925,44.94591],[-0.09266,44.91019],[-0.14521,44.8392],[-0.15491,44.84238],[-0.19387,44.78678],[-0.43541,44.87317],[-0.39048,44.68413],[-0.58798,44.66014],[-0.66628,44.99129],[-0.77838,44.99263],[-0.77764,45.05389],[-0.81584,45.05321],[-0.81838,45.11962],[-0.88393,45.12051],[-0.88171,45.18081],[-0.93438,45.18185],[-0.9328,45.24484],[-1.00163,45.24439],[-1.00247,45.30827],[-1.0524,45.31013],[-1.04828,45.36911],[-1.06412,45.36911],[-1.05039,45.18252],[-1.10761,44.80787],[-1.01514,44.80113],[-1.01946,44.76914],[-0.93365,44.76149],[-0.9404,44.7018],[-0.96035,44.56434],[-1.01408,44.56765],[-1.09916,44.1456],[-1.22689,44.14022],[-1.21853,44.03249],[-1.30762,44.029],[-1.39572,43.74301],[-1.31296,43.72951],[-1.37439,43.53109],[-1.34589,43.50606],[-1.59964,43.35423],[-1.76549,43.25548],[-1.79281,43.28038],[-1.80281,43.40425],[-1.72832,43.45033],[-1.58531,43.489],[-1.33584,44.22832],[-1.30744,44.41847],[-1.22511,45.44416],[-1.48685,46.06042],[-1.60176,46.17019],[-1.64442,46.22375],[-1.75643,46.42214],[-2.03483,46.61895],[-2.3466,46.62382],[-2.46561,46.71196],[-2.3233,46.83812],[-2.45286,46.93856],[-2.31733,47.16214],[-2.92848,47.28413],[-2.96742,47.22147],[-3.35602,47.32474],[-3.18803,47.48441],[-3.22791,47.61132],[-3.38912,47.59473],[-3.9162,47.67831],[-4.10163,47.70921],[-4.14314,47.78847],[-4.37619,47.71067],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.60147,48.11469],[-4.5921,48.14758],[-4.67101,48.2331],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.83515,48.54319],[-4.63117,48.66129],[-3.96692,48.77978],[-3.94939,48.74715],[-3.67013,48.89508],[-3.54444,48.90297],[-3.40954,48.91866],[-3.33344,48.90458],[-3.02769,48.9275],[-2.80207,48.79793],[-2.69353,48.76722],[-2.45786,48.70896],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.7243,48.75828],[-1.70557,48.84512],[-1.90304,48.86288],[-1.91027,48.92348],[-1.68714,48.93249],[-1.74277,49.24473],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.18545,49.54836],[-0.96463,49.42509],[-0.74429,49.36802],[-0.39014,49.3622],[-0.24976,49.3158],[-0.13342,49.31293],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.59712,51.17355],[2.66071,51.0196],[2.07124,50.92022],[2.05937,50.94709],[1.7976,50.89906],[1.68089,50.8717],[1.65569,50.59729],[1.75357,50.5932],[1.72295,50.24702],[1.82156,50.24262],[1.80149,50.05116],[1.54565,50.06311],[1.54155,50.01267],[1.42462,50.01747],[1.42667,50.05276],[1.03838,49.84609],[0.9827,49.88916],[0.57961,49.82133],[0.42063,49.76297],[0.4281,49.75445],[0.20831,49.67269],[0.14765,49.57767],[0.13461,49.5809],[0.11117,49.54365],[0.56598,49.52045],[0.5632,49.49989],[0.63001,49.49666],[0.61478,49.37441],[0.54825,49.37851],[0.54254,49.33461],[0.45741,49.33938],[0.45843,49.34492],[0.32597,49.35456],[0.32846,49.38128],[0.28011,49.38433],[0.27689,49.36334],[0.21095,49.36658],[0.20817,49.35084],[0.14326,49.35532],[0.13769,49.3115],[0.07204,49.31532],[0.0675,49.28713],[0.00274,49.29076],[0.00508,49.25711],[-0.02027,49.26036],[-0.03492,49.1973],[-0.19448,49.21463],[-0.38966,49.12726],[-0.45369,49.18792],[-0.3561,49.23214],[-0.82088,49.28331],[-0.99778,49.30149],[-1.16728,49.24545],[-1.19515,49.28183],[-1.26768,49.24099],[-1.34114,49.2975],[-1.24768,49.35025],[-1.44583,49.60689],[-1.81105,49.61757],[-1.77479,49.44333],[-1.72775,49.46509],[-1.5339,49.29098],[-1.47909,49.29233],[-1.47608,49.24027],[-1.43557,49.20326],[-1.47225,49.1822],[-1.45091,48.75725],[-1.31155,48.76408],[-1.30533,48.70216],[-1.2584,48.70421],[-1.25229,48.64353],[-1.23519,48.64435],[-1.2269,48.56824],[-1.85218,48.53086],[-1.84908,48.4975],[-1.92326,48.49187],[-1.92813,48.44096],[-2.04272,48.43601],[-2.03889,48.48191],[-2.2895,48.46102],[-2.3021,48.52433],[-2.40863,48.51618],[-2.42035,48.56954],[-2.43084,48.57852],[-2.49083,48.54924],[-2.47353,48.53326],[-2.54978,48.49647],[-2.54005,48.48747],[-2.70681,48.40746],[-3.02979,48.69115],[-4.01034,48.53179],[-4.05342,48.64412],[-4.38281,48.57349],[-4.35482,48.5118],[-4.38853,48.50473],[-4.13495,48.44868],[-4.16411,48.38936],[-4.01832,48.35685],[-4.04733,48.29918],[-3.98814,48.2867],[-4.0214,48.21606],[-4.03634,48.21958],[-4.06623,48.16028],[-4.16675,48.18247],[-4.18331,48.14934],[-4.17232,48.1065],[-4.20111,48.10285],[-4.18643,48.04389],[-4.18806,48.04061],[-4.35686,48.02305],[-4.25657,47.93997],[-4.23363,47.93497],[-4.21371,47.97598],[-4.21854,47.97726],[-4.1806,48.05569],[-3.6172,47.93124],[-2.17991,47.58642],[-2.25449,47.44501],[-2.30182,47.4568],[-2.32043,47.42092],[-2.30372,47.41755],[-2.34753,47.33499],[-2.36219,47.33837],[-2.38079,47.3039],[-2.35852,47.29854],[-2.29962,47.29784],[-2.29742,47.3618],[-2.13199,47.35852],[-2.13478,47.39107],[-2.01565,47.39623],[-2.01404,47.38095],[-1.92862,47.38254],[-1.92891,47.37956],[-1.8322,47.38184],[-1.82986,47.34165],[-1.73608,47.34304],[-1.73418,47.305],[-1.64084,47.30639],[-1.64011,47.29427],[-1.58355,47.29566],[-1.58531,47.33708],[-1.4612,47.33966],[-1.46003,47.32924],[-1.37211,47.33221],[-1.36054,47.11239],[-1.48567,47.11149],[-1.48582,47.11877],[-1.66897,47.11688],[-1.66971,47.12864],[-1.72553,47.12764],[-1.72612,47.13761],[-1.93975,47.13263],[-1.94019,47.1422],[-1.9925,47.14309],[-1.81066,47.00588],[-1.94723,46.92078],[-1.92891,46.90677],[-1.99529,46.86461],[-1.73652,46.66839],[-1.77535,46.64386],[-1.82678,46.64174],[-1.82473,46.62071],[-1.18192,46.39987],[-0.91261,46.3048],[-0.95481,46.2489],[-0.94235,46.24424],[-0.98385,46.18807]],[[3.14769,42.40072],[3.14949,42.40015],[3.15305,42.40052],[3.15804,42.40243],[3.1877,42.42805],[3.14227,42.5248],[3.06837,42.54635],[3.04884,42.6942],[3.0799,43.03073],[3.22641,43.18727],[3.40916,43.26032],[3.52104,43.25877],[3.66429,43.37628],[3.73841,43.39054],[4.00979,43.53607],[4.17692,43.45636],[4.54355,43.43349],[4.54943,43.35401],[4.83506,43.30891],[4.97506,43.38309],[5.03219,43.31928],[5.25919,43.31928],[5.31082,43.20504],[5.35682,43.18645],[5.36882,43.16785],[5.40232,43.16211],[5.41382,43.17123],[5.40919,43.19921],[5.54232,43.18827],[5.60582,43.14797],[5.6197,43.1529],[5.63832,43.17159],[5.67157,43.1674],[5.69095,43.13411],[5.77607,43.10637],[5.7762,43.09432],[5.75407,43.08328],[5.75707,43.0725],[5.77032,43.06465],[5.85933,43.03469],[5.8877,43.06273],[5.9567,43.06109],[5.96383,43.09277],[6.00033,43.09186],[6.01745,43.06849],[6.10233,43.07415],[6.10483,43.0526],[6.0666,43.04318],[6.06722,43.03785],[6.1427,43.00923],[6.15676,42.98715],[6.19635,42.97331],[6.22221,42.9801],[6.26891,42.99651],[6.25515,43.03627],[6.2019,43.02713],[6.18378,43.09188],[6.30153,43.09909],[6.32478,43.07974],[6.37778,43.08011],[6.38866,43.13395],[6.51341,43.14608],[6.57704,43.17881],[6.62291,43.14563],[6.69779,43.19969],[6.68016,43.23357],[6.72116,43.26007],[6.72241,43.27472],[6.67054,43.29192],[6.68741,43.33113],[6.72416,43.34267],[6.75291,43.409],[6.79104,43.39674],[6.90629,43.41672],[6.96767,43.50273],[6.96617,43.52812],[7.00617,43.53845],[7.03554,43.4982],[7.06892,43.5001],[7.09079,43.51642],[7.06267,43.53672],[7.08254,43.5456],[7.1238,43.53074],[7.1558,43.5437],[7.1433,43.62284],[7.16867,43.64636],[7.2138,43.63469],[7.25417,43.68497],[7.3403,43.66744],[7.36442,43.6894],[7.35305,43.7082],[7.4163,43.71091],[7.45405,43.74506],[7.4943,43.74524],[7.57943,43.78424],[7.60552,43.78603],[7.60368,43.78898],[7.59588,43.79528],[7.59628,43.79549],[7.53853,43.84195],[7.45996,43.79988],[7.44781,43.80934],[7.32353,43.74806],[7.30822,43.76357],[6.64878,43.3885],[6.66865,43.37178],[6.51003,43.27803],[6.56584,43.22509],[6.12681,43.10527],[5.48229,43.24939],[5.47267,43.2309],[5.41567,43.24657],[5.45267,43.3451],[4.80191,43.48158],[4.76416,43.39244],[4.65716,43.42368],[4.67228,43.45608],[4.43203,43.52419],[4.41453,43.49255],[4.16102,43.56433],[4.14452,43.57067],[4.14165,43.57393],[4.18677,43.59946],[4.10565,43.68196],[3.79689,43.52165],[3.77851,43.51313],[3.76464,43.50597],[3.76201,43.50334],[3.74226,43.49328],[3.71601,43.52075],[3.26213,43.28143],[3.24638,43.29735],[3.18388,43.28052],[3.10675,43.24083],[3.15475,43.19419],[2.90625,43.19383],[2.90675,42.76189],[2.94613,42.76208],[2.9465,42.61516],[2.99238,42.61497],[2.99238,42.5125],[3.041,42.51259],[3.04121,42.50093],[3.09086,42.50082],[3.14769,42.40072]],[[6.35945,43.02321],[6.42477,43.02444],[6.45244,43.03504],[6.46985,43.05461],[6.51121,43.05765],[6.52156,43.04318],[6.48364,43.02444],[6.47179,43.00725],[6.41178,42.9918],[6.39852,42.98048],[6.35178,42.99905],[6.35945,43.02321]]],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.05001,49.82175],[6.04979,49.91166],[6.18901,49.91172],[6.18897,49.82181],[6.05001,49.82175]]],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:"Geoportal2-PL-aerial_image",name:"Geoportal 2: Orthophotomap (aerial image)",type:"wms",template:"http://mapy.geoportal.gov.pl/wss/service/img/guest/ORTO/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Raster&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}{header(User-Agent,Mozilla/5.0 (JOSM)}",projection:"EPSG:4326",scaleExtent:[0,23],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"http://geoportal.gov.pl/web/guest/regulamin",terms_text:"Główny Urząd Geodezji i Kartografii",best:true,icon:"https://wiki.openstreetmap.org/w/images/2/25/Geoportal-josm.png"},{id:"Geoportal2-PL-prng",name:"Geoportal 2: PRNG (geo names)",type:"wms",template:"http://mapy.geoportal.gov.pl/wss/service/pub/guest/G2_PRNG_WMS/MapServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=PozostaleObiektyFizjograficzne,Hydrografia,PozostaleMiejscowosci,Wies,UksztaltowanieTerenu&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}{header(User-Agent,Mozilla/5.0 (JOSM)}",projection:"EPSG:4326",polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"http://www.codgik.gov.pl/index.php/darmowe-dane/prng.html",terms_text:"Centralny Ośrodek Dokumentacji Geodezyjnej i Kartograficznej",icon:"https://wiki.openstreetmap.org/w/images/2/25/Geoportal-josm.png",overlay:true},{id:"Geoportal-PL-aerial_image",name:"Geoportal.gov.pl (Orthophotomap)",type:"tms",template:"https://wms.misek.pl/geoportal.orto/tms/{zoom}/{x}/{y}",scaleExtent:[6,24],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_text:"Copyright © Główny Urząd Geodezji i Kartografii.",best:true,icon:"https://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.78013,-9.92939],[-36.78087,-9.83892],[-36.87233,-9.83917],[-36.87173,-9.90542],[-36.87037,-9.92989],[-36.86156,-9.92994],[-36.85566,-9.92981],[-36.85146,-9.92973],[-36.84575,-9.92977],[-36.83213,-9.92967],[-36.81456,-9.9296],[-36.78013,-9.92939]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"Gliwice-buildings",name:"Gliwice: Buildings",type:"wms",template:"http://185.60.246.14:9090/isdp/gs/ows?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=default:EGIB_budynek,default:pkt_adr&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.57376,50.34828],[18.58723,50.35464],[18.58421,50.3601],[18.59264,50.37522],[18.65228,50.38297],[18.67384,50.37675],[18.67672,50.36174],[18.69218,50.34467],[18.70805,50.33799],[18.74154,50.3391],[18.75145,50.33046],[18.74679,50.31236],[18.75512,50.30193],[18.76358,50.29989],[18.76539,50.26873],[18.744,50.26541],[18.73482,50.25377],[18.72775,50.22843],[18.71439,50.22835],[18.71426,50.21978],[18.67522,50.21969],[18.67607,50.22562],[18.65098,50.23169],[18.6288,50.22539],[18.61744,50.24044],[18.62699,50.24369],[18.6315,50.25487],[18.61406,50.2576],[18.60319,50.25206],[18.56536,50.24763],[18.54841,50.2492],[18.55857,50.2826],[18.5459,50.29947],[18.52896,50.33687],[18.55118,50.35332],[18.57376,50.34828]]],terms_text:"Urząd Miasta Gliwice"},{id:"GRAFCAN-Canary_Islands",name:"GRAFCAN - Canary Islands",type:"wms",template:"https://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.92917,28.89106],[-18.03334,28.79981],[-18.03743,28.73178],[-17.87811,28.43224],[-17.83113,28.41787],[-17.72696,28.56328],[-17.73105,28.67982],[-17.68407,28.73715],[-17.75352,28.86781],[-17.85768,28.86065],[-17.92917,28.89106]],[[-18.07818,27.77211],[-18.13707,27.78751],[-18.17054,27.76441],[-18.1779,27.70695],[-18.15782,27.68799],[-18.0581,27.6791],[-18.00656,27.62574],[-17.96105,27.62218],[-17.93896,27.70814],[-17.90751,27.7194],[-17.86199,27.80468],[-17.8727,27.84079],[-17.92558,27.86801],[-18.00522,27.83605],[-18.01392,27.8035],[-18.07818,27.77211]],[[-17.26878,28.23996],[-17.33403,28.21933],[-17.36331,28.1537],[-17.36666,28.08803],[-17.33069,28.04742],[-17.27296,28.00681],[-17.20017,28.00533],[-17.14412,28.02896],[-17.07803,28.0836],[-17.08723,28.1537],[-17.1826,28.2149],[-17.26878,28.23996]],[[-16.9358,28.37623],[-16.945,28.33574],[-16.71995,27.98317],[-16.62541,27.98317],[-16.52753,28.01641],[-16.39953,28.14632],[-16.33594,28.30922],[-16.33009,28.36445],[-16.10253,28.52408],[-16.09834,28.5814],[-16.14268,28.62547],[-16.33929,28.59609],[-16.43801,28.53143],[-16.53924,28.44025],[-16.83959,28.41229],[-16.9358,28.37623]],[[-15.68833,28.20585],[-15.47395,28.16437],[-15.42427,28.21046],[-15.36283,28.17244],[-15.38375,28.05598],[-15.33146,27.98444],[-15.3576,27.8042],[-15.5916,27.69777],[-15.7001,27.73365],[-15.79944,27.80305],[-15.87134,27.92439],[-15.84781,28.03637],[-15.74716,28.08943],[-15.73147,28.18396],[-15.68833,28.20585]],[[-14.50882,28.13448],[-14.41078,28.13448],[-14.24868,28.24278],[-14.23822,28.34637],[-14.03953,28.73911],[-13.89442,28.78265],[-13.78592,28.77692],[-13.82122,28.38433],[-13.91534,28.19095],[-14.18593,28.13563],[-14.30881,28.00529],[-14.54019,28.05144],[-14.50882,28.13448]],[[-13.5525,29.37727],[-13.50868,29.36824],[-13.47955,29.38728],[-13.47543,29.40963],[-13.5003,29.42807],[-13.5505,29.40712],[-13.5525,29.37727]],[[-13.3976,29.16102],[-13.42814,29.12157],[-13.44174,28.99084],[-13.53899,28.91947],[-13.70841,28.88468],[-13.77116,28.80865],[-13.90083,28.83522],[-13.90711,28.88926],[-13.85796,28.93686],[-13.85691,29.03657],[-13.67599,29.14988],[-13.56723,29.15719],[-13.55428,29.35073],[-13.39988,29.21806],[-13.3976,29.16102]],[[-13.33792,29.28667],[-13.35035,29.27436],[-13.3386,29.26533],[-13.32617,29.27765],[-13.33792,29.28667]]],terms_text:"GRAFCAN OrtoExpress Urbana 2009"},{id:"GRAFCAN_Express-Canary_Islands",name:"GRAFCAN Express - Canary Islands",type:"wms",template:"https://idecan1.grafcan.es/ServicioWMS/OrtoExpress?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=ortoexpress&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-17.92917,28.89106],[-18.03334,28.79981],[-18.03743,28.73178],[-17.87811,28.43224],[-17.83113,28.41787],[-17.72696,28.56328],[-17.73105,28.67982],[-17.68407,28.73715],[-17.75352,28.86781],[-17.85768,28.86065],[-17.92917,28.89106]],[[-18.07818,27.77211],[-18.13707,27.78751],[-18.17054,27.76441],[-18.1779,27.70695],[-18.15782,27.68799],[-18.0581,27.6791],[-18.00656,27.62574],[-17.96105,27.62218],[-17.93896,27.70814],[-17.90751,27.7194],[-17.86199,27.80468],[-17.8727,27.84079],[-17.92558,27.86801],[-18.00522,27.83605],[-18.01392,27.8035],[-18.07818,27.77211]],[[-17.26878,28.23996],[-17.33403,28.21933],[-17.36331,28.1537],[-17.36666,28.08803],[-17.33069,28.04742],[-17.27296,28.00681],[-17.20017,28.00533],[-17.14412,28.02896],[-17.07803,28.0836],[-17.08723,28.1537],[-17.1826,28.2149],[-17.26878,28.23996]],[[-16.9358,28.37623],[-16.945,28.33574],[-16.71995,27.98317],[-16.62541,27.98317],[-16.52753,28.01641],[-16.39953,28.14632],[-16.33594,28.30922],[-16.33009,28.36445],[-16.10253,28.52408],[-16.09834,28.5814],[-16.14268,28.62547],[-16.33929,28.59609],[-16.43801,28.53143],[-16.53924,28.44025],[-16.83959,28.41229],[-16.9358,28.37623]],[[-15.68833,28.20585],[-15.47395,28.16437],[-15.42427,28.21046],[-15.36283,28.17244],[-15.38375,28.05598],[-15.33146,27.98444],[-15.3576,27.8042],[-15.5916,27.69777],[-15.7001,27.73365],[-15.79944,27.80305],[-15.87134,27.92439],[-15.84781,28.03637],[-15.74716,28.08943],[-15.73147,28.18396],[-15.68833,28.20585]],[[-14.50882,28.13448],[-14.41078,28.13448],[-14.24868,28.24278],[-14.23822,28.34637],[-14.03953,28.73911],[-13.89442,28.78265],[-13.78592,28.77692],[-13.82122,28.38433],[-13.91534,28.19095],[-14.18593,28.13563],[-14.30881,28.00529],[-14.54019,28.05144],[-14.50882,28.13448]],[[-13.5525,29.37727],[-13.50868,29.36824],[-13.47955,29.38728],[-13.47543,29.40963],[-13.5003,29.42807],[-13.5505,29.40712],[-13.5525,29.37727]],[[-13.3976,29.16102],[-13.42814,29.12157],[-13.44174,28.99084],[-13.53899,28.91947],[-13.70841,28.88468],[-13.77116,28.80865],[-13.90083,28.83522],[-13.90711,28.88926],[-13.85796,28.93686],[-13.85691,29.03657],[-13.67599,29.14988],[-13.56723,29.15719],[-13.55428,29.35073],[-13.39988,29.21806],[-13.3976,29.16102]],[[-13.33792,29.28667],[-13.35035,29.27436],[-13.3386,29.26533],[-13.32617,29.27765],[-13.33792,29.28667]]],terms_text:"GRAFCAN OrtoExpress"},{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.06066,48.60554],[6.29717,48.59923],[6.30611,48.74077],[6.06896,48.7471],[6.06066,48.60554]]],terms_url:"https://wiki.openstreetmap.org/wiki/Nancy/Orthophotographie",terms_text:"GrandNancy Orthophotographie 2012"},{id:"GURS-buildings",name:"GURS: Building outlines",type:"tms",template:"http://wms.openstreetmap.de/tms/GURS-building-outlines/{zoom}/{x}/{y}.png",scaleExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"http://egp.gu.gov.si/",terms_text:"CC-BY ©2018 Geodetska uprava Republike Slovenije (gu.gov.si).",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/GURSRoadlines.png",overlay:true},{id:"GURS-roads",name:"GURS: Road lines",type:"tms",template:"http://wms.openstreetmap.de/tms/GURS-road-lines/{zoom}/{x}/{y}.png",scaleExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"http://egp.gu.gov.si/",terms_text:"CC-BY ©2018 Geodetska uprava Republike Slovenije (gu.gov.si).",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/GURSRoadlines.png",overlay:true},{id:"hamburg-20cm",name:"Hamburg (20 cm)",type:"wms",template:"https://geodienste.hamburg.de/HH_WMS_DOP20?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.4826,53.9356],[8.48274,53.90924],[8.5275,53.90941],[8.52792,53.93577],[8.4826,53.9356]],[[9.77232,53.54352],[9.77434,53.55433],[9.76314,53.55521],[9.73047,53.55787],[9.73465,53.56536],[9.75793,53.61828],[9.77129,53.63131],[9.7707,53.61607],[9.79634,53.6103],[9.78993,53.60386],[9.81817,53.58591],[9.83773,53.59198],[9.84498,53.59498],[9.85416,53.59805],[9.86814,53.6093],[9.86931,53.61323],[9.88505,53.62199],[9.88697,53.6252],[9.89356,53.63026],[9.89637,53.63122],[9.89688,53.63492],[9.90678,53.65231],[9.93115,53.65262],[9.94552,53.65276],[9.95024,53.65085],[9.95155,53.65065],[9.97795,53.64887],[9.98492,53.6483],[9.98739,53.65072],[9.9996,53.68153],[10.02282,53.68157],[10.04338,53.68198],[10.05148,53.67759],[10.06925,53.67955],[10.0604,53.68833],[10.071,53.69585],[10.0707,53.70996],[10.08198,53.72044],[10.11908,53.71324],[10.16939,53.73896],[10.19369,53.731],[10.1779,53.70992],[10.15694,53.70451],[10.15829,53.68944],[10.14342,53.68057],[10.14176,53.67744],[10.14473,53.67613],[10.14643,53.67588],[10.14955,53.67545],[10.17153,53.66869],[10.19885,53.64675],[10.18973,53.63838],[10.22202,53.63349],[10.18887,53.61316],[10.19236,53.59474],[10.20117,53.58392],[10.15169,53.57619],[10.15067,53.56973],[10.148,53.5639],[10.15308,53.56242],[10.15942,53.56091],[10.15189,53.5417],[10.15465,53.53657],[10.16874,53.5374],[10.16327,53.52185],[10.16611,53.52013],[10.16919,53.51965],[10.18951,53.51148],[10.21043,53.51996],[10.21828,53.49923],[10.2367,53.49629],[10.25008,53.47898],[10.26592,53.47079],[10.29043,53.45512],[10.30962,53.44309],[10.31223,53.45229],[10.32514,53.44979],[10.30799,53.43332],[10.25598,53.41623],[10.25089,53.41024],[10.24578,53.40261],[10.24155,53.39797],[10.16555,53.39933],[10.14506,53.41614],[10.10949,53.42649],[10.1068,53.42658],[10.07581,53.45436],[10.05155,53.46394],[10.03517,53.4469],[10.01449,53.44203],[10.02294,53.43228],[9.99754,53.42546],[9.98243,53.41478],[9.97873,53.4142],[9.9581,53.42708],[9.92953,53.42007],[9.92552,53.41924],[9.90667,53.41596],[9.92305,53.43631],[9.91704,53.44664],[9.90436,53.45707],[9.89493,53.45583],[9.86885,53.44462],[9.86211,53.42942],[9.84872,53.44111],[9.80663,53.46648],[9.80021,53.47372],[9.8028,53.49383],[9.78203,53.49236],[9.76885,53.5053],[9.77107,53.52185],[9.78105,53.51838],[9.77352,53.52796],[9.77232,53.54352]]],terms_url:"https://www.hamburg.de/bsw/landesbetrieb-geoinformation-und-vermessung",terms_text:"Freie und Hansestadt Hamburg, Landesbetrieb Geoinformation und Vermessung"},{id:"Hamburg-DK5",name:"Hamburg (DK5)",type:"wms",template:"https://geodienste.hamburg.de/HH_WMS_DK5?FORMAT=image/png&TRANSPARENT=false&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4826,53.9356],[8.48274,53.90924],[8.5275,53.90941],[8.52792,53.93577],[8.4826,53.9356]],[[9.77232,53.54352],[9.77434,53.55433],[9.76314,53.55521],[9.73047,53.55787],[9.73465,53.56536],[9.75793,53.61828],[9.77129,53.63131],[9.7707,53.61607],[9.79634,53.6103],[9.78993,53.60386],[9.81817,53.58591],[9.83773,53.59198],[9.84498,53.59498],[9.85416,53.59805],[9.86814,53.6093],[9.86931,53.61323],[9.88505,53.62199],[9.88697,53.6252],[9.89356,53.63026],[9.89637,53.63122],[9.89688,53.63492],[9.90678,53.65231],[9.93115,53.65262],[9.94552,53.65276],[9.95024,53.65085],[9.95155,53.65065],[9.97795,53.64887],[9.98492,53.6483],[9.98739,53.65072],[9.9996,53.68153],[10.02282,53.68157],[10.04338,53.68198],[10.05148,53.67759],[10.06925,53.67955],[10.0604,53.68833],[10.071,53.69585],[10.0707,53.70996],[10.08198,53.72044],[10.11908,53.71324],[10.16939,53.73896],[10.19369,53.731],[10.1779,53.70992],[10.15694,53.70451],[10.15829,53.68944],[10.14342,53.68057],[10.14176,53.67744],[10.14473,53.67613],[10.14643,53.67588],[10.14955,53.67545],[10.17153,53.66869],[10.19885,53.64675],[10.18973,53.63838],[10.22202,53.63349],[10.18887,53.61316],[10.19236,53.59474],[10.20117,53.58392],[10.15169,53.57619],[10.15067,53.56973],[10.148,53.5639],[10.15308,53.56242],[10.15942,53.56091],[10.15189,53.5417],[10.15465,53.53657],[10.16874,53.5374],[10.16327,53.52185],[10.16611,53.52013],[10.16919,53.51965],[10.18951,53.51148],[10.21043,53.51996],[10.21828,53.49923],[10.2367,53.49629],[10.25008,53.47898],[10.26592,53.47079],[10.29043,53.45512],[10.30962,53.44309],[10.31223,53.45229],[10.32514,53.44979],[10.30799,53.43332],[10.25598,53.41623],[10.25089,53.41024],[10.24578,53.40261],[10.24155,53.39797],[10.16555,53.39933],[10.14506,53.41614],[10.10949,53.42649],[10.1068,53.42658],[10.07581,53.45436],[10.05155,53.46394],[10.03517,53.4469],[10.01449,53.44203],[10.02294,53.43228],[9.99754,53.42546],[9.98243,53.41478],[9.97873,53.4142],[9.9581,53.42708],[9.92953,53.42007],[9.92552,53.41924],[9.90667,53.41596],[9.92305,53.43631],[9.91704,53.44664],[9.90436,53.45707],[9.89493,53.45583],[9.86885,53.44462],[9.86211,53.42942],[9.84872,53.44111],[9.80663,53.46648],[9.80021,53.47372],[9.8028,53.49383],[9.78203,53.49236],[9.76885,53.5053],[9.77107,53.52185],[9.78105,53.51838],[9.77352,53.52796],[9.77232,53.54352]]],terms_url:"https://www.hamburg.de/bsw/landesbetrieb-geoinformation-und-vermessung",terms_text:"Freie und Hansestadt Hamburg, Landesbetrieb Geoinformation und Vermessung"},{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.31567,50.77809],[-1.49139,50.73027],[-1.57113,50.69041],[-1.68095,50.71748],[-1.69338,50.73484],[-1.69528,50.74065],[-1.68689,50.74999],[-1.71068,50.74812],[-1.7195,50.75261],[-1.746,50.74452],[-1.74845,50.75675],[-1.74287,50.76397],[-1.75101,50.77577],[-1.78525,50.76177],[-1.79911,50.77236],[-1.82256,50.77225],[-1.82678,50.78077],[-1.8225,50.79933],[-1.80732,50.80074],[-1.81566,50.80752],[-1.80889,50.81358],[-1.80579,50.83249],[-1.79816,50.83535],[-1.80649,50.84414],[-1.80988,50.86189],[-1.81378,50.85591],[-1.83052,50.85261],[-1.85271,50.85651],[-1.85655,50.86684],[-1.8492,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.82693,50.89939],[-1.82006,50.90492],[-1.82151,50.91691],[-1.81689,50.92412],[-1.84114,50.92886],[-1.87446,50.91441],[-1.91129,50.9439],[-1.92339,50.95917],[-1.95751,50.97575],[-1.9591,50.99152],[-1.94907,50.98649],[-1.92879,51.00055],[-1.88709,51.0026],[-1.87393,51.0097],[-1.8717,50.99083],[-1.85433,51.00786],[-1.83567,51.01238],[-1.81502,50.9899],[-1.80031,50.99457],[-1.75184,50.98133],[-1.71927,50.98047],[-1.69142,50.95943],[-1.66829,50.95041],[-1.6526,50.95029],[-1.63536,50.96269],[-1.62397,50.95903],[-1.6089,50.97686],[-1.62172,50.98099],[-1.63115,50.99984],[-1.60984,51.01225],[-1.60173,51.01042],[-1.60787,51.01582],[-1.6057,51.02271],[-1.63542,51.03176],[-1.63858,51.04126],[-1.63107,51.07819],[-1.64025,51.09201],[-1.6306,51.10359],[-1.63408,51.11099],[-1.63067,51.11652],[-1.64109,51.12237],[-1.66525,51.12546],[-1.65724,51.15539],[-1.67474,51.177],[-1.67213,51.18708],[-1.69679,51.20233],[-1.69247,51.21617],[-1.65288,51.22301],[-1.63564,51.22019],[-1.62395,51.24136],[-1.61402,51.24467],[-1.60741,51.25513],[-1.57717,51.25863],[-1.54443,51.24826],[-1.5384,51.25085],[-1.53436,51.25919],[-1.54345,51.25957],[-1.54007,51.27602],[-1.54596,51.28095],[-1.53591,51.28978],[-1.52595,51.28975],[-1.53093,51.29948],[-1.53008,51.3111],[-1.53628,51.31596],[-1.52986,51.34057],[-1.51552,51.34219],[-1.49498,51.33228],[-1.43599,51.33861],[-1.44759,51.3464],[-1.4463,51.35699],[-1.43056,51.35941],[-1.41608,51.37517],[-1.34899,51.37045],[-1.31472,51.37627],[-1.27555,51.3707],[-1.25116,51.37511],[-1.24118,51.36938],[-1.22209,51.37271],[-1.17602,51.36102],[-1.14321,51.36028],[-1.11875,51.36156],[-1.12096,51.36859],[-1.11678,51.3767],[-1.08363,51.38712],[-1.04754,51.36122],[-0.9904,51.36619],[-0.97264,51.36297],[-0.92376,51.36937],[-0.87681,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.81122,51.34418],[-0.78322,51.34084],[-0.76325,51.32721],[-0.76005,51.32013],[-0.74183,51.31112],[-0.72842,51.28238],[-0.72631,51.25653],[-0.73713,51.23126],[-0.74898,51.2277],[-0.77712,51.23901],[-0.80193,51.23628],[-0.80611,51.24056],[-0.82491,51.23137],[-0.82701,51.22315],[-0.84493,51.20998],[-0.82268,51.18268],[-0.83042,51.15022],[-0.81952,51.15047],[-0.80504,51.15847],[-0.79382,51.15491],[-0.78879,51.14141],[-0.77846,51.13664],[-0.77813,51.13063],[-0.76654,51.11946],[-0.74365,51.11491],[-0.74715,51.10131],[-0.75411,51.10116],[-0.75122,51.09547],[-0.75506,51.08987],[-0.75076,51.0852],[-0.7785,51.07715],[-0.78645,51.06467],[-0.79954,51.06078],[-0.82645,51.05881],[-0.83646,51.0664],[-0.84519,51.06052],[-0.8499,51.0436],[-0.89485,51.01978],[-0.89065,51.00194],[-0.90461,50.99327],[-0.91461,50.97806],[-0.91278,50.9708],[-0.93246,50.94278],[-0.92119,50.9232],[-0.93793,50.91615],[-0.95132,50.89178],[-0.92368,50.86513],[-0.92976,50.85365],[-0.92903,50.84245],[-0.94342,50.82191],[-0.9299,50.78445],[-0.93275,50.77435],[-0.95347,50.73682],[-1.31567,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.31567,50.77809],[-1.49139,50.73027],[-1.57113,50.69041],[-1.68095,50.71748],[-1.69338,50.73484],[-1.69528,50.74065],[-1.68689,50.74999],[-1.71068,50.74812],[-1.7195,50.75261],[-1.746,50.74452],[-1.74845,50.75675],[-1.74287,50.76397],[-1.75101,50.77577],[-1.78525,50.76177],[-1.79911,50.77236],[-1.82256,50.77225],[-1.82678,50.78077],[-1.8225,50.79933],[-1.80732,50.80074],[-1.81566,50.80752],[-1.80889,50.81358],[-1.80579,50.83249],[-1.79816,50.83535],[-1.80649,50.84414],[-1.80988,50.86189],[-1.81378,50.85591],[-1.83052,50.85261],[-1.85271,50.85651],[-1.85655,50.86684],[-1.8492,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.82693,50.89939],[-1.82006,50.90492],[-1.82151,50.91691],[-1.81689,50.92412],[-1.84114,50.92886],[-1.87446,50.91441],[-1.91129,50.9439],[-1.92339,50.95917],[-1.95751,50.97575],[-1.9591,50.99152],[-1.94907,50.98649],[-1.92879,51.00055],[-1.88709,51.0026],[-1.87393,51.0097],[-1.8717,50.99083],[-1.85433,51.00786],[-1.83567,51.01238],[-1.81502,50.9899],[-1.80031,50.99457],[-1.75184,50.98133],[-1.71927,50.98047],[-1.69142,50.95943],[-1.66829,50.95041],[-1.6526,50.95029],[-1.63536,50.96269],[-1.62397,50.95903],[-1.6089,50.97686],[-1.62172,50.98099],[-1.63115,50.99984],[-1.60984,51.01225],[-1.60173,51.01042],[-1.60787,51.01582],[-1.6057,51.02271],[-1.63542,51.03176],[-1.63858,51.04126],[-1.63107,51.07819],[-1.64025,51.09201],[-1.6306,51.10359],[-1.63408,51.11099],[-1.63067,51.11652],[-1.64109,51.12237],[-1.66525,51.12546],[-1.65724,51.15539],[-1.67474,51.177],[-1.67213,51.18708],[-1.69679,51.20233],[-1.69247,51.21617],[-1.65288,51.22301],[-1.63564,51.22019],[-1.62395,51.24136],[-1.61402,51.24467],[-1.60741,51.25513],[-1.57717,51.25863],[-1.54443,51.24826],[-1.5384,51.25085],[-1.53436,51.25919],[-1.54345,51.25957],[-1.54007,51.27602],[-1.54596,51.28095],[-1.53591,51.28978],[-1.52595,51.28975],[-1.53093,51.29948],[-1.53008,51.3111],[-1.53628,51.31596],[-1.52986,51.34057],[-1.51552,51.34219],[-1.49498,51.33228],[-1.43599,51.33861],[-1.44759,51.3464],[-1.4463,51.35699],[-1.43056,51.35941],[-1.41608,51.37517],[-1.34899,51.37045],[-1.31472,51.37627],[-1.27555,51.3707],[-1.25116,51.37511],[-1.24118,51.36938],[-1.22209,51.37271],[-1.17602,51.36102],[-1.14321,51.36028],[-1.11875,51.36156],[-1.12096,51.36859],[-1.11678,51.3767],[-1.08363,51.38712],[-1.04754,51.36122],[-0.9904,51.36619],[-0.97264,51.36297],[-0.92376,51.36937],[-0.87681,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.81122,51.34418],[-0.78322,51.34084],[-0.76325,51.32721],[-0.76005,51.32013],[-0.74183,51.31112],[-0.72842,51.28238],[-0.72631,51.25653],[-0.73713,51.23126],[-0.74898,51.2277],[-0.77712,51.23901],[-0.80193,51.23628],[-0.80611,51.24056],[-0.82491,51.23137],[-0.82701,51.22315],[-0.84493,51.20998],[-0.82268,51.18268],[-0.83042,51.15022],[-0.81952,51.15047],[-0.80504,51.15847],[-0.79382,51.15491],[-0.78879,51.14141],[-0.77846,51.13664],[-0.77813,51.13063],[-0.76654,51.11946],[-0.74365,51.11491],[-0.74715,51.10131],[-0.75411,51.10116],[-0.75122,51.09547],[-0.75506,51.08987],[-0.75076,51.0852],[-0.7785,51.07715],[-0.78645,51.06467],[-0.79954,51.06078],[-0.82645,51.05881],[-0.83646,51.0664],[-0.84519,51.06052],[-0.8499,51.0436],[-0.89485,51.01978],[-0.89065,51.00194],[-0.90461,50.99327],[-0.91461,50.97806],[-0.91278,50.9708],[-0.93246,50.94278],[-0.92119,50.9232],[-0.93793,50.91615],[-0.95132,50.89178],[-0.92368,50.86513],[-0.92976,50.85365],[-0.92903,50.84245],[-0.94342,50.82191],[-0.9299,50.78445],[-0.93275,50.77435],[-0.95347,50.73682],[-1.31567,50.77809]]]},{id:"hu-hillshade",name:"Hillshade Hungary",type:"tms",template:"https://{switch:a,b,c}.map.turistautak.hu/tiles/shading/{zoom}/{x}/{y}.png",scaleExtent:[0,18],polygon:[[[15,45],[24,45],[24,49],[15,49],[15,45]]],terms_text:"SRTM",overlay:true},{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:[[[-69.94793,-4.23168],[-69.45659,-1.49119],[-69.3973,-1.36508],[-69.42989,-1.22173],[-69.39523,-1.12555],[-69.44292,-1.03351],[-69.41861,-0.99827],[-69.528,-0.92514],[-69.52577,-0.86807],[-69.62491,-0.74667],[-69.56179,-0.63692],[-69.60783,-0.5008],[-69.8446,-0.33732],[-69.92054,-0.32573],[-70.04323,-0.18998],[-70.04302,0.56359],[-69.80272,0.57162],[-69.6711,0.66759],[-69.60529,0.61328],[-69.59701,0.6542],[-69.48002,0.73577],[-69.35277,0.61416],[-69.28914,0.64997],[-69.29484,0.60389],[-69.19975,0.60591],[-69.19425,0.64982],[-69.11563,0.64484],[-69.19001,0.74056],[-69.14881,0.76751],[-69.13576,0.87204],[-69.18846,0.91324],[-69.1646,0.94156],[-69.21679,0.97245],[-69.19773,0.99974],[-69.24494,1.05655],[-69.37641,1.08794],[-69.42312,1.04265],[-69.60989,1.09826],[-69.67718,1.06994],[-69.70963,1.11817],[-69.84266,1.07272],[-69.83972,1.71893],[-69.78236,1.69244],[-69.53464,1.77691],[-69.39109,1.72935],[-68.1645,1.72945],[-68.19207,1.7797],[-68.23954,1.77044],[-68.22688,1.82918],[-68.28555,1.83084],[-68.19583,2.03479],[-68.18033,1.9767],[-68.14417,1.97854],[-68.09043,1.89774],[-67.90162,1.81165],[-67.76942,2.00924],[-67.55095,2.04769],[-67.49519,2.16312],[-67.39404,2.22894],[-67.32672,2.06387],[-67.33083,1.94158],[-67.22831,1.84127],[-67.15384,1.8315],[-67.15922,1.67504],[-67.08017,1.38546],[-67.13923,1.32002],[-67.08675,1.16704],[-66.85119,1.22896],[-66.31032,0.74494],[-66.19737,0.78161],[-66.07783,0.76174],[-66.07024,0.8123],[-65.96712,0.81511],[-65.88369,0.94159],[-65.77261,0.95859],[-65.7421,1.00125],[-65.58894,1.00471],[-65.49624,0.87415],[-65.60623,0.70748],[-65.54116,0.64881],[-65.44499,0.68921],[-65.39213,0.75692],[-65.41198,0.82415],[-65.32734,0.93596],[-65.21302,0.90282],[-65.1749,0.94131],[-65.15831,1.1246],[-65.07232,1.15303],[-65.06317,1.11205],[-65.01361,1.10905],[-64.97445,1.20288],[-64.90439,1.25153],[-64.86966,1.22713],[-64.80053,1.31527],[-64.74446,1.22569],[-64.5789,1.34041],[-64.52608,1.44322],[-64.43586,1.47006],[-64.3939,1.52901],[-64.35111,1.52921],[-64.34777,1.49508],[-64.41019,1.40301],[-64.33791,1.36134],[-64.3136,1.45617],[-64.19707,1.52071],[-64.0735,1.64902],[-64.05781,1.92899],[-63.97219,1.99194],[-63.83555,1.96644],[-63.71155,2.04645],[-63.66501,2.01861],[-63.6268,2.11222],[-63.56474,2.13571],[-63.44059,2.126],[-63.36742,2.26864],[-63.37088,2.41121],[-63.42123,2.45102],[-63.46036,2.39684],[-63.56398,2.44573],[-63.76805,2.43994],[-63.84358,2.4916],[-64.01914,2.46135],[-64.0573,2.49752],[-63.98033,2.7237],[-64.07709,2.87262],[-64.07156,2.92142],[-64.12349,2.99048],[-64.15754,2.98243],[-64.14592,3.03459],[-64.22642,3.12356],[-64.19795,3.20121],[-64.2444,3.43036],[-64.17437,3.56841],[-64.281,3.70928],[-64.54357,3.85713],[-64.72239,4.11775],[-64.80203,4.17422],[-64.81123,4.27048],[-64.69522,4.25323],[-64.623,4.135],[-64.5565,4.10529],[-64.164,4.127],[-63.964,3.868],[-63.928,3.925],[-63.85,3.95],[-63.682,3.908],[-63.676,4.019],[-63.591,3.886],[-63.497,3.84],[-63.489,3.874],[-63.434,3.865],[-63.428,3.977],[-63.204,3.952],[-63.226,3.836],[-63.103,3.794],[-63.059,3.748],[-63.081,3.694],[-62.96,3.608],[-62.835,3.739],[-62.743,3.674],[-62.729,3.805],[-62.788,3.894],[-62.753,4.032],[-62.555,4.019],[-62.552,4.109],[-62.437,4.183],[-62.14308,4.07768],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.93175,4.12009],[-61.92213,4.16126],[-61.824,4.164],[-61.802,4.229],[-61.724,4.27],[-61.56,4.252],[-61.508,4.322],[-61.513,4.406],[-61.288,4.458],[-61.323,4.535],[-61.217,4.536],[-61.14559,4.48016],[-61.095,4.522],[-60.994,4.519],[-60.932,4.587],[-60.949,4.653],[-60.899,4.717],[-60.751,4.756],[-60.591,4.927],[-60.661,5.164],[-60.73197,5.21203],[-60.434,5.182],[-60.20825,5.28346],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.96984,5.06334],[-60.02524,4.7065],[-60.0705,4.61688],[-60.15725,4.57247],[-60.16114,4.51773],[-59.79503,4.46554],[-59.66948,4.37629],[-59.7319,4.28587],[-59.73069,4.18076],[-59.61818,4.13166],[-59.65406,4.06943],[-59.58417,3.96851],[-59.5153,3.94493],[-59.59279,3.88538],[-59.59631,3.79386],[-59.66555,3.78126],[-59.66842,3.70277],[-59.86728,3.57776],[-59.80205,3.50156],[-59.8408,3.43174],[-59.80488,3.35695],[-59.907,3.212],[-59.98944,2.88185],[-59.99,2.686],[-59.895,2.482],[-59.89872,2.36245],[-59.72315,2.27614],[-59.751,1.859],[-59.677,1.839],[-59.663,1.871],[-59.69,1.757],[-59.539,1.723],[-59.381,1.507],[-59.329,1.514],[-59.327,1.464],[-59.284,1.45],[-59.253,1.389],[-58.978,1.302],[-58.918,1.317],[-58.886,1.261],[-58.912,1.239],[-58.82512,1.17127],[-58.73956,1.1999],[-58.69456,1.29732],[-58.49622,1.26796],[-58.45787,1.37145],[-58.50511,1.40317],[-58.50873,1.46295],[-58.38559,1.46999],[-58.39472,1.52651],[-58.32237,1.59702],[-58.236,1.54669],[-58.16064,1.56011],[-58.12942,1.4989],[-58.00423,1.50303],[-57.99009,1.65844],[-57.85206,1.66782],[-57.77431,1.72973],[-57.70509,1.73093],[-57.65042,1.68237],[-57.5376,1.7005],[-57.50187,1.78609],[-57.43776,1.82681],[-57.43343,1.90598],[-57.36768,1.92372],[-57.36912,1.95638],[-57.30712,1.99665],[-57.22923,1.93759],[-57.08668,2.02644],[-57.01421,1.91489],[-56.91971,1.93036],[-56.79793,1.85336],[-56.72096,1.92582],[-56.62145,1.94588],[-56.57976,1.90588],[-56.45126,1.95614],[-56.24404,1.87808],[-56.1709,1.90048],[-56.11762,1.85097],[-55.95638,1.84509],[-55.90385,1.88803],[-55.93635,1.98647],[-55.9031,2.04108],[-56.00307,2.1676],[-56.05505,2.18464],[-56.04288,2.22778],[-56.13887,2.26574],[-56.09012,2.37228],[-56.02181,2.34247],[-55.97052,2.52931],[-55.76663,2.45524],[-55.71028,2.39917],[-55.49971,2.44324],[-55.38533,2.41836],[-55.32019,2.51537],[-55.23474,2.50338],[-55.1234,2.56762],[-55.10302,2.52564],[-54.95424,2.58359],[-54.86846,2.43989],[-54.68917,2.45389],[-54.68861,2.32472],[-54.54667,2.31833],[-54.53778,2.26556],[-54.46861,2.21306],[-54.24917,2.14667],[-54.18056,2.1725],[-54.11083,2.11222],[-54.06139,2.19167],[-53.94083,2.21917],[-53.93194,2.27194],[-53.88667,2.26778],[-53.745,2.37389],[-53.73389,2.31222],[-53.52972,2.24917],[-53.45861,2.2575],[-53.32833,2.35333],[-53.21667,2.25333],[-53.27899,2.18603],[-53.11861,2.2225],[-52.99472,2.17528],[-52.90972,2.19583],[-52.84722,2.28556],[-52.67528,2.37389],[-52.59444,2.47389],[-52.54028,2.57028],[-52.56417,2.63944],[-52.43944,2.87778],[-52.39583,2.90222],[-52.33187,3.16938],[-52.21472,3.26833],[-51.97104,3.70696],[-51.92148,3.72422],[-51.922,3.7792],[-51.79731,3.88888],[-51.77783,3.97406],[-51.65867,4.05276],[-51.61325,4.17437],[-51.63716,4.50834],[-51.49427,4.67426],[-51.11466,4.42286],[-50.94232,4.20165],[-50.85475,3.92491],[-50.85507,3.45573],[-50.75331,2.94057],[-50.29908,2.33079],[-49.73896,1.79143],[-48.23746,-0.07449],[-44.84728,-1.07246],[-43.54602,-2.04705],[-43.24389,-2.12403],[-42.78189,-2.33053],[-41.78084,-2.51859],[-41.5085,-2.68486],[-40.66365,-2.63829],[-40.50396,-2.57531],[-39.8907,-2.65328],[-39.15187,-3.04444],[-38.57151,-3.48047],[-38.34306,-3.54434],[-38.21421,-3.74103],[-38.12555,-3.80544],[-37.90182,-4.07265],[-37.77934,-4.18046],[-37.63401,-4.24454],[-37.51218,-4.41535],[-37.22122,-4.51045],[-37.07874,-4.71355],[-36.91716,-4.71372],[-36.62299,-4.85815],[-36.18969,-4.88505],[-35.93627,-4.83327],[-35.56471,-4.90758],[-35.33677,-4.99239],[-35.17659,-5.12497],[-34.79469,-6.33583],[-34.71587,-6.74615],[-34.62306,-6.90323],[-34.59953,-7.11133],[-34.64374,-7.98735],[-34.81497,-8.62472],[-35.0253,-9.13761],[-35.55848,-9.81261],[-35.69663,-9.90026],[-35.96401,-10.31281],[-36.06155,-10.37447],[-36.26639,-10.64593],[-36.61764,-10.81082],[-36.78725,-10.95151],[-36.99511,-11.29602],[-37.11368,-11.41261],[-37.46002,-12.10275],[-37.89668,-12.75844],[-38.22146,-13.09717],[-38.61146,-13.26537],[-38.85337,-14.65508],[-38.74388,-15.60089],[-38.66456,-15.74741],[-38.64697,-15.88327],[-38.8013,-16.24838],[-38.92933,-16.80775],[-38.53193,-17.80026],[-38.49171,-18.0046],[-38.53661,-18.09683],[-38.67053,-18.16855],[-39.35288,-18.10892],[-39.4675,-18.30359],[-39.54529,-18.78548],[-39.49227,-19.40134],[-39.63477,-19.74403],[-39.86353,-19.88681],[-40.17827,-20.75426],[-40.81442,-21.67672],[-40.76948,-21.87786],[-40.81442,-22.09702],[-41.5086,-22.52638],[-41.59666,-22.83627],[-41.79292,-23.08823],[-41.91484,-23.18527],[-43.19603,-23.26703],[-44.07735,-23.40501],[-45.13508,-24.12014],[-46.61368,-24.67512],[-47.85376,-25.47012],[-48.2801,-26.23036],[-48.34897,-26.75081],[-48.11076,-27.28208],[-48.21148,-27.85592],[-48.40713,-28.43255],[-48.68615,-28.76016],[-48.9156,-28.86305],[-49.1579,-29.02871],[-49.52748,-29.42005],[-49.82565,-29.86559],[-50.17344,-30.64282],[-50.60441,-31.24135],[-51.18785,-31.77646],[-51.74211,-32.10539],[-51.89236,-32.29596],[-52.06117,-32.38504],[-52.27087,-32.92102],[-52.45986,-33.25369],[-52.61505,-33.42291],[-53.18109,-33.86891],[-53.43053,-33.73947],[-53.43951,-33.69347],[-53.53228,-33.6888],[-53.51819,-33.15342],[-53.44438,-33.05296],[-53.24468,-32.93489],[-53.31008,-32.91875],[-53.29454,-32.89931],[-53.18496,-32.85043],[-53.14569,-32.79202],[-53.0858,-32.78835],[-53.07558,-32.74088],[-53.24992,-32.6041],[-53.39137,-32.58573],[-53.46423,-32.48446],[-53.58321,-32.45192],[-53.74599,-32.07848],[-53.83375,-32.05524],[-53.84978,-32.00064],[-53.96073,-31.95532],[-53.96972,-31.91765],[-54.10019,-31.92825],[-54.4549,-31.65295],[-54.4528,-31.59959],[-54.58676,-31.45656],[-54.8367,-31.442],[-54.88623,-31.3773],[-54.94087,-31.38068],[-55.00723,-31.26692],[-55.07446,-31.33216],[-55.24003,-31.26062],[-55.29118,-31.14226],[-55.34037,-31.13144],[-55.34981,-31.03922],[-55.42306,-31.01823],[-55.57742,-30.83309],[-55.65834,-30.864],[-55.66621,-30.95395],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.00989,-31.08267],[-56.02241,-30.78565],[-56.12508,-30.73871],[-56.17074,-30.61517],[-56.26095,-30.58509],[-56.29193,-30.51967],[-56.38177,-30.49956],[-56.46126,-30.38486],[-56.54706,-30.35946],[-56.54115,-30.31291],[-56.6187,-30.30054],[-56.64628,-30.20346],[-56.77662,-30.1633],[-56.80777,-30.10301],[-57.07113,-30.08671],[-57.22081,-30.28928],[-57.31303,-30.25785],[-57.39229,-30.30474],[-57.46574,-30.26589],[-57.52431,-30.28569],[-57.56087,-30.21134],[-57.64744,-30.19483],[-57.48047,-30.12315],[-57.33713,-29.99284],[-57.294,-29.831],[-57.121,-29.765],[-56.89888,-29.53179],[-56.81905,-29.48816],[-56.76618,-29.37768],[-56.70164,-29.35913],[-56.59315,-29.12516],[-56.418,-29.075],[-56.40775,-28.9748],[-56.29995,-28.89614],[-56.29652,-28.8027],[-56.17858,-28.75922],[-56.00984,-28.60718],[-56.01249,-28.50873],[-55.88357,-28.47923],[-55.87739,-28.36159],[-55.75157,-28.37095],[-55.69433,-28.42204],[-55.67047,-28.33218],[-55.77415,-28.27414],[-55.7757,-28.24481],[-55.63167,-28.17719],[-55.60747,-28.11604],[-55.55957,-28.16523],[-55.4952,-28.07682],[-55.44611,-28.09787],[-55.368,-28.029],[-55.38299,-27.97948],[-55.343,-27.972],[-55.32706,-27.92664],[-55.26574,-27.92969],[-55.196,-27.856],[-55.133,-27.897],[-55.106,-27.846],[-55.035,-27.858],[-55.081,-27.779],[-54.936,-27.772],[-54.90617,-27.63871],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.67926,-27.57394],[-54.67709,-27.508],[-54.621,-27.541],[-54.574,-27.453],[-54.5246,-27.5059],[-54.444,-27.472],[-54.47081,-27.42674],[-54.41,-27.405],[-54.35466,-27.46528],[-54.34067,-27.40311],[-54.28484,-27.44819],[-54.261,-27.397],[-54.21736,-27.38603],[-54.172,-27.254],[-54.15619,-27.29619],[-54.08872,-27.30149],[-54.01026,-27.19978],[-53.96219,-27.19698],[-53.95195,-27.15169],[-53.79879,-27.14629],[-53.80233,-27.04028],[-53.76087,-27.06543],[-53.78585,-27.02674],[-53.7473,-27.03218],[-53.7092,-26.93414],[-53.67125,-26.94222],[-53.69684,-26.86015],[-53.66059,-26.85814],[-53.75814,-26.72045],[-53.7205,-26.65099],[-53.75864,-26.64113],[-53.63739,-26.24968],[-53.742,-26.108],[-53.73409,-26.04333],[-53.83619,-25.97166],[-53.82214,-25.79377],[-53.89113,-25.62286],[-53.94895,-25.6117],[-53.95638,-25.64628],[-54.01,-25.567],[-54.07592,-25.55766],[-54.098,-25.619],[-54.099,-25.495],[-54.206,-25.541],[-54.178,-25.584],[-54.23,-25.562],[-54.25,-25.597],[-54.28,-25.556],[-54.38395,-25.59747],[-54.43288,-25.69756],[-54.4927,-25.6181],[-54.59354,-25.59275],[-54.61941,-25.45312],[-54.4295,-25.15915],[-54.43548,-24.94769],[-54.32437,-24.66059],[-54.32714,-24.47073],[-54.25877,-24.36377],[-54.34537,-24.14705],[-54.28223,-24.07336],[-54.43984,-23.90446],[-54.66978,-23.81262],[-54.70533,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.06223,-23.99335],[-55.107,-23.961],[-55.22907,-24.01383],[-55.30415,-23.96504],[-55.34542,-23.99458],[-55.41423,-23.9645],[-55.44167,-23.70084],[-55.47306,-23.64834],[-55.53989,-23.625],[-55.52356,-23.19733],[-55.54199,-23.1561],[-55.59635,-23.14993],[-55.66578,-22.85274],[-55.61432,-22.65521],[-55.72364,-22.55166],[-55.74302,-22.39266],[-55.78939,-22.3846],[-55.84304,-22.28725],[-56.20983,-22.27805],[-56.36485,-22.16949],[-56.39404,-22.07434],[-56.50711,-22.09561],[-56.63705,-22.26341],[-56.70344,-22.21693],[-56.72026,-22.26479],[-56.79344,-22.24238],[-56.84285,-22.30155],[-56.88343,-22.24755],[-56.9967,-22.22246],[-57.3744,-22.23204],[-57.5804,-22.17534],[-57.6106,-22.09462],[-57.70751,-22.09111],[-57.80183,-22.15072],[-57.99384,-22.09023],[-58.00946,-22.04038],[-57.91281,-21.88266],[-57.96603,-21.85045],[-57.90866,-21.77355],[-57.94714,-21.74413],[-57.88329,-21.68903],[-57.93436,-21.65037],[-57.91387,-21.59021],[-57.96795,-21.52432],[-57.8535,-21.33109],[-57.92019,-21.27655],[-57.85066,-21.22407],[-57.86834,-21.04417],[-57.81919,-20.94066],[-57.92836,-20.90036],[-57.8552,-20.83403],[-57.89863,-20.78872],[-57.96183,-20.7916],[-57.93478,-20.74565],[-57.86732,-20.73265],[-57.92414,-20.66392],[-57.98848,-20.69879],[-57.99847,-20.43551],[-58.09339,-20.35554],[-58.09596,-20.25445],[-58.16216,-20.25953],[-58.12152,-20.19246],[-58.16932,-20.1694],[-57.95347,-20.02094],[-57.90248,-20.04207],[-57.85796,-19.9703],[-58.131,-19.758],[-57.784,-19.033],[-57.694,-19.011],[-57.719,-18.899],[-57.766,-18.899],[-57.557,-18.24],[-57.453,-18.231],[-57.574,-18.131],[-57.72302,-17.83074],[-57.68472,-17.8306],[-57.70991,-17.72702],[-57.783,-17.639],[-57.73696,-17.5583],[-57.883,-17.449],[-57.996,-17.515],[-58.06,-17.45],[-58.116,-17.451],[-58.151,-17.384],[-58.263,-17.344],[-58.396,-17.181],[-58.423,-16.989],[-58.474,-16.935],[-58.47,-16.703],[-58.436,-16.592],[-58.333,-16.49],[-58.32227,-16.26559],[-58.388,-16.261],[-58.43059,-16.32264],[-60.17335,-16.26672],[-60.238,-15.473],[-60.57543,-15.09677],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.38066,-13.9888],[-60.45062,-13.9364],[-60.45599,-13.85422],[-60.49068,-13.85782],[-60.46776,-13.79446],[-60.76755,-13.68329],[-60.87678,-13.62149],[-60.91857,-13.54334],[-61.0056,-13.552],[-61.0129,-13.48925],[-61.0938,-13.49081],[-61.10314,-13.53056],[-61.18155,-13.50557],[-61.19236,-13.53695],[-61.29954,-13.47718],[-61.46527,-13.55427],[-61.57927,-13.48711],[-61.852,-13.538],[-61.892,-13.431],[-61.96968,-13.40759],[-61.97592,-13.36695],[-62.11498,-13.25932],[-62.115,-13.163],[-62.15254,-13.15993],[-62.16703,-13.11346],[-62.19,-13.153],[-62.214,-13.111],[-62.27269,-13.15687],[-62.39178,-13.13471],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.89672,-12.8539],[-63.01134,-12.83602],[-63.08186,-12.72323],[-63.06163,-12.68584],[-63.15726,-12.6138],[-63.24621,-12.66222],[-63.23713,-12.69043],[-63.30125,-12.68138],[-63.44052,-12.608],[-63.43627,-12.56526],[-63.50641,-12.56562],[-63.55295,-12.50598],[-63.7848,-12.42871],[-63.88957,-12.44745],[-63.89949,-12.50204],[-63.95144,-12.53179],[-64.13464,-12.47732],[-64.16781,-12.51503],[-64.17504,-12.46675],[-64.22945,-12.45419],[-64.29018,-12.50313],[-64.29452,-12.4582],[-64.41057,-12.44436],[-64.51217,-12.3551],[-64.51256,-12.22562],[-64.70406,-12.1827],[-64.70719,-12.08684],[-64.75486,-12.15762],[-64.7688,-12.09356],[-64.83747,-12.11786],[-64.80954,-12.05633],[-64.84077,-12.01027],[-65.03548,-11.99408],[-65.01398,-11.90303],[-65.0727,-11.86587],[-65.08672,-11.7082],[-65.18953,-11.72353],[-65.18216,-11.75609],[-65.2593,-11.71053],[-65.21178,-11.52857],[-65.3074,-11.49957],[-65.33276,-11.33986],[-65.29053,-11.32275],[-65.34347,-11.3082],[-65.35834,-11.26834],[-65.35938,-11.22067],[-65.31294,-11.19578],[-65.35387,-11.18419],[-65.36177,-11.14031],[-65.28269,-11.09009],[-65.30071,-11.03142],[-65.25053,-10.98506],[-65.27476,-10.87302],[-65.35376,-10.78881],[-65.34667,-10.68155],[-65.40569,-10.63935],[-65.43011,-10.48505],[-65.288,-10.219],[-65.333,-9.965],[-65.28588,-9.84413],[-65.39313,-9.68683],[-65.44394,-9.66957],[-65.4883,-9.71015],[-65.55611,-9.84498],[-65.627,-9.83804],[-65.66963,-9.78129],[-65.71023,-9.80857],[-65.68395,-9.74992],[-65.7432,-9.78296],[-65.77013,-9.73442],[-65.79437,-9.79295],[-65.79962,-9.75663],[-65.86532,-9.79533],[-65.87184,-9.75307],[-65.91976,-9.75314],[-65.98222,-9.81011],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.61995,-9.89353],[-66.63701,-9.94983],[-66.8751,-10.08268],[-66.9528,-10.18886],[-66.99683,-10.20017],[-67.01537,-10.25919],[-67.17745,-10.33923],[-67.31545,-10.31932],[-67.31155,-10.37716],[-67.40717,-10.37386],[-67.44361,-10.45492],[-67.57925,-10.5028],[-67.64028,-10.59807],[-67.67631,-10.60484],[-67.70825,-10.71083],[-67.86386,-10.64067],[-68.03289,-10.65486],[-68.10456,-10.71426],[-68.10333,-10.77541],[-68.27819,-10.98926],[-68.71576,-11.14483],[-68.75767,-11.00079],[-68.9118,-11.02192],[-69.41453,-10.92575],[-69.73653,-10.97445],[-69.76903,-10.92972],[-69.93442,-10.9219],[-70.15869,-11.04096],[-70.30672,-11.06983],[-70.43675,-11.03923],[-70.53033,-10.93465],[-70.62103,-10.99982],[-70.62338,-9.82054],[-70.53663,-9.76584],[-70.59972,-9.56264],[-70.55282,-9.57093],[-70.56894,-9.53127],[-70.50506,-9.50557],[-70.49665,-9.42489],[-70.59581,-9.4425],[-70.6632,-9.52601],[-70.75067,-9.56043],[-70.79332,-9.63846],[-70.96337,-9.74891],[-70.99391,-9.81721],[-71.13974,-9.85702],[-71.22052,-9.96968],[-72.1804,-9.99967],[-72.15136,-9.79742],[-72.26296,-9.75085],[-72.25282,-9.61633],[-72.28821,-9.60316],[-72.2829,-9.53995],[-72.35688,-9.4946],[-72.51954,-9.49128],[-72.71676,-9.4122],[-73.2038,-9.40715],[-73.07352,-9.23461],[-73.0093,-9.22236],[-73.02612,-9.17786],[-72.9582,-9.14302],[-72.94091,-8.98494],[-72.99931,-8.91778],[-73.05901,-8.90561],[-73.14992,-8.6839],[-73.20907,-8.6857],[-73.28745,-8.61948],[-73.3055,-8.47197],[-73.38956,-8.46878],[-73.41286,-8.41099],[-73.53744,-8.34587],[-73.62739,-8.02187],[-73.73175,-7.9684],[-73.7725,-7.90237],[-73.76164,-7.85803],[-73.69706,-7.86527],[-73.6843,-7.77644],[-73.82217,-7.71788],[-73.99094,-7.53635],[-73.948,-7.52661],[-73.91981,-7.46568],[-73.96394,-7.34764],[-73.87014,-7.37882],[-73.7003,-7.30429],[-73.79842,-7.11306],[-73.71046,-6.84019],[-73.53639,-6.6834],[-73.39115,-6.64193],[-73.35281,-6.59327],[-73.22741,-6.58884],[-73.18797,-6.52302],[-73.13523,-6.51046],[-73.10473,-6.40666],[-73.24664,-6.14963],[-73.23821,-6.04399],[-73.1868,-6.00512],[-73.15207,-5.86796],[-73.05303,-5.79517],[-72.95912,-5.65689],[-72.95888,-5.46613],[-72.86052,-5.27117],[-72.88725,-5.16307],[-72.73986,-5.08859],[-72.72765,-5.05199],[-72.6212,-5.0518],[-72.598,-4.98386],[-72.38202,-4.87296],[-72.36895,-4.80387],[-72.12601,-4.73454],[-72.04335,-4.62384],[-72.00689,-4.64622],[-71.99464,-4.60996],[-71.94743,-4.60877],[-71.91909,-4.5298],[-71.88549,-4.53803],[-71.9073,-4.51644],[-71.76637,-4.50446],[-71.75109,-4.46887],[-71.70817,-4.51165],[-71.65479,-4.47246],[-71.65032,-4.50395],[-71.61548,-4.4687],[-71.6335,-4.51524],[-71.59625,-4.52928],[-71.53703,-4.46442],[-71.49428,-4.48701],[-71.50716,-4.43909],[-71.43438,-4.42882],[-71.42562,-4.47058],[-71.35026,-4.42728],[-71.30752,-4.46288],[-71.32091,-4.42009],[-71.27782,-4.44217],[-71.26975,-4.385],[-71.20263,-4.37987],[-71.19422,-4.42471],[-71.14478,-4.38158],[-71.11491,-4.41119],[-71.10616,-4.37764],[-70.99389,-4.38654],[-70.99595,-4.34632],[-70.9357,-4.38432],[-70.84483,-4.27905],[-70.86447,-4.25245],[-70.81677,-4.23005],[-70.8458,-4.21872],[-70.75901,-4.15944],[-70.68147,-4.20791],[-70.64256,-4.12805],[-70.62521,-4.19151],[-70.56118,-4.1775],[-70.57357,-4.21169],[-70.54796,-4.13671],[-70.51036,-4.14824],[-70.50417,-4.20098],[-70.48535,-4.16132],[-70.43435,-4.16266],[-70.43146,-4.13217],[-70.33892,-4.17997],[-70.32281,-4.14206],[-70.28769,-4.16555],[-70.29141,-4.28709],[-70.21457,-4.29749],[-70.19194,-4.36179],[-70.15508,-4.27308],[-70.11749,-4.28585],[-70.10881,-4.25454],[-70.04189,-4.29409],[-70.07948,-4.31428],[-70.02826,-4.3703],[-69.99182,-4.37482],[-69.94793,-4.23168]],[[-34.00035,-3.76654],[-34.01797,-3.84985],[-34.00664,-3.91809],[-33.98608,-3.95952],[-33.95923,-3.99217],[-33.8921,-4.03653],[-33.81658,-4.05077],[-33.72931,-4.03151],[-33.66638,-3.9838],[-33.62736,-3.9185],[-33.61519,-3.84985],[-33.63239,-3.76864],[-33.68693,-3.69537],[-33.74987,-3.65978],[-33.81658,-3.6489],[-33.89336,-3.66397],[-33.96007,-3.70877],[-34.00035,-3.76654]],[[-32.5538,-4.00884],[-32.59937,-3.9531],[-32.64061,-3.87309],[-32.61755,-3.73712],[-32.58338,-3.70527],[-32.54228,-3.65606],[-32.4592,-3.63029],[-32.35174,-3.63887],[-32.30049,-3.67684],[-32.24749,-3.75266],[-32.23155,-3.81889],[-32.2357,-3.90247],[-32.30194,-3.9883],[-32.42898,-4.0384],[-32.5538,-4.00884]],[[-29.50321,0.79391],[-29.54097,0.8689],[-29.54727,0.92553],[-29.52367,0.99422],[-29.48958,1.06134],[-29.43136,1.10224],[-29.35899,1.1206],[-29.29238,1.11378],[-29.22158,1.0776],[-29.16285,1.00314],[-29.14501,0.92605],[-29.14764,0.88358],[-29.17176,0.8196],[-29.24885,0.74357],[-29.29448,0.72521],[-29.36371,0.71892],[-29.43556,0.73937],[-29.50321,0.79391]],[[-29.09537,-20.42649],[-29.19756,-20.33509],[-29.3343,-20.28932],[-29.46741,-20.3288],[-29.54604,-20.42958],[-29.55396,-20.52706],[-29.51696,-20.62613],[-29.40995,-20.68955],[-29.27599,-20.72578],[-29.15968,-20.66209],[-29.07188,-20.57088],[-28.9712,-20.64769],[-28.83286,-20.69814],[-28.67968,-20.62099],[-28.63549,-20.49284],[-28.63412,-20.47146],[-28.7431,-20.30094],[-28.8683,-20.27288],[-29.0031,-20.32416],[-29.09537,-20.42649]]],terms_text:"IBGE",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/IBGE_Setores_Rurais.png"},{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:[[[-69.94793,-4.23168],[-69.45659,-1.49119],[-69.3973,-1.36508],[-69.42989,-1.22173],[-69.39523,-1.12555],[-69.44292,-1.03351],[-69.41861,-0.99827],[-69.528,-0.92514],[-69.52577,-0.86807],[-69.62491,-0.74667],[-69.56179,-0.63692],[-69.60783,-0.5008],[-69.8446,-0.33732],[-69.92054,-0.32573],[-70.04323,-0.18998],[-70.04302,0.56359],[-69.80272,0.57162],[-69.6711,0.66759],[-69.60529,0.61328],[-69.59701,0.6542],[-69.48002,0.73577],[-69.35277,0.61416],[-69.28914,0.64997],[-69.29484,0.60389],[-69.19975,0.60591],[-69.19425,0.64982],[-69.11563,0.64484],[-69.19001,0.74056],[-69.14881,0.76751],[-69.13576,0.87204],[-69.18846,0.91324],[-69.1646,0.94156],[-69.21679,0.97245],[-69.19773,0.99974],[-69.24494,1.05655],[-69.37641,1.08794],[-69.42312,1.04265],[-69.60989,1.09826],[-69.67718,1.06994],[-69.70963,1.11817],[-69.84266,1.07272],[-69.83972,1.71893],[-69.78236,1.69244],[-69.53464,1.77691],[-69.39109,1.72935],[-68.1645,1.72945],[-68.19207,1.7797],[-68.23954,1.77044],[-68.22688,1.82918],[-68.28555,1.83084],[-68.19583,2.03479],[-68.18033,1.9767],[-68.14417,1.97854],[-68.09043,1.89774],[-67.90162,1.81165],[-67.76942,2.00924],[-67.55095,2.04769],[-67.49519,2.16312],[-67.39404,2.22894],[-67.32672,2.06387],[-67.33083,1.94158],[-67.22831,1.84127],[-67.15384,1.8315],[-67.15922,1.67504],[-67.08017,1.38546],[-67.13923,1.32002],[-67.08675,1.16704],[-66.85119,1.22896],[-66.31032,0.74494],[-66.19737,0.78161],[-66.07783,0.76174],[-66.07024,0.8123],[-65.96712,0.81511],[-65.88369,0.94159],[-65.77261,0.95859],[-65.7421,1.00125],[-65.58894,1.00471],[-65.49624,0.87415],[-65.60623,0.70748],[-65.54116,0.64881],[-65.44499,0.68921],[-65.39213,0.75692],[-65.41198,0.82415],[-65.32734,0.93596],[-65.21302,0.90282],[-65.1749,0.94131],[-65.15831,1.1246],[-65.07232,1.15303],[-65.06317,1.11205],[-65.01361,1.10905],[-64.97445,1.20288],[-64.90439,1.25153],[-64.86966,1.22713],[-64.80053,1.31527],[-64.74446,1.22569],[-64.5789,1.34041],[-64.52608,1.44322],[-64.43586,1.47006],[-64.3939,1.52901],[-64.35111,1.52921],[-64.34777,1.49508],[-64.41019,1.40301],[-64.33791,1.36134],[-64.3136,1.45617],[-64.19707,1.52071],[-64.0735,1.64902],[-64.05781,1.92899],[-63.97219,1.99194],[-63.83555,1.96644],[-63.71155,2.04645],[-63.66501,2.01861],[-63.6268,2.11222],[-63.56474,2.13571],[-63.44059,2.126],[-63.36742,2.26864],[-63.37088,2.41121],[-63.42123,2.45102],[-63.46036,2.39684],[-63.56398,2.44573],[-63.76805,2.43994],[-63.84358,2.4916],[-64.01914,2.46135],[-64.0573,2.49752],[-63.98033,2.7237],[-64.07709,2.87262],[-64.07156,2.92142],[-64.12349,2.99048],[-64.15754,2.98243],[-64.14592,3.03459],[-64.22642,3.12356],[-64.19795,3.20121],[-64.2444,3.43036],[-64.17437,3.56841],[-64.281,3.70928],[-64.54357,3.85713],[-64.72239,4.11775],[-64.80203,4.17422],[-64.81123,4.27048],[-64.69522,4.25323],[-64.623,4.135],[-64.5565,4.10529],[-64.164,4.127],[-63.964,3.868],[-63.928,3.925],[-63.85,3.95],[-63.682,3.908],[-63.676,4.019],[-63.591,3.886],[-63.497,3.84],[-63.489,3.874],[-63.434,3.865],[-63.428,3.977],[-63.204,3.952],[-63.226,3.836],[-63.103,3.794],[-63.059,3.748],[-63.081,3.694],[-62.96,3.608],[-62.835,3.739],[-62.743,3.674],[-62.729,3.805],[-62.788,3.894],[-62.753,4.032],[-62.555,4.019],[-62.552,4.109],[-62.437,4.183],[-62.14308,4.07768],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.93175,4.12009],[-61.92213,4.16126],[-61.824,4.164],[-61.802,4.229],[-61.724,4.27],[-61.56,4.252],[-61.508,4.322],[-61.513,4.406],[-61.288,4.458],[-61.323,4.535],[-61.217,4.536],[-61.14559,4.48016],[-61.095,4.522],[-60.994,4.519],[-60.932,4.587],[-60.949,4.653],[-60.899,4.717],[-60.751,4.756],[-60.591,4.927],[-60.661,5.164],[-60.73197,5.21203],[-60.434,5.182],[-60.20825,5.28346],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.96984,5.06334],[-60.02524,4.7065],[-60.0705,4.61688],[-60.15725,4.57247],[-60.16114,4.51773],[-59.79503,4.46554],[-59.66948,4.37629],[-59.7319,4.28587],[-59.73069,4.18076],[-59.61818,4.13166],[-59.65406,4.06943],[-59.58417,3.96851],[-59.5153,3.94493],[-59.59279,3.88538],[-59.59631,3.79386],[-59.66555,3.78126],[-59.66842,3.70277],[-59.86728,3.57776],[-59.80205,3.50156],[-59.8408,3.43174],[-59.80488,3.35695],[-59.907,3.212],[-59.98944,2.88185],[-59.99,2.686],[-59.895,2.482],[-59.89872,2.36245],[-59.72315,2.27614],[-59.751,1.859],[-59.677,1.839],[-59.663,1.871],[-59.69,1.757],[-59.539,1.723],[-59.381,1.507],[-59.329,1.514],[-59.327,1.464],[-59.284,1.45],[-59.253,1.389],[-58.978,1.302],[-58.918,1.317],[-58.886,1.261],[-58.912,1.239],[-58.82512,1.17127],[-58.73956,1.1999],[-58.69456,1.29732],[-58.49622,1.26796],[-58.45787,1.37145],[-58.50511,1.40317],[-58.50873,1.46295],[-58.38559,1.46999],[-58.39472,1.52651],[-58.32237,1.59702],[-58.236,1.54669],[-58.16064,1.56011],[-58.12942,1.4989],[-58.00423,1.50303],[-57.99009,1.65844],[-57.85206,1.66782],[-57.77431,1.72973],[-57.70509,1.73093],[-57.65042,1.68237],[-57.5376,1.7005],[-57.50187,1.78609],[-57.43776,1.82681],[-57.43343,1.90598],[-57.36768,1.92372],[-57.36912,1.95638],[-57.30712,1.99665],[-57.22923,1.93759],[-57.08668,2.02644],[-57.01421,1.91489],[-56.91971,1.93036],[-56.79793,1.85336],[-56.72096,1.92582],[-56.62145,1.94588],[-56.57976,1.90588],[-56.45126,1.95614],[-56.24404,1.87808],[-56.1709,1.90048],[-56.11762,1.85097],[-55.95638,1.84509],[-55.90385,1.88803],[-55.93635,1.98647],[-55.9031,2.04108],[-56.00307,2.1676],[-56.05505,2.18464],[-56.04288,2.22778],[-56.13887,2.26574],[-56.09012,2.37228],[-56.02181,2.34247],[-55.97052,2.52931],[-55.76663,2.45524],[-55.71028,2.39917],[-55.49971,2.44324],[-55.38533,2.41836],[-55.32019,2.51537],[-55.23474,2.50338],[-55.1234,2.56762],[-55.10302,2.52564],[-54.95424,2.58359],[-54.86846,2.43989],[-54.68917,2.45389],[-54.68861,2.32472],[-54.54667,2.31833],[-54.53778,2.26556],[-54.46861,2.21306],[-54.24917,2.14667],[-54.18056,2.1725],[-54.11083,2.11222],[-54.06139,2.19167],[-53.94083,2.21917],[-53.93194,2.27194],[-53.88667,2.26778],[-53.745,2.37389],[-53.73389,2.31222],[-53.52972,2.24917],[-53.45861,2.2575],[-53.32833,2.35333],[-53.21667,2.25333],[-53.27899,2.18603],[-53.11861,2.2225],[-52.99472,2.17528],[-52.90972,2.19583],[-52.84722,2.28556],[-52.67528,2.37389],[-52.59444,2.47389],[-52.54028,2.57028],[-52.56417,2.63944],[-52.43944,2.87778],[-52.39583,2.90222],[-52.33187,3.16938],[-52.21472,3.26833],[-51.97104,3.70696],[-51.92148,3.72422],[-51.922,3.7792],[-51.79731,3.88888],[-51.77783,3.97406],[-51.65867,4.05276],[-51.61325,4.17437],[-51.63716,4.50834],[-51.49427,4.67426],[-51.11466,4.42286],[-50.94232,4.20165],[-50.85475,3.92491],[-50.85507,3.45573],[-50.75331,2.94057],[-50.29908,2.33079],[-49.73896,1.79143],[-48.23746,-0.07449],[-44.84728,-1.07246],[-43.54602,-2.04705],[-43.24389,-2.12403],[-42.78189,-2.33053],[-41.78084,-2.51859],[-41.5085,-2.68486],[-40.66365,-2.63829],[-40.50396,-2.57531],[-39.8907,-2.65328],[-39.15187,-3.04444],[-38.57151,-3.48047],[-38.34306,-3.54434],[-38.21421,-3.74103],[-38.12555,-3.80544],[-37.90182,-4.07265],[-37.77934,-4.18046],[-37.63401,-4.24454],[-37.51218,-4.41535],[-37.22122,-4.51045],[-37.07874,-4.71355],[-36.91716,-4.71372],[-36.62299,-4.85815],[-36.18969,-4.88505],[-35.93627,-4.83327],[-35.56471,-4.90758],[-35.33677,-4.99239],[-35.17659,-5.12497],[-34.79469,-6.33583],[-34.71587,-6.74615],[-34.62306,-6.90323],[-34.59953,-7.11133],[-34.64374,-7.98735],[-34.81497,-8.62472],[-35.0253,-9.13761],[-35.55848,-9.81261],[-35.69663,-9.90026],[-35.96401,-10.31281],[-36.06155,-10.37447],[-36.26639,-10.64593],[-36.61764,-10.81082],[-36.78725,-10.95151],[-36.99511,-11.29602],[-37.11368,-11.41261],[-37.46002,-12.10275],[-37.89668,-12.75844],[-38.22146,-13.09717],[-38.61146,-13.26537],[-38.85337,-14.65508],[-38.74388,-15.60089],[-38.66456,-15.74741],[-38.64697,-15.88327],[-38.8013,-16.24838],[-38.92933,-16.80775],[-38.53193,-17.80026],[-38.49171,-18.0046],[-38.53661,-18.09683],[-38.67053,-18.16855],[-39.35288,-18.10892],[-39.4675,-18.30359],[-39.54529,-18.78548],[-39.49227,-19.40134],[-39.63477,-19.74403],[-39.86353,-19.88681],[-40.17827,-20.75426],[-40.81442,-21.67672],[-40.76948,-21.87786],[-40.81442,-22.09702],[-41.5086,-22.52638],[-41.59666,-22.83627],[-41.79292,-23.08823],[-41.91484,-23.18527],[-43.19603,-23.26703],[-44.07735,-23.40501],[-45.13508,-24.12014],[-46.61368,-24.67512],[-47.85376,-25.47012],[-48.2801,-26.23036],[-48.34897,-26.75081],[-48.11076,-27.28208],[-48.21148,-27.85592],[-48.40713,-28.43255],[-48.68615,-28.76016],[-48.9156,-28.86305],[-49.1579,-29.02871],[-49.52748,-29.42005],[-49.82565,-29.86559],[-50.17344,-30.64282],[-50.60441,-31.24135],[-51.18785,-31.77646],[-51.74211,-32.10539],[-51.89236,-32.29596],[-52.06117,-32.38504],[-52.27087,-32.92102],[-52.45986,-33.25369],[-52.61505,-33.42291],[-53.18109,-33.86891],[-53.43053,-33.73947],[-53.43951,-33.69347],[-53.53228,-33.6888],[-53.51819,-33.15342],[-53.44438,-33.05296],[-53.24468,-32.93489],[-53.31008,-32.91875],[-53.29454,-32.89931],[-53.18496,-32.85043],[-53.14569,-32.79202],[-53.0858,-32.78835],[-53.07558,-32.74088],[-53.24992,-32.6041],[-53.39137,-32.58573],[-53.46423,-32.48446],[-53.58321,-32.45192],[-53.74599,-32.07848],[-53.83375,-32.05524],[-53.84978,-32.00064],[-53.96073,-31.95532],[-53.96972,-31.91765],[-54.10019,-31.92825],[-54.4549,-31.65295],[-54.4528,-31.59959],[-54.58676,-31.45656],[-54.8367,-31.442],[-54.88623,-31.3773],[-54.94087,-31.38068],[-55.00723,-31.26692],[-55.07446,-31.33216],[-55.24003,-31.26062],[-55.29118,-31.14226],[-55.34037,-31.13144],[-55.34981,-31.03922],[-55.42306,-31.01823],[-55.57742,-30.83309],[-55.65834,-30.864],[-55.66621,-30.95395],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.00989,-31.08267],[-56.02241,-30.78565],[-56.12508,-30.73871],[-56.17074,-30.61517],[-56.26095,-30.58509],[-56.29193,-30.51967],[-56.38177,-30.49956],[-56.46126,-30.38486],[-56.54706,-30.35946],[-56.54115,-30.31291],[-56.6187,-30.30054],[-56.64628,-30.20346],[-56.77662,-30.1633],[-56.80777,-30.10301],[-57.07113,-30.08671],[-57.22081,-30.28928],[-57.31303,-30.25785],[-57.39229,-30.30474],[-57.46574,-30.26589],[-57.52431,-30.28569],[-57.56087,-30.21134],[-57.64744,-30.19483],[-57.48047,-30.12315],[-57.33713,-29.99284],[-57.294,-29.831],[-57.121,-29.765],[-56.89888,-29.53179],[-56.81905,-29.48816],[-56.76618,-29.37768],[-56.70164,-29.35913],[-56.59315,-29.12516],[-56.418,-29.075],[-56.40775,-28.9748],[-56.29995,-28.89614],[-56.29652,-28.8027],[-56.17858,-28.75922],[-56.00984,-28.60718],[-56.01249,-28.50873],[-55.88357,-28.47923],[-55.87739,-28.36159],[-55.75157,-28.37095],[-55.69433,-28.42204],[-55.67047,-28.33218],[-55.77415,-28.27414],[-55.7757,-28.24481],[-55.63167,-28.17719],[-55.60747,-28.11604],[-55.55957,-28.16523],[-55.4952,-28.07682],[-55.44611,-28.09787],[-55.368,-28.029],[-55.38299,-27.97948],[-55.343,-27.972],[-55.32706,-27.92664],[-55.26574,-27.92969],[-55.196,-27.856],[-55.133,-27.897],[-55.106,-27.846],[-55.035,-27.858],[-55.081,-27.779],[-54.936,-27.772],[-54.90617,-27.63871],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.67926,-27.57394],[-54.67709,-27.508],[-54.621,-27.541],[-54.574,-27.453],[-54.5246,-27.5059],[-54.444,-27.472],[-54.47081,-27.42674],[-54.41,-27.405],[-54.35466,-27.46528],[-54.34067,-27.40311],[-54.28484,-27.44819],[-54.261,-27.397],[-54.21736,-27.38603],[-54.172,-27.254],[-54.15619,-27.29619],[-54.08872,-27.30149],[-54.01026,-27.19978],[-53.96219,-27.19698],[-53.95195,-27.15169],[-53.79879,-27.14629],[-53.80233,-27.04028],[-53.76087,-27.06543],[-53.78585,-27.02674],[-53.7473,-27.03218],[-53.7092,-26.93414],[-53.67125,-26.94222],[-53.69684,-26.86015],[-53.66059,-26.85814],[-53.75814,-26.72045],[-53.7205,-26.65099],[-53.75864,-26.64113],[-53.63739,-26.24968],[-53.742,-26.108],[-53.73409,-26.04333],[-53.83619,-25.97166],[-53.82214,-25.79377],[-53.89113,-25.62286],[-53.94895,-25.6117],[-53.95638,-25.64628],[-54.01,-25.567],[-54.07592,-25.55766],[-54.098,-25.619],[-54.099,-25.495],[-54.206,-25.541],[-54.178,-25.584],[-54.23,-25.562],[-54.25,-25.597],[-54.28,-25.556],[-54.38395,-25.59747],[-54.43288,-25.69756],[-54.4927,-25.6181],[-54.59354,-25.59275],[-54.61941,-25.45312],[-54.4295,-25.15915],[-54.43548,-24.94769],[-54.32437,-24.66059],[-54.32714,-24.47073],[-54.25877,-24.36377],[-54.34537,-24.14705],[-54.28223,-24.07336],[-54.43984,-23.90446],[-54.66978,-23.81262],[-54.70533,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.06223,-23.99335],[-55.107,-23.961],[-55.22907,-24.01383],[-55.30415,-23.96504],[-55.34542,-23.99458],[-55.41423,-23.9645],[-55.44167,-23.70084],[-55.47306,-23.64834],[-55.53989,-23.625],[-55.52356,-23.19733],[-55.54199,-23.1561],[-55.59635,-23.14993],[-55.66578,-22.85274],[-55.61432,-22.65521],[-55.72364,-22.55166],[-55.74302,-22.39266],[-55.78939,-22.3846],[-55.84304,-22.28725],[-56.20983,-22.27805],[-56.36485,-22.16949],[-56.39404,-22.07434],[-56.50711,-22.09561],[-56.63705,-22.26341],[-56.70344,-22.21693],[-56.72026,-22.26479],[-56.79344,-22.24238],[-56.84285,-22.30155],[-56.88343,-22.24755],[-56.9967,-22.22246],[-57.3744,-22.23204],[-57.5804,-22.17534],[-57.6106,-22.09462],[-57.70751,-22.09111],[-57.80183,-22.15072],[-57.99384,-22.09023],[-58.00946,-22.04038],[-57.91281,-21.88266],[-57.96603,-21.85045],[-57.90866,-21.77355],[-57.94714,-21.74413],[-57.88329,-21.68903],[-57.93436,-21.65037],[-57.91387,-21.59021],[-57.96795,-21.52432],[-57.8535,-21.33109],[-57.92019,-21.27655],[-57.85066,-21.22407],[-57.86834,-21.04417],[-57.81919,-20.94066],[-57.92836,-20.90036],[-57.8552,-20.83403],[-57.89863,-20.78872],[-57.96183,-20.7916],[-57.93478,-20.74565],[-57.86732,-20.73265],[-57.92414,-20.66392],[-57.98848,-20.69879],[-57.99847,-20.43551],[-58.09339,-20.35554],[-58.09596,-20.25445],[-58.16216,-20.25953],[-58.12152,-20.19246],[-58.16932,-20.1694],[-57.95347,-20.02094],[-57.90248,-20.04207],[-57.85796,-19.9703],[-58.131,-19.758],[-57.784,-19.033],[-57.694,-19.011],[-57.719,-18.899],[-57.766,-18.899],[-57.557,-18.24],[-57.453,-18.231],[-57.574,-18.131],[-57.72302,-17.83074],[-57.68472,-17.8306],[-57.70991,-17.72702],[-57.783,-17.639],[-57.73696,-17.5583],[-57.883,-17.449],[-57.996,-17.515],[-58.06,-17.45],[-58.116,-17.451],[-58.151,-17.384],[-58.263,-17.344],[-58.396,-17.181],[-58.423,-16.989],[-58.474,-16.935],[-58.47,-16.703],[-58.436,-16.592],[-58.333,-16.49],[-58.32227,-16.26559],[-58.388,-16.261],[-58.43059,-16.32264],[-60.17335,-16.26672],[-60.238,-15.473],[-60.57543,-15.09677],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.38066,-13.9888],[-60.45062,-13.9364],[-60.45599,-13.85422],[-60.49068,-13.85782],[-60.46776,-13.79446],[-60.76755,-13.68329],[-60.87678,-13.62149],[-60.91857,-13.54334],[-61.0056,-13.552],[-61.0129,-13.48925],[-61.0938,-13.49081],[-61.10314,-13.53056],[-61.18155,-13.50557],[-61.19236,-13.53695],[-61.29954,-13.47718],[-61.46527,-13.55427],[-61.57927,-13.48711],[-61.852,-13.538],[-61.892,-13.431],[-61.96968,-13.40759],[-61.97592,-13.36695],[-62.11498,-13.25932],[-62.115,-13.163],[-62.15254,-13.15993],[-62.16703,-13.11346],[-62.19,-13.153],[-62.214,-13.111],[-62.27269,-13.15687],[-62.39178,-13.13471],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.89672,-12.8539],[-63.01134,-12.83602],[-63.08186,-12.72323],[-63.06163,-12.68584],[-63.15726,-12.6138],[-63.24621,-12.66222],[-63.23713,-12.69043],[-63.30125,-12.68138],[-63.44052,-12.608],[-63.43627,-12.56526],[-63.50641,-12.56562],[-63.55295,-12.50598],[-63.7848,-12.42871],[-63.88957,-12.44745],[-63.89949,-12.50204],[-63.95144,-12.53179],[-64.13464,-12.47732],[-64.16781,-12.51503],[-64.17504,-12.46675],[-64.22945,-12.45419],[-64.29018,-12.50313],[-64.29452,-12.4582],[-64.41057,-12.44436],[-64.51217,-12.3551],[-64.51256,-12.22562],[-64.70406,-12.1827],[-64.70719,-12.08684],[-64.75486,-12.15762],[-64.7688,-12.09356],[-64.83747,-12.11786],[-64.80954,-12.05633],[-64.84077,-12.01027],[-65.03548,-11.99408],[-65.01398,-11.90303],[-65.0727,-11.86587],[-65.08672,-11.7082],[-65.18953,-11.72353],[-65.18216,-11.75609],[-65.2593,-11.71053],[-65.21178,-11.52857],[-65.3074,-11.49957],[-65.33276,-11.33986],[-65.29053,-11.32275],[-65.34347,-11.3082],[-65.35834,-11.26834],[-65.35938,-11.22067],[-65.31294,-11.19578],[-65.35387,-11.18419],[-65.36177,-11.14031],[-65.28269,-11.09009],[-65.30071,-11.03142],[-65.25053,-10.98506],[-65.27476,-10.87302],[-65.35376,-10.78881],[-65.34667,-10.68155],[-65.40569,-10.63935],[-65.43011,-10.48505],[-65.288,-10.219],[-65.333,-9.965],[-65.28588,-9.84413],[-65.39313,-9.68683],[-65.44394,-9.66957],[-65.4883,-9.71015],[-65.55611,-9.84498],[-65.627,-9.83804],[-65.66963,-9.78129],[-65.71023,-9.80857],[-65.68395,-9.74992],[-65.7432,-9.78296],[-65.77013,-9.73442],[-65.79437,-9.79295],[-65.79962,-9.75663],[-65.86532,-9.79533],[-65.87184,-9.75307],[-65.91976,-9.75314],[-65.98222,-9.81011],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.61995,-9.89353],[-66.63701,-9.94983],[-66.8751,-10.08268],[-66.9528,-10.18886],[-66.99683,-10.20017],[-67.01537,-10.25919],[-67.17745,-10.33923],[-67.31545,-10.31932],[-67.31155,-10.37716],[-67.40717,-10.37386],[-67.44361,-10.45492],[-67.57925,-10.5028],[-67.64028,-10.59807],[-67.67631,-10.60484],[-67.70825,-10.71083],[-67.86386,-10.64067],[-68.03289,-10.65486],[-68.10456,-10.71426],[-68.10333,-10.77541],[-68.27819,-10.98926],[-68.71576,-11.14483],[-68.75767,-11.00079],[-68.9118,-11.02192],[-69.41453,-10.92575],[-69.73653,-10.97445],[-69.76903,-10.92972],[-69.93442,-10.9219],[-70.15869,-11.04096],[-70.30672,-11.06983],[-70.43675,-11.03923],[-70.53033,-10.93465],[-70.62103,-10.99982],[-70.62338,-9.82054],[-70.53663,-9.76584],[-70.59972,-9.56264],[-70.55282,-9.57093],[-70.56894,-9.53127],[-70.50506,-9.50557],[-70.49665,-9.42489],[-70.59581,-9.4425],[-70.6632,-9.52601],[-70.75067,-9.56043],[-70.79332,-9.63846],[-70.96337,-9.74891],[-70.99391,-9.81721],[-71.13974,-9.85702],[-71.22052,-9.96968],[-72.1804,-9.99967],[-72.15136,-9.79742],[-72.26296,-9.75085],[-72.25282,-9.61633],[-72.28821,-9.60316],[-72.2829,-9.53995],[-72.35688,-9.4946],[-72.51954,-9.49128],[-72.71676,-9.4122],[-73.2038,-9.40715],[-73.07352,-9.23461],[-73.0093,-9.22236],[-73.02612,-9.17786],[-72.9582,-9.14302],[-72.94091,-8.98494],[-72.99931,-8.91778],[-73.05901,-8.90561],[-73.14992,-8.6839],[-73.20907,-8.6857],[-73.28745,-8.61948],[-73.3055,-8.47197],[-73.38956,-8.46878],[-73.41286,-8.41099],[-73.53744,-8.34587],[-73.62739,-8.02187],[-73.73175,-7.9684],[-73.7725,-7.90237],[-73.76164,-7.85803],[-73.69706,-7.86527],[-73.6843,-7.77644],[-73.82217,-7.71788],[-73.99094,-7.53635],[-73.948,-7.52661],[-73.91981,-7.46568],[-73.96394,-7.34764],[-73.87014,-7.37882],[-73.7003,-7.30429],[-73.79842,-7.11306],[-73.71046,-6.84019],[-73.53639,-6.6834],[-73.39115,-6.64193],[-73.35281,-6.59327],[-73.22741,-6.58884],[-73.18797,-6.52302],[-73.13523,-6.51046],[-73.10473,-6.40666],[-73.24664,-6.14963],[-73.23821,-6.04399],[-73.1868,-6.00512],[-73.15207,-5.86796],[-73.05303,-5.79517],[-72.95912,-5.65689],[-72.95888,-5.46613],[-72.86052,-5.27117],[-72.88725,-5.16307],[-72.73986,-5.08859],[-72.72765,-5.05199],[-72.6212,-5.0518],[-72.598,-4.98386],[-72.38202,-4.87296],[-72.36895,-4.80387],[-72.12601,-4.73454],[-72.04335,-4.62384],[-72.00689,-4.64622],[-71.99464,-4.60996],[-71.94743,-4.60877],[-71.91909,-4.5298],[-71.88549,-4.53803],[-71.9073,-4.51644],[-71.76637,-4.50446],[-71.75109,-4.46887],[-71.70817,-4.51165],[-71.65479,-4.47246],[-71.65032,-4.50395],[-71.61548,-4.4687],[-71.6335,-4.51524],[-71.59625,-4.52928],[-71.53703,-4.46442],[-71.49428,-4.48701],[-71.50716,-4.43909],[-71.43438,-4.42882],[-71.42562,-4.47058],[-71.35026,-4.42728],[-71.30752,-4.46288],[-71.32091,-4.42009],[-71.27782,-4.44217],[-71.26975,-4.385],[-71.20263,-4.37987],[-71.19422,-4.42471],[-71.14478,-4.38158],[-71.11491,-4.41119],[-71.10616,-4.37764],[-70.99389,-4.38654],[-70.99595,-4.34632],[-70.9357,-4.38432],[-70.84483,-4.27905],[-70.86447,-4.25245],[-70.81677,-4.23005],[-70.8458,-4.21872],[-70.75901,-4.15944],[-70.68147,-4.20791],[-70.64256,-4.12805],[-70.62521,-4.19151],[-70.56118,-4.1775],[-70.57357,-4.21169],[-70.54796,-4.13671],[-70.51036,-4.14824],[-70.50417,-4.20098],[-70.48535,-4.16132],[-70.43435,-4.16266],[-70.43146,-4.13217],[-70.33892,-4.17997],[-70.32281,-4.14206],[-70.28769,-4.16555],[-70.29141,-4.28709],[-70.21457,-4.29749],[-70.19194,-4.36179],[-70.15508,-4.27308],[-70.11749,-4.28585],[-70.10881,-4.25454],[-70.04189,-4.29409],[-70.07948,-4.31428],[-70.02826,-4.3703],[-69.99182,-4.37482],[-69.94793,-4.23168]],[[-34.00035,-3.76654],[-34.01797,-3.84985],[-34.00664,-3.91809],[-33.98608,-3.95952],[-33.95923,-3.99217],[-33.8921,-4.03653],[-33.81658,-4.05077],[-33.72931,-4.03151],[-33.66638,-3.9838],[-33.62736,-3.9185],[-33.61519,-3.84985],[-33.63239,-3.76864],[-33.68693,-3.69537],[-33.74987,-3.65978],[-33.81658,-3.6489],[-33.89336,-3.66397],[-33.96007,-3.70877],[-34.00035,-3.76654]],[[-32.5538,-4.00884],[-32.59937,-3.9531],[-32.64061,-3.87309],[-32.61755,-3.73712],[-32.58338,-3.70527],[-32.54228,-3.65606],[-32.4592,-3.63029],[-32.35174,-3.63887],[-32.30049,-3.67684],[-32.24749,-3.75266],[-32.23155,-3.81889],[-32.2357,-3.90247],[-32.30194,-3.9883],[-32.42898,-4.0384],[-32.5538,-4.00884]],[[-29.50321,0.79391],[-29.54097,0.8689],[-29.54727,0.92553],[-29.52367,0.99422],[-29.48958,1.06134],[-29.43136,1.10224],[-29.35899,1.1206],[-29.29238,1.11378],[-29.22158,1.0776],[-29.16285,1.00314],[-29.14501,0.92605],[-29.14764,0.88358],[-29.17176,0.8196],[-29.24885,0.74357],[-29.29448,0.72521],[-29.36371,0.71892],[-29.43556,0.73937],[-29.50321,0.79391]],[[-29.09537,-20.42649],[-29.19756,-20.33509],[-29.3343,-20.28932],[-29.46741,-20.3288],[-29.54604,-20.42958],[-29.55396,-20.52706],[-29.51696,-20.62613],[-29.40995,-20.68955],[-29.27599,-20.72578],[-29.15968,-20.66209],[-29.07188,-20.57088],[-28.9712,-20.64769],[-28.83286,-20.69814],[-28.67968,-20.62099],[-28.63549,-20.49284],[-28.63412,-20.47146],[-28.7431,-20.30094],[-28.8683,-20.27288],[-29.0031,-20.32416],[-29.09537,-20.42649]]],terms_text:"IBGE",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/IBGE_Setores_Rurais.png"},{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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"ign-topografico-tms",name:"IGN topographical map (TMS)",type:"tms",template:"https://ide.ign.gob.ar/geoservicios/rest/services/Mapas_IGN/mapa_topografico/MapServer/tile/{zoom}/{y}/{x}",scaleExtent:[1,20],polygon:[[[-55.5438,-35.77219],[-64.31743,-49.44788],[-61.52546,-55.68296],[-66.04226,-55.24192],[-66.6896,-55.17191],[-66.86233,-55.04496],[-67.23387,-54.9245],[-67.47633,-54.92785],[-67.71808,-54.91261],[-67.96138,-54.88571],[-68.18753,-54.89288],[-68.61804,-54.92151],[-68.66375,-52.66716],[-68.51023,-52.39432],[-70.01629,-52.05707],[-72.05562,-52.01749],[-72.09055,-51.93758],[-72.02273,-51.88832],[-72.49598,-51.597],[-72.3623,-51.25935],[-72.46252,-51.08654],[-72.31217,-50.90093],[-72.39293,-50.69005],[-72.49148,-50.66866],[-72.59646,-50.73916],[-72.76983,-50.68829],[-73.22154,-50.87193],[-73.22709,-50.66897],[-73.39438,-50.58008],[-73.57703,-50.15788],[-73.53993,-50.01443],[-73.61453,-49.91795],[-73.52684,-49.7716],[-73.02779,-49.70085],[-73.02788,-49.23743],[-73.16148,-49.13062],[-72.96385,-48.89084],[-72.80952,-48.90039],[-72.59462,-48.77255],[-72.63621,-48.45823],[-72.46698,-48.45706],[-72.42158,-48.31422],[-72.3428,-48.29046],[-72.37166,-48.15995],[-72.57678,-47.96054],[-72.5731,-47.72062],[-72.3839,-47.57888],[-72.38448,-47.41759],[-72.07162,-47.2755],[-72.04726,-47.14867],[-71.93566,-47.15037],[-72.00956,-47.08473],[-72.00759,-46.78833],[-71.71488,-46.64453],[-71.7985,-46.26925],[-71.97019,-46.14972],[-71.63332,-45.97063],[-71.66595,-45.89232],[-71.77408,-45.85187],[-71.8548,-45.61169],[-71.7885,-45.50505],[-71.58354,-45.45607],[-71.58236,-45.36316],[-71.40574,-45.27206],[-71.61593,-45.03146],[-72.07949,-44.93988],[-72.11766,-44.73884],[-71.47444,-44.68048],[-71.2897,-44.75036],[-71.28469,-44.60892],[-71.20209,-44.5359],[-71.40536,-44.44891],[-71.86374,-44.44274],[-71.9047,-44.10354],[-71.70007,-43.98287],[-71.78725,-43.80985],[-71.63263,-43.65888],[-71.87866,-43.56195],[-71.95542,-43.44292],[-71.91512,-43.319],[-71.80268,-43.29535],[-71.73869,-43.19234],[-71.94149,-43.11061],[-72.18001,-42.8948],[-72.18733,-42.66619],[-72.06314,-42.53751],[-72.0441,-42.41231],[-72.14365,-42.40333],[-72.20024,-42.17229],[-72.17802,-42.13207],[-72.06032,-42.10593],[-71.78041,-42.12128],[-71.83133,-41.78089],[-71.94135,-41.60926],[-71.9023,-41.06778],[-72.02097,-40.73647],[-71.91507,-40.61832],[-71.87117,-40.38959],[-71.76665,-40.35676],[-71.87961,-40.24227],[-71.8856,-40.10093],[-71.67779,-39.92156],[-71.74365,-39.86164],[-71.77001,-39.61946],[-71.68665,-39.50983],[-71.58545,-39.55159],[-71.45202,-39.31025],[-71.47673,-38.89162],[-71.25594,-38.74909],[-70.95844,-38.70272],[-70.89411,-38.57644],[-71.03346,-38.45451],[-71.08724,-38.09054],[-71.23505,-37.86541],[-71.26668,-37.68295],[-71.18031,-37.4828],[-71.27241,-37.28686],[-71.17697,-37.1077],[-71.27586,-36.9637],[-71.20495,-36.91075],[-71.2345,-36.83303],[-71.07654,-36.43571],[-70.96469,-36.43366],[-70.90086,-36.34336],[-70.77062,-36.35412],[-70.59553,-36.12118],[-70.44219,-36.14876],[-70.42788,-35.73781],[-70.50607,-35.38014],[-70.59764,-35.34459],[-70.63128,-35.23712],[-70.42629,-35.12462],[-70.32933,-34.83081],[-70.35687,-34.72532],[-70.07752,-34.38253],[-70.06901,-34.24694],[-69.87771,-34.20233],[-69.95948,-33.77235],[-69.83371,-33.34911],[-70.02502,-33.37388],[-70.14906,-33.04145],[-70.06223,-33.01233],[-70.00981,-32.90747],[-70.19517,-32.75732],[-70.19589,-32.50891],[-70.28486,-32.45564],[-70.44343,-32.05325],[-70.41077,-31.9809],[-70.29402,-31.95849],[-70.5117,-31.85844],[-70.62295,-31.59949],[-70.59941,-31.29869],[-70.5377,-31.08557],[-70.35748,-31.0002],[-70.20264,-30.32249],[-69.97775,-30.32288],[-69.847,-30.16294],[-70.01824,-30.10003],[-69.95038,-29.73744],[-70.03755,-29.35428],[-69.97565,-29.18743],[-69.85112,-29.06923],[-69.70118,-28.37779],[-69.20484,-27.90816],[-68.84844,-27.13115],[-68.76133,-27.08588],[-68.60693,-27.09636],[-68.3489,-26.92771],[-68.64137,-26.50722],[-68.60352,-26.25391],[-68.45177,-26.1377],[-68.63052,-25.43524],[-68.55582,-25.14476],[-68.44595,-25.0658],[-68.62011,-24.81717],[-68.55162,-24.58836],[-68.28078,-24.34935],[-67.32648,-24.02538],[-66.99882,-23.00044],[-67.18775,-22.81375],[-67.08088,-22.62433],[-67.03366,-22.53815],[-66.84345,-22.39746],[-66.73734,-22.22282],[-66.38248,-22.07602],[-66.28978,-21.76554],[-66.21845,-21.72575],[-65.89675,-21.88263],[-65.71368,-22.09054],[-65.61493,-22.09152],[-65.60973,-22.09505],[-65.60607,-22.09358],[-65.60256,-22.09658],[-65.60015,-22.09543],[-65.59229,-22.09511],[-65.59015,-22.09735],[-65.58691,-22.09645],[-65.58512,-22.08432],[-65.57523,-22.07312],[-65.47487,-22.08487],[-64.99026,-22.06739],[-64.59768,-22.19269],[-64.52643,-22.29504],[-64.33114,-22.68517],[-64.10381,-22.34114],[-64.10712,-22.32023],[-64.06522,-22.23093],[-64.04702,-22.23757],[-64.03654,-22.19469],[-64.0029,-22.10735],[-63.99022,-22.07925],[-63.97147,-22.07619],[-63.94118,-21.99823],[-63.70932,-21.99896],[-63.68839,-22.01037],[-63.68079,-22.03116],[-63.68507,-22.04019],[-63.68156,-22.05185],[-63.67659,-22.03287],[-63.67201,-22.02293],[-63.66821,-22.01634],[-63.67191,-22.01399],[-63.66566,-21.99839],[-62.79606,-21.98778],[-62.74618,-22.10033],[-62.18511,-22.50843],[-61.93761,-22.97376],[-61.45605,-23.36182],[-61.05842,-23.56621],[-60.95137,-23.75997],[-60.28746,-24.01906],[-60.03728,-24.00408],[-59.46607,-24.33428],[-59.12256,-24.59772],[-58.46645,-24.84584],[-58.332,-24.98132],[-58.2349,-24.91756],[-57.8565,-25.08005],[-57.76981,-25.15013],[-57.75374,-25.17277],[-57.71597,-25.26456],[-57.71837,-25.27146],[-57.71111,-25.27265],[-57.71008,-25.28146],[-57.70692,-25.2845],[-57.70438,-25.28159],[-57.70273,-25.28239],[-57.70175,-25.28459],[-57.69741,-25.28283],[-57.69281,-25.28588],[-57.69733,-25.29337],[-57.70246,-25.29847],[-57.69612,-25.30832],[-57.69763,-25.3199],[-57.69143,-25.32127],[-57.67993,-25.33318],[-57.64822,-25.3679],[-57.63902,-25.38287],[-57.61504,-25.38841],[-57.59954,-25.39704],[-57.57673,-25.42029],[-57.56698,-25.43147],[-57.55477,-25.43999],[-57.55285,-25.44705],[-57.55811,-25.45717],[-57.55763,-25.46897],[-57.56523,-25.48014],[-57.56806,-25.49501],[-57.57722,-25.50575],[-57.57566,-25.52264],[-57.5661,-25.54112],[-57.56809,-25.55797],[-57.58142,-25.57145],[-57.59952,-25.57438],[-57.60444,-25.59855],[-57.6122,-25.61963],[-57.6367,-25.61807],[-57.66569,-25.60273],[-57.67006,-25.65579],[-57.67513,-25.66052],[-57.68626,-25.66287],[-57.69808,-25.65933],[-57.71855,-25.64914],[-57.72537,-25.71924],[-57.77786,-25.77559],[-57.84986,-26.01142],[-58.08597,-26.14202],[-58.13896,-26.66834],[-58.28224,-26.80127],[-58.32056,-26.82169],[-58.3167,-26.86081],[-58.32384,-26.87074],[-58.56858,-27.20629],[-57.90834,-27.24265],[-56.99114,-27.41858],[-56.60886,-27.36586],[-56.40607,-27.52701],[-56.32355,-27.36897],[-56.09353,-27.25219],[-55.76168,-27.38106],[-55.65541,-27.30153],[-55.67524,-27.17004],[-55.59643,-27.06538],[-55.40826,-26.91763],[-55.20788,-26.89214],[-54.97304,-26.63717],[-54.8532,-26.59894],[-54.72264,-26.31238],[-54.73235,-25.98554],[-54.65309,-25.84138],[-54.71357,-25.66721],[-54.62995,-25.55106],[-54.44288,-25.5795],[-54.11451,-25.4396],[-53.80059,-25.65093],[-53.766,-25.94301],[-53.59024,-26.19274],[-53.67264,-26.61495],[-53.61669,-26.95395],[-53.76351,-27.18917],[-54.15393,-27.36033],[-54.26461,-27.49923],[-54.79439,-27.6397],[-55.0044,-27.90341],[-55.19076,-27.92946],[-55.41589,-28.14304],[-55.66542,-28.26547],[-55.61633,-28.32205],[-55.65957,-28.46539],[-55.83413,-28.42136],[-55.87339,-28.49468],[-56.13558,-28.7265],[-56.37343,-29.10817],[-56.569,-29.13892],[-56.76306,-29.48638],[-57.05958,-29.72263],[-57.24463,-29.86452],[-57.3045,-30.03966],[-57.61942,-30.20517],[-57.60863,-30.32424],[-57.82983,-30.53118],[-57.75241,-30.68756],[-57.75273,-30.91942],[-57.93419,-31.27388],[-57.99,-31.36053],[-57.98302,-31.3734],[-57.97736,-31.38022],[-57.97778,-31.38599],[-57.98203,-31.39213],[-58.00944,-31.41341],[-58.06637,-31.47395],[-57.92613,-31.57745],[-57.98622,-31.77449],[-58.12179,-31.89772],[-58.11905,-32.14059],[-58.04227,-32.29153],[-58.14327,-32.45845],[-58.0758,-33.00587],[-58.18964,-33.09402],[-58.2723,-33.1061],[-58.31012,-33.1048],[-58.35418,-33.1221],[-58.37567,-33.17644],[-58.44465,-33.5853],[-58.43016,-33.71813],[-58.42434,-33.86887],[-58.41858,-33.91742],[-58.33697,-34.00477],[-58.241,-34.16246],[-57.84696,-34.50017],[-55.5438,-35.77219]]],terms_url:"http://www.ign.gob.ar/",terms_text:"Instituto Geográfico Nacional de la República Argentina",icon:"http://www.ign.gob.ar/sites/default/files/favicon.png"},{id:"Haiti-Drone",name:"Imagerie Drone (Haiti)",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/iomhaiti/{zoom}/{x}/{y}",scaleExtent:[0,21],polygon:[[[-72.15474,19.6879],[-72.15458,19.6878],[-72.15485,19.68776],[-72.15472,19.68685],[-72.15431,19.68707],[-72.15463,19.68544],[-72.15301,19.68499],[-72.15086,19.68435],[-72.15045,19.68479],[-72.15078,19.68315],[-72.15223,19.6833],[-72.15282,19.68066],[-72.15186,19.68051],[-72.15191,19.68034],[-72.15227,19.68035],[-72.15238,19.67972],[-72.15328,19.67965],[-72.15333,19.67698],[-72.15308,19.67694],[-72.15348,19.67638],[-72.14878,19.67107],[-72.13664,19.67081],[-72.13557,19.67408],[-72.13573,19.68351],[-72.13679,19.68407],[-72.13695,19.68559],[-72.13778,19.685],[-72.13782,19.68727],[-72.13888,19.68767],[-72.13881,19.69013],[-72.13853,19.68949],[-72.13806,19.68964],[-72.13869,19.69232],[-72.13825,19.69276],[-72.13948,19.69737],[-72.14101,19.7],[-72.1437,19.70112],[-72.14851,19.70015],[-72.14772,19.70268],[-72.14874,19.7029],[-72.1616,19.70357],[-72.16578,19.698],[-72.165,19.69324],[-72.16223,19.68901],[-72.15474,19.6879]],[[-72.13106,19.67189],[-72.12598,19.67728],[-72.12554,19.67762],[-72.12169,19.67764],[-72.11497,19.6726],[-72.11527,19.66872],[-72.11982,19.66275],[-72.12278,19.66257],[-72.1249,19.6627],[-72.12858,19.66454],[-72.13081,19.66617],[-72.13167,19.66879],[-72.13156,19.671],[-72.13106,19.67189]],[[-71.84579,19.67098],[-71.84294,19.67595],[-71.841,19.67595],[-71.83802,19.67553],[-71.83787,19.6745],[-71.83905,19.67439],[-71.83901,19.67411],[-71.83984,19.67395],[-71.83891,19.67361],[-71.83802,19.67209],[-71.83801,19.67263],[-71.83767,19.67272],[-71.83763,19.67254],[-71.83544,19.67321],[-71.83533,19.673],[-71.83312,19.67346],[-71.83267,19.67168],[-71.83216,19.67209],[-71.83072,19.66949],[-71.8306,19.66976],[-71.83022,19.66989],[-71.82918,19.66721],[-71.82907,19.66721],[-71.82891,19.66679],[-71.82895,19.66662],[-71.82883,19.66635],[-71.82856,19.66648],[-71.82887,19.66725],[-71.82876,19.66741],[-71.8278,19.66782],[-71.82771,19.66786],[-71.82783,19.66796],[-71.82718,19.66812],[-71.82718,19.66809],[-71.82644,19.66839],[-71.82641,19.66832],[-71.8262,19.66843],[-71.82618,19.66836],[-71.82589,19.66842],[-71.82589,19.66866],[-71.82516,19.66875],[-71.82545,19.66916],[-71.82293,19.66957],[-71.82271,19.66967],[-71.82277,19.66976],[-71.82018,19.67099],[-71.81985,19.67045],[-71.8198,19.6706],[-71.81947,19.67076],[-71.81825,19.67134],[-71.81814,19.67114],[-71.81758,19.67143],[-71.81696,19.67077],[-71.81764,19.6719],[-71.81714,19.67204],[-71.81582,19.6718],[-71.81384,19.67119],[-71.81233,19.6707],[-71.81218,19.67043],[-71.81243,19.67015],[-71.81192,19.67001],[-71.81188,19.67058],[-71.81117,19.67035],[-71.80959,19.66985],[-71.8078,19.66928],[-71.8056,19.66861],[-71.80514,19.66689],[-71.80512,19.66523],[-71.80523,19.66198],[-71.80656,19.65239],[-71.80734,19.64829],[-71.80997,19.64683],[-71.81475,19.64545],[-71.81477,19.64556],[-71.815,19.64551],[-71.81495,19.64538],[-71.81599,19.64502],[-71.81589,19.64489],[-71.81659,19.64461],[-71.81901,19.6438],[-71.82115,19.64345],[-71.82216,19.64333],[-71.8269,19.64321],[-71.82805,19.64322],[-71.83045,19.64408],[-71.83064,19.64486],[-71.82953,19.64504],[-71.82961,19.64561],[-71.82994,19.64557],[-71.83037,19.64517],[-71.83047,19.64535],[-71.83081,19.6452],[-71.83102,19.64511],[-71.83125,19.64585],[-71.83111,19.64582],[-71.83137,19.64659],[-71.83289,19.64619],[-71.83446,19.64571],[-71.83447,19.64631],[-71.83422,19.64619],[-71.8342,19.64655],[-71.83467,19.6463],[-71.83491,19.64639],[-71.8348,19.64622],[-71.83544,19.64585],[-71.8355,19.6458],[-71.83647,19.64613],[-71.83764,19.64727],[-71.83791,19.64789],[-71.83905,19.6508],[-71.84569,19.66962],[-71.84579,19.67098]],[[-72.09888,18.54843],[-72.09907,18.54838],[-72.09991,18.54809],[-72.10234,18.54813],[-72.10252,18.54814],[-72.10229,18.54826],[-72.10229,18.54828],[-72.10256,18.54815],[-72.10272,18.54814],[-72.10343,18.54871],[-72.10354,18.5489],[-72.10352,18.54974],[-72.10349,18.54974],[-72.10351,18.55003],[-72.10285,18.55018],[-72.1029,18.55025],[-72.10287,18.55031],[-72.10352,18.55024],[-72.1035,18.55152],[-72.10338,18.55152],[-72.10308,18.55161],[-72.10348,18.55162],[-72.10342,18.55435],[-72.10243,18.5555],[-72.10149,18.55562],[-72.10062,18.55559],[-72.0979,18.55521],[-72.09688,18.55466],[-72.09652,18.55421],[-72.09661,18.55417],[-72.09651,18.55417],[-72.09654,18.55398],[-72.09644,18.55355],[-72.09628,18.55357],[-72.09621,18.5532],[-72.09599,18.55337],[-72.09564,18.55267],[-72.09556,18.55185],[-72.09685,18.55035],[-72.09729,18.55032],[-72.09699,18.5502],[-72.09888,18.54843]],[[-72.25425,18.56826],[-72.25603,18.57178],[-72.25579,18.5748],[-72.2535,18.57555],[-72.25228,18.57555],[-72.24999,18.57409],[-72.24739,18.56983],[-72.24601,18.56673],[-72.24585,18.56295],[-72.24794,18.56254],[-72.25015,18.5628],[-72.25192,18.56508],[-72.25425,18.56826]],[[-72.30315,18.53327],[-72.30313,18.53318],[-72.30483,18.53111],[-72.30974,18.53111],[-72.31643,18.53243],[-72.32341,18.53661],[-72.32614,18.53878],[-72.32619,18.54264],[-72.31705,18.55406],[-72.31309,18.55406],[-72.29875,18.54533],[-72.29886,18.54073],[-72.2963,18.54047],[-72.29546,18.53952],[-72.29619,18.53386],[-72.29719,18.53322],[-72.3007,18.53328],[-72.30227,18.53423],[-72.30285,18.53352],[-72.3031,18.53334],[-72.30318,18.5334],[-72.30358,18.53356],[-72.30308,18.53465],[-72.30371,18.53399],[-72.30453,18.53441],[-72.3044,18.53451],[-72.30627,18.53526],[-72.30631,18.53527],[-72.30612,18.53576],[-72.30612,18.53582],[-72.30637,18.53589],[-72.30627,18.53549],[-72.30667,18.53509],[-72.3062,18.53497],[-72.30589,18.53494],[-72.30554,18.53468],[-72.30549,18.53461],[-72.30556,18.53451],[-72.30467,18.53423],[-72.30476,18.53388],[-72.30433,18.53375],[-72.30426,18.53363],[-72.30315,18.53327]],[[-72.29814,18.4775],[-72.29357,18.49486],[-72.29222,18.49643],[-72.29317,18.49725],[-72.28923,18.50571],[-72.28781,18.5081],[-72.28505,18.51199],[-72.28402,18.51132],[-72.28086,18.51588],[-72.27732,18.5176],[-72.27235,18.51752],[-72.26627,18.51446],[-72.26659,18.50668],[-72.26926,18.50462],[-72.2662,18.50298],[-72.26882,18.49652],[-72.26915,18.49594],[-72.27027,18.49615],[-72.27027,18.4956],[-72.26907,18.49557],[-72.26929,18.49377],[-72.2737,18.486],[-72.27467,18.48504],[-72.27518,18.4834],[-72.27654,18.48134],[-72.27735,18.4815],[-72.2783,18.48097],[-72.27785,18.4807],[-72.2771,18.48012],[-72.279,18.47758],[-72.27972,18.47729],[-72.28064,18.47764],[-72.28137,18.47716],[-72.28084,18.47698],[-72.28128,18.47584],[-72.28232,18.47518],[-72.28516,18.4751],[-72.28499,18.47637],[-72.28544,18.47698],[-72.28628,18.47563],[-72.28693,18.47547],[-72.2866,18.47519],[-72.2866,18.475],[-72.29098,18.47473],[-72.29466,18.47494],[-72.29739,18.47684],[-72.29814,18.4775]],[[-72.34667,18.52224],[-72.34683,18.52443],[-72.34753,18.52776],[-72.34555,18.52911],[-72.34031,18.52922],[-72.33833,18.52803],[-72.3369,18.53012],[-72.33381,18.52967],[-72.32893,18.52708],[-72.32865,18.52533],[-72.32921,18.52327],[-72.33041,18.52205],[-72.33216,18.52218],[-72.33225,18.5192],[-72.33692,18.51836],[-72.3382,18.51847],[-72.33815,18.51818],[-72.3412,18.51779],[-72.34549,18.5172],[-72.34926,18.51728],[-72.35043,18.51889],[-72.35035,18.52061],[-72.34968,18.52204],[-72.34667,18.52224]],[[-72.33031,18.54865],[-72.34297,18.55081],[-72.34332,18.55306],[-72.34131,18.56143],[-72.33906,18.56136],[-72.33847,18.56383],[-72.33753,18.56543],[-72.33484,18.56506],[-72.33118,18.56383],[-72.33121,18.56162],[-72.32321,18.56069],[-72.32124,18.5596],[-72.3208,18.5587],[-72.32088,18.55788],[-72.32595,18.55803],[-72.32662,18.5582],[-72.32592,18.55775],[-72.3251,18.55738],[-72.32338,18.55226],[-72.3246,18.54785],[-72.3289,18.54837],[-72.32998,18.54895],[-72.33031,18.54865]],[[-72.32314,18.52698],[-72.32234,18.52807],[-72.32096,18.52797],[-72.32078,18.52713],[-72.32085,18.52537],[-72.32146,18.52496],[-72.32257,18.52489],[-72.32285,18.52533],[-72.32324,18.52648],[-72.32314,18.52698]],[[-72.21608,18.64578],[-72.21596,18.65538],[-72.20303,18.65583],[-72.19471,18.65534],[-72.19222,18.65456],[-72.19206,18.65213],[-72.19348,18.64776],[-72.20125,18.63852],[-72.20693,18.63882],[-72.2121,18.64241],[-72.21181,18.64306],[-72.21217,18.64269],[-72.2128,18.64276],[-72.21347,18.64313],[-72.21356,18.64375],[-72.21542,18.64439],[-72.21589,18.64503],[-72.21608,18.64578]],[[-72.28677,18.6482],[-72.2901,18.65274],[-72.28981,18.65365],[-72.29007,18.65427],[-72.29072,18.65377],[-72.29103,18.65447],[-72.29125,18.65422],[-72.29168,18.65589],[-72.29122,18.65661],[-72.29227,18.65597],[-72.29269,18.65675],[-72.29307,18.65673],[-72.29413,18.65818],[-72.29602,18.66084],[-72.29597,18.66191],[-72.29329,18.66457],[-72.29067,18.666],[-72.28959,18.66613],[-72.28959,18.66657],[-72.2877,18.66647],[-72.28758,18.66766],[-72.28312,18.66972],[-72.27965,18.66965],[-72.27843,18.66908],[-72.2784,18.66877],[-72.27774,18.66917],[-72.27744,18.66914],[-72.27701,18.66832],[-72.27656,18.66811],[-72.27654,18.66806],[-72.27523,18.66852],[-72.27493,18.66746],[-72.27464,18.66743],[-72.27347,18.66821],[-72.27323,18.66827],[-72.27268,18.66716],[-72.27191,18.66743],[-72.27188,18.66734],[-72.26881,18.66819],[-72.26883,18.66718],[-72.26908,18.66682],[-72.26881,18.66679],[-72.26811,18.66707],[-72.26763,18.66738],[-72.26756,18.66669],[-72.26686,18.66695],[-72.26559,18.66736],[-72.26545,18.66701],[-72.26475,18.66741],[-72.26299,18.66819],[-72.26285,18.66818],[-72.26265,18.66761],[-72.2623,18.66771],[-72.26248,18.66792],[-72.26248,18.66823],[-72.26231,18.66826],[-72.2621,18.66797],[-72.26228,18.66892],[-72.26015,18.6689],[-72.25427,18.66879],[-72.25054,18.66835],[-72.25044,18.66954],[-72.24779,18.66989],[-72.24152,18.66979],[-72.24142,18.67419],[-72.23892,18.67398],[-72.23872,18.67346],[-72.23837,18.67331],[-72.2387,18.67395],[-72.23755,18.6739],[-72.23742,18.67351],[-72.23774,18.67334],[-72.23751,18.67326],[-72.23684,18.67349],[-72.23644,18.67241],[-72.23551,18.6726],[-72.2354,18.67242],[-72.2353,18.6729],[-72.23455,18.67269],[-72.23431,18.67246],[-72.23424,18.67347],[-72.23341,18.67346],[-72.23329,18.6733],[-72.23274,18.67329],[-72.23271,18.6735],[-72.2277,18.67253],[-72.22653,18.67165],[-72.2268,18.67157],[-72.2275,18.67159],[-72.22749,18.67145],[-72.22729,18.67146],[-72.22728,18.6713],[-72.22721,18.67136],[-72.22618,18.67137],[-72.2256,18.67088],[-72.22551,18.66945],[-72.22611,18.66969],[-72.22618,18.66959],[-72.22598,18.66955],[-72.22578,18.66914],[-72.22533,18.66946],[-72.22497,18.66947],[-72.22458,18.66788],[-72.22355,18.6677],[-72.22359,18.66759],[-72.22246,18.66763],[-72.22237,18.66702],[-72.22233,18.66709],[-72.22192,18.66703],[-72.22081,18.6669],[-72.22081,18.66653],[-72.22087,18.66636],[-72.2206,18.66681],[-72.22039,18.66664],[-72.21843,18.66505],[-72.21829,18.6641],[-72.21835,18.66084],[-72.21872,18.66065],[-72.21869,18.6606],[-72.21873,18.66045],[-72.21898,18.66032],[-72.21878,18.6602],[-72.2187,18.66024],[-72.21858,18.66004],[-72.21861,18.66],[-72.21878,18.66013],[-72.219,18.66002],[-72.21891,18.65991],[-72.21897,18.65979],[-72.21838,18.65958],[-72.21847,18.65397],[-72.2201,18.65116],[-72.2258,18.64695],[-72.2283,18.64573],[-72.23793,18.64586],[-72.23776,18.6447],[-72.24004,18.64325],[-72.2456,18.64335],[-72.24827,18.64504],[-72.24875,18.64367],[-72.25111,18.64298],[-72.25124,18.64334],[-72.25126,18.64316],[-72.25148,18.64314],[-72.25133,18.64297],[-72.25336,18.64235],[-72.25352,18.64268],[-72.25395,18.64254],[-72.25415,18.64293],[-72.25439,18.64287],[-72.25438,18.64275],[-72.25642,18.64232],[-72.25669,18.64314],[-72.25688,18.64286],[-72.25682,18.64253],[-72.25884,18.6421],[-72.25889,18.64225],[-72.25926,18.64223],[-72.25965,18.64241],[-72.25922,18.64069],[-72.25995,18.64048],[-72.26012,18.64063],[-72.26012,18.63994],[-72.26153,18.63947],[-72.26261,18.6391],[-72.26545,18.63873],[-72.27194,18.63868],[-72.2722,18.63886],[-72.27303,18.63942],[-72.27317,18.64126],[-72.27387,18.64103],[-72.27422,18.64161],[-72.27522,18.6417],[-72.27545,18.64157],[-72.27555,18.64169],[-72.27554,18.64175],[-72.27647,18.64186],[-72.27675,18.6419],[-72.2763,18.6426],[-72.27742,18.643],[-72.27798,18.64272],[-72.27858,18.64313],[-72.27857,18.64323],[-72.2789,18.64335],[-72.27985,18.64397],[-72.28587,18.64697],[-72.28677,18.6482]],[[-72.55572,18.53059],[-72.55559,18.5367],[-72.555,18.53797],[-72.5488,18.53792],[-72.54866,18.53728],[-72.54884,18.53063],[-72.54937,18.5301],[-72.55513,18.53012],[-72.55572,18.53059]],[[-72.62353,18.50799],[-72.62344,18.50952],[-72.62261,18.51043],[-72.62049,18.51185],[-72.61834,18.51075],[-72.61622,18.50832],[-72.61626,18.50647],[-72.61866,18.50444],[-72.6204,18.5045],[-72.62283,18.507],[-72.62353,18.50799]]]},{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.01779,8.82757],[79.01402,9.64678],[80.17642,9.65042],[80.17728,8.8313],[79.01779,8.82757]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.70873,62.30357],[-152.70839,62.58153],[-152.00835,63.54646],[-148.99432,63.5333],[-148.99432,62.30357],[-152.70873,62.30357]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.36,2.02846],[113.53448,2.03],[113.53619,3.07077],[114.76512,3.06751],[114.76254,2.08816],[114.36,2.02846]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.00155,-0.00008],[104.00137,1.45099],[104.91015,1.45116],[104.91015,-0.00008],[104.00155,-0.00008]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing Islands in OSM (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.24653,-54.47047],[3.24653,-54.37539],[3.46385,-54.37539],[3.46385,-54.47047],[3.24653,-54.47047]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.55906,45.95485],[7.47396,45.95533],[7.55585,46.2708],[8.0547,47.66469],[11.75245,47.66481],[11.75245,46.81334],[11.38424,45.95509],[10.55906,45.95485]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.17701,-55.29693],[-35.19599,-55.28285],[-35.16664,-54.72097],[-34.12517,-54.73465],[-34.1401,-55.29693],[-34.17701,-55.29693]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.75945,-15.68684],[-72.75945,-15.4957],[-72.74434,-15.4263],[-72.41286,-15.4263],[-72.41286,-15.65296],[-72.42411,-15.68667],[-72.75945,-15.68684]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.83975,6.2578],[1.83975,7.11427],[2.5494,7.11427],[2.5494,6.48905],[2.49781,6.25806],[1.83975,6.2578]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.05216,1.3213],[-92.05216,1.72181],[-91.74849,1.72181],[-91.74849,1.3213],[-92.05216,1.3213]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.34799,74.38946],[-84.34799,75.8903],[-79.14871,75.8903],[-79.14871,74.38946],[-84.34799,74.38946]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coastline mostly mapped meanwhile (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.04701,64.21109],[-15.16496,64.22408],[-15.16805,64.81573],[-13.04357,64.8036],[-13.04701,64.21109]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing islets and inaccurate coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.532,-1.80509],[-78.532,-1.60811],[-78.33562,-1.60811],[-78.33562,-1.80509],[-78.532,-1.80509]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.13476,-61.63472],[-56.13476,-61.19936],[-55.83264,-60.84015],[-53.72343,-60.83982],[-53.72343,-61.63472],[-56.13476,-61.63472]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.75878,14.74814],[-24.75878,15.09249],[-24.26706,15.09249],[-24.26706,14.74814],[-24.75878,14.74814]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.06897,-53.27059],[73.06897,-52.87549],[73.67338,-52.87673],[74.08863,-52.9495],[74.08863,-53.27059],[73.06897,-53.27059]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.8568,-55.55949],[-72.26521,-55.14943],[-72.26521,-54.51089],[-72.08531,-54.17909],[-69.49116,-54.17889],[-69.4915,-55.28379],[-69.62231,-55.5591],[-69.8568,-55.55949]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.93259,44.96237],[35.93259,45.55926],[37.36991,45.55926],[37.36991,44.96237],[35.93259,44.96237]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R021_N44_20180429T082601",name:"imagico.de: Kerch Strait 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20180429T082601&z={zoom}&x={x}&y={-y}",endDate:"2018-04-29T00:00:00.000Z",startDate:"2018-04-29T00:00:00.000Z",scaleExtent:[0,14],polygon:[[[35.8787,45.0348],[35.8787,45.6095],[36.9208,45.6095],[36.9208,45.0348],[35.8787,45.0348]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Bridge and surrounding after completion in April 2018 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.05175,81.91484],[-79.05175,83.43339],[-73.6039,83.80225],[-26.42449,83.80225],[-21.493,83.50352],[-16.88835,83.15095],[-16.88835,81.91484],[-79.05175,81.91484]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.21075,-56.72108],[-28.21075,-56.62498],[-27.96956,-56.62498],[-27.96956,-56.72108],[-28.21075,-56.72108]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.99293,-56.73479],[-28.22776,-56.73262],[-28.22416,-56.60075],[-27.96975,-56.60283],[-27.97319,-56.73479],[-27.99293,-56.73479]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2B_R005_S69_20180222T061749",name:"imagico.de: Lützow-Holm Bay",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2B_R005_S69_20180222T061749&z={zoom}&x={x}&y={-y}",endDate:"2018-02-22T00:00:00.000Z",startDate:"2018-02-22T00:00:00.000Z",scaleExtent:[0,13],polygon:[[[35.124,-70.3693],[35.1241,-69.2795],[36.3864,-68.4765],[42.2208,-68.4762],[42.2208,-70.3651],[35.124,-70.3693]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late season image or an area poorly mapped in OSM at the moment - lots of sea ice, be careful with distinguishing sea ice from ice shelves and floating glacier tongues. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.76109,81.39333],[-89.83016,82.14952],[-89.83153,82.24405],[-84.99342,82.73099],[-79.95207,83.13108],[-74.55641,83.46267],[-69.35851,83.70451],[-28.20784,83.70451],[-23.06624,83.46532],[-17.96584,83.15518],[-17.96721,82.72386],[-22.78197,81.4419],[-85.76109,81.39333]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.20666,-0.26685],[37.20666,-0.01193],[37.56552,-0.01193],[37.56552,-0.26685],[37.20666,-0.26685]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.24769,-3.22921],[37.24769,-2.96816],[37.61581,-2.96816],[37.61581,-3.22921],[37.24769,-3.22921]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.38853,-2.80053],[150.38853,-2.3834],[150.83348,-2.3834],[150.83348,-2.80053],[150.38853,-2.80053]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2018",name:"imagico.de: North Sea Coast spring 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-05-08T00:00:00.000Z",startDate:"2018-05-08T00:00:00.000Z",scaleExtent:[0,13],polygon:[[[5.3179,53.0918],[5.322,53.4418],[6.7023,56.3572],[9.8813,56.3578],[9.8813,53.2819],[9.7758,53.0921],[5.3179,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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-caspian_2018",name:"imagico.de: Northeast Caspian Sea 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=caspian_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-05-16T00:00:00.000Z",startDate:"2018-05-16T00:00:00.000Z",scaleExtent:[0,14],polygon:[[[51.0243,45.0729],[51.0243,46.569],[52.4259,46.5687],[53.6471,46.3177],[53.6474,45.0729],[51.0243,45.0729]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coastal contruction and Kashagan oil field in Kazakhstan in May 2018 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.19898,64.89205],[59.19898,66.91656],[60.73329,68.44289],[67.73295,68.44327],[67.73295,67.74883],[64.21647,64.91957],[59.19898,64.89205]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.62923,82.4597],[-83.03136,82.47986],[-83.03136,83.05876],[-72.80309,83.09567],[-65.65786,83.03232],[-65.81167,82.4597],[-81.62923,82.4597]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.89729,82.17577],[-82.64501,82.19426],[-82.64501,83.08067],[-66.58986,83.08497],[-63.78011,82.98908],[-63.78011,82.72198],[-65.0092,82.17577],[-78.89729,82.17577]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.63568,53.28027],[7.63568,53.6677],[8.49433,55.50246],[9.20775,55.48106],[9.20775,53.28027],[7.63568,53.28027]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.63568,53.28027],[7.63568,53.66811],[8.49433,55.50246],[9.20775,55.48106],[9.20775,53.28027],[7.63568,53.28027]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.49222,82.48972],[-52.49222,82.94295],[-49.28696,83.47312],[-44.5285,83.73214],[-29.5253,83.73214],[-25.26398,83.58271],[-21.18393,83.39776],[-21.18393,82.74312],[-23.40454,82.48972],[-52.49222,82.48972]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.2279,-53.20333],[73.2279,-53.01073],[73.25949,-52.94944],[73.78992,-52.94944],[73.78992,-53.06048],[73.71783,-53.20333],[73.2279,-53.20333]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.01654,8.84898],[-80.01654,9.41481],[-79.46859,9.41481],[-79.46859,8.84898],[-80.01654,8.84898]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.62539,8.77083],[-79.68684,8.82197],[-79.68667,8.93705],[-79.65363,9.09294],[-79.26816,9.09294],[-79.32833,8.77083],[-79.62539,8.77083]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.20922,-84.12525],[-60.61538,-83.78609],[-60.61538,-82.29969],[-48.72405,-82.29987],[-44.52178,-82.43683],[-44.51354,-84.12525],[-53.20922,-84.12525]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.11233,42.15316],[19.08426,43.08074],[20.63299,43.09603],[20.63788,42.16779],[19.11233,42.15316]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.23857,68.79972],[-51.24334,68.85303],[-51.15167,68.85303],[-51.14038,68.80116],[-51.23857,68.79972]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.9684,22.36265],[67.86231,22.38392],[67.86231,24.88693],[71.48986,24.88693],[71.48986,22.36265],[67.9684,22.36265]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.80811,41.58488],[22.99238,41.60195],[23.01186,42.29984],[23.99402,42.28339],[23.96561,41.58488],[23.80811,41.58488]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.7663,0.20689],[29.7663,0.50918],[30.0346,0.50918],[30.0346,0.20689],[29.7663,0.20689]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.80514,0.23586],[29.80514,0.46709],[30.02503,0.46709],[30.02503,0.23586],[29.80514,0.23586]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.42635],[-180,-67.32544],[-179.82473,-67.32538],[-179.82473,-67.42635],[-180,-67.42635]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.12875,-53.7205],[-42.14626,-53.45782],[-41.67573,-53.44586],[-41.65582,-53.70872],[-42.12875,-53.7205]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.84382,-3.59545],[120.84382,-3.15985],[120.98184,-2.51468],[122.62618,-2.51468],[122.62618,-3.00215],[122.5007,-3.59545],[120.84382,-3.59545]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.96951,-84.50098],[154.50858,-84.46255],[154.50858,-82.60681],[175.46774,-82.58505],[177.00583,-83.52807],[177.00583,-84.19262],[171.93839,-84.34633],[166.83798,-84.4437],[161.67029,-84.50045],[156.96951,-84.50098]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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,12],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.93977,76.51133],[-68.93977,76.5499],[-68.76635,76.55176],[-68.50993,76.55176],[-68.50744,76.51612],[-68.67897,76.51194],[-68.93977,76.51133]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.74292,76.52636],[-68.74446,76.5284],[-68.74807,76.54939],[-68.74615,76.56017],[-68.72276,76.56022],[-68.72017,76.55775],[-68.71853,76.52921],[-68.71978,76.52637],[-68.74292,76.52636]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.81924,76.5251],[-68.82651,76.54177],[-68.77345,76.5439],[-68.7021,76.54545],[-68.59177,76.5456],[-68.59183,76.52793],[-68.6597,76.5251],[-68.81924,76.5251]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.77771,76.50688],[-68.77662,76.57064],[-68.68115,76.57065],[-68.6763,76.55384],[-68.6762,76.53074],[-68.68523,76.50688],[-68.77771,76.50688]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.45886,80.72643],[78.45886,80.9099],[80.48892,80.9099],[80.48892,80.72643],[78.45886,80.72643]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.06138,-11.78923],[153.06138,-11.28869],[153.10927,-11.07229],[154.41201,-11.07229],[154.41201,-11.78923],[153.06138,-11.78923]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.86696,-41.51741],[-72.86696,-41.04527],[-72.23181,-41.04527],[-71.8751,-41.10829],[-72.00007,-41.51741],[-72.86696,-41.51741]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.36143,51.37553],[126.34804,52.33932],[128.60762,52.3409],[128.61174,51.37553],[126.36143,51.37553]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image showing newest features (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.98364,34.97851],[73.96164,35.36957],[74.44281,37.09391],[76.50601,36.70267],[75.98364,34.97851]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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.18071,-14.49785],[-71.17976,-13.71029],[-70.55637,-13.71263],[-70.55637,-14.49785],[-71.18071,-14.49785]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"IPR-orotofoto-last-tms",name:"IPR ortofoto LAST (tmsproxy)",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_ipr_last.php/{zoom}/{x}/{y}.jpg",scaleExtent:[1,20],polygon:[[[14.81232,49.93089],[14.18755,49.87687],[14.12025,50.19882],[14.74502,50.25247],[14.81232,49.93089]]]},{id:"IPR-orotofoto-vege-tms",name:"IPR ortofoto Low-Vegetation (tmsproxy)",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_ipr_vege.php/{zoom}/{x}/{y}.jpg",scaleExtent:[1,20],polygon:[[[14.30454,49.99538],[14.31604,49.94205],[14.35,49.94508],[14.35384,49.92726],[14.42385,49.93352],[14.42009,49.95097],[14.48865,49.95709],[14.48479,49.97501],[14.55386,49.98117],[14.55012,49.99852],[14.58455,50.00159],[14.5883,49.98424],[14.69168,49.99346],[14.67634,50.06453],[14.71279,50.06777],[14.70115,50.12158],[14.6647,50.11834],[14.661,50.13543],[14.62755,50.13246],[14.61965,50.16895],[14.58543,50.16591],[14.58163,50.18344],[14.40776,50.168],[14.41156,50.15045],[14.37765,50.14744],[14.3738,50.16524],[14.33893,50.16214],[14.34278,50.14434],[14.27368,50.1382],[14.27749,50.12058],[14.2088,50.11447],[14.21289,50.09557],[14.24656,50.09857],[14.25417,50.06336],[14.21987,50.0603],[14.2237,50.04259],[14.258,50.04565],[14.26953,49.99226],[14.30454,49.99538]]]},{id:"GSGS3906",name:"Ireland British War Office 1:25k GSGS 3906",type:"tms",template:"https://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png",scaleExtent:[0,18],polygon:[[[-9.31139,51.43828],[-7.36131,51.99302],[-7.33934,52.13149],[-6.9658,52.06231],[-6.23796,52.1534],[-6.21049,52.52928],[-5.98253,52.80079],[-5.96056,53.67037],[-6.20775,53.67851],[-6.22423,53.95255],[-5.86442,54.12513],[-5.85893,54.20392],[-5.53483,54.23122],[-5.39476,54.44739],[-5.50188,54.70052],[-6.21873,55.38194],[-6.86418,55.2162],[-7.25145,55.46455],[-7.53435,55.30853],[-8.25395,55.26787],[-8.61101,54.97259],[-8.49016,54.89369],[-8.83897,54.68306],[-8.42699,54.52397],[-8.75108,54.31302],[-9.29765,54.38985],[-10.05296,54.37866],[-10.30015,54.05747],[-10.02275,53.79386],[-10.30565,53.55142],[-9.99803,53.24354],[-9.09166,53.19256],[-9.81676,53.1102],[-9.48167,52.96984],[-9.70415,52.68107],[-10.00627,52.63608],[-9.78929,52.52426],[-9.99803,52.32663],[-10.64348,52.1753],[-10.39629,51.9761],[-10.16832,51.64668],[-10.28642,51.57334],[-9.88542,51.57163],[-9.79204,51.44684],[-9.31139,51.43828]]],terms_url:"https://wiki.openstreetmap.org/wiki/Ireland/Background_Imagery#Trinity_College_Dublin",terms_text:"Glucksman Map Library, Trinity College Dublin",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ie/IrelandBritishWarOffice-GSGS3906.png"},{id:"Israel_Hiking",name:"Israel Hiking",type:"tms",template:"https://israelhiking.osm.org.il/Tiles/{zoom}/{x}/{y}.png",scaleExtent:[7,16],polygon:[[[34.64563,32.92073],[34.98374,33.13352],[35.15662,33.09994],[35.31781,33.11463],[35.36541,33.06285],[35.46229,33.09994],[35.51741,33.12652],[35.5266,33.21531],[35.53893,33.25442],[35.56446,33.2969],[35.61264,33.27918],[35.67429,33.30627],[35.70785,33.34269],[35.75363,33.35091],[35.81509,33.3392],[35.91531,32.9406],[35.80834,32.772],[35.77835,32.72446],[35.59491,32.62828],[35.5729,32.36541],[35.59461,32.21856],[35.55452,32.02901],[35.57225,31.75415],[35.48771,31.41951],[35.4209,31.25116],[35.47936,31.1783],[35.42771,30.95172],[35.3321,30.77107],[35.20709,30.53307],[35.17202,30.11204],[35.07514,29.83713],[35.02336,29.64569],[34.93992,29.39946],[34.89517,29.37711],[34.84785,29.59084],[34.69667,30.10714],[34.52423,30.40912],[34.48879,30.64515],[34.07929,31.52265],[34.64563,32.92073]]],terms_url:"https://israelhiking.osm.org.il/",terms_text:"Tiles © IsraelHiking, CC BY-SA-NC 3.0. Data by OpenStreetMap under ODbL.",description:"Israel Hiking map",icon:"https://israelhiking.osm.org.il/content/favicons/favicon.ico"},{id:"Israel_MTB",name:"Israel MTB",type:"tms",template:"https://israelhiking.osm.org.il/MTBTiles/{zoom}/{x}/{y}.png",scaleExtent:[7,16],polygon:[[[34.64563,32.92073],[34.98374,33.13352],[35.15662,33.09994],[35.31781,33.11463],[35.36541,33.06285],[35.46229,33.09994],[35.51741,33.12652],[35.5266,33.21531],[35.53893,33.25442],[35.56446,33.2969],[35.61264,33.27918],[35.67429,33.30627],[35.70785,33.34269],[35.75363,33.35091],[35.81509,33.3392],[35.91531,32.9406],[35.80834,32.772],[35.77835,32.72446],[35.59491,32.62828],[35.5729,32.36541],[35.59461,32.21856],[35.55452,32.02901],[35.57225,31.75415],[35.48771,31.41951],[35.4209,31.25116],[35.47936,31.1783],[35.42771,30.95172],[35.3321,30.77107],[35.20709,30.53307],[35.17202,30.11204],[35.07514,29.83713],[35.02336,29.64569],[34.93992,29.39946],[34.89517,29.37711],[34.84785,29.59084],[34.69667,30.10714],[34.52423,30.40912],[34.48879,30.64515],[34.07929,31.52265],[34.64563,32.92073]]],terms_url:"https://israelhiking.osm.org.il/",terms_text:"Tiles © IsraelHiking, CC BY-SA-NC 3.0. Data by OpenStreetMap under ODbL.",description:"Israel MTB map",icon:"https://israelhiking.osm.org.il/content/favicons/favicon.ico"},{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.9358,41.43834],[-1.89601,41.43869],[-1.89536,41.39687],[-1.9767,41.39616],[-1.97639,41.37623],[-2.06201,41.37548],[-2.06262,41.41471],[-2.10458,41.41434],[-2.10363,41.35367],[-2.14448,41.35331],[-2.1419,41.18683],[-2.06204,41.18753],[-2.06171,41.16624],[-2.02046,41.16661],[-2.01887,41.06334],[-2.10083,41.06262],[-2.10114,41.08296],[-2.22733,41.08185],[-2.22704,41.0635],[-2.26912,41.06313],[-2.2688,41.04257],[-2.35325,41.04182],[-2.35356,41.06148],[-2.39487,41.06112],[-2.39457,41.04206],[-2.43722,41.04168],[-2.43756,41.06315],[-2.47928,41.06278],[-2.47991,41.10369],[-2.52078,41.10333],[-2.5211,41.12429],[-2.60415,41.12357],[-2.60481,41.16628],[-2.6471,41.16591],[-2.64808,41.22931],[-2.72874,41.2286],[-2.72907,41.24974],[-2.89552,41.24828],[-2.89649,41.31063],[-2.9363,41.31028],[-2.93571,41.27231],[-3.14692,41.27046],[-3.14723,41.29045],[-3.22828,41.28974],[-3.22767,41.25008],[-3.39581,41.2486],[-3.39518,41.20808],[-3.43492,41.20773],[-3.43429,41.16696],[-3.47877,41.16657],[-3.47844,41.14556],[-3.60336,41.14446],[-3.6027,41.10169],[-3.64539,41.10131],[-3.64508,41.08159],[-3.68735,41.08122],[-3.68673,41.04104],[-3.72866,41.04067],[-3.72803,40.9998],[-3.76896,40.99944],[-3.76864,40.97886],[-3.85473,40.97811],[-3.8544,40.95653],[-3.89857,40.95615],[-3.89764,40.89575],[-3.93906,40.89539],[-3.93716,40.77204],[-4.06198,40.77093],[-4.06133,40.72926],[-4.10372,40.72888],[-4.10311,40.68918],[-4.14628,40.6888],[-4.14498,40.60421],[-4.19025,40.60381],[-4.18994,40.58362],[-4.22946,40.58327],[-4.22979,40.60487],[-4.27054,40.60451],[-4.26958,40.54211],[-4.31384,40.54171],[-4.31163,40.39758],[-4.39376,40.39685],[-4.39345,40.37677],[-4.43723,40.37638],[-4.43623,40.31123],[-4.52192,40.31046],[-4.52037,40.20897],[-4.56131,40.2086],[-4.56099,40.18763],[-4.68895,40.18649],[-4.68933,40.21101],[-4.73192,40.21063],[-4.73252,40.24966],[-4.76838,40.24934],[-4.76809,40.23035],[-4.81104,40.22996],[-4.81147,40.20726],[-4.8542,40.18414],[-4.85264,40.12563],[-4.93699,40.12488],[-4.93638,40.08529],[-5.35538,40.08155],[-5.35606,40.12562],[-5.44027,40.12487],[-5.44091,40.16673],[-5.60382,40.16527],[-5.60448,40.20881],[-5.68646,40.20808],[-5.68712,40.25131],[-6.02166,40.24834],[-6.02295,40.33257],[-6.10433,40.33184],[-6.1056,40.41451],[-6.18951,40.41376],[-6.19018,40.45745],[-6.26971,40.45675],[-6.26909,40.41653],[-6.35192,40.41579],[-6.35128,40.37422],[-6.43325,40.37349],[-6.43264,40.33361],[-6.52245,40.33281],[-6.52116,40.24849],[-6.59942,40.24779],[-6.59886,40.21128],[-6.85568,40.20899],[-6.85634,40.25257],[-6.93622,40.25186],[-6.93751,40.33657],[-6.85111,40.33734],[-6.86001,40.91672],[-6.93544,40.91605],[-6.93741,41.0435],[-6.85482,41.04423],[-6.85548,41.08706],[-6.77015,41.08781],[-6.77245,41.23623],[-6.68379,41.23701],[-6.60436,41.2377],[-6.60524,41.29474],[-6.5193,41.29549],[-6.51991,41.33479],[-6.43673,41.33552],[-6.43801,41.41814],[-6.35318,41.41888],[-6.35447,41.50141],[-6.26889,41.50216],[-6.2708,41.6245],[-6.35661,41.62375],[-6.35724,41.66401],[-6.43548,41.66333],[-6.4349,41.62651],[-6.52279,41.62575],[-6.52343,41.66635],[-6.6034,41.66565],[-6.60733,41.9166],[-7.02209,41.913],[-7.02406,42.03872],[-7.1054,42.03801],[-7.10613,42.08421],[-7.0208,42.08495],[-7.02276,42.2094],[-6.93699,42.21014],[-6.93763,42.25087],[-6.8548,42.25159],[-6.85545,42.29329],[-6.77342,42.294],[-6.77403,42.33244],[-6.85325,42.33176],[-6.85523,42.4569],[-7.10341,42.45477],[-7.10811,42.75115],[-7.02199,42.75189],[-7.02241,42.77825],[-6.93976,42.77896],[-6.94199,42.91962],[-6.77302,42.92106],[-6.77363,42.95958],[-6.52329,42.96172],[-6.52391,43.00095],[-6.43893,43.00167],[-6.44024,43.08361],[-5.93782,43.08789],[-5.93708,43.04189],[-5.85421,43.0426],[-5.85357,43.00258],[-5.77236,43.00327],[-5.77363,43.08308],[-5.6027,43.08453],[-5.60202,43.04222],[-5.52161,43.04291],[-5.52226,43.08409],[-5.4376,43.08481],[-5.43827,43.12651],[-5.10444,43.12935],[-5.10573,43.2099],[-5.02386,43.2106],[-5.02451,43.25117],[-4.90017,43.25222],[-4.89941,43.20501],[-4.81126,43.20576],[-4.80966,43.10538],[-4.76975,43.10571],[-4.76937,43.08168],[-4.72945,43.08202],[-4.72881,43.04219],[-4.56322,43.0436],[-4.56353,43.06296],[-4.39599,43.06438],[-4.39566,43.04336],[-4.3537,43.04371],[-4.35266,42.97836],[-4.23013,42.9794],[-4.22913,42.91625],[-4.18774,42.9166],[-4.18706,42.87407],[-4.10552,42.87476],[-4.10486,42.83348],[-3.97801,42.83457],[-3.97733,42.79214],[-3.9375,42.79248],[-3.93781,42.81183],[-3.85397,42.81254],[-3.85427,42.83193],[-3.89573,42.83158],[-3.89607,42.85343],[-3.93821,42.85307],[-3.93889,42.89577],[-3.9806,42.89542],[-3.98093,42.91627],[-4.0222,42.91591],[-4.0229,42.96014],[-3.97851,42.96052],[-3.97946,43.01999],[-3.93883,43.02034],[-3.93918,43.04239],[-3.89704,43.04275],[-3.89738,43.06414],[-3.85424,43.06451],[-3.8549,43.10583],[-3.77086,43.10654],[-3.77116,43.12515],[-3.72819,43.12551],[-3.72853,43.14656],[-3.68713,43.14691],[-3.68778,43.18786],[-3.60365,43.18858],[-3.60331,43.16747],[-3.52278,43.16815],[-3.52243,43.14619],[-3.39669,43.14726],[-3.39699,43.16601],[-3.35444,43.16637],[-3.35479,43.18837],[-3.31268,43.18873],[-3.31299,43.20828],[-3.22993,43.20899],[-3.22959,43.18768],[-3.10343,43.18875],[-3.10274,43.14562],[-3.14546,43.14526],[-3.14516,43.1271],[-3.10617,43.12743],[-3.10445,43.01915],[-3.02075,43.01987],[-3.0201,42.97903],[-2.9811,42.97936],[-2.97977,42.8958],[-3.10476,42.89473],[-3.10276,42.76928],[-3.02199,42.76997],[-3.02168,42.74983],[-2.98024,42.75019],[-2.97988,42.7275],[-2.89613,42.72822],[-2.89679,42.76967],[-2.8534,42.77004],[-2.85405,42.81087],[-2.68577,42.81231],[-2.68544,42.79159],[-2.64523,42.79194],[-2.64489,42.77024],[-2.52005,42.7713],[-2.51936,42.72827],[-2.5607,42.72791],[-2.56038,42.7076],[-2.51944,42.70795],[-2.5181,42.62357],[-2.60404,42.62283],[-2.60439,42.64497],[-2.77154,42.64353],[-2.77188,42.66544],[-2.81176,42.6651],[-2.8121,42.68624],[-2.85469,42.68588],[-2.85337,42.60302],[-2.89413,42.60267],[-2.89379,42.58159],[-3.0619,42.58015],[-3.06031,42.47952],[-3.02191,42.47985],[-3.0199,42.3525],[-3.06255,42.35213],[-3.06029,42.20906],[-3.1012,42.20871],[-3.10086,42.18682],[-3.06175,42.18716],[-3.0611,42.14559],[-3.02029,42.14594],[-3.01963,42.10375],[-2.89602,42.10482],[-2.89501,42.04071],[-2.81222,42.04143],[-2.81353,42.1246],[-2.76871,42.12499],[-2.76905,42.14674],[-2.72695,42.14711],[-2.7266,42.12485],[-2.68706,42.12519],[-2.68605,42.06109],[-2.72804,42.06073],[-2.72739,42.0193],[-2.60343,42.02037],[-2.60376,42.04135],[-2.561,42.04173],[-2.56198,42.10411],[-2.52266,42.10445],[-2.52299,42.12577],[-2.47933,42.12615],[-2.47963,42.145],[-2.35517,42.14608],[-2.3555,42.16747],[-2.31184,42.16785],[-2.3115,42.14605],[-2.2699,42.14641],[-2.26924,42.1048],[-2.2295,42.10515],[-2.22981,42.12514],[-2.14467,42.12587],[-2.14432,42.10386],[-2.10385,42.10421],[-2.10156,41.95811],[-1.97689,41.95919],[-1.97655,41.93765],[-1.93473,41.93801],[-1.93504,41.95776],[-1.89453,41.95811],[-1.89483,41.97715],[-1.854,41.97751],[-1.85304,41.91638],[-1.81381,41.91672],[-1.81151,41.76984],[-1.7706,41.77019],[-1.76866,41.64582],[-1.85335,41.64508],[-1.85305,41.62567],[-1.89471,41.6253],[-1.89403,41.58215],[-1.97716,41.58142],[-1.97683,41.56021],[-1.9377,41.56055],[-1.9358,41.43834]]],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:[[[130.35021,31.45741],[130.26851,31.45817],[130.20875,31.44939],[130.1002,31.44996],[130.09237,31.3919],[130.13355,31.37528],[130.35043,31.37528],[130.35021,31.45741]],[[130.4193,31.41715],[130.417,31.41672],[130.41677,31.47525],[130.34179,31.47506],[130.34179,31.48374],[130.33362,31.48374],[130.33329,31.50044],[130.36675,31.49997],[130.36664,31.52458],[130.35019,31.52544],[130.35041,31.54986],[130.32523,31.55024],[130.32501,31.60029],[130.31661,31.63336],[130.31634,31.65084],[130.3752,31.65084],[130.31164,31.67599],[130.29194,31.69179],[130.29105,31.73235],[130.2521,31.73387],[130.24986,31.71693],[130.24427,31.71712],[130.21629,31.75804],[130.17533,31.75919],[130.17422,31.78259],[130.18384,31.79096],[130.23644,31.79096],[130.26911,31.77003],[130.36334,31.75785],[130.42668,31.70893],[130.62409,31.7076],[130.62588,31.68627],[130.61088,31.62245],[130.55582,31.50249],[130.54239,31.41715],[130.42158,31.41715],[130.4193,31.41715]],[[130.52516,31.24184],[130.54441,31.24107],[130.56858,31.21715],[130.59924,31.21657],[130.59924,31.26633],[130.57641,31.26633],[130.57351,31.31625],[130.6308,31.28393],[130.68989,31.27666],[130.66706,31.26059],[130.66594,31.21925],[130.64401,31.18135],[130.59007,31.14688],[130.54239,31.17503],[130.54239,31.1913],[130.50009,31.19207],[130.50009,31.21581],[130.52494,31.21715],[130.52516,31.24184]],[[130.74987,31.16622],[130.74965,31.24107],[130.77449,31.25887],[130.77718,31.33307],[130.75122,31.37455],[130.74898,31.41658],[130.67557,31.46852],[130.67489,31.50077],[131.40006,31.5002],[131.40834,31.45916],[131.36694,31.40932],[131.3656,31.35142],[131.31703,31.34206],[131.29957,31.36595],[131.24317,31.36633],[131.19952,31.43358],[131.14782,31.45019],[131.13394,31.45],[131.1326,31.42899],[131.10059,31.42536],[131.05091,31.41639],[131.04912,31.39155],[131.08403,31.35085],[131.11626,31.35085],[131.11783,31.33422],[130.99943,31.33365],[130.99965,31.25102],[130.87521,31.25064],[130.87454,31.16679],[130.74987,31.16622]],[[130.86625,30.47468],[130.86602,30.49937],[130.93362,30.57493],[130.93227,30.61597],[131.00636,30.61655],[131.04933,30.59112],[131.04933,30.54275],[130.99203,30.50843],[130.99114,30.47526],[130.86625,30.47468]],[[137.87486,36.37519],[138.00005,36.37494],[138.00005,36.30839],[138.04159,36.30827],[138.04191,36.29175],[138.08306,36.29162],[138.08353,36.2499],[138.13307,36.24996],[138.13354,36.16677],[138.16654,36.1667],[138.16694,36.12485],[138.04167,36.12491],[138.04144,36.04158],[137.87479,36.04152],[137.87486,36.37519]],[[138.37446,35.83393],[138.4998,35.83285],[138.4998,35.75042],[138.74936,35.7506],[138.7507,35.58332],[138.62447,35.58386],[138.62536,35.49991],[138.37491,35.49972],[138.37446,35.83393]],[[135.79179,35.64165],[135.8006,35.64923],[135.834,35.65052],[135.8916,35.62003],[135.89271,35.6091],[135.95776,35.60858],[135.9834,35.6172],[135.98435,35.641],[135.95095,35.6419],[135.95048,35.68305],[135.94225,35.69204],[135.94178,35.73239],[136.00809,35.77516],[136.03167,35.77503],[136.05018,35.75012],[136.05003,35.66646],[136.0084,35.65836],[136.00856,35.61694],[136.03404,35.60022],[136.06664,35.59996],[136.06617,35.61656],[136.1002,35.62492],[136.1002,35.69127],[136.07598,35.69166],[136.07503,35.74922],[136.08342,35.76694],[136.12441,35.76605],[136.15021,35.7004],[136.15875,35.64216],[136.17442,35.62492],[136.17553,35.58342],[136.1749,35.55813],[136.15859,35.55832],[136.15875,35.56701],[136.1165,35.56675],[136.11626,35.52555],[136.04045,35.5247],[136.01684,35.50311],[136.01661,35.48334],[135.97543,35.48334],[135.94141,35.50885],[135.94186,35.56641],[135.93358,35.57487],[135.90873,35.57514],[135.90851,35.59953],[135.83185,35.59972],[135.7928,35.62519],[135.79179,35.64165]],[[135.80916,35.47505],[135.77044,35.53345],[135.7579,35.53326],[135.74168,35.51641],[135.70072,35.51705],[135.67464,35.53363],[135.67543,35.56659],[135.6996,35.58333],[135.81654,35.58343],[135.81654,35.56804],[135.85817,35.54956],[135.85851,35.52543],[135.8509,35.5247],[135.85012,35.47514],[135.80916,35.47505]],[[135.58333,35.44132],[135.61656,35.44989],[135.64163,35.47496],[135.71639,35.47478],[135.71728,35.46703],[135.81442,35.46539],[135.86668,35.44187],[135.86679,35.40868],[135.81722,35.40822],[135.81677,35.38496],[135.77548,35.3835],[135.75835,35.40804],[135.59183,35.4084],[135.58322,35.42536],[135.58333,35.44132]],[[135.40011,35.43312],[135.42496,35.44189],[135.45803,35.45008],[135.45899,35.49164],[135.46642,35.49184],[135.46619,35.50807],[135.44181,35.51709],[135.43968,35.53293],[135.45843,35.55804],[135.52324,35.55811],[135.52498,35.5091],[135.54152,35.50008],[135.54152,35.4834],[135.57515,35.48366],[135.57491,35.49164],[135.60878,35.49171],[135.60894,35.46684],[135.59208,35.45826],[135.53305,35.45826],[135.50029,35.45008],[135.50045,35.4415],[135.50789,35.42506],[135.53337,35.42513],[135.53297,35.38346],[135.5416,35.38333],[135.54176,35.36688],[135.5086,35.35836],[135.50892,35.34216],[135.50013,35.34164],[135.50013,35.41662],[135.39987,35.41655],[135.40011,35.43312]],[[133.70822,35.45816],[133.70822,35.33319],[133.12484,35.33328],[133.12495,35.3749],[132.95877,35.37508],[132.95821,35.4578],[132.87506,35.45853],[132.87461,35.52504],[132.95015,35.52522],[132.9497,35.55819],[133.01674,35.55855],[133.01685,35.56675],[133.03352,35.56693],[133.03308,35.59205],[133.06687,35.59187],[133.06654,35.6168],[133.14135,35.61671],[133.14151,35.59181],[133.36667,35.59186],[133.36689,35.57484],[133.34216,35.57447],[133.34194,35.558],[133.33321,35.55026],[133.28363,35.55017],[133.28341,35.49178],[133.33354,35.4916],[133.33354,35.47529],[133.41714,35.47492],[133.41714,35.37516],[133.49995,35.37534],[133.49973,35.45806],[133.45854,35.45806],[133.45854,35.51629],[133.49212,35.5335],[133.54136,35.54161],[133.58343,35.54197],[133.58355,35.45843],[133.70822,35.45816]],[[133.84174,35.46646],[133.84158,35.58367],[133.975,35.58329],[133.97532,35.5086],[134.00823,35.50834],[134.0334,35.49971],[134.0421,35.47497],[134.04432,35.45834],[134.08357,35.4586],[134.08309,35.53359],[134.13326,35.54969],[134.23328,35.55999],[134.27491,35.58342],[134.33299,35.58367],[134.33521,35.49172],[134.36654,35.49224],[134.36654,35.49997],[134.41718,35.49971],[134.41592,35.5417],[134.6253,35.54157],[134.62514,35.37554],[134.70839,35.37463],[134.70823,35.33398],[134.41655,35.33359],[134.41592,35.37528],[134.39218,35.37541],[134.39155,35.35011],[134.37477,35.33346],[134.20005,35.33359],[134.19939,35.35874],[134.24997,35.39971],[134.27515,35.39962],[134.27504,35.39205],[134.35819,35.39314],[134.35852,35.3999],[134.3752,35.39999],[134.37441,35.42489],[134.33256,35.42507],[134.33278,35.41659],[134.04954,35.41659],[134.05077,35.39178],[134.0661,35.39187],[134.06711,35.39999],[134.14187,35.40017],[134.14164,35.36678],[134.18339,35.35847],[134.18372,35.33337],[133.78309,35.33364],[133.78331,35.34159],[133.82472,35.3592],[133.82505,35.38311],[133.84173,35.40838],[133.89981,35.40893],[133.89981,35.41677],[133.85829,35.41659],[133.8574,35.46646],[133.84174,35.46646]],[[133.24987,33.66667],[133.41786,33.66674],[133.52485,33.66674],[133.52493,33.79178],[133.64157,33.79185],[133.64188,33.66681],[133.75006,33.66687],[133.75029,33.62517],[133.79152,33.62498],[133.79168,33.5084],[133.73336,33.5084],[133.73328,33.51658],[133.64196,33.51671],[133.60833,33.48346],[133.52493,33.46682],[133.47492,33.41935],[133.43313,33.38321],[133.37497,33.38334],[133.37497,33.49157],[133.20817,33.49191],[133.20824,33.55827],[133.24947,33.55833],[133.24987,33.66667]],[[134.3501,33.73355],[134.4832,33.73368],[134.48336,33.66732],[134.43366,33.65033],[134.43287,33.63412],[134.35279,33.63347],[134.3501,33.73355]],[[140.31656,36.21656],[140.31671,36.44984],[140.34973,36.44994],[140.35012,36.51668],[140.47467,36.51671],[140.47483,36.59159],[140.62489,36.59204],[140.62467,36.63354],[140.64974,36.6348],[140.65041,36.71684],[140.69912,36.81554],[140.71006,36.91306],[140.70838,36.95687],[140.74956,36.95866],[140.75323,37.06176],[140.75001,37.16671],[141.00832,37.16666],[141.00837,37.0917],[140.98331,37.05828],[140.98333,36.95834],[140.90834,36.90002],[140.81672,36.89999],[140.80828,36.87498],[140.80833,36.85],[140.81655,36.85004],[140.81669,36.8415],[140.81669,36.81816],[140.79988,36.80832],[140.7834,36.79992],[140.775,36.79523],[140.77498,36.78339],[140.75836,36.775],[140.75825,36.75837],[140.75002,36.75831],[140.74689,36.71939],[140.73336,36.65048],[140.69167,36.58337],[140.65003,36.51336],[140.64998,36.38351],[140.59986,36.27483],[140.57499,36.24796],[140.57463,36.21729],[140.31656,36.21656]],[[141.2166,41.24992],[141.41662,41.24971],[141.39858,41.17052],[141.40426,41.0968],[141.39503,41.04046],[141.39858,40.97185],[141.40625,40.91003],[141.41136,40.83011],[141.41307,40.80204],[141.42245,40.74987],[141.34161,40.75084],[141.3149,40.74556],[141.29203,40.74169],[141.23322,40.7419],[141.23307,40.85837],[141.25026,40.85858],[141.24941,40.91647],[141.17412,40.9169],[141.22498,40.9948],[141.23819,41.0696],[141.2497,41.1258],[141.27143,41.15875],[141.23336,41.22995],[141.2166,41.24992]],[[141.25854,41.3166],[141.15015,41.31672],[141.1499,41.39163],[141.18877,41.39205],[141.21625,41.37916],[141.25849,41.36012],[141.25854,41.3166]],[[141.05841,45.2584],[141.03453,45.25833],[141.00874,45.25815],[141.0083,45.27495],[140.99994,45.27495],[141.00002,45.30371],[140.99999,45.30828],[140.99196,45.30846],[140.99171,45.34162],[140.98351,45.34172],[140.98336,45.34998],[140.97477,45.35008],[140.97502,45.3667],[140.96664,45.36675],[140.96685,45.39818],[140.9665,45.42499],[140.9584,45.42484],[140.95816,45.43314],[140.95012,45.4335],[140.94967,45.51651],[140.97443,45.51672],[140.97448,45.50014],[140.98307,45.50042],[140.98332,45.46697],[140.99045,45.46704],[140.99135,45.45876],[141.00019,45.45813],[141.00035,45.45002],[141.01627,45.4502],[141.01637,45.47496],[141.04992,45.47532],[141.04992,45.46676],[141.06614,45.46679],[141.0665,45.4502],[141.07463,45.44999],[141.07498,45.34178],[141.0666,45.34168],[141.06418,45.30611],[141.06644,45.30565],[141.06629,45.28484],[141.05906,45.28357],[141.05841,45.2584]],[[144.27488,42.96671],[144.27502,42.99155],[144.25861,42.99145],[144.25805,42.98314],[144.20818,42.98319],[144.20854,42.97472],[144.16684,42.97503],[144.16684,43.00496],[144.16642,43.04178],[144.07486,43.04188],[144.07493,43.10025],[144.24988,43.1],[144.24988,43.1168],[144.29179,43.11675],[144.292,43.0919],[144.4168,43.09185],[144.4168,43.1168],[144.56654,43.1168],[144.56675,42.99171],[144.50005,42.9915],[144.5002,42.92481],[144.46653,42.92501],[144.31739,42.96675],[144.27488,42.96671]],[[140.69973,42.57513],[140.70015,42.61647],[140.84451,42.61673],[140.99961,42.61669],[141.00006,42.54168],[141.24984,42.54168],[141.24994,42.58336],[141.29163,42.58332],[141.29158,42.6251],[141.37501,42.62498],[141.37501,42.66662],[141.49992,42.66666],[141.49992,42.8165],[141.47496,42.8165],[141.47511,42.83341],[141.81236,42.83357],[141.95752,42.83328],[141.94355,42.77977],[141.95762,42.77896],[141.95832,42.7502],[141.99991,42.75086],[141.9992,42.71493],[142.00031,42.67632],[142.01799,42.65076],[142.09082,42.65002],[142.09122,42.5251],[142.02472,42.5251],[141.96033,42.52495],[141.8665,42.52518],[141.8656,42.57713],[141.83577,42.58519],[141.80482,42.57417],[141.74646,42.57705],[141.73069,42.61477],[141.61707,42.61055],[141.52134,42.60331],[141.45615,42.57587],[141.3562,42.52866],[141.27523,42.48822],[141.19507,42.43791],[141.10476,42.3914],[141.05393,42.33165],[141.0254,42.29161],[140.95187,42.29146],[140.9147,42.32682],[140.89451,42.37174],[140.88426,42.42723],[140.85041,42.46096],[140.76643,42.49978],[140.76663,42.52821],[140.69973,42.57513]],[[140.75005,43.23374],[140.82762,43.2135],[140.88245,43.22531],[140.97338,43.24601],[141.02139,43.24311],[141.04213,43.20211],[141.08346,43.18205],[141.17267,43.16382],[141.25678,43.19366],[141.37528,43.33327],[141.62491,43.33335],[141.62451,43.4168],[141.79146,43.4168],[141.79197,43.83339],[142.12487,43.83332],[142.12487,43.75022],[142.16656,43.74993],[142.16656,43.83317],[142.24954,43.83325],[142.24984,43.8581],[142.27465,43.8581],[142.27465,43.87425],[142.26671,43.8749],[142.26651,43.91688],[142.24994,43.9171],[142.25001,44.5],[142.49997,44.50013],[142.49977,43.88366],[142.51674,43.88344],[142.51644,43.83346],[142.62473,43.83346],[142.62473,43.58331],[142.54176,43.58403],[142.54196,43.50008],[142.50057,43.50022],[142.50037,43.25006],[142.25054,43.25014],[142.25004,43.45838],[142.00031,43.45816],[142.00001,43.41724],[141.91703,43.41688],[141.91703,43.33342],[141.87494,43.33327],[141.87454,43.17487],[141.93351,43.17473],[141.93391,43.15868],[141.99137,43.15802],[141.99207,43.1334],[141.87524,43.13332],[141.87484,43.00012],[141.49984,43.00027],[141.50015,42.91683],[141.25021,42.91631],[141.25001,42.9999],[141.12505,43.00005],[141.12525,43.08323],[140.99988,43.0836],[141.00008,43.16638],[140.75086,43.1666],[140.75005,43.23374]],[[140.59121,41.78353],[140.58382,41.8334],[140.58453,41.87732],[140.59092,41.91613],[140.60797,41.94403],[140.57544,41.95914],[140.58439,41.99979],[140.7104,42.00011],[140.86894,42.00011],[140.91724,42.00053],[140.99041,41.91909],[141.04737,41.90693],[141.12722,41.88398],[141.17552,41.83732],[141.20194,41.81488],[141.18418,41.78321],[141.11301,41.76711],[141.05689,41.71559],[140.99382,41.69968],[140.94267,41.70414],[140.89238,41.73563],[140.84806,41.74326],[140.80018,41.75672],[140.73299,41.74634],[140.69705,41.73234],[140.6881,41.76986],[140.59121,41.78353]],[[140.2418,42.2338],[140.24159,42.25827],[140.21005,42.25797],[140.20804,42.27485],[140.26611,42.27514],[140.2651,42.29179],[140.29001,42.2912],[140.29182,42.26779],[140.33914,42.24139],[140.34145,42.21662],[140.29323,42.21662],[140.2418,42.2338]],[[140.55007,42.08447],[140.54977,42.11387],[140.58066,42.11193],[140.62636,42.12069],[140.63365,42.12136],[140.6336,42.10061],[140.60853,42.09964],[140.60848,42.08327],[140.54972,42.08312],[140.55007,42.08447]],[[140.6583,41.06668],[140.67117,40.91974],[140.84492,40.91652],[140.91726,40.91688],[140.91712,40.87597],[140.9846,40.87533],[140.98503,40.79278],[141.13391,40.79192],[141.13972,40.68034],[141.17424,40.68174],[141.18504,40.60057],[141.43351,40.60078],[141.43308,40.51757],[141.18305,40.51649],[141.18362,40.58223],[141.16714,40.59172],[141.04397,40.59237],[141.04283,40.65825],[140.98402,40.65836],[140.72646,40.65857],[140.72589,40.57521],[140.66849,40.57467],[140.60883,40.57489],[140.60925,40.48311],[140.55058,40.483],[140.54888,40.51757],[140.40028,40.51692],[140.40013,40.5832],[140.25665,40.58233],[140.24898,40.63292],[140.33251,40.63292],[140.33251,40.66687],[140.41676,40.66698],[140.41704,40.73311],[140.33194,40.73375],[140.33351,40.75851],[140.28421,40.75818],[140.28037,40.85679],[140.30254,40.98507],[140.31845,41.00019],[140.42443,41.0004],[140.42443,40.90029],[140.55044,40.89975],[140.54994,41.06668],[140.6583,41.06668]],[[140.01669,40.33381],[140.25252,40.33381],[140.25006,39.33298],[139.98341,39.3332],[140.05622,39.72433],[140.00614,39.77043],[139.94073,39.88023],[139.94158,40.01081],[139.94055,40.08509],[139.94116,40.10876],[140.01669,40.33381]],[[139.85814,39.04176],[139.87552,39.04137],[139.87703,39.00009],[139.91671,39.00001],[139.9167,38.79173],[139.75493,38.79165],[139.7502,38.79386],[139.79376,38.89687],[139.79014,38.9254],[139.83615,38.99102],[139.85814,39.04176]],[[139.37551,38.1174],[139.38053,37.95893],[139.417,37.95845],[139.417,37.87413],[139.37571,37.8746],[139.37611,37.83296],[139.29234,37.83145],[139.30007,37.78074],[139.29173,37.68357],[139.29193,37.66473],[139.22935,37.6594],[139.18113,37.61024],[139.14537,37.60769],[139.12367,37.62671],[139.09816,37.65018],[139.08831,37.6664],[138.99951,37.66656],[138.99942,37.79171],[138.81261,37.79199],[138.86834,37.84689],[138.9915,37.91333],[139.08231,37.9775],[139.27679,38.03417],[139.37551,38.1174]],[[139.96008,38.49993],[140.50033,38.50009],[140.50023,38.16654],[140.37496,38.16654],[140.37536,38.08348],[140.2504,38.08293],[140.21705,38.07407],[140.22136,38.0422],[140.2512,38.04196],[140.2504,38.00017],[140.23372,37.99962],[140.23352,37.94197],[140.20861,37.9411],[140.20841,37.90013],[140.19253,37.89965],[140.19123,37.88372],[140.15838,37.883],[140.15828,37.85811],[140.0753,37.85945],[140.0741,37.87476],[140.05019,37.87571],[140.05019,37.89252],[140.05762,37.89355],[140.05813,37.92541],[140.0741,37.92573],[140.0742,37.94197],[140.09871,37.95369],[140.09821,37.99234],[140.10182,38.00041],[140.12282,38.00081],[140.11549,38.01806],[140.08977,38.02795],[140.0747,38.04133],[140.06727,38.03492],[140.06707,37.99186],[140.01634,37.9917],[140.01584,38.066],[139.99805,38.06656],[139.99966,38.13739],[139.99956,38.17514],[139.99795,38.3337],[139.95787,38.33378],[139.95837,38.50028],[139.96008,38.49993]],[[140.70822,38.7833],[140.70837,39.15023],[141.04194,39.14957],[141.04167,39.50008],[141.00147,39.49986],[140.99893,39.91638],[141.25077,39.91692],[141.25037,39.5007],[141.16709,39.50008],[141.16699,39.45627],[141.16669,39.40273],[141.16689,39.25073],[141.20798,39.24996],[141.20898,38.87471],[141.03399,38.8751],[141.03339,38.78354],[140.86794,38.78315],[140.70822,38.7833]],[[141.3759,38.36972],[141.37476,38.49992],[141.24904,38.50025],[141.25134,38.66886],[141.52524,38.66653],[141.54981,38.63369],[141.55052,38.55563],[141.55549,38.47938],[141.56558,38.39559],[141.54626,38.37398],[141.55919,38.32429],[141.59854,38.31226],[141.59527,38.26063],[141.50762,38.23664],[141.46983,38.24479],[141.39226,38.27725],[141.41158,38.34781],[141.3759,38.36972]],[[131.04175,33.7381],[131.0413,33.70887],[130.99956,33.70858],[131.00035,33.68392],[131.04959,33.68392],[131.05014,33.64171],[131.0751,33.64201],[131.07588,33.61683],[131.10039,33.61666],[131.10084,33.60082],[131.17448,33.60007],[131.19999,33.58422],[131.20066,33.55868],[131.2405,33.55868],[131.28258,33.54207],[131.33137,33.52528],[131.41821,33.55065],[131.51625,33.55084],[131.51692,33.5667],[131.63353,33.56688],[131.63308,33.47545],[131.7423,33.47452],[131.74946,33.45939],[131.75014,33.33289],[131.60756,33.33401],[131.60801,33.37421],[131.52565,33.37458],[131.52467,33.26691],[131.5769,33.25843],[131.64942,33.28332],[131.71634,33.28388],[131.77497,33.26687],[131.78385,33.25028],[131.83291,33.25015],[131.88403,33.2745],[131.90825,33.2749],[131.90809,33.25849],[131.87517,33.20607],[131.84985,33.18276],[131.85032,33.14964],[131.87525,33.15038],[131.90777,33.14129],[131.9171,33.13332],[131.91733,33.10858],[131.9505,33.09967],[131.95019,33.08349],[131.98279,33.08336],[131.98279,33.10007],[132.00036,33.1169],[132.0252,33.1169],[132.02473,33.0998],[132.00843,33.09172],[132.00843,33.06718],[132.01745,33.06705],[132.01715,33.04988],[131.99181,33.04211],[131.92518,33.04092],[131.9255,33.025],[131.95003,33.025],[131.95045,33.01347],[131.95034,32.97482],[131.98326,32.97536],[131.98492,32.95941],[132.0261,32.95922],[132.05828,32.95862],[132.05844,32.99142],[132.07198,32.9917],[132.08297,32.98332],[132.09168,32.92635],[132.02473,32.92542],[132.02473,32.90058],[132.03349,32.88294],[132.00795,32.88357],[131.98326,32.85871],[131.99988,32.8498],[132.01715,32.8429],[132.01603,32.82654],[131.97551,32.78396],[131.93411,32.76746],[131.8992,32.76614],[131.89179,32.71661],[131.83317,32.6507],[131.78369,32.64894],[131.78415,32.58396],[131.74185,32.58283],[131.7082,32.56669],[131.70773,32.54294],[131.74159,32.50852],[131.74141,32.45129],[131.70804,32.44216],[131.70112,32.40878],[131.65787,32.39219],[131.64226,32.33355],[131.59948,32.27572],[131.57492,32.18338],[131.54184,32.08474],[131.542,32.00009],[131.49975,32.00023],[131.50038,31.74971],[131.4586,31.75011],[131.45876,31.79182],[131.24969,31.79169],[131.24969,32.16704],[131.37488,32.16717],[131.37504,32.25046],[131.49991,32.25019],[131.49991,32.33341],[131.54137,32.33341],[131.54167,32.62506],[131.66645,32.62515],[131.66633,32.66662],[131.74993,32.66652],[131.75006,32.91664],[131.5977,32.91688],[131.25044,32.91663],[131.24902,33.00042],[131.49971,33.00002],[131.49987,33.06345],[131.50018,33.13915],[131.4804,33.16631],[131.284,33.16618],[131.26706,33.20035],[131.26627,33.25039],[131.29966,33.26985],[131.29951,33.31999],[131.24427,33.34114],[131.17511,33.34154],[131.17527,33.35806],[131.07525,33.35806],[131.07572,33.33347],[131.00055,33.33321],[131.00007,33.2496],[130.91445,33.2496],[130.7497,33.25013],[130.7497,33.08374],[130.62546,33.08321],[130.62546,33.00002],[130.72796,33.00171],[130.87492,33.00018],[130.8753,32.79131],[130.96677,32.79185],[130.96709,32.85808],[130.92531,32.85781],[130.92531,32.95029],[130.96679,32.95831],[131.00012,32.91683],[131.00017,32.50007],[130.66647,32.50046],[130.66669,32.33306],[130.62506,32.33306],[130.62461,32.24943],[130.49972,32.25037],[130.50039,32.12517],[130.33275,32.12498],[130.3437,32.16133],[130.34954,32.20815],[130.42748,32.29423],[130.46637,32.40054],[130.4939,32.40073],[130.523,32.43304],[130.54941,32.44456],[130.54986,32.4659],[130.48383,32.46647],[130.47421,32.47535],[130.4751,32.50064],[130.5089,32.54197],[130.62439,32.62571],[130.62484,32.6666],[130.52569,32.66679],[130.52524,32.68337],[130.55859,32.71671],[130.55903,32.7745],[130.57493,32.78372],[130.57493,32.82172],[130.50935,32.84185],[130.50778,32.86986],[130.44155,32.89158],[130.41624,32.94258],[130.41579,32.97488],[130.37438,33.00098],[130.37528,33.08315],[130.24927,33.08372],[130.24905,33.16076],[130.15863,33.09741],[130.17775,33.07174],[130.18369,33.06684],[130.18369,33.03401],[130.19958,33.025],[130.19977,33.00001],[130.12479,33.00001],[130.12457,32.96678],[130.0409,32.9407],[130.02501,32.94164],[130.02456,32.91647],[130.12457,32.9172],[130.12457,32.86739],[130.15031,32.86683],[130.19578,32.8661],[130.23334,32.89183],[130.29198,32.89183],[130.29243,32.84991],[130.29153,32.7916],[130.2922,32.71725],[130.18343,32.65791],[130.15034,32.65002],[130.11539,32.64962],[130.11744,32.70014],[130.15903,32.71706],[130.24856,32.75867],[130.24968,32.79085],[130.1333,32.79235],[130.12569,32.76751],[130.00147,32.74963],[129.9294,32.67317],[129.80048,32.57459],[129.80003,32.54704],[129.77425,32.54749],[129.71767,32.54987],[129.71632,32.59043],[129.7499,32.67487],[129.75012,32.72459],[129.80025,32.72553],[129.74161,32.77523],[129.62411,32.8501],[129.62646,32.91787],[129.83159,32.91738],[129.87121,32.91644],[129.89269,32.94105],[129.93343,33.00827],[129.967,33.07469],[130.05809,33.12025],[130.05876,33.21693],[130.24946,33.21674],[130.2499,33.33331],[130.21566,33.3335],[130.0422,33.33331],[129.92559,33.33294],[129.90836,33.35837],[129.90791,33.38304],[129.86695,33.38285],[129.86697,33.36012],[129.83338,33.34079],[129.80093,33.34098],[129.80003,33.31592],[129.75057,33.31686],[129.75034,33.27533],[129.72572,33.27477],[129.6917,33.30807],[129.69237,33.25025],[129.87479,33.25025],[129.8759,33.21299],[129.87521,33.11856],[129.87523,33.03323],[129.80831,33.03305],[129.7499,33.05031],[129.734,33.058],[129.72658,33.08172],[129.69842,33.09982],[129.62413,33.09928],[129.62374,33.12377],[129.62501,33.24201],[129.59255,33.24108],[129.59255,33.29928],[129.54197,33.3004],[129.50012,33.31761],[129.49989,33.41686],[129.59949,33.41593],[129.66753,33.40864],[129.66775,33.43274],[129.8336,33.56656],[129.93208,33.56787],[129.93522,33.40827],[130.04131,33.3836],[130.04108,33.48428],[130.24901,33.48465],[130.25057,33.61681],[130.28504,33.63405],[130.28303,33.69151],[130.30888,33.69151],[130.32365,33.66712],[130.39225,33.69179],[130.41777,33.72484],[130.43388,33.77546],[130.39024,33.87047],[130.39113,33.92509],[130.50774,33.92621],[130.60555,33.89166],[130.66665,33.9496],[130.74991,34.00844],[130.84973,34.00825],[130.8504,34.14155],[130.88308,34.19192],[130.85801,34.27519],[130.83228,34.36706],[130.97127,34.45052],[131.08608,34.43336],[131.19307,34.44166],[131.29356,34.44092],[131.36518,34.44591],[131.37548,34.5328],[131.44934,34.55013],[131.57445,34.69176],[131.62526,34.69158],[131.78596,34.70078],[131.86989,34.77435],[131.99545,34.88146],[132.37594,35.16739],[132.74972,35.16684],[132.75084,35.08318],[132.6255,35.08337],[132.62505,34.91671],[132.3755,34.91689],[132.37527,34.83426],[132.12482,34.83298],[132.12482,34.75008],[132.00038,34.7499],[132.00038,34.5833],[131.74989,34.58326],[131.75139,34.37954],[131.75147,34.1671],[132.12497,34.16683],[132.12481,34.2914],[132.25016,34.29193],[132.24929,34.40917],[132.25016,34.49983],[132.37249,34.49996],[132.37503,34.58339],[132.49167,34.58339],[132.49182,34.70831],[132.59177,34.70824],[132.58365,34.5417],[132.84148,34.54133],[132.84193,34.66623],[133.08343,34.66678],[133.08365,34.76631],[133.20743,34.76687],[133.20787,34.66678],[133.49973,34.66642],[133.50026,34.83314],[133.7012,34.83357],[133.69941,34.87526],[133.74984,34.87535],[133.74984,34.9999],[133.8751,35.00003],[133.87518,35.12504],[133.97425,35.12517],[133.97546,35.00097],[134.0585,34.99997],[134.05816,35.07464],[134.16654,35.0748],[134.1667,35.00016],[134.75338,35.00016],[134.83324,34.99997],[134.8333,35.04176],[135.24494,35.04176],[135.37472,35.04153],[135.37535,35.0836],[135.74948,35.08335],[135.75066,35.25004],[135.87474,35.2503],[135.87529,35.33388],[136.00001,35.33356],[136.00024,35.2587],[135.98331,35.24255],[135.93361,35.20027],[135.93306,35.1667],[135.97539,35.16664],[135.97523,35.15597],[136.04993,35.15829],[136.04993,35.21663],[136.05895,35.22484],[136.12455,35.23344],[136.12536,35.25011],[136.16667,35.24997],[136.16651,35.36441],[136.16664,35.45873],[136.33347,35.45857],[136.37478,35.33382],[136.49981,35.33356],[136.49965,35.49981],[136.74991,35.58365],[137.00003,35.58344],[136.99984,35.41254],[136.99999,35.33351],[137.24995,35.33357],[137.24998,34.91665],[137.6249,34.91658],[137.62516,35.00034],[137.69186,35.00052],[137.69182,35.06711],[137.74199,35.06668],[137.74222,35.10789],[137.77489,35.10844],[137.77474,35.15015],[138.16671,35.15021],[138.16666,35.2918],[138.38224,35.29138],[138.50029,35.29187],[138.50119,35.33333],[138.38256,35.33369],[138.38319,35.44169],[138.49985,35.44208],[138.49988,35.4584],[138.66644,35.45855],[138.66704,35.37476],[138.70818,35.37519],[138.70818,35.33348],[138.8334,35.33357],[138.83329,35.40832],[139.0082,35.40836],[139.00858,35.39192],[139.1243,35.39228],[139.12498,35.41668],[139.25001,35.41667],[139.24995,35.49996],[139.12487,35.50005],[139.12492,35.5833],[138.99999,35.58333],[138.99999,35.6667],[139.1249,35.66678],[139.12504,35.8092],[139.12474,35.91713],[139.00053,35.91713],[139.00006,36.00001],[139.12492,36.00012],[139.12547,36.11894],[139.12495,36.16664],[139,36.16668],[138.99941,36.25031],[138.95831,36.25002],[138.95822,36.29127],[138.91663,36.29166],[138.91678,36.37496],[138.95845,36.37565],[138.95836,36.45832],[139.08379,36.45868],[139.08334,36.5],[139.25009,36.50012],[139.2496,36.54136],[139.37464,36.54189],[139.37505,36.62499],[139.45022,36.62528],[139.44999,36.66667],[139.66374,36.66671],[139.75002,36.66665],[139.75005,36.75003],[140,36.75001],[139.99998,36.62209],[140.00001,36.41668],[140.25001,36.41666],[140.24999,36.04158],[140.50004,36.04158],[140.49989,35.83349],[140.41632,35.83374],[140.4168,35.7919],[140.45874,35.79113],[140.45874,35.72461],[140.51666,35.72486],[140.51691,35.7417],[140.59144,35.74174],[140.5915,35.94177],[140.65002,35.94164],[140.64994,36.00837],[140.67503,36.00834],[140.71403,35.92326],[140.77327,35.83877],[140.81532,35.78508],[140.89133,35.7501],[140.89211,35.71717],[140.86632,35.67853],[140.80694,35.70622],[140.72767,35.6761],[140.68235,35.68891],[140.60194,35.63074],[140.48545,35.54409],[140.4095,35.42897],[140.40816,35.33353],[140.30722,35.33371],[140.30767,35.41748],[140.30946,35.45851],[140.20762,35.45905],[140.20829,35.37478],[140.12503,35.37478],[140.12436,35.33408],[140.29155,35.33316],[140.29245,35.20909],[140.31707,35.20836],[140.31662,35.18422],[140.35042,35.18257],[140.3431,35.13152],[140.23201,35.10096],[140.13697,35.09271],[140.05542,35.03643],[139.98865,34.98849],[139.96379,34.91688],[139.91222,34.88262],[139.82272,34.89218],[139.78337,34.93633],[139.73961,34.95322],[139.7443,34.99303],[139.81476,35.00932],[139.7963,35.05283],[139.80169,35.09108],[139.80766,35.1529],[139.80866,35.19667],[139.85153,35.24127],[139.8325,35.29189],[139.74927,35.2961],[139.76149,35.33517],[139.79232,35.35267],[139.81035,35.49933],[140.0035,35.49988],[140.03349,35.53668],[140.06639,35.58384],[139.79714,35.58311],[139.80005,35.50079],[139.77087,35.47343],[139.70992,35.44207],[139.6987,35.40282],[139.66887,35.36715],[139.68478,35.30781],[139.73549,35.2728],[139.75069,35.25934],[139.73734,35.23092],[139.74388,35.20852],[139.69714,35.18971],[139.67426,35.1702],[139.68932,35.15394],[139.68151,35.13477],[139.62355,35.12199],[139.59783,35.1285],[139.60224,35.17253],[139.58363,35.18959],[139.59033,35.24164],[139.5496,35.28403],[139.49879,35.30084],[139.42314,35.30942],[139.29131,35.30066],[139.23074,35.27778],[139.15546,35.23542],[139.15031,35.17507],[139.16665,35.13316],[139.12502,35.13298],[139.09436,35.13335],[139.05832,35.13316],[139.05671,35.00443],[139.03348,34.98385],[138.99968,34.98367],[139.00057,34.88274],[139.14136,34.88348],[139.11002,34.84602],[139.08129,34.79529],[139.01691,34.74107],[138.9999,34.64151],[138.90044,34.6097],[138.87367,34.59159],[138.80026,34.59988],[138.75773,34.65881],[138.72528,34.67575],[138.72528,34.72506],[138.83316,34.72598],[138.83383,34.74952],[138.7419,34.75106],[138.7338,34.8136],[138.74985,34.90057],[138.76065,34.93773],[138.75028,34.98313],[138.77855,35.04352],[138.87546,35.03316],[138.87703,35.04929],[138.85845,35.04984],[138.76804,35.12107],[138.68294,35.12223],[138.61873,35.09015],[138.55409,35.05201],[138.54926,34.99442],[138.49996,34.95392],[138.39142,34.91129],[138.35562,34.86759],[138.33929,34.80042],[138.27635,34.72246],[138.24467,34.66616],[138.24396,34.58503],[138.12662,34.58573],[138.01467,34.62561],[137.88184,34.65541],[137.79532,34.63718],[137.68991,34.65307],[137.57654,34.66441],[137.38135,34.64618],[137.18402,34.58409],[137.03187,34.5662],[137.00794,34.57573],[137.0254,34.61792],[137.0599,34.66613],[137.17517,34.66686],[137.30767,34.75996],[137.29894,34.77595],[137.29088,34.79231],[137.25037,34.79213],[137.21635,34.76768],[137.15816,34.74911],[137.08318,34.75076],[137.03215,34.76345],[136.94061,34.80848],[136.93456,34.77522],[136.98335,34.72575],[137.06751,34.74212],[137.06773,34.70183],[137.02454,34.70809],[137.01581,34.64937],[136.98179,34.65029],[136.82601,34.74911],[136.84884,34.82319],[136.79266,34.82521],[136.79132,35.00048],[136.75081,35.00012],[136.74991,34.95849],[136.68277,34.96069],[136.6624,34.89701],[136.59078,34.80003],[136.53863,34.72704],[136.58294,34.62506],[136.75682,34.54181],[136.85798,34.54126],[136.93945,34.54347],[136.91675,34.49231],[136.94081,34.46687],[136.94113,34.40866],[136.92404,34.35876],[136.90742,34.30209],[136.90045,34.2666],[136.84981,34.23416],[136.81693,34.1923],[136.79948,34.19254],[136.79996,34.22906],[136.74203,34.25863],[136.73325,34.28285],[136.70896,34.28334],[136.64264,34.25902],[136.5594,34.22605],[136.53564,34.22167],[136.50068,34.20864],[136.44007,34.20053],[136.38325,34.16675],[136.3334,34.14802],[136.31583,34.08487],[136.2674,34.08316],[136.12497,34.08343],[136.12449,34.16688],[136.24968,34.16688],[136.24984,34.25012],[136.37486,34.25025],[136.37468,34.33331],[136.50021,34.33302],[136.49973,34.49192],[136.45843,34.49127],[136.45811,34.5416],[136.4168,34.54186],[136.41664,34.62516],[136.37494,34.62464],[136.37469,34.68106],[136.37485,34.74974],[136.33402,34.75026],[136.33354,34.79109],[136.37485,34.79213],[136.37533,34.95858],[136.33323,34.95858],[136.33323,34.83345],[136.29239,34.83371],[136.29208,34.792],[136.24966,34.79213],[136.24998,34.70838],[136.29192,34.70851],[136.2916,34.62475],[136.12487,34.62512],[136.12498,34.66674],[136.04161,34.66655],[136.04094,34.7499],[136.00023,34.75009],[135.99991,34.65993],[135.99975,34.58387],[136.04153,34.58374],[136.04185,34.50017],[136.04989,34.49997],[136.05005,34.42503],[135.91674,34.425],[135.91667,34.35836],[135.81665,34.35837],[135.81661,34.31668],[135.74991,34.31672],[135.75007,34.29167],[135.64152,34.29176],[135.64186,34.27512],[135.53325,34.27489],[135.53348,34.25834],[135.475,34.25834],[135.47511,34.22498],[135.37507,34.22512],[135.3749,34.20814],[135.50001,34.20837],[135.50001,33.66652],[135.87502,33.66661],[135.87558,33.74983],[136.03371,33.75021],[136.01272,33.71062],[135.99681,33.67327],[135.97948,33.63389],[135.97195,33.61271],[135.95831,33.56798],[135.85332,33.50522],[135.85353,33.48302],[135.87591,33.4814],[135.86057,33.44051],[135.77718,33.42558],[135.7418,33.42534],[135.74163,33.4665],[135.68498,33.47915],[135.59008,33.49633],[135.47373,33.52819],[135.3902,33.5752],[135.37485,33.61633],[135.37533,33.64967],[135.33371,33.6498],[135.32468,33.66653],[135.45794,33.66666],[135.45842,33.74987],[135.41727,33.75],[135.41663,33.78802],[135.41743,33.83273],[135.37517,33.83326],[135.37517,33.79171],[135.3284,33.78999],[135.28777,33.75622],[135.21503,33.7698],[135.14371,33.85113],[135.12013,33.87826],[135.05776,33.87991],[135.05947,33.96479],[135.07709,34.00837],[135.11345,34.05029],[135.06515,34.06759],[135.07041,34.121],[135.15522,34.16286],[135.1163,34.18742],[135.06316,34.25849],[135.04915,34.27082],[134.99554,34.27152],[134.9955,34.29122],[134.99945,34.29894],[135.00904,34.30357],[135.1457,34.34721],[135.20804,34.35108],[135.24174,34.39165],[135.19145,34.42482],[135.25012,34.46056],[135.29487,34.42658],[135.30902,34.44119],[135.36647,34.53277],[135.39147,34.53394],[135.38308,34.63128],[135.36409,34.66669],[135.29161,34.66695],[135.29061,34.6245],[135.08349,34.62463],[135.04725,34.61643],[134.92905,34.64799],[134.826,34.69662],[134.75874,34.74267],[134.71632,34.74982],[134.52561,34.74969],[134.41657,34.70885],[134.31671,34.66669],[134.25055,34.66656],[134.24992,34.68309],[134.15797,34.68348],[134.15781,34.70013],[134.12505,34.7],[134.12474,34.58386],[134.11666,34.55845],[134.02519,34.55024],[134.02535,34.44785],[134.02788,34.41639],[134.19168,34.41678],[134.19152,34.38401],[134.28347,34.38296],[134.28347,34.33371],[134.38082,34.29415],[134.40952,34.26539],[134.43268,34.24648],[134.56265,34.25055],[134.66663,34.24963],[134.64146,34.04963],[134.70809,33.96554],[134.74006,33.92825],[134.71221,33.86773],[134.76918,33.86691],[134.76712,33.82524],[134.66742,33.7754],[134.63102,33.77487],[134.50018,33.77493],[134.49978,33.95855],[134.4582,33.95874],[134.45816,34.00006],[134.34679,33.99889],[134.06047,33.99988],[133.74955,34.00047],[133.74998,34.33337],[133.875,34.33342],[133.87494,34.41668],[133.95888,34.41683],[133.95843,34.44157],[133.85055,34.44157],[133.84966,34.46621],[133.82537,34.46704],[133.81642,34.44222],[133.84205,34.43326],[133.84194,34.41656],[133.75822,34.41715],[133.74122,34.44175],[133.6913,34.44152],[133.69085,34.45739],[133.69097,34.46639],[133.70004,34.48346],[133.61655,34.48355],[133.61689,34.45827],[133.53351,34.45887],[133.53329,34.41752],[133.4897,34.41743],[133.46642,34.43313],[133.46631,34.44992],[133.4503,34.45002],[133.45008,34.4166],[133.41713,34.41696],[133.41668,34.35786],[133.34174,34.3583],[133.30304,34.37515],[133.2748,34.35876],[133.21655,34.35],[133.16694,34.35007],[133.16662,34.36659],[133.09184,34.36659],[133.09176,34.3417],[133.05837,34.34164],[133.05829,34.32491],[132.90003,34.32517],[132.89148,34.29164],[132.7917,34.29164],[132.79133,34.28281],[132.792,34.24212],[132.77492,34.22513],[132.71629,34.22499],[132.71652,34.21655],[132.75854,34.21636],[132.775,34.20877],[132.79218,34.20095],[132.79223,34.14177],[132.74138,34.14173],[132.70838,34.16655],[132.63354,34.16665],[132.61664,34.1917],[132.59185,34.1916],[132.5749,34.1666],[132.54155,34.16674],[132.54178,34.14196],[132.42515,34.14165],[132.42503,34.16657],[132.3749,34.16663],[132.37515,34.18348],[132.40833,34.18343],[132.3752,34.2168],[132.34991,34.23331],[132.35014,34.25834],[132.35814,34.25843],[132.35819,34.27503],[132.33922,34.25834],[132.29166,34.22494],[132.24992,34.22494],[132.25003,34.2043],[132.25809,34.18324],[132.28327,34.18352],[132.28321,34.19995],[132.29183,34.20837],[132.32501,34.20847],[132.31684,34.1753],[132.25843,34.17533],[132.25843,34.14171],[132.2502,34.11675],[132.21669,34.11684],[132.21685,34.0585],[132.22491,34.05827],[132.22502,33.99163],[132.21669,33.99177],[132.21652,33.97516],[132.25037,33.97526],[132.25014,33.91622],[131.95761,33.91733],[131.95783,33.92512],[131.91755,33.92495],[131.91586,33.95863],[131.88699,33.96671],[131.87569,33.95891],[131.84973,33.92502],[131.80049,33.92439],[131.79948,33.95046],[131.7752,33.95057],[131.75058,33.9668],[131.70828,33.97508],[131.70918,33.92551],[131.68366,33.92513],[131.68321,33.95056],[131.6916,33.96717],[131.69988,33.98323],[131.68332,33.99937],[131.68354,34.01681],[131.69999,34.017],[131.70011,34.03314],[131.68209,34.03352],[131.67515,34.02581],[131.62513,34.02488],[131.59122,33.97515],[131.38721,33.97497],[131.29981,33.91685],[131.16675,33.91667],[131.1172,33.97473],[131.06078,34.02462],[131.03349,34.02557],[131.04198,34.00848],[131.04175,33.7381]],[[135.98583,35.86595],[135.93905,35.95517],[135.95723,36.1316],[136.15271,36.29666],[136.6596,36.75695],[136.65846,37.00603],[136.66642,37.33477],[136.85167,37.42328],[137.11307,37.5288],[137.31877,37.54953],[137.39151,37.50356],[137.34765,37.35791],[137.20218,37.24762],[137.09307,37.06828],[137.0223,36.83795],[137.09532,36.80133],[137.22971,36.77368],[137.35387,36.80451],[137.39706,36.90966],[137.50588,36.95883],[137.72267,37.01579],[137.95199,37.10656],[138.053,37.16975],[138.18626,37.18254],[138.28854,37.24861],[138.43501,37.34512],[138.54909,37.41229],[138.61842,37.49225],[138.73903,37.51536],[138.78378,37.5674],[138.82185,37.62796],[138.91491,37.63009],[138.924,37.6032],[139.01321,37.59757],[139.01421,37.53507],[139.03452,37.52325],[139.03793,37.45798],[139.04887,37.42358],[139.13027,37.42312],[139.23881,37.4326],[139.26282,37.33326],[139.12289,37.32784],[139.11408,37.26354],[139.11422,37.16748],[139.05555,37.16658],[138.82825,37.17133],[138.87072,37.2338],[138.89104,37.31316],[138.72965,37.33259],[138.71403,37.29474],[138.71715,37.1642],[138.53517,37.16533],[138.39907,37.16692],[138.37478,37.13261],[138.3725,36.99907],[138.08823,36.99839],[138.08596,36.91586],[137.89233,36.91768],[137.87798,36.83517],[137.66517,36.8321],[137.52111,36.83142],[137.51216,36.74222],[137.39482,36.74427],[137.37138,36.58325],[137.29367,36.58371],[137.18016,36.55028],[137.21383,36.53133],[137.26384,36.33176],[136.63321,36.33496],[136.50436,36.29227],[136.39412,36.29444],[136.38034,36.25493],[136.37778,36.17665],[136.38218,36.09507],[136.38758,36.00065],[136.2593,35.99399],[136.25532,35.90923],[136.24992,35.83337],[136.12207,35.82876],[136.11184,35.88725],[136.05984,35.91165],[136.01793,35.86676],[135.98583,35.86595]],[[140.03281,37.29986],[140.03344,37.34643],[140.03344,37.47427],[140.03407,37.48281],[139.99973,37.48356],[140.00036,37.44198],[139.94212,37.44173],[139.94197,37.35007],[139.89116,37.35007],[139.89116,37.41698],[139.81725,37.41647],[139.81266,37.57468],[139.74192,37.57556],[139.74224,37.79174],[139.81789,37.79162],[139.98296,37.79112],[139.98359,37.58334],[140.0412,37.58334],[140.04151,37.47502],[140.1591,37.47528],[140.15815,37.63311],[140.3745,37.63399],[140.37481,37.83338],[140.5,37.83525],[140.49989,37.91662],[140.53144,37.9168],[140.62489,37.9167],[140.62489,37.84641],[140.62534,37.33359],[140.57502,37.33284],[140.57486,37.25881],[140.4579,37.25855],[140.45774,37.2084],[140.2501,37.20866],[140.24994,37.29998],[140.03281,37.29986]],[[141.00075,38.16707],[140.84264,38.16752],[140.68779,38.16405],[140.70788,38.09499],[140.70868,38.03346],[140.61627,38.03362],[140.53369,38.11364],[140.5359,38.14478],[140.61948,38.14478],[140.62471,38.2048],[140.6231,38.27376],[140.63073,38.33902],[140.81255,38.33698],[141.00362,38.33398],[141.00075,38.16707]],[[129.44454,34.73675],[129.52524,34.65452],[129.35703,34.19046],[129.23088,34.06063],[129.15132,34.11616],[129.27179,34.63488],[129.44454,34.73675]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan"},{id:"gsi.go.jp_std_map",name:"Japan GSI Standard Map",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/std/{zoom}/{x}/{y}.png",scaleExtent:[5,18],polygon:[[[141.85547,44.64912],[140.22949,43.9691],[138.95508,41.80408],[139.48242,40.17887],[138.86719,38.30718],[136.31836,37.19533],[132.14355,35.13788],[128.93555,33.35806],[129.50684,32.4727],[129.77051,31.69078],[130.20996,30.90223],[131.2207,30.78904],[131.66016,32.32428],[132.71484,32.87959],[133.76953,33.17434],[136.75781,33.87042],[139.30664,35.06597],[140.88867,35.17381],[141.15234,36.5626],[142.11914,39.94344],[141.76758,42.68243],[141.85547,44.64912]]],terms_url:"https://maps.gsi.go.jp/help/use.html",terms_text:"GSI Japan"},{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.09602,47.57882],[8.10323,47.57879],[8.10323,47.58583],[8.10591,47.58732],[8.11019,47.58878],[8.11589,47.5893],[8.12168,47.58916],[8.12546,47.58873],[8.12959,47.58888],[8.13023,47.59122],[8.132,47.59358],[8.13506,47.59546],[8.13831,47.59698],[8.14161,47.59939],[8.14534,47.60076],[8.14961,47.60144],[8.15438,47.60127],[8.15751,47.60063],[8.16119,47.59914],[8.16255,47.59976],[8.16438,47.60148],[8.16653,47.60399],[8.17087,47.60673],[8.17608,47.60838],[8.17912,47.60868],[8.18153,47.6118],[8.18304,47.61489],[8.18498,47.6176],[8.18953,47.62151],[8.19212,47.62321],[8.22261,47.623],[8.22561,47.6212],[8.22849,47.61842],[8.22959,47.61621],[8.23008,47.61501],[8.23261,47.61686],[8.23657,47.61803],[8.24,47.61835],[8.24351,47.61783],[8.24749,47.61877],[8.25066,47.61988],[8.25708,47.6208],[8.26104,47.62069],[8.26491,47.61935],[8.26732,47.61769],[8.26902,47.61531],[8.27579,47.61702],[8.28106,47.61707],[8.28772,47.61626],[8.29421,47.61442],[8.29947,47.61221],[8.30311,47.60977],[8.30287,47.59447],[8.30438,47.59227],[8.30591,47.59109],[8.30791,47.59019],[8.31236,47.58917],[8.31655,47.58713],[8.32049,47.58436],[8.32598,47.57888],[8.32864,47.57716],[8.33219,47.57604],[8.33902,47.57577],[8.34702,47.57628],[8.35962,47.57552],[8.36475,47.57436],[8.37207,47.57377],[8.38002,47.57233],[8.38194,47.57496],[8.38387,47.57686],[8.38879,47.58027],[8.39232,47.58174],[8.39611,47.58247],[8.40013,47.58255],[8.40432,47.58158],[8.41158,47.57928],[8.418,47.57602],[8.42381,47.57452],[8.43039,47.57228],[8.43275,47.57035],[8.4336,47.56849],[8.43353,47.56669],[8.4319,47.56444],[8.4286,47.56217],[8.42575,47.56121],[8.4259,47.55854],[8.42498,47.55624],[8.42353,47.55469],[8.42296,47.5537],[8.4246,47.5517],[8.42492,47.54981],[8.42434,47.54836],[8.42539,47.54679],[8.425,47.54418],[8.4233,47.5422],[8.421,47.54106],[8.41832,47.54049],[8.41551,47.54062],[8.4139,47.53924],[8.41283,47.5372],[8.41194,47.53626],[8.41241,47.53415],[8.41185,47.53237],[8.41117,47.53158],[8.40143,47.53169],[8.40124,47.52443],[8.39936,47.5222],[8.39666,47.52082],[8.39385,47.51988],[8.39085,47.51973],[8.38877,47.52014],[8.38809,47.5146],[8.38551,47.51075],[8.38366,47.50944],[8.36776,47.50953],[8.36739,47.48709],[8.3751,47.48689],[8.37889,47.4853],[8.38196,47.48188],[8.38184,47.47521],[8.38328,47.47192],[8.38244,47.46879],[8.37943,47.46643],[8.37751,47.4659],[8.37787,47.46496],[8.38238,47.46423],[8.38671,47.46097],[8.39171,47.45743],[8.39315,47.45349],[8.39514,47.45031],[8.39418,47.44722],[8.39171,47.44535],[8.3896,47.44449],[8.38996,47.44339],[8.39111,47.4416],[8.39213,47.43924],[8.39339,47.4359],[8.39249,47.43411],[8.39369,47.43143],[8.39568,47.42854],[8.39959,47.42463],[8.39953,47.41954],[8.449,47.41897],[8.45369,47.41233],[8.45369,47.40451],[8.44858,47.39649],[8.40362,47.39685],[8.40483,47.39392],[8.4029,47.38903],[8.4035,47.38553],[8.40314,47.38304],[8.40483,47.37905],[8.40844,47.37575],[8.41379,47.37338],[8.4159,47.37016],[8.41584,47.36539],[8.4144,47.36327],[8.41494,47.35912],[8.41722,47.35573],[8.41632,47.35231],[8.41355,47.34913],[8.41367,47.34688],[8.41476,47.3448],[8.41885,47.34244],[8.42264,47.34052],[8.42469,47.33718],[8.42421,47.33163],[8.42914,47.33286],[8.4351,47.33192],[8.43763,47.33281],[8.44328,47.33506],[8.44527,47.33746],[8.45213,47.3402],[8.45761,47.33975],[8.46212,47.33649],[8.46278,47.33322],[8.46043,47.32829],[8.45797,47.32457],[8.45556,47.32005],[8.44918,47.31495],[8.44713,47.31217],[8.44021,47.30948],[8.43624,47.29817],[8.43311,47.29593],[8.42806,47.29397],[8.42318,47.29001],[8.41656,47.28789],[8.41024,47.28728],[8.4035,47.28409],[8.40188,47.2805],[8.40862,47.27593],[8.41066,47.2716],[8.40892,47.26613],[8.41235,47.2618],[8.41235,47.25873],[8.41109,47.25608],[8.41698,47.25142],[8.41885,47.2475],[8.41801,47.24305],[8.4144,47.23904],[8.41373,47.23565],[8.4106,47.23226],[8.40435,47.22797],[8.40296,47.2256],[8.40398,47.22127],[8.40856,47.21718],[8.40928,47.21326],[8.40844,47.20945],[8.41012,47.20258],[8.41319,47.19678],[8.41271,47.1924],[8.4088,47.18799],[8.40814,47.18475],[8.4091,47.1812],[8.41518,47.17915],[8.41915,47.17563],[8.42294,47.16553],[8.42294,47.15747],[8.42011,47.15325],[8.42246,47.14838],[8.42276,47.14392],[8.42053,47.13954],[8.41584,47.13524],[8.40898,47.13274],[8.40386,47.13201],[8.40116,47.13258],[8.39532,47.1327],[8.38437,47.1345],[8.37895,47.13385],[8.37245,47.13442],[8.36908,47.13659],[8.368,47.13876],[8.35656,47.14228],[8.35409,47.14564],[8.35331,47.14916],[8.3506,47.15161],[8.3503,47.15419],[8.34772,47.15669],[8.34561,47.15923],[8.34086,47.16164],[8.33935,47.16512],[8.3373,47.16896],[8.33315,47.17154],[8.33261,47.17351],[8.33062,47.17792],[8.33002,47.18717],[8.32924,47.18786],[8.32936,47.19494],[8.32292,47.19514],[8.32148,47.19854],[8.32196,47.20115],[8.31835,47.21043],[8.31413,47.21178],[8.31089,47.2153],[8.31107,47.21857],[8.31221,47.2198],[8.30884,47.22433],[8.30932,47.22646],[8.30715,47.23042],[8.30727,47.2321],[8.30595,47.23582],[8.30607,47.23949],[8.30378,47.24366],[8.30144,47.24677],[8.29554,47.24836],[8.29187,47.25293],[8.28814,47.25869],[8.28766,47.26143],[8.28627,47.26519],[8.28723,47.26805],[8.28838,47.26964],[8.2823,47.27478],[8.27718,47.27576],[8.27273,47.27531],[8.26749,47.27593],[8.26533,47.27719],[8.2616,47.27695],[8.25793,47.27781],[8.25576,47.27887],[8.25317,47.27678],[8.25034,47.27548],[8.2501,47.27348],[8.24956,47.27017],[8.24559,47.26715],[8.24095,47.26678],[8.23452,47.26727],[8.23145,47.26278],[8.2309,47.25931],[8.22663,47.24942],[8.222,47.24713],[8.21526,47.24431],[8.21363,47.24203],[8.21309,47.23602],[8.21123,47.23246],[8.21285,47.22548],[8.21117,47.22266],[8.20689,47.22053],[8.19762,47.22065],[8.19149,47.21861],[8.16976,47.21865],[8.16543,47.22315],[8.16085,47.22405],[8.15351,47.2294],[8.15171,47.2332],[8.14822,47.23647],[8.14798,47.241],[8.14635,47.24203],[8.13823,47.24166],[8.13558,47.23941],[8.12673,47.23606],[8.1218,47.23631],[8.11614,47.23872],[8.10675,47.23945],[8.10266,47.24113],[8.09983,47.24436],[8.09766,47.2493],[8.09797,47.25069],[8.09339,47.25567],[8.08852,47.2569],[8.08485,47.25583],[8.08323,47.25405],[8.07995,47.25246],[8.0769,47.25054],[8.06854,47.24284],[8.06325,47.24098],[8.05134,47.23865],[8.04857,47.23886],[8.03575,47.23747],[8.0322,47.23555],[8.02714,47.23534],[8.01139,47.23967],[8.00927,47.24116],[8.00791,47.24312],[8.00783,47.24821],[8.00857,47.25042],[8.0084,47.25769],[8.00712,47.25922],[8.00299,47.26162],[8.00052,47.26486],[7.99759,47.26789],[7.99627,47.27271],[7.99474,47.27369],[7.98993,47.27121],[7.97278,47.26907],[7.96857,47.27008],[7.96737,47.27098],[7.95861,47.27112],[7.9601,47.26748],[7.96274,47.26396],[7.96576,47.26171],[7.96699,47.25879],[7.96695,47.25001],[7.95963,47.24582],[7.95112,47.23918],[7.94469,47.236],[7.93733,47.23106],[7.93405,47.23051],[7.9298,47.23077],[7.9178,47.23305],[7.90784,47.23837],[7.89793,47.2377],[7.8695,47.23207],[7.85478,47.22719],[7.85137,47.22713],[7.83958,47.22947],[7.83584,47.22976],[7.83082,47.23259],[7.82707,47.23505],[7.82431,47.23831],[7.82129,47.24042],[7.82014,47.24264],[7.81822,47.24562],[7.81771,47.24917],[7.81822,47.25082],[7.81835,47.25371],[7.81988,47.25587],[7.82116,47.2568],[7.82112,47.25778],[7.8192,47.26058],[7.81912,47.26154],[7.81686,47.26486],[7.8175,47.26731],[7.81958,47.26982],[7.82439,47.27158],[7.82805,47.2721],[7.83592,47.27837],[7.83707,47.28342],[7.84005,47.2872],[7.84201,47.29067],[7.84588,47.29427],[7.84763,47.2982],[7.85137,47.30299],[7.8529,47.30741],[7.85571,47.31032],[7.86065,47.31254],[7.86422,47.31349],[7.87018,47.31672],[7.87631,47.31736],[7.88082,47.31716],[7.88337,47.31667],[7.88588,47.31941],[7.88886,47.32131],[7.88805,47.32443],[7.88907,47.3287],[7.8915,47.33262],[7.8978,47.34014],[7.9001,47.34156],[7.90005,47.3432],[7.90222,47.34557],[7.90635,47.34704],[7.90963,47.34735],[7.91359,47.34626],[7.91618,47.34456],[7.91699,47.34303],[7.92401,47.33899],[7.93839,47.33792],[7.94929,47.33784],[7.95431,47.33596],[7.95593,47.33317],[7.95691,47.32968],[7.95571,47.32535],[7.96993,47.32797],[7.97308,47.33017],[7.98333,47.33432],[7.98563,47.33692],[7.98954,47.33818],[7.99248,47.33827],[7.99784,47.34017],[7.99635,47.34257],[7.99601,47.34588],[7.99733,47.34859],[8.00116,47.35081],[8.00137,47.3569],[8.00261,47.3577],[8.00418,47.36044],[8.00976,47.36419],[8.01125,47.36598],[8.01746,47.36926],[8.01912,47.37157],[8.0198,47.37376],[8.02023,47.37598],[8.02172,47.37837],[8.02193,47.38093],[8.02282,47.38286],[8.02078,47.38857],[8.01606,47.38929],[8.01265,47.38897],[8.00772,47.39012],[8.00367,47.39205],[8.00163,47.39479],[8.00155,47.39998],[8.00023,47.40306],[7.99801,47.40453],[7.99261,47.40551],[7.98776,47.40637],[7.98418,47.40839],[7.98027,47.4081],[7.9732,47.41127],[7.96963,47.41383],[7.95695,47.41893],[7.95529,47.4218],[7.95593,47.42402],[7.95746,47.42621],[7.96274,47.42828],[7.97746,47.43254],[7.97567,47.43732],[7.97614,47.44138],[7.97431,47.44368],[7.95129,47.45111],[7.94861,47.4539],[7.94818,47.4566],[7.94678,47.45755],[7.94039,47.45669],[7.93588,47.45738],[7.93631,47.47625],[7.9318,47.47605],[7.92469,47.47717],[7.91571,47.47743],[7.90903,47.47947],[7.90316,47.47967],[7.90295,47.48965],[7.8969,47.4898],[7.8918,47.49405],[7.89086,47.49765],[7.8878,47.49931],[7.88631,47.5023],[7.87999,47.50397],[7.87403,47.50787],[7.86994,47.50944],[7.87006,47.51239],[7.86435,47.51245],[7.85851,47.51543],[7.8558,47.51854],[7.85625,47.52147],[7.8549,47.52474],[7.85183,47.5285],[7.84647,47.52714],[7.84148,47.52777],[7.8413,47.52406],[7.84015,47.51587],[7.83943,47.51259],[7.83688,47.51256],[7.83679,47.51049],[7.83352,47.50949],[7.83156,47.50765],[7.82981,47.50552],[7.82522,47.50354],[7.82049,47.5004],[7.81475,47.49491],[7.81181,47.49261],[7.80645,47.4914],[7.80403,47.49146],[7.80049,47.49014],[7.77977,47.49028],[7.77871,47.49304],[7.7796,47.496],[7.78386,47.5004],[7.78203,47.50368],[7.78088,47.5073],[7.78109,47.51018],[7.77977,47.51265],[7.77969,47.51529],[7.77045,47.51802],[7.75905,47.52003],[7.75266,47.52009],[7.74781,47.51957],[7.73368,47.52291],[7.72781,47.52719],[7.71985,47.52978],[7.71262,47.53095],[7.70764,47.5344],[7.70551,47.53917],[7.70696,47.54279],[7.71415,47.54627],[7.72245,47.54756],[7.749,47.54977],[7.75428,47.55339],[7.76654,47.55615],[7.77168,47.55761],[7.78007,47.55836],[7.78577,47.55982],[7.7902,47.5616],[7.79398,47.56634],[7.80492,47.57237],[7.80611,47.57989],[7.81173,47.58954],[7.81577,47.59218],[7.82211,47.59352],[7.83645,47.59163],[7.83952,47.59045],[7.84305,47.58778],[7.84875,47.58899],[7.85624,47.59189],[7.86488,47.59393],[7.87126,47.5943],[7.87726,47.59367],[7.88535,47.59424],[7.89343,47.59301],[7.90109,47.58976],[7.90833,47.58514],[7.91386,47.57923],[7.91867,47.57194],[7.91956,47.56772],[7.91875,47.56433],[7.9156,47.56008],[7.91577,47.55715],[7.91841,47.55405],[7.92126,47.55261],[7.92552,47.55227],[7.93471,47.55221],[7.9405,47.55078],[7.94326,47.54968],[7.94356,47.55052],[7.94458,47.55589],[7.94841,47.55979],[7.95394,47.56229],[7.96003,47.56333],[7.96577,47.56272],[7.97203,47.5612],[7.97833,47.56057],[7.98624,47.56094],[7.99718,47.56212],[8.0045,47.56137],[8.01114,47.55974],[8.01641,47.55701],[8.02046,47.55574],[8.0262,47.55741],[8.03799,47.55876],[8.04254,47.56028],[8.0485,47.56333],[8.05454,47.56798],[8.05931,47.56921],[8.0622,47.56895],[8.06693,47.57002],[8.07242,47.56973],[8.07739,47.56795],[8.08182,47.56436],[8.08522,47.56281],[8.08791,47.56298],[8.09259,47.56559],[8.09395,47.56809],[8.09484,47.57587],[8.09602,47.57882]]],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:[[[7.70438,47.55794],[7.77076,47.55772],[7.77103,47.58025],[7.80408,47.58017],[7.80433,47.60248],[7.93713,47.60217],[7.93703,47.57962],[8.00374,47.57917],[8.00338,47.55687],[8.0364,47.55665],[8.03681,47.57928],[8.10313,47.57881],[8.10387,47.60112],[8.17011,47.60086],[8.17036,47.6235],[8.30311,47.62235],[8.30305,47.59988],[8.3362,47.59927],[8.33585,47.5771],[8.36913,47.57694],[8.36943,47.59931],[8.43564,47.59877],[8.43454,47.53133],[8.40144,47.53162],[8.40096,47.50926],[8.3678,47.50959],[8.3675,47.48698],[8.40042,47.48666],[8.39939,47.41929],[8.46558,47.4187],[8.46515,47.39647],[8.43206,47.39654],[8.43125,47.3516],[8.46434,47.35128],[8.46327,47.28387],[8.42997,47.28421],[8.42714,47.12676],[8.3293,47.12753],[8.32937,47.13007],[8.32833,47.13007],[8.3285,47.14529],[8.3294,47.19502],[8.2964,47.19526],[8.29714,47.24022],[8.2641,47.24046],[8.26446,47.26297],[8.23141,47.26316],[8.23075,47.21822],[8.09886,47.21912],[8.09874,47.24135],[8.066,47.24176],[8.06552,47.2192],[7.99993,47.21952],[8.00003,47.26433],[7.96735,47.26462],[7.96675,47.21961],[7.80153,47.22029],[7.80244,47.28791],[7.83518,47.28772],[7.83543,47.31017],[7.86837,47.31017],[7.86885,47.35542],[8.00097,47.3543],[8.00156,47.39928],[7.9353,47.39976],[7.93607,47.46716],[7.90278,47.46729],[7.90303,47.48981],[7.86987,47.48998],[7.86993,47.5125],[7.83689,47.51258],[7.83665,47.4901],[7.77027,47.49026],[7.77045,47.51274],[7.70452,47.51307],[7.70438,47.55794]]],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.37028,47.41368],[7.35758,47.41508],[7.35792,47.41827],[7.35354,47.41961],[7.34488,47.42402],[7.33973,47.42971],[7.33269,47.43024],[7.32685,47.43192],[7.32528,47.43489],[7.3305,47.44176],[7.33899,47.44109],[7.34496,47.43608],[7.35266,47.43436],[7.3812,47.43208],[7.37599,47.41431],[7.37815,47.414],[7.38204,47.41331],[7.38839,47.41398],[7.41371,47.41093],[7.42074,47.4111],[7.42748,47.41448],[7.43811,47.41274],[7.4484,47.41507],[7.45558,47.42792],[7.45062,47.43534],[7.43784,47.44632],[7.42542,47.44328],[7.4209,47.44594],[7.42242,47.45072],[7.4288,47.45388],[7.43003,47.45949],[7.44577,47.46197],[7.44717,47.45696],[7.45651,47.44926],[7.49236,47.45897],[7.53068,47.46119],[7.52745,47.47391],[7.53633,47.48383],[7.53623,47.49105],[7.5326,47.49097],[7.53179,47.4974],[7.52004,47.49678],[7.51223,47.49892],[7.50935,47.50888],[7.49908,47.51628],[7.49787,47.52125],[7.50228,47.51491],[7.51746,47.51728],[7.5222,47.51409],[7.53096,47.52905],[7.51935,47.53472],[7.51075,47.52899],[7.5023,47.5284],[7.49804,47.53615],[7.50545,47.54438],[7.51676,47.54541],[7.52732,47.55278],[7.55466,47.56437],[7.56458,47.55704],[7.56124,47.55172],[7.55875,47.55235],[7.55588,47.54434],[7.56479,47.54569],[7.58726,47.5419],[7.58269,47.53247],[7.58948,47.52792],[7.59025,47.51979],[7.59478,47.51929],[7.61378,47.53925],[7.6223,47.53977],[7.62285,47.55004],[7.61774,47.55437],[7.61762,47.55865],[7.63273,47.56149],[7.63997,47.55816],[7.649,47.5483],[7.66131,47.54483],[7.66586,47.53746],[7.67467,47.53375],[7.69494,47.5325],[7.71347,47.53978],[7.71596,47.53582],[7.72362,47.53675],[7.72716,47.53293],[7.73322,47.53275],[7.73797,47.52732],[7.74902,47.52498],[7.75786,47.52605],[7.78763,47.52012],[7.79014,47.51864],[7.78887,47.50683],[7.7928,47.50068],[7.78663,47.49312],[7.79889,47.49565],[7.79816,47.4994],[7.7994,47.49748],[7.80742,47.49714],[7.81471,47.5048],[7.83198,47.51474],[7.83321,47.53382],[7.84653,47.53266],[7.85233,47.53524],[7.86257,47.52692],[7.86396,47.51931],[7.87666,47.52269],[7.87567,47.51319],[7.89399,47.50606],[7.90477,47.49218],[7.90482,47.48491],[7.93329,47.48141],[7.94702,47.48489],[7.94003,47.46202],[7.94885,47.46378],[7.95761,47.45881],[7.95785,47.45128],[7.94678,47.44319],[7.95003,47.43172],[7.96183,47.42183],[7.95657,47.41968],[7.95504,47.41561],[7.94839,47.41627],[7.93493,47.41177],[7.93672,47.40806],[7.93266,47.40527],[7.90974,47.39852],[7.89022,47.40714],[7.88333,47.4061],[7.88344,47.4012],[7.8777,47.40126],[7.86914,47.39551],[7.87943,47.38799],[7.87881,47.38351],[7.86265,47.38198],[7.84012,47.37476],[7.83055,47.36512],[7.80217,47.3611],[7.79637,47.35347],[7.79356,47.33905],[7.78529,47.33788],[7.76896,47.33891],[7.76642,47.34273],[7.75152,47.34433],[7.73415,47.35776],[7.72791,47.36886],[7.70195,47.37245],[7.6442,47.36721],[7.64176,47.38047],[7.63558,47.38059],[7.63332,47.38291],[7.63331,47.38534],[7.63725,47.38607],[7.63272,47.41003],[7.66405,47.41002],[7.6798,47.41751],[7.68658,47.43366],[7.68297,47.43872],[7.68485,47.44784],[7.69227,47.45421],[7.69883,47.45586],[7.69993,47.46191],[7.70988,47.46938],[7.69976,47.48063],[7.66833,47.48635],[7.66612,47.49687],[7.65217,47.49581],[7.64865,47.49183],[7.65539,47.49021],[7.65051,47.48826],[7.65593,47.48739],[7.64442,47.48564],[7.64097,47.48273],[7.6073,47.4894],[7.60885,47.48353],[7.60563,47.47936],[7.60815,47.47521],[7.60449,47.47045],[7.61887,47.46745],[7.62607,47.46291],[7.62217,47.46195],[7.61646,47.44523],[7.6158,47.43275],[7.59207,47.43271],[7.58121,47.42878],[7.57842,47.43491],[7.5689,47.4369],[7.5683,47.42233],[7.58074,47.4147],[7.52524,47.41163],[7.53117,47.40353],[7.51862,47.38822],[7.5113,47.38974],[7.50226,47.38481],[7.49233,47.38523],[7.47841,47.39056],[7.47747,47.40128],[7.46448,47.40251],[7.46092,47.40068],[7.45002,47.40393],[7.44951,47.39976],[7.4434,47.40231],[7.44131,47.40018],[7.44357,47.3889],[7.43732,47.38089],[7.41169,47.38057],[7.41628,47.38479],[7.41449,47.3943],[7.39894,47.39684],[7.39592,47.40338],[7.38869,47.40302],[7.38405,47.41236],[7.37968,47.41281],[7.37584,47.41401],[7.37028,47.41368]]],terms_url:"https://www.geo.bl.ch/fileadmin/user_upload/Geodaten/Nutzungsbedingungen_GBD_BL_V3p2.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.67138,47.59522],[7.67996,47.60078],[7.68451,47.60182],[7.69438,47.60171],[7.69395,47.59667],[7.68708,47.59355],[7.67884,47.58712],[7.68571,47.58538],[7.68906,47.57612],[7.69412,47.5734],[7.6924,47.56691],[7.6847,47.5617],[7.66425,47.56164],[7.64872,47.55689],[7.63035,47.55869],[7.62357,47.55666],[7.62786,47.55145],[7.62738,47.53658],[7.61833,47.53662],[7.61335,47.53262],[7.59962,47.51911],[7.58503,47.51917],[7.58409,47.52636],[7.57713,47.53163],[7.58125,47.53986],[7.5719,47.54148],[7.55387,47.54148],[7.55379,47.55122],[7.55653,47.55828],[7.5537,47.56031],[7.55379,47.57473],[7.56434,47.58122],[7.57936,47.57988],[7.58331,47.59019],[7.58563,47.59233],[7.59207,47.59239],[7.59851,47.59071],[7.60915,47.58643],[7.60923,47.5811],[7.6191,47.58046],[7.63687,47.59314],[7.63782,47.59557],[7.64168,47.59887],[7.64528,47.60026],[7.66494,47.59618],[7.67138,47.59522]]],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.95595,47.47162],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39022],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.94122,47.30978],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84832,47.27416],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24777],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.6499,47.22083],[7.66308,47.22073],[7.6631,47.21178],[7.66297,47.20273],[7.67617,47.2027],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53095,47.13097],[7.51767,47.13097],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47813,47.07705],[7.46493,47.07708],[7.46498,47.06807],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.3727,47.15796],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.20287],[7.33307,47.2029],[7.33307,47.22096],[7.34614,47.22096],[7.34614,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.5046,47.29288],[7.50473,47.30183],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.3988,47.36484],[7.39889,47.39182],[7.38564,47.39181],[7.38564,47.4008],[7.37234,47.4008],[7.37234,47.40978],[7.34584,47.40978],[7.34584,47.41878],[7.31925,47.41878],[7.31925,47.44578],[7.4121,47.44578],[7.4121,47.49078],[7.42535,47.49078],[7.42535,47.49981],[7.43856,47.49981],[7.43856,47.50876],[7.49177,47.50876],[7.49178,47.63468],[7.7845,47.63428],[7.78415,47.57123],[7.81074,47.57114],[7.81074,47.56216],[7.82395,47.56206],[7.82387,47.54414],[7.86368,47.54397],[7.86363,47.53498],[7.87679,47.53495],[7.87675,47.52599],[7.8901,47.52596],[7.89006,47.51695],[7.90319,47.51692],[7.9031,47.49886],[7.91649,47.49883],[7.91645,47.48976],[7.95612,47.48967],[7.95595,47.47162]]],terms_text:"Orthofoto WMS Solothurn",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ch/KantonSolothurn-SOGIS-wms.png"},{id:"Solothurn-infrared-SOGIS",name:"Kanton Solothurn Infrarot (SOGIS)",type:"wms",template:"https://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.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53093,47.12196],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47816,47.09496],[7.49144,47.09499],[7.4914,47.07702],[7.47816,47.07705],[7.4782,47.06804],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.39913,47.15804],[7.39913,47.14901],[7.3727,47.14898],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.19391],[7.33307,47.19394],[7.33307,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.49149,47.29289],[7.49162,47.30184],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.43862,47.36492],[7.43867,47.37389],[7.42538,47.37395],[7.42543,47.40081],[7.38558,47.4009],[7.38567,47.4098],[7.35915,47.4098],[7.35915,47.41878],[7.37239,47.41884],[7.37247,47.43682],[7.38571,47.43682],[7.38571,47.44104],[7.39563,47.44016],[7.3963,47.44258],[7.40761,47.4411],[7.40793,47.44225],[7.40313,47.44246],[7.39738,47.44331],[7.39832,47.44583],[7.41214,47.44583],[7.41228,47.45478],[7.43867,47.45488],[7.4388,47.47053],[7.45007,47.46941],[7.45007,47.47223],[7.44647,47.47223],[7.44647,47.47381],[7.44293,47.4739],[7.44288,47.47553],[7.43921,47.4756],[7.43921,47.4772],[7.43557,47.47729],[7.43548,47.47899],[7.4174,47.47896],[7.41744,47.48573],[7.42099,47.48573],[7.42108,47.49082],[7.42763,47.49073],[7.42852,47.49349],[7.43099,47.49643],[7.43485,47.49889],[7.4419,47.49552],[7.44665,47.49455],[7.45011,47.49176],[7.45087,47.4907],[7.46451,47.49073],[7.46456,47.48903],[7.46819,47.489],[7.46819,47.48566],[7.47187,47.48573],[7.47192,47.48233],[7.48269,47.48239],[7.48264,47.48388],[7.48623,47.48397],[7.48637,47.48566],[7.48991,47.48566],[7.49,47.4907],[7.4997,47.49073],[7.49965,47.4914],[7.49175,47.49194],[7.49175,47.49513],[7.49822,47.49479],[7.49889,47.49585],[7.49566,47.49628],[7.49171,47.49625],[7.4918,47.49973],[7.50504,47.4997],[7.50504,47.50874],[7.5448,47.50871],[7.54474,47.45482],[7.49169,47.45469],[7.49175,47.44581],[7.46529,47.44577],[7.46522,47.40983],[7.49156,47.40979],[7.49175,47.39192],[7.50489,47.39183],[7.50489,47.40068],[7.51821,47.40077],[7.51834,47.41876],[7.55794,47.41872],[7.55813,47.44581],[7.58453,47.44572],[7.58441,47.43667],[7.61094,47.43662],[7.611,47.4637],[7.59767,47.4637],[7.59793,47.49964],[7.62433,47.49969],[7.62445,47.4906],[7.63778,47.49055],[7.63784,47.4996],[7.67757,47.49947],[7.67745,47.49047],[7.70385,47.49043],[7.70391,47.48146],[7.71711,47.48129],[7.71711,47.45452],[7.70397,47.45452],[7.70385,47.44559],[7.69046,47.44551],[7.69033,47.40957],[7.67713,47.40949],[7.67713,47.40068],[7.65066,47.40068],[7.65047,47.37365],[7.67706,47.37357],[7.67706,47.38251],[7.71667,47.38251],[7.71679,47.37344],[7.74307,47.3734],[7.74307,47.35538],[7.7562,47.35534],[7.75633,47.3464],[7.78261,47.34627],[7.78292,47.36433],[7.79612,47.36428],[7.79619,47.37327],[7.82265,47.37314],[7.82271,47.38229],[7.84912,47.38212],[7.84924,47.39106],[7.86251,47.39097],[7.86263,47.40906],[7.8759,47.40897],[7.87602,47.41803],[7.90242,47.41795],[7.90242,47.40897],[7.92889,47.4088],[7.92914,47.41782],[7.94215,47.41769],[7.94266,47.46276],[7.95592,47.46259],[7.95612,47.47164],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39015],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.9412,47.30992],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84843,47.27415],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24765],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.66305,47.22971],[7.6631,47.21178],[7.67621,47.21169],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70248,47.16663],[7.71567,47.16663],[7.71558,47.15769],[7.70239,47.15766],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792]]],terms_text:"Orthofoto WMS Solothurn",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ch/KantonSolothurn-SOGIS-wms.png"},{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.63768,47.70041],[8.78328,47.6988],[8.78304,47.68533],[8.87027,47.68427],[8.86997,47.6709],[8.89901,47.67047],[8.89867,47.65698],[8.9277,47.65661],[8.92828,47.67015],[8.95726,47.66973],[8.95774,47.68327],[9.19061,47.67994],[9.19027,47.66645],[9.21922,47.66603],[9.21899,47.65256],[9.24784,47.6521],[9.24747,47.63864],[9.3057,47.63765],[9.30526,47.6242],[9.33417,47.62371],[9.33348,47.59674],[9.39151,47.59577],[9.39114,47.58235],[9.42007,47.58176],[9.4186,47.54139],[9.44754,47.54084],[9.44717,47.5273],[9.47605,47.52681],[9.47519,47.49986],[9.50414,47.49935],[9.5031,47.47242],[9.41596,47.47392],[9.41554,47.46045],[9.3576,47.46141],[9.35818,47.47498],[9.32896,47.47534],[9.32864,47.46188],[9.18361,47.4642],[9.18411,47.47769],[9.15492,47.4781],[9.15466,47.46463],[9.06736,47.46583],[9.06718,47.45234],[9.09609,47.45193],[9.09582,47.43853],[9.06663,47.43883],[9.06642,47.42537],[9.00829,47.4262],[9.00714,47.38573],[8.97811,47.38616],[8.9774,47.35913],[8.9194,47.35989],[8.92032,47.38697],[8.89136,47.38725],[8.89286,47.44117],[8.86398,47.44149],[8.86604,47.52251],[8.80784,47.52317],[8.80894,47.56373],[8.77985,47.56403],[8.78024,47.57751],[8.72209,47.57814],[8.72337,47.63213],[8.6652,47.63273],[8.6658,47.6598],[8.63674,47.66],[8.63768,47.70041]]],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.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Kanton Zürich Orthophotos 2014/2015",best:true},{id:"Kanton-Zuerich-2015",name:"Kanton Zürich Orthophotos 2014/2015 10cm",type:"wms",template:"https://wms.zh.ch/OrthoZHWMS?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orthophotos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",scaleExtent:[8,21],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Kanton Zürich Orthophotos 2014/2015",best:true},{id:"kartverket-abas",name:"Kartverket Administrative Boundaries overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.adm_enheter?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=avtaltavgrensningslinje,territorialgrense,riksgrense,fylker,kommuner&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/data/Kartdata/Grenser/",terms_text:"© Kartverket",description:"Official administrative boundaries at the national, county and municipality levels",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-luftfartshindre",name:"Kartverket Aviation Obstructions overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.nrl?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nrl3_wms&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[7,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kartverket.no/kart/Nasjonalt-register-over-luftfartshindre/",terms_text:"© Kartverket",description:"Vertical obstructions to aircrafts, above 15m in rural areas and 30m in urban areas (e.g. masts, towers, high buildings, power lines)",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-matrikkel",name:"Kartverket Cadastral overlay",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.matrikkel?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=matrikkel_WMS&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[14,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"http://www.seeiendom.no/",terms_text:"© Kartverket",description:"Real estate boundaries from the official land register (`matrikkelen´). Monthly update.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-hoydekurver",name:"Kartverket Contour Lines overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.topo4?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=hoydetall5linje,hoydetall5punkt,hoydepunkt,vannpunkt,hoydekurver_1m,hoydekurver_5m,N50Hoydekurver,N250Hoydekurver,N500Hoydekurver,N1000Hoydekurver,N2000Hoydekurver&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[9,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/Prosjekter/Nasjonal-detaljert-hoydemodell/",terms_text:"© Kartverket",description:"Contours for Norway",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-dom-skygge",name:"Kartverket DOM Digital Surface Model",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.hoyde-dom_somlos_skyggerelieff?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=las_dom_skyggerelieff_somlos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[0,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://hoydedata.no/",terms_text:"© Kartverket",description:"Shaded relief representation of the Norwegian digital surface model (DOM), i.e. earth surface including trees, buildings and other objects on top of it.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-dtm-skygge",name:"Kartverket DTM Digital Terrain Model",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.hoyde-dtm_somlos_skyggerelieff?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=las_dtm_skyggerelieff_somlos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[0,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://hoydedata.no/",terms_text:"© Kartverket",description:"Shaded relief representation of the Norwegian digital terrain model (DTM), i.e. earth surface without trees, buildings and other objects.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-ok-1st",name:"Kartverket Economic Maps (historic)",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.n5raster2?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=n5raster_foerstegang_metadata,n5raster_foerstegang&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[11,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/kunnskap/historie/kartverkets-historiske-arkiv/",terms_text:"© Kartverket",description:"1st edition of historic Economic maps for Norway 1960-90s (`Økonomisk kartverk´). Available from zoom 16. Please correct local imagery offset.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{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:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],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-fjellskygge",name:"Kartverket Hillshade overlay",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=fjellskygge&zoom={zoom}&x={x}&y={y}",scaleExtent:[9,15],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kartkatalog.geonorge.no/metadata/kartverket/fjellskygge-cache/cca7c129-fe66-4c96-9091-40d92290dd81",terms_text:"© Kartverket",description:"Hillshade for Norway",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-historic",name:"Kartverket Historic maps",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.historiskekart?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=amt1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[5,15],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/kart/historiske-kart/",terms_text:"© Kartverket",description:"Historic maps - for the time being `Amtskartserien´ 1826-1917.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-topo4",name:"Kartverket N50 topo",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo4&zoom={zoom}&x={x}&y={y}",scaleExtent:[3,15],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],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-sjokart",name:"Kartverket Nautical Charts",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=sjokartraster&zoom={zoom}&x={x}&y={y}",scaleExtent:[3,20],polygon:[[[-15.01273,-60.16205],[33.3326,-60.17016],[33.32144,-73.0009],[-15.0239,-72.99613],[-15.01273,-60.16205]],[[-173.00076,-70.54952],[-125.00321,-70.54878],[-125.00167,-78.99977],[-172.99922,-79.0002],[-173.00076,-70.54952]],[[3.24857,56.08599],[2.60924,56.59428],[1.47215,58.45924],[1.77704,61.36251],[-0.49301,63.88665],[-13.73292,69.76376],[-12.43655,72.58741],[-5.11965,74.39626],[-3.60356,79.12998],[5.85587,82.34863],[34.98861,82.3401],[37.96874,78.62784],[37.99619,75.79673],[36.95796,73.68962],[32.07458,70.27336],[30.3511,69.56882],[21.46179,69.57098],[18.3032,68.36681],[14.47997,66.2558],[11.50266,63.28307],[11.50166,58.95444],[11.08246,58.96771],[10.03051,58.25173],[8.88244,57.69534],[3.24857,56.08599]]],terms_url:"https://www.kartverket.no/Kart/Sjokart/",terms_text:"© Kartverket",description:"Norwegian nautical charts (includes Spitsbergen/Svalbard and Antarctica). Raster representation of paper charts. Updated biweekly.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-vegnett",name:"Kartverket Road Network",type:"wms",template:"https://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:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],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:"Katowice-buildings",name:"Katowice: Buildings",type:"wms",template:"http://mapserver.um.katowice.pl/services/ortowms/MapServer/WMSServer?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=4,5,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.90884,50.24006],[18.90851,50.23542],[18.94279,50.23515],[18.94399,50.27138],[18.95469,50.27485],[18.95571,50.2894],[18.96692,50.29364],[18.98752,50.2848],[18.99888,50.2847],[18.99907,50.29368],[18.98892,50.29377],[18.98934,50.30244],[19.0094,50.30196],[19.03401,50.28842],[19.05533,50.30139],[19.07901,50.30087],[19.07908,50.29297],[19.12296,50.27784],[19.12267,50.25523],[19.11079,50.2428],[19.1098,50.17946],[19.12065,50.17936],[19.11957,50.14359],[19.10777,50.14386],[19.0973,50.13916],[19.09656,50.12786],[19.06379,50.12786],[19.02985,50.14009],[19.03007,50.16177],[19.01909,50.16698],[19.00848,50.16707],[18.96329,50.1498],[18.92907,50.15008],[18.92915,50.15426],[18.91854,50.15419],[18.91878,50.20421],[18.90792,50.20429],[18.90808,50.21297],[18.88588,50.21314],[18.88639,50.24024],[18.90884,50.24006]]],terms_text:"Urząd Miasta Katowic"},{id:"Katowice-aerial_image",name:"Katowice: Orthophotomap (aerial image)",type:"wms",template:"http://mapserver.um.katowice.pl/services/ortowms/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[0,23],polygon:[[[18.90884,50.24006],[18.90851,50.23542],[18.94279,50.23515],[18.94399,50.27138],[18.95469,50.27485],[18.95571,50.2894],[18.96692,50.29364],[18.98752,50.2848],[18.99888,50.2847],[18.99907,50.29368],[18.98892,50.29377],[18.98934,50.30244],[19.0094,50.30196],[19.03401,50.28842],[19.05533,50.30139],[19.07901,50.30087],[19.07908,50.29297],[19.12296,50.27784],[19.12267,50.25523],[19.11079,50.2428],[19.1098,50.17946],[19.12065,50.17936],[19.11957,50.14359],[19.10777,50.14386],[19.0973,50.13916],[19.09656,50.12786],[19.06379,50.12786],[19.02985,50.14009],[19.03007,50.16177],[19.01909,50.16698],[19.00848,50.16707],[18.96329,50.1498],[18.92907,50.15008],[18.92915,50.15426],[18.91854,50.15419],[18.91878,50.20421],[18.90792,50.20429],[18.90808,50.21297],[18.88588,50.21314],[18.88639,50.24024],[18.90884,50.24006]]],terms_text:"Urząd Miasta Katowic"},{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.58673,49.79281],[-119.54657,49.79281],[-119.54657,49.80138],[-119.53434,49.80138],[-119.53434,49.80473],[-119.52962,49.80473],[-119.52962,49.81196],[-119.51045,49.81196],[-119.51157,49.87443],[-119.51089,49.87449],[-119.51141,49.88433],[-119.51141,49.92218],[-119.49386,49.92235],[-119.49405,49.9313],[-119.48039,49.93175],[-119.48046,49.94075],[-119.46667,49.94099],[-119.46928,49.99137],[-119.45513,49.99161],[-119.45567,50.01212],[-119.44167,50.01239],[-119.44173,50.01363],[-119.42215,50.01404],[-119.4221,50.01193],[-119.41213,50.01217],[-119.41261,50.02169],[-119.41234,50.02169],[-119.41248,50.02508],[-119.41209,50.02508],[-119.4122,50.02708],[-119.41261,50.02707],[-119.41283,50.03219],[-119.39363,50.03264],[-119.39353,50.03078],[-119.37957,50.03101],[-119.37954,50.02876],[-119.37358,50.02886],[-119.37154,49.97936],[-119.35735,49.97936],[-119.35484,49.92561],[-119.32681,49.92572],[-119.32566,49.88041],[-119.31389,49.88065],[-119.31371,49.87717],[-119.31322,49.87722],[-119.31315,49.87497],[-119.31245,49.87491],[-119.31223,49.87236],[-119.31176,49.87233],[-119.3116,49.86961],[-119.31122,49.86942],[-119.31092,49.86324],[-119.31037,49.86327],[-119.30951,49.85124],[-119.31064,49.85123],[-119.31039,49.84626],[-119.32453,49.846],[-119.3246,49.84507],[-119.3367,49.84488],[-119.33675,49.84351],[-119.33794,49.84347],[-119.3378,49.83821],[-119.33836,49.8381],[-119.33837,49.83512],[-119.33909,49.83511],[-119.3388,49.83212],[-119.33915,49.83206],[-119.33917,49.82933],[-119.33946,49.82933],[-119.33959,49.82679],[-119.35001,49.82658],[-119.34937,49.81806],[-119.4047,49.81638],[-119.40457,49.8099],[-119.41016,49.8099],[-119.41029,49.80728],[-119.43195,49.80691],[-119.43226,49.7908],[-119.44598,49.79055],[-119.44529,49.78202],[-119.49674,49.78116],[-119.49661,49.77849],[-119.54184,49.77751],[-119.54159,49.77183],[-119.55603,49.77149],[-119.55612,49.77184],[-119.57157,49.77151],[-119.57162,49.77173],[-119.58192,49.77149],[-119.58201,49.77177],[-119.5923,49.77152],[-119.59234,49.77181],[-119.60038,49.7716],[-119.60119,49.78391],[-119.58644,49.78439],[-119.58673,49.79281]]],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.58673,49.79281],[-119.54657,49.79281],[-119.54657,49.80138],[-119.53434,49.80138],[-119.53434,49.80473],[-119.52962,49.80473],[-119.52962,49.81196],[-119.51045,49.81196],[-119.51157,49.87443],[-119.51089,49.87449],[-119.51141,49.88433],[-119.51141,49.92218],[-119.49386,49.92235],[-119.49405,49.9313],[-119.48039,49.93175],[-119.48046,49.94075],[-119.46667,49.94099],[-119.46928,49.99137],[-119.45513,49.99161],[-119.45567,50.01212],[-119.44167,50.01239],[-119.44173,50.01363],[-119.42215,50.01404],[-119.4221,50.01193],[-119.41213,50.01217],[-119.41261,50.02169],[-119.41234,50.02169],[-119.41248,50.02508],[-119.41209,50.02508],[-119.4122,50.02708],[-119.41261,50.02707],[-119.41283,50.03219],[-119.39363,50.03264],[-119.39353,50.03078],[-119.37957,50.03101],[-119.37954,50.02876],[-119.37358,50.02886],[-119.37154,49.97936],[-119.35735,49.97936],[-119.35484,49.92561],[-119.32681,49.92572],[-119.32566,49.88041],[-119.31389,49.88065],[-119.31371,49.87717],[-119.31322,49.87722],[-119.31315,49.87497],[-119.31245,49.87491],[-119.31223,49.87236],[-119.31176,49.87233],[-119.3116,49.86961],[-119.31122,49.86942],[-119.31092,49.86324],[-119.31037,49.86327],[-119.30951,49.85124],[-119.31064,49.85123],[-119.31039,49.84626],[-119.32453,49.846],[-119.3246,49.84507],[-119.3367,49.84488],[-119.33675,49.84351],[-119.33794,49.84347],[-119.3378,49.83821],[-119.33836,49.8381],[-119.33837,49.83512],[-119.33909,49.83511],[-119.3388,49.83212],[-119.33915,49.83206],[-119.33917,49.82933],[-119.33946,49.82933],[-119.33959,49.82679],[-119.35001,49.82658],[-119.34937,49.81806],[-119.4047,49.81638],[-119.40457,49.8099],[-119.41016,49.8099],[-119.41029,49.80728],[-119.43195,49.80691],[-119.43226,49.7908],[-119.44598,49.79055],[-119.44529,49.78202],[-119.49674,49.78116],[-119.49661,49.77849],[-119.54184,49.77751],[-119.54159,49.77183],[-119.55603,49.77149],[-119.55612,49.77184],[-119.57157,49.77151],[-119.57162,49.77173],[-119.58192,49.77149],[-119.58201,49.77177],[-119.5923,49.77152],[-119.59234,49.77181],[-119.60038,49.7716],[-119.60119,49.78391],[-119.58644,49.78439],[-119.58673,49.79281]]],overlay:true},{id:"kystverket-navigasjon",name:"Kystverket Navigational Aid overlay",type:"wms",template:"https://nfs.kystverket.no/arcgis/services/nfs/NFSSistOperativ/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=17,16,15,14,12,10,9,8,7,4&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[12,19],polygon:[[[3.24857,56.08599],[2.60924,56.59428],[1.47215,58.45924],[1.77704,61.36251],[-0.49301,63.88665],[-13.73292,69.76376],[-12.43655,72.58741],[-5.11965,74.39626],[-3.60356,79.12998],[5.85587,82.34863],[34.98861,82.3401],[37.96874,78.62784],[37.99619,75.79673],[36.95796,73.68962],[32.07458,70.27336],[30.3511,69.56882],[21.46179,69.57098],[18.3032,68.36681],[14.47997,66.2558],[11.50266,63.28307],[11.50166,58.95444],[11.08246,58.96771],[10.03051,58.25173],[8.88244,57.69534],[3.24857,56.08599]]],terms_url:"http://kystverket.no/Maritim-infrastruktur/Fyr-og-merker-/",terms_text:"© Kystverket",description:"Beacons, buoys, lights and fairways maintained by the Norwegian Coastal Administration",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Coat_of_arms_of_the_Norwegian_Coastal_Administration.svg/143px-Coat_of_arms_of_the_Norwegian_Coastal_Administration.svg.png",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.855,6.1765],[-60.47626,7.91883],[-62.16169,8.27787],[-62.53225,6.53755],[-60.855,6.1765]]],description:"Recent Landsat imagery"},{id:"osmse-ekonomiska",name:"Lantmäteriet Economic Map (historic)",type:"tms",template:"https://mapproxy.openstreetmap.se/tms/1.0.0/ek_EPSG3857/{zoom}/{x}/{-y}.jpeg",scaleExtent:[3,17],polygon:[[[12.71117,55.2666],[14.38109,55.29163],[19.65453,57.24934],[19.85228,59.75087],[17.77587,61.13794],[18.06151,62.27815],[20.97289,63.5779],[24.35668,65.60842],[23.96117,66.79191],[20.61034,66.45189],[17.13866,63.96632],[11.99706,61.03702],[12.29369,60.31607],[10.70067,58.81375],[12.71117,55.2666]]],terms_url:"https://www.lantmateriet.se",terms_text:"© Lantmäteriet",description:"Scan of ´Economic maps´ ca 1950-1980",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/se/LantmterietHistoricOrthophoto1960.png"},{id:"lantmateriet-orto1960",name:"Lantmäteriet Historic Orthophoto 1960",type:"wms",template:"https://api.lantmateriet.se/historiska-ortofoton/wms/v1/token/9b342b7d9f12d4ddb92277be9869d860/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.Histortho_60&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[5,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Mosaic of Swedish orthophotos from the period 1949-1970.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/se/LantmterietHistoricOrthophoto1960.png"},{id:"lantmateriet-orto1975",name:"Lantmäteriet Historic Orthophoto 1975",type:"wms",template:"https://api.lantmateriet.se/historiska-ortofoton/wms/v1/token/9b342b7d9f12d4ddb92277be9869d860/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.Histortho_75&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[5,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[17.85131,60.87407],[14.74558,60.53889],[11.60239,59.56416],[10.51799,58.66559],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Mosaic of Swedish orthophotos from the period 1970-1980. To be expanded.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/se/LantmterietHistoricOrthophoto1960.png"},{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.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,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.93555,47.78206],[-121.57206,48.64101],[-121.20155,49.48462],[-121.83755,49.60232],[-122.4767,49.71617],[-123.11891,49.82688],[-123.76023,49.93358],[-124.08877,49.08705],[-124.41289,48.22526],[-123.79277,48.11973],[-123.17279,48.01096],[-122.55355,47.89823],[-121.93555,47.78206]]],description:"Recent lower-resolution landsat imagery for southwest British Columbia"},{id:"Lausanne-2012",name:"Lausanne - Orthophoto technique 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/lausanne2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",scaleExtent:[14,20],polygon:[[[6.66668,46.49441],[6.61637,46.49406],[6.61636,46.49836],[6.60135,46.49825],[6.60131,46.50227],[6.55923,46.50194],[6.55773,46.59687],[6.72895,46.59805],[6.7304,46.49004],[6.67702,46.48978],[6.67703,46.49011],[6.67345,46.49006],[6.67347,46.49041],[6.66672,46.49036],[6.66668,46.49441]]],terms_url:"http://carto.lausanne.ch/lausanne-gc/",terms_text:"Ville de Lausanne - Orthophoto technique 2012"},{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.25037,-47.21957],[167.24487,-47.28016],[167.50305,-47.37975],[168.25012,-47.1561],[168.74451,-46.7963],[169.32678,-46.75492],[169.78271,-46.60417],[170.42542,-46.11133],[170.80444,-45.95115],[170.95276,-45.44086],[171.30981,-44.91036],[171.40869,-44.39062],[172.56226,-43.92955],[172.90283,-43.9691],[173.16101,-43.90977],[173.25989,-43.69568],[172.97424,-43.5366],[172.76001,-43.37711],[173.15002,-43.17714],[173.70483,-42.63396],[174.36401,-41.7836],[174.32007,-41.40978],[174.84741,-41.52914],[175.07263,-41.70573],[175.50659,-41.67291],[176.2262,-41.10833],[176.83044,-40.42604],[177.17102,-39.67337],[177.03918,-39.39375],[177.44568,-39.18118],[177.60498,-39.33005],[177.97852,-39.36828],[178.33557,-38.65978],[178.70911,-37.74466],[178.62671,-37.54458],[178.3136,-37.43125],[177.62146,-37.37889],[177.03918,-37.39635],[176.56128,-37.37016],[176.33606,-37.05956],[176.00647,-36.29742],[175.67688,-36.05354],[174.67163,-35.1783],[173.19397,-34.28445],[172.67761,-34.23451],[172.38647,-34.40238],[172.47986,-34.71904],[172.98523,-35.32185],[173.56201,-36.14231],[174.30908,-37.07709],[174.55627,-38.05242],[174.47937,-38.65549],[174.32556,-38.86537],[173.79822,-38.95941],[173.60596,-39.23225],[173.69934,-39.56335],[174.58923,-39.95607],[174.98474,-40.21664],[174.98474,-40.49292],[174.72107,-40.80549],[174.14978,-40.65147],[173.28186,-40.4344],[172.58972,-40.35073],[172.08435,-40.53468],[171.76575,-40.82628],[171.57349,-41.39742],[171.28235,-41.65239],[170.87585,-42.53284],[170.354,-42.87194],[168.27759,-43.92955],[167.6239,-44.47691],[166.55273,-45.38688],[166.27258,-45.91677],[166.48132,-46.22545],[167.67883,-46.47192],[167.25037,-47.21957]]],terms_url:"https://www.linz.govt.nz/data/licensing-and-using-data/attributing-elevation-or-aerial-imagery-data",terms_text:"Sourced from LINZ CC-BY 4.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.25037,-47.21957],[167.24487,-47.28016],[167.50305,-47.37975],[168.25012,-47.1561],[168.74451,-46.7963],[169.32678,-46.75492],[169.78271,-46.60417],[170.42542,-46.11133],[170.80444,-45.95115],[170.95276,-45.44086],[171.30981,-44.91036],[171.40869,-44.39062],[172.56226,-43.92955],[172.90283,-43.9691],[173.16101,-43.90977],[173.25989,-43.69568],[172.97424,-43.5366],[172.76001,-43.37711],[173.15002,-43.17714],[173.70483,-42.63396],[174.36401,-41.7836],[174.32007,-41.40978],[174.84741,-41.52914],[175.07263,-41.70573],[175.50659,-41.67291],[176.2262,-41.10833],[176.83044,-40.42604],[177.17102,-39.67337],[177.03918,-39.39375],[177.44568,-39.18118],[177.60498,-39.33005],[177.97852,-39.36828],[178.33557,-38.65978],[178.70911,-37.74466],[178.62671,-37.54458],[178.3136,-37.43125],[177.62146,-37.37889],[177.03918,-37.39635],[176.56128,-37.37016],[176.33606,-37.05956],[176.00647,-36.29742],[175.67688,-36.05354],[174.67163,-35.1783],[173.19397,-34.28445],[172.67761,-34.23451],[172.38647,-34.40238],[172.47986,-34.71904],[172.98523,-35.32185],[173.56201,-36.14231],[174.30908,-37.07709],[174.55627,-38.05242],[174.47937,-38.65549],[174.32556,-38.86537],[173.79822,-38.95941],[173.60596,-39.23225],[173.69934,-39.56335],[174.58923,-39.95607],[174.98474,-40.21664],[174.98474,-40.49292],[174.72107,-40.80549],[174.14978,-40.65147],[173.28186,-40.4344],[172.58972,-40.35073],[172.08435,-40.53468],[171.76575,-40.82628],[171.57349,-41.39742],[171.28235,-41.65239],[170.87585,-42.53284],[170.354,-42.87194],[168.27759,-43.92955],[167.6239,-44.47691],[166.55273,-45.38688],[166.27258,-45.91677],[166.48132,-46.22545],[167.67883,-46.47192],[167.25037,-47.21957]]],terms_url:"https://data.linz.govt.nz/layer/2343-nz-mainland-topo50-gridless-maps",terms_text:"CC BY 4.0 Land Information New Zealand"},{id:"ORT10LT",name:"Lithuania - NŽT ORT10LT",type:"tms",template:"https://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.21384,55.85075],[26.38583,55.70453],[26.63036,55.68067],[26.62053,55.56892],[26.52422,55.50992],[26.55415,55.38883],[26.43993,55.34794],[26.79197,55.3212],[26.82913,55.27635],[26.74346,55.25399],[26.67648,55.15883],[26.46112,55.12856],[26.35774,55.15054],[26.22963,55.10732],[26.27138,55.07759],[26.20851,54.99741],[26.06191,54.94161],[25.85782,54.9276],[25.74298,54.81506],[25.76261,54.5769],[25.53194,54.34182],[25.67716,54.32381],[25.78573,54.23362],[25.78588,54.15506],[25.55508,54.14619],[25.51095,54.17503],[25.58967,54.22858],[25.51362,54.30785],[25.26893,54.27447],[25.0706,54.13363],[24.95737,54.17206],[24.81338,54.14486],[24.77902,54.09991],[24.87128,54.0349],[24.81957,53.99772],[24.68459,53.96211],[24.69787,54.01714],[24.62591,54.0105],[24.43426,53.90144],[24.35206,53.89679],[24.20161,53.97001],[23.96833,53.9267],[23.91302,53.96968],[23.77812,53.89892],[23.70977,53.93945],[23.53704,53.94307],[23.48224,53.98938],[23.52734,54.04735],[23.48586,54.15323],[23.38679,54.22484],[23.04212,54.31597],[23.01021,54.3828],[22.85469,54.4104],[22.792,54.36332],[22.70234,54.4529],[22.68386,54.58597],[22.74897,54.63198],[22.74297,54.72682],[22.88668,54.8135],[22.8204,54.91198],[22.6424,54.97134],[22.58924,55.07024],[22.0806,55.02448],[22.03241,55.0841],[21.91307,55.08168],[21.64919,55.18081],[21.50151,55.18682],[21.38437,55.2937],[21.27098,55.24501],[21.09836,55.25639],[20.94217,55.28245],[21.08635,55.56183],[21.03995,55.83636],[21.06403,56.06995],[21.20478,56.08117],[21.2308,56.16233],[21.5021,56.2955],[21.72359,56.31382],[21.83566,56.37162],[21.96954,56.37665],[22.0153,56.42428],[22.43727,56.4064],[22.68,56.35159],[22.91917,56.37902],[22.94668,56.41465],[23.09325,56.30464],[23.17034,56.36677],[23.30645,56.38305],[23.55717,56.33382],[23.7648,56.37332],[23.76669,56.32381],[24.019,56.32976],[24.12146,56.2489],[24.28574,56.30064],[24.45415,56.25816],[24.57947,56.28824],[24.62841,56.37533],[24.90238,56.48053],[25.12774,56.20591],[25.57714,56.18241],[25.67312,56.14937],[26.21384,55.85075]]],terms_url:"https://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.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",scaleExtent:[0,16],overzoom:false,terms_url:"https://www.mapbox.com/about/maps",terms_text:"Terms & Feedback","default":true,description:"Shows major features to help orient you.",overlay:true},{id:"Lodz-buildings",name:"Łódź: Buildings",type:"wms",template:"http://gis.mapa.lodz.pl/awiskts/services/WMS_publikowane/LODZ/MapServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Budynki,Ulice,Adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Lodz-2015",name:"Łódź: Orthophotomap 2015 (aerial image)",type:"wms",template:"http://gis.mapa.lodz.pl/awiskts/services/Ortofotomapa/Ortofotomapa/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:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",scaleExtent:[0,22],polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Lodz-2017",name:"Łódź: Orthophotomap 2017 (aerial image)",type:"wms",template:"https://mapa.lodz.pl/3/services/OGC/Ortofotomapa/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:4326",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",scaleExtent:[0,22],polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{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.48638,46.87691],[-1.54437,46.84873],[-1.73468,46.87246],[-1.89276,46.94234],[-1.95475,46.98084],[-2.07067,47.08521],[-2.2678,47.12656],[-2.22627,47.17124],[-2.19217,47.16914],[-2.19341,47.25546],[-2.29694,47.22769],[-2.41658,47.25336],[-2.54862,47.28575],[-2.63913,47.41678],[-2.50573,47.50812],[-2.31063,47.53021],[-2.24836,47.52384],[-2.23223,47.51499],[-2.12109,47.54674],[-2.11783,47.60126],[-2.1001,47.61123],[-2.09981,47.62005],[-2.11141,47.62873],[-2.10055,47.65141],[-2.08121,47.66578],[-1.98016,47.70751],[-1.83077,47.72419],[-1.67455,47.72544],[-1.63735,47.77463],[-1.49601,47.81752],[-1.49911,47.84166],[-1.38133,47.84415],[-1.346,47.81086],[-1.23007,47.78587],[-1.21643,47.75838],[-1.22635,47.73628],[-1.21086,47.7317],[-1.18668,47.73462],[-1.15196,47.69332],[-1.13151,47.63654],[-1.09121,47.6332],[-0.99265,47.6027],[-0.98459,47.58598],[-1.0317,47.55001],[-1.13585,47.55628],[-1.13275,47.5161],[-1.0317,47.51778],[-0.94863,47.50103],[-0.93686,47.47715],[-0.93376,47.43859],[-0.9009,47.39874],[-0.92694,47.37482],[-0.97157,47.35845],[-1.28339,47.32736],[-1.23379,47.26093],[-1.20032,47.26935],[-1.16498,47.24957],[-1.14143,47.1763],[-1.1563,47.15818],[-1.20652,47.12402],[-1.20838,47.10968],[-1.15568,47.10504],[-1.14081,47.08056],[-1.09431,47.0717],[-1.09989,47.03199],[-1.14453,47.01636],[-1.21582,47.02904],[-1.26727,47.06325],[-1.28524,47.02185],[-1.34972,47.02397],[-1.33918,46.969],[-1.3491,46.94446],[-1.45014,46.91186],[-1.47504,46.9176],[-1.48775,46.93063],[-1.49235,46.98433],[-1.48644,46.99943],[-1.49213,47.02722],[-1.52764,47.00541],[-1.52961,46.97252],[-1.50507,46.94439],[-1.50222,46.92973],[-1.51142,46.91371],[-1.48622,46.89724],[-1.48638,46.87691]]],terms_url:"http://data2.loire-atlantique.fr/licences/",terms_text:"Département de Loire-Atlantique"},{id:"Lombardia-Italy-CTR-DBT",name:"Lombardia - Italy (CTR DBT)",type:"wms",template:"https://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.4816,45.28938],[8.63085,45.01372],[8.78009,44.98189],[8.86775,45.02712],[9.07148,44.80063],[9.14966,44.79055],[9.19467,44.67106],[9.31549,44.65758],[9.36997,44.698],[9.37945,44.82752],[9.33207,44.91483],[9.41025,45.03716],[9.78692,45.04386],[9.78692,45.00032],[9.93853,45.002],[9.93379,45.08903],[10.00013,45.09071],[10.00013,44.99697],[10.20149,45.002],[10.20149,44.95004],[10.40523,44.9534],[10.40523,44.90476],[10.49288,44.90308],[10.49288,44.8628],[10.6516,44.85776],[10.64686,44.90308],[11.35282,44.89469],[11.35519,44.93663],[11.45706,44.93328],[11.44758,44.97351],[11.3623,45.00032],[11.35282,45.09238],[11.25806,45.09572],[11.25806,45.13752],[11.16094,45.14253],[11.16094,45.18262],[11.05196,45.19097],[11.05196,45.23436],[10.9572,45.23269],[10.9572,45.28605],[10.8577,45.28438],[10.85534,45.32271],[10.74636,45.32937],[10.75347,45.47408],[10.64686,45.48073],[10.60301,45.51074],[10.57636,45.47379],[10.53549,45.50036],[10.59116,45.53148],[10.61666,45.61304],[10.87429,45.84001],[10.82217,45.85982],[10.67529,45.85817],[10.57342,45.8103],[10.58624,46.00773],[10.5016,46.01596],[10.59325,46.11529],[10.60896,46.35583],[10.65634,46.38688],[10.64686,46.46037],[10.4147,46.57285],[10.32705,46.56797],[10.25124,46.65422],[10.07357,46.62494],[10.02382,46.53212],[10.02855,46.43588],[10.07357,46.39832],[10.12095,46.39669],[10.0783,46.32802],[10.14464,46.26582],[10.10436,46.24781],[9.97407,46.40812],[9.71111,46.3689],[9.68742,46.32312],[9.61872,46.30675],[9.55712,46.32475],[9.50264,46.39015],[9.47895,46.5256],[9.25626,46.51582],[9.22546,46.44078],[9.27284,46.34438],[9.17098,46.19044],[9.04305,46.12808],[9.062,46.09195],[8.97435,46.04593],[8.98856,46.00152],[8.93882,45.97354],[9.04068,45.8961],[9.01936,45.84827],[8.84879,46.0081],[8.89854,46.07059],[8.8251,46.11823],[8.70902,46.11659],[8.67823,46.07552],[8.7185,46.01468],[8.55504,45.90434],[8.59768,45.83836],[8.53372,45.79378],[8.6877,45.49235],[8.78009,45.41591],[8.68533,45.37931],[8.71139,45.34103],[8.69481,45.32104],[8.62848,45.37765],[8.5124,45.35768],[8.4816,45.28938]]],terms_url:"https://www.dati.gov.it/content/italian-open-data-license-v20",terms_text:"CTR DBT 10000 Regione Lombardia"},{id:"Lombardia-Italy-CTR",name:"Lombardia - Italy (CTR)",type:"wms",template:"https://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.4816,45.28938],[8.63085,45.01372],[8.78009,44.98189],[8.86775,45.02712],[9.07148,44.80063],[9.14966,44.79055],[9.19467,44.67106],[9.31549,44.65758],[9.36997,44.698],[9.37945,44.82752],[9.33207,44.91483],[9.41025,45.03716],[9.78692,45.04386],[9.78692,45.00032],[9.93853,45.002],[9.93379,45.08903],[10.00013,45.09071],[10.00013,44.99697],[10.20149,45.002],[10.20149,44.95004],[10.40523,44.9534],[10.40523,44.90476],[10.49288,44.90308],[10.49288,44.8628],[10.6516,44.85776],[10.64686,44.90308],[11.35282,44.89469],[11.35519,44.93663],[11.45706,44.93328],[11.44758,44.97351],[11.3623,45.00032],[11.35282,45.09238],[11.25806,45.09572],[11.25806,45.13752],[11.16094,45.14253],[11.16094,45.18262],[11.05196,45.19097],[11.05196,45.23436],[10.9572,45.23269],[10.9572,45.28605],[10.8577,45.28438],[10.85534,45.32271],[10.74636,45.32937],[10.75347,45.47408],[10.64686,45.48073],[10.60301,45.51074],[10.57636,45.47379],[10.53549,45.50036],[10.59116,45.53148],[10.61666,45.61304],[10.87429,45.84001],[10.82217,45.85982],[10.67529,45.85817],[10.57342,45.8103],[10.58624,46.00773],[10.5016,46.01596],[10.59325,46.11529],[10.60896,46.35583],[10.65634,46.38688],[10.64686,46.46037],[10.4147,46.57285],[10.32705,46.56797],[10.25124,46.65422],[10.07357,46.62494],[10.02382,46.53212],[10.02855,46.43588],[10.07357,46.39832],[10.12095,46.39669],[10.0783,46.32802],[10.14464,46.26582],[10.10436,46.24781],[9.97407,46.40812],[9.71111,46.3689],[9.68742,46.32312],[9.61872,46.30675],[9.55712,46.32475],[9.50264,46.39015],[9.47895,46.5256],[9.25626,46.51582],[9.22546,46.44078],[9.27284,46.34438],[9.17098,46.19044],[9.04305,46.12808],[9.062,46.09195],[8.97435,46.04593],[8.98856,46.00152],[8.93882,45.97354],[9.04068,45.8961],[9.01936,45.84827],[8.84879,46.0081],[8.89854,46.07059],[8.8251,46.11823],[8.70902,46.11659],[8.67823,46.07552],[8.7185,46.01468],[8.55504,45.90434],[8.59768,45.83836],[8.53372,45.79378],[8.6877,45.49235],[8.78009,45.41591],[8.68533,45.37931],[8.71139,45.34103],[8.69481,45.32104],[8.62848,45.37765],[8.5124,45.35768],[8.4816,45.28938]]],terms_url:"https://www.dati.gov.it/content/italian-open-data-license-v20",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}",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",scaleExtent:[0,19],polygon:[[[-51.10903,-23.39275],[-51.11015,-23.39112],[-51.11198,-23.3896],[-51.11358,-23.38977],[-51.121,-23.38593],[-51.12225,-23.38511],[-51.12483,-23.3835],[-51.12538,-23.38187],[-51.12482,-23.3777],[-51.12446,-23.37505],[-51.12437,-23.3723],[-51.12244,-23.37033],[-51.12302,-23.36643],[-51.12856,-23.36548],[-51.12832,-23.35884],[-51.12477,-23.35476],[-51.12703,-23.35091],[-51.12412,-23.3468],[-51.12025,-23.34781],[-51.11765,-23.33969],[-51.11265,-23.34129],[-51.1094,-23.33489],[-51.10756,-23.33409],[-51.10486,-23.33398],[-51.10253,-23.33419],[-51.09987,-23.33102],[-51.09801,-23.32936],[-51.09999,-23.32831],[-51.10323,-23.32532],[-51.10473,-23.32319],[-51.10466,-23.32129],[-51.10515,-23.31844],[-51.10636,-23.31575],[-51.10661,-23.31467],[-51.1105,-23.31167],[-51.11158,-23.30842],[-51.0995,-23.30947],[-51.0974,-23.30863],[-51.09512,-23.30745],[-51.09202,-23.30494],[-51.09036,-23.30371],[-51.09205,-23.29875],[-51.09269,-23.2975],[-51.09408,-23.29295],[-51.10074,-23.29332],[-51.10102,-23.28871],[-51.10068,-23.28837],[-51.10085,-23.28778],[-51.09938,-23.28664],[-51.09632,-23.27791],[-51.10285,-23.27302],[-51.10836,-23.27034],[-51.1131,-23.2684],[-51.1316,-23.26534],[-51.13188,-23.26201],[-51.13173,-23.25506],[-51.1329,-23.25468],[-51.13296,-23.25075],[-51.13474,-23.25127],[-51.13534,-23.25133],[-51.13517,-23.24359],[-51.13535,-23.24118],[-51.13752,-23.24219],[-51.13885,-23.2435],[-51.14109,-23.24521],[-51.14717,-23.24318],[-51.14761,-23.23828],[-51.14908,-23.23588],[-51.14977,-23.23681],[-51.15139,-23.23854],[-51.15289,-23.23884],[-51.15384,-23.23895],[-51.1582,-23.23814],[-51.16045,-23.23816],[-51.16035,-23.24658],[-51.15912,-23.24783],[-51.16131,-23.24777],[-51.16659,-23.24594],[-51.17193,-23.24582],[-51.17205,-23.24956],[-51.17424,-23.2484],[-51.17514,-23.24932],[-51.17686,-23.24816],[-51.17947,-23.25169],[-51.18135,-23.25381],[-51.18274,-23.25363],[-51.18379,-23.25326],[-51.18496,-23.2533],[-51.18627,-23.25215],[-51.18665,-23.24748],[-51.19118,-23.24914],[-51.19142,-23.25286],[-51.19369,-23.25278],[-51.19384,-23.26074],[-51.20097,-23.26055],[-51.20127,-23.2426],[-51.20994,-23.24278],[-51.2109,-23.26988],[-51.21969,-23.27222],[-51.22597,-23.27453],[-51.22934,-23.2786],[-51.23452,-23.2816],[-51.23498,-23.28325],[-51.23507,-23.28544],[-51.23371,-23.2859],[-51.23216,-23.28802],[-51.2287,-23.29229],[-51.2274,-23.2946],[-51.22679,-23.29548],[-51.2256,-23.29657],[-51.22393,-23.29721],[-51.22048,-23.30073],[-51.21864,-23.3013],[-51.21668,-23.30212],[-51.21424,-23.30441],[-51.21097,-23.30697],[-51.22328,-23.3183],[-51.22439,-23.31459],[-51.22521,-23.31289],[-51.22512,-23.31258],[-51.22521,-23.31251],[-51.22553,-23.31253],[-51.22595,-23.31239],[-51.22617,-23.31183],[-51.22936,-23.31489],[-51.22802,-23.31661],[-51.22789,-23.31902],[-51.22767,-23.32023],[-51.22723,-23.32151],[-51.22739,-23.32223],[-51.22725,-23.32285],[-51.23033,-23.32558],[-51.23046,-23.32671],[-51.22954,-23.32789],[-51.22916,-23.3305],[-51.22929,-23.33178],[-51.22681,-23.33447],[-51.22602,-23.33657],[-51.22473,-23.33839],[-51.2221,-23.34023],[-51.22257,-23.34196],[-51.22381,-23.34339],[-51.22384,-23.34531],[-51.22441,-23.347],[-51.22454,-23.34829],[-51.22404,-23.34968],[-51.22351,-23.35011],[-51.22382,-23.35077],[-51.22305,-23.35174],[-51.2226,-23.35296],[-51.22587,-23.35481],[-51.2265,-23.36706],[-51.22354,-23.36915],[-51.22367,-23.37968],[-51.22038,-23.38163],[-51.21647,-23.3817],[-51.21416,-23.37995],[-51.20928,-23.37395],[-51.20738,-23.36814],[-51.20629,-23.36723],[-51.20472,-23.36627],[-51.19823,-23.36668],[-51.19297,-23.36651],[-51.18986,-23.36544],[-51.18806,-23.36464],[-51.18718,-23.36453],[-51.1858,-23.36374],[-51.18304,-23.36359],[-51.18071,-23.36376],[-51.17907,-23.36158],[-51.17764,-23.35836],[-51.16684,-23.35626],[-51.16614,-23.35854],[-51.16476,-23.36039],[-51.16077,-23.35922],[-51.15983,-23.3666],[-51.16204,-23.36861],[-51.16276,-23.37416],[-51.15845,-23.3758],[-51.15505,-23.37631],[-51.15396,-23.37903],[-51.15299,-23.38105],[-51.15119,-23.38208],[-51.14917,-23.38251],[-51.14722,-23.38216],[-51.14518,-23.38259],[-51.1441,-23.38376],[-51.14512,-23.38808],[-51.1418,-23.3894],[-51.14031,-23.3888],[-51.14068,-23.39161],[-51.14127,-23.39354],[-51.14094,-23.39443],[-51.14046,-23.39536],[-51.13939,-23.3951],[-51.13739,-23.39315],[-51.13609,-23.3898],[-51.13429,-23.38976],[-51.13216,-23.39007],[-51.13172,-23.39286],[-51.12259,-23.38864],[-51.12228,-23.39166],[-51.11883,-23.39317],[-51.11568,-23.39335],[-51.10903,-23.39275]],[[-51.13829,-23.41601],[-51.13331,-23.41867],[-51.13209,-23.41644],[-51.13002,-23.41829],[-51.12869,-23.41901],[-51.12824,-23.42103],[-51.12696,-23.42186],[-51.12533,-23.42269],[-51.12445,-23.42097],[-51.12151,-23.42411],[-51.12063,-23.42327],[-51.11971,-23.42312],[-51.11977,-23.42157],[-51.1188,-23.42155],[-51.11643,-23.42084],[-51.11943,-23.41917],[-51.11787,-23.41678],[-51.11655,-23.41731],[-51.1157,-23.4157],[-51.11512,-23.41309],[-51.11908,-23.41111],[-51.1196,-23.4117],[-51.12052,-23.41489],[-51.12148,-23.41714],[-51.12309,-23.41863],[-51.12755,-23.41654],[-51.12803,-23.4174],[-51.1312,-23.41557],[-51.1308,-23.41477],[-51.13279,-23.41264],[-51.13522,-23.41106],[-51.13586,-23.41096],[-51.13682,-23.41119],[-51.13721,-23.41158],[-51.1373,-23.41324],[-51.13743,-23.41471],[-51.13829,-23.41601]],[[-51.18929,-23.61469],[-51.18869,-23.61385],[-51.18818,-23.61339],[-51.18731,-23.61302],[-51.18629,-23.61314],[-51.18402,-23.61396],[-51.18349,-23.61397],[-51.18183,-23.61284],[-51.1814,-23.61344],[-51.18063,-23.61314],[-51.18001,-23.61409],[-51.17866,-23.61329],[-51.18065,-23.6106],[-51.17972,-23.61018],[-51.18062,-23.60849],[-51.18212,-23.6085],[-51.18261,-23.60775],[-51.1832,-23.60804],[-51.18415,-23.60628],[-51.18511,-23.60666],[-51.18649,-23.6047],[-51.18902,-23.6061],[-51.18821,-23.60742],[-51.18919,-23.60802],[-51.1889,-23.60953],[-51.18962,-23.60993],[-51.19119,-23.61119],[-51.19015,-23.61245],[-51.19054,-23.61276],[-51.19029,-23.61378],[-51.18929,-23.61469]],[[-51.08006,-23.52984],[-51.07962,-23.52205],[-51.08468,-23.52194],[-51.08582,-23.52404],[-51.08589,-23.52704],[-51.08579,-23.52777],[-51.0853,-23.52806],[-51.08514,-23.52857],[-51.08512,-23.52982],[-51.08471,-23.53024],[-51.08343,-23.53024],[-51.0833,-23.52978],[-51.08006,-23.52984]]],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:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],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:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],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:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],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:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],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:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],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:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],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:[1,19],polygon:[[[140.99486,-28.95297],[148.96114,-28.89977],[148.98701,-28.48623],[151.01361,-28.47865],[151.10847,-28.70329],[151.87599,-28.68312],[151.93348,-28.40788],[152.25544,-28.23327],[153.06608,-28.21047],[153.14082,-28.1091],[153.47351,-28.11648],[153.35765,-27.69361],[159.49383,-27.69925],[159.4857,-37.84741],[149.52569,-37.82815],[149.91596,-37.487],[148.04859,-36.81317],[147.9681,-36.15679],[146.71477,-36.28666],[145.30046,-36.15679],[144.53007,-36.14751],[142.8398,-35.02543],[142.35686,-34.78025],[141.97741,-34.40162],[140.99503,-34.13718],[140.99486,-28.95297]]],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:[1,21],polygon:[[[140.98687,-28.98878],[148.99515,-28.97275],[148.99667,-28.49151],[151.0029,-28.49307],[151.0029,-28.72617],[151.49151,-28.73239],[151.49187,-28.71553],[151.92282,-28.71964],[151.92516,-28.48971],[151.99559,-28.48987],[151.99899,-28.11927],[152.49676,-28.12209],[152.49682,-28.11464],[153.00446,-28.11544],[153.00446,-28.1204],[153.50386,-28.11934],[153.50393,-28.12271],[153.59194,-28.12236],[153.59266,-28.17769],[153.61112,-28.17579],[153.61139,-28.18252],[153.74268,-28.21621],[153.77873,-28.71091],[152.6238,-32.58772],[152.3124,-32.63288],[151.41419,-33.57904],[150.89299,-35.26487],[150.46207,-35.77773],[150.01565,-37.51036],[149.99181,-37.51268],[149.51978,-37.51307],[149.51996,-37.52169],[149.4463,-37.53537],[149.06334,-37.5358],[148.98366,-37.52176],[148.98169,-37.5192],[148.98638,-37.2585],[148.48754,-37.26585],[148.48248,-37.00927],[147.99439,-37.01434],[147.98829,-36.53322],[147.95297,-36.52607],[147.94865,-36.0686],[147.5035,-36.07168],[147.50477,-36.2651],[146.492,-36.26613],[146.49225,-36.2565],[145.99298,-36.25343],[145.99659,-36.01881],[145.98316,-36.01871],[145.96245,-36.0219],[145.94624,-36.01209],[145.94543,-36.00603],[145.50415,-36.00136],[145.50379,-36.01091],[145.0072,-36.00362],[145.00354,-36.15204],[144.48608,-36.14231],[144.48741,-36.01375],[143.98747,-36.00241],[143.99329,-35.57238],[143.49717,-35.58371],[143.4918,-35.40656],[143.46134,-35.36749],[143.45856,-35.35559],[143.48978,-35.33965],[143.48955,-35.33221],[143.4317,-35.25706],[143.25055,-35.26066],[143.24384,-35.01327],[142.99333,-35.01772],[142.99198,-34.79619],[142.49714,-34.80323],[142.49732,-34.80076],[142.42114,-34.80176],[142.42092,-34.78383],[142.23309,-34.78592],[142.23077,-34.78075],[142.227,-34.50613],[141.99753,-34.50837],[141.9946,-34.25267],[141.49823,-34.25569],[141.49817,-34.25228],[140.99454,-34.25284],[140.98687,-28.98878]]],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.98687,-28.98878],[148.99515,-28.97275],[148.99667,-28.49151],[151.0029,-28.49307],[151.0029,-28.72617],[151.49151,-28.73239],[151.49187,-28.71553],[151.92282,-28.71964],[151.92516,-28.48971],[151.99559,-28.48987],[151.99899,-28.11927],[152.49676,-28.12209],[152.49682,-28.11464],[153.00446,-28.11544],[153.00446,-28.1204],[153.50386,-28.11934],[153.50393,-28.12271],[153.59194,-28.12236],[153.59266,-28.17769],[153.61112,-28.17579],[153.61139,-28.18252],[153.74268,-28.21621],[153.77873,-28.71091],[152.6238,-32.58772],[152.3124,-32.63288],[151.41419,-33.57904],[150.89299,-35.26487],[150.46207,-35.77773],[150.01565,-37.51036],[149.99181,-37.51268],[149.51978,-37.51307],[149.51996,-37.52169],[149.4463,-37.53537],[149.06334,-37.5358],[148.98366,-37.52176],[148.98169,-37.5192],[148.98638,-37.2585],[148.48754,-37.26585],[148.48248,-37.00927],[147.99439,-37.01434],[147.98829,-36.53322],[147.95297,-36.52607],[147.94865,-36.0686],[147.5035,-36.07168],[147.50477,-36.2651],[146.492,-36.26613],[146.49225,-36.2565],[145.99298,-36.25343],[145.99659,-36.01881],[145.98316,-36.01871],[145.96245,-36.0219],[145.94624,-36.01209],[145.94543,-36.00603],[145.50415,-36.00136],[145.50379,-36.01091],[145.0072,-36.00362],[145.00354,-36.15204],[144.48608,-36.14231],[144.48741,-36.01375],[143.98747,-36.00241],[143.99329,-35.57238],[143.49717,-35.58371],[143.4918,-35.40656],[143.46134,-35.36749],[143.45856,-35.35559],[143.48978,-35.33965],[143.48955,-35.33221],[143.4317,-35.25706],[143.25055,-35.26066],[143.24384,-35.01327],[142.99333,-35.01772],[142.99198,-34.79619],[142.49714,-34.80323],[142.49732,-34.80076],[142.42114,-34.80176],[142.42092,-34.78383],[142.23309,-34.78592],[142.23077,-34.78075],[142.227,-34.50613],[141.99753,-34.50837],[141.9946,-34.25267],[141.49823,-34.25569],[141.49817,-34.25228],[140.99454,-34.25284],[140.98687,-28.98878]]],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:[1,16],polygon:[[[140.99884,-28.99924],[148.95024,-28.99937],[148.94988,-28.96653],[148.99983,-28.96653],[149.00009,-28.81658],[149.10007,-28.81658],[149.0997,-28.74885],[148.99985,-28.74974],[148.99982,-28.50003],[151.00005,-28.50052],[151.00059,-28.73258],[151.02395,-28.73274],[151.02413,-28.74188],[151.03293,-28.74188],[151.03383,-28.75054],[151.99998,-28.74953],[151.99998,-28.71645],[152.0334,-28.71661],[152.03322,-28.6832],[152.00007,-28.68335],[151.99988,-28.64163],[151.98299,-28.64139],[151.98317,-28.62491],[151.93313,-28.62475],[151.93341,-28.50007],[151.99989,-28.50023],[151.99986,-28.37496],[152.24997,-28.37507],[152.24994,-28.25001],[152.99972,-28.24986],[152.9999,-28.28324],[153.1165,-28.2834],[153.11659,-28.24986],[153.16663,-28.25001],[153.16672,-28.23316],[153.24999,-28.23324],[153.25003,-28.12497],[153.62496,-28.12508],[153.62484,-28.49991],[153.7498,-28.49999],[153.74959,-28.7498],[153.62481,-28.75011],[153.62497,-28.99993],[153.49977,-29.00006],[153.49984,-29.49951],[153.3748,-29.50005],[153.37541,-29.87503],[153.49991,-29.87514],[153.49991,-30.00009],[153.24989,-29.99976],[153.25002,-30.19177],[153.27482,-30.19162],[153.27482,-30.21685],[153.21661,-30.21661],[153.21661,-30.25006],[153.25002,-30.25006],[153.24975,-30.37519],[153.12436,-30.37497],[153.12465,-30.62504],[153.03317,-30.62505],[153.03339,-30.87508],[153.12492,-30.87503],[153.12493,-31.12505],[153.00824,-31.12497],[153.00829,-31.24998],[153,-31.25],[152.99994,-31.62499],[152.87494,-31.62505],[152.87496,-31.74995],[152.78329,-31.75],[152.7832,-31.87486],[152.74991,-31.87501],[152.75004,-32.00002],[152.6249,-31.99994],[152.62491,-32.5],[152.49998,-32.49996],[152.50003,-32.56664],[152.41667,-32.56634],[152.41676,-32.625],[152.34985,-32.62499],[152.34985,-32.63323],[152.28308,-32.63322],[152.28326,-32.62498],[152.24948,-32.62498],[152.24981,-32.87491],[151.87457,-32.87504],[151.87485,-33.00001],[151.74977,-33.00015],[151.75047,-33.25004],[151.62524,-33.24974],[151.62508,-33.37516],[151.49958,-33.37514],[151.50031,-33.62494],[151.37415,-33.62437],[151.37279,-34.00196],[151.24778,-34.00112],[151.24778,-34.24931],[150.99573,-34.25015],[151.00081,-34.62483],[150.87174,-34.6265],[150.87276,-35.12427],[150.76706,-35.12344],[150.76909,-35.24638],[150.62579,-35.2497],[150.62803,-35.37515],[150.49997,-35.37515],[150.49591,-35.6275],[150.37192,-35.62503],[150.37497,-35.7538],[150.26724,-35.75132],[150.2652,-35.87412],[150.24792,-35.87083],[150.24589,-36.37488],[150.12292,-36.37488],[150.12597,-36.62243],[150.02535,-36.62407],[150.0284,-36.74713],[149.99283,-36.74958],[150.00401,-37.12245],[150.05889,-37.12731],[150.05686,-37.37809],[149.99791,-37.37324],[149.99994,-37.48301],[149.98774,-37.48462],[149.98571,-37.508],[148.06846,-36.80624],[147.99306,-36.138],[147.81483,-36.00556],[147.38939,-36.01137],[147.38221,-36.13103],[146.99725,-36.12755],[146.98863,-36.25283],[146.49564,-36.24471],[146.50426,-36.12639],[145.00118,-36.00795],[145.01541,-36.25421],[144.50725,-36.24765],[144.49912,-36.0211],[143.99654,-35.98105],[143.33826,-35.23318],[142.40976,-34.76694],[142.03614,-34.37588],[140.99652,-34.13858],[140.99884,-28.99924]]],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.69049,45.54652],[4.83131,45.54652],[4.83131,45.57131],[4.88344,45.57131],[4.88344,45.59745],[5.16622,45.59745],[5.16622,45.74533],[5.10793,45.74533],[5.10793,45.88145],[4.90698,45.88145],[4.90698,45.92107],[4.84377,45.92107],[4.84377,45.94011],[4.71543,45.94011],[4.71543,45.87018],[4.67458,45.87018],[4.67458,45.7178],[4.69567,45.7178],[4.69049,45.54652]]],terms_url:"https://data.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.66489,45.54688],[4.88253,45.54348],[4.88435,45.59745],[5.16623,45.59242],[5.17217,45.74532],[5.10793,45.74653],[5.11305,45.88145],[4.90698,45.88508],[4.90822,45.92106],[4.84377,45.92212],[4.84497,45.9581],[4.67729,45.96069],[4.66489,45.54688]]],terms_url:"https://data.grandlyon.com/imagerie/orthophotographie-2015-du-grand-lyon",terms_text:"Métropole de Lyon DINSI",best:true},{id:"MainRoadsWA_Road_Hierarchy",name:"Main Roads WA Road Hierarchy",type:"wms",template:"https://services.slip.wa.gov.au/public/services/SLIP_Public_Services/Transport/MapServer/WMSServer?LAYERS=8&TRANSPARENT=TRUE&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&FORMAT=image%2Fpng&SRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}",projection:"EPSG:3857",scaleExtent:[0,21],polygon:[[[129.00009,-31.68764],[128.99872,-14.58225],[127.08984,-12.29707],[124.76074,-12.98315],[121.24512,-15.70766],[119.0918,-17.60214],[115.53223,-18.85431],[112.41211,-20.46819],[111.24756,-22.83695],[111.00586,-25.62172],[111.64307,-29.66896],[111.68701,-32.3614],[112.14844,-34.47034],[113.35693,-36.10238],[116.98242,-36.70366],[119.44336,-36.94989],[122.27783,-36.61553],[125.99121,-35.40696],[127.59521,-34.57895],[128.86963,-33.59632],[129.00009,-31.68764]]],terms_url:"https://catalogue.data.wa.gov.au/dataset/clss-road-hierarchy",terms_text:"Main Roads Western Australia",overlay:true},{id:"mainzlatestaerialimagery",name:"Mainz latest aerial imagery",type:"wms",template:"https://gint.mainz.de/gint1-cgi/mapserv?map=/data/mapbender-int/umn-www/client/a62/luftbild.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_f_mz_2016&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[17,22],polygon:[[[8.10355,49.865],[8.38356,49.865],[8.38356,50.0466],[8.10355,50.0466],[8.10355,49.865]]],terms_url:"https://www.mainz.de/vv/oe/100140100000035141.php#tab-infos",terms_text:"Vermessung und Geoinformation Mainz",icon:"https://www.mainz.de/configuration.inc.php.media/27432/Logo-72px.png"},{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.94048,-9.57588],[-36.94106,-9.48536],[-37.03215,-9.48606],[-37.03164,-9.57639],[-36.94048,-9.57588]]],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/v4/mapbox.satellite/{zoom}/{x}/{y}.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",scaleExtent:[0,22],terms_url:"https://www.mapbox.com/about/maps",terms_text:"Terms & Feedback","default":true,description:"Satellite and aerial imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/MapBoxSatellite.png"},{id:"Maps4BW-LGL_BW",name:"Maps4BW (LGL-BW, www.lgl-bw.de)",type:"wms",template:"http://www.webatlasde.de/arcgis/services/Maps4BW/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Halbtonvariante&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.06954,49.57679],[9.10577,49.57952],[9.16079,49.58263],[9.24212,49.58402],[9.27192,49.63515],[9.30454,49.65561],[9.36753,49.65893],[9.38253,49.64341],[9.41191,49.66033],[9.39602,49.67143],[9.41828,49.69706],[9.40378,49.71957],[9.37769,49.70357],[9.35828,49.70334],[9.29438,49.73958],[9.31467,49.76859],[9.42435,49.79099],[9.50417,49.78962],[9.51808,49.78214],[9.65623,49.79286],[9.65317,49.73944],[9.63435,49.70076],[9.67054,49.69515],[9.67721,49.71846],[9.71079,49.72918],[9.8014,49.73429],[9.83728,49.70237],[9.87656,49.61362],[9.83362,49.55607],[9.84954,49.54793],[9.87463,49.5836],[9.91419,49.58955],[9.93066,49.56097],[9.92482,49.48951],[10.01787,49.48673],[10.03352,49.52978],[10.06372,49.55129],[10.09052,49.54218],[10.12792,49.51192],[10.11027,49.49272],[10.16753,49.38589],[10.12627,49.3809],[10.14385,49.32772],[10.16061,49.27043],[10.13569,49.26189],[10.14311,49.20387],[10.25161,49.15031],[10.26279,49.12959],[10.26869,49.05202],[10.36527,49.02557],[10.45894,48.93581],[10.46208,48.83947],[10.42886,48.74973],[10.46648,48.73627],[10.49761,48.68581],[10.45007,48.66277],[10.3553,48.65068],[10.32297,48.68241],[10.26028,48.67842],[10.32542,48.60763],[10.31448,48.52323],[10.17973,48.45977],[10.12892,48.45301],[10.10938,48.47445],[10.06355,48.45381],[10.03918,48.45125],[10.04492,48.43158],[10.0152,48.40323],[9.98709,48.38565],[9.97328,48.37944],[9.97549,48.36558],[9.99071,48.3734],[10.00265,48.3632],[9.99992,48.35572],[10.06698,48.28172],[10.08111,48.2253],[10.11306,48.12632],[10.13966,48.11307],[10.14695,48.07455],[10.13763,48.01938],[10.11725,47.9755],[10.11359,47.93422],[10.10709,47.86711],[10.14174,47.80956],[10.0732,47.78686],[10.11825,47.76126],[10.14213,47.70165],[10.13262,47.67678],[10.07445,47.63472],[10.06303,47.66923],[10.00359,47.67526],[9.95808,47.64376],[9.84481,47.67533],[9.83488,47.66042],[9.74926,47.60206],[9.70817,47.60007],[9.65788,47.60599],[9.64742,47.58931],[9.61389,47.57809],[9.56602,47.53274],[9.51199,47.53246],[9.25717,47.65752],[9.18684,47.65697],[9.17591,47.65379],[9.17028,47.65474],[9.15555,47.666],[9.1494,47.66713],[9.13947,47.66367],[9.02005,47.68616],[8.94127,47.65569],[8.89825,47.64821],[8.88263,47.65327],[8.87474,47.6545],[8.87235,47.66971],[8.84949,47.68089],[8.84993,47.70233],[8.81816,47.71242],[8.80108,47.72811],[8.77231,47.71606],[8.81295,47.6959],[8.79373,47.67216],[8.7533,47.68997],[8.72575,47.6917],[8.71002,47.68829],[8.68937,47.69318],[8.67046,47.68235],[8.65783,47.68883],[8.66161,47.71454],[8.70596,47.71584],[8.70932,47.73275],[8.73033,47.75527],[8.72003,47.76273],[8.68871,47.75314],[8.67898,47.78306],[8.64981,47.79435],[8.65592,47.76948],[8.63132,47.75749],[8.61918,47.76216],[8.61351,47.78451],[8.61686,47.79705],[8.568,47.79977],[8.57611,47.79015],[8.57847,47.78102],[8.56315,47.77654],[8.48889,47.76458],[8.45742,47.74126],[8.4623,47.72909],[8.44929,47.71663],[8.41471,47.69991],[8.4273,47.68562],[8.41061,47.6743],[8.46839,47.6568],[8.52474,47.64677],[8.5269,47.66373],[8.56441,47.67261],[8.57853,47.66373],[8.60454,47.6751],[8.63333,47.65212],[8.62386,47.63922],[8.60395,47.63193],[8.61281,47.61327],[8.57951,47.59306],[8.5602,47.59867],[8.56765,47.61442],[8.53394,47.62984],[8.51208,47.61641],[8.46581,47.60137],[8.46631,47.58666],[8.48985,47.59139],[8.5,47.58062],[8.43414,47.5629],[8.39882,47.57559],[8.38525,47.56408],[8.32701,47.56893],[8.29483,47.59077],[8.2948,47.60497],[8.26293,47.60823],[8.22435,47.60446],[8.18644,47.60508],[8.16904,47.59394],[8.13615,47.58246],[8.10503,47.56795],[8.09873,47.55933],[8.08261,47.55624],[8.07095,47.56299],[8.0274,47.54931],[7.94632,47.54209],[7.90966,47.54825],[7.90676,47.5603],[7.88681,47.58765],[7.83987,47.58122],[7.79648,47.55517],[7.69208,47.53137],[7.66583,47.53403],[7.63159,47.56044],[7.63879,47.56619],[7.68607,47.57205],[7.65278,47.59418],[7.62247,47.57767],[7.60473,47.57822],[7.58771,47.59015],[7.52156,47.65161],[7.50399,47.70235],[7.52096,47.77685],[7.55712,47.84839],[7.54946,47.8792],[7.57461,47.93028],[7.61318,47.96804],[7.6119,47.9871],[7.56124,48.03836],[7.57491,48.1258],[7.59534,48.15977],[7.63305,48.19717],[7.66275,48.22473],[7.68466,48.30305],[7.76346,48.49158],[7.80046,48.5126],[7.79958,48.5878],[7.83409,48.64439],[7.91211,48.68899],[7.96723,48.75716],[8.02069,48.78879],[8.04302,48.7956],[8.08647,48.81306],[8.13644,48.89782],[8.19706,48.96021],[8.28161,48.9949],[8.29967,49.02597],[8.31243,49.05996],[8.38654,49.23497],[8.46083,49.28407],[8.48783,49.29326],[8.47577,49.3079],[8.44839,49.31693],[8.45152,49.33135],[8.46288,49.3869],[8.49407,49.40186],[8.49762,49.41583],[8.50721,49.43414],[8.49834,49.44187],[8.47977,49.44391],[8.46414,49.44151],[8.44696,49.44516],[8.43947,49.45214],[8.44407,49.46085],[8.45992,49.46498],[8.46312,49.47135],[8.4554,49.48107],[8.44184,49.49297],[8.41194,49.55852],[8.42193,49.5843],[8.44117,49.59081],[8.45482,49.59157],[8.47738,49.5874],[8.56161,49.52237],[8.61486,49.54175],[8.59165,49.59179],[8.58706,49.61156],[8.65189,49.6209],[8.69494,49.62762],[8.70105,49.59869],[8.68726,49.57096],[8.72597,49.53085],[8.78493,49.51775],[8.81467,49.53187],[8.88863,49.51091],[8.90168,49.50363],[8.90315,49.486],[8.87995,49.46561],[8.83117,49.42147],[8.80845,49.40981],[8.82075,49.39647],[8.83009,49.41316],[8.85107,49.39663],[8.90247,49.44632],[8.93863,49.48179],[8.95154,49.50562],[8.98498,49.51153],[9.03553,49.50079],[9.05731,49.532],[9.10023,49.52728],[9.11009,49.51213],[9.12424,49.51722],[9.11286,49.53337],[9.08284,49.54211],[9.06694,49.56433],[9.06954,49.57679]]],terms_url:"https://www.lgl-bw.de/",terms_text:"Datengrundlage: LGL, www.lgl-bw.de"},{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.34201,-9.49289],[-36.3422,-9.47533],[-36.34275,-9.4029],[-36.34473,-9.4029],[-36.34537,-9.40279],[-36.34702,-9.40293],[-36.3508,-9.40291],[-36.359,-9.40307],[-36.36109,-9.403],[-36.36289,-9.40307],[-36.3659,-9.40305],[-36.36713,-9.40301],[-36.37571,-9.40307],[-36.38049,-9.40308],[-36.38663,-9.4032],[-36.38852,-9.40312],[-36.39286,-9.40325],[-36.39656,-9.40322],[-36.40309,-9.40327],[-36.41973,-9.40338],[-36.43368,-9.4034],[-36.43355,-9.41685],[-36.43344,-9.42386],[-36.43338,-9.43753],[-36.43329,-9.45012],[-36.433,-9.49359],[-36.40839,-9.4935],[-36.40442,-9.49354],[-36.40008,-9.49351],[-36.39787,-9.49342],[-36.39168,-9.49328],[-36.38757,-9.49331],[-36.38536,-9.49341],[-36.37673,-9.49331],[-36.37427,-9.49319],[-36.36707,-9.49299],[-36.36502,-9.493],[-36.36043,-9.49299],[-36.35955,-9.49295],[-36.35895,-9.49304],[-36.35703,-9.49294],[-36.35665,-9.493],[-36.3526,-9.493],[-36.34767,-9.49297],[-36.34201,-9.49289]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"MassGIS-L3-Parcels",name:"MassGIS L3 Parcels",type:"tms",template:"http://tile.osm.osuosl.org/tiles/massgis_parcels/{zoom}/{x}/{y}.png",polygon:[[[-72.13569,42.03025],[-72.53156,42.03458],[-72.57278,42.03022],[-72.58216,42.02474],[-72.60717,42.02515],[-72.60797,42.03108],[-72.64019,42.03205],[-72.69933,42.03696],[-72.75714,42.03635],[-72.75868,42.02439],[-72.76572,42.02276],[-72.76673,42.00327],[-72.81705,41.99769],[-72.81378,42.03674],[-73.03678,42.03929],[-73.43281,42.05059],[-73.49688,42.04968],[-73.50814,42.08626],[-73.26496,42.74594],[-72.6872,42.73348],[-71.97286,42.71307],[-71.69663,42.70572],[-71.29464,42.69704],[-71.27894,42.71136],[-71.26787,42.72603],[-71.25526,42.73659],[-71.24598,42.74231],[-71.23732,42.74491],[-71.22391,42.74643],[-71.18181,42.73732],[-71.18617,42.79088],[-71.16667,42.80891],[-71.13277,42.82145],[-71.06442,42.80626],[-71.05395,42.83337],[-71.04483,42.84869],[-71.03128,42.85924],[-70.96702,42.86887],[-70.94967,42.87588],[-70.92973,42.88504],[-70.91465,42.88661],[-70.90348,42.88671],[-70.88566,42.88288],[-70.84776,42.86088],[-70.82963,42.86875],[-70.81567,42.87204],[-70.45842,42.67694],[-70.8759,42.35302],[-69.88713,42.0519],[-69.89537,41.21643],[-70.81959,41.23192],[-71.09996,41.43386],[-71.12047,41.49717],[-71.13131,41.59231],[-71.14059,41.6051],[-71.14047,41.62389],[-71.13569,41.6284],[-71.13291,41.6601],[-71.17605,41.6681],[-71.17588,41.67154],[-71.1954,41.67514],[-71.26139,41.7523],[-71.32885,41.7811],[-71.33407,41.79455],[-71.34156,41.79817],[-71.33914,41.80842],[-71.3472,41.8231],[-71.3449,41.828],[-71.3352,41.8355],[-71.3422,41.8448],[-71.33392,41.86229],[-71.34086,41.87872],[-71.33865,41.89865],[-71.38174,41.8932],[-71.38127,42.01885],[-71.49744,42.01725],[-71.52888,42.01499],[-71.79925,42.00807],[-71.80067,42.02351],[-72.0635,42.02735],[-72.13569,42.03025]]]},{id:"geodata.md.gov-MD_SixInchImagery",name:"MD Latest 6 Inch Aerial Imagery",type:"wms",template:"https://geodata.md.gov/imap/services/Imagery/MD_SixInchImagery/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=MD_SixInchImagery&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",scaleExtent:[0,20],polygon:[[[-76.23413,37.92037],[-76.59805,38.15832],[-76.94,38.27053],[-77.03819,38.41379],[-77.23526,38.33627],[-77.31216,38.41056],[-77.26273,38.56642],[-77.043,38.71338],[-77.04987,38.7937],[-76.92627,38.8925],[-77.04094,38.9845],[-77.12162,38.92523],[-77.15012,38.95514],[-77.25243,38.97543],[-77.25929,39.02425],[-77.34581,39.05492],[-77.46185,39.07038],[-77.53738,39.13965],[-77.47421,39.22481],[-77.57275,39.30428],[-77.72347,39.32899],[-77.77702,39.46323],[-77.86148,39.51622],[-77.84088,39.60886],[-77.95624,39.59299],[-78.16635,39.69556],[-78.27003,39.62156],[-78.3387,39.64007],[-78.46641,39.52364],[-78.6628,39.54006],[-78.79875,39.60622],[-78.9814,39.4468],[-79.06723,39.47649],[-79.48505,39.19954],[-79.48557,39.72158],[-75.78836,39.72181],[-75.69099,38.46058],[-75.04924,38.45816],[-75.04984,38.40222],[-75.08151,38.32321],[-75.09773,38.30907],[-75.187,38.09755],[-75.23798,38.0224],[-75.61821,37.98967],[-75.86369,37.90953],[-76.23413,37.92037]]],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:"https://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.46299,38.9808],[-76.46326,38.94779],[-76.49499,38.9369],[-76.51617,38.93697],[-76.54763,38.9591],[-76.54745,38.98667],[-76.51559,39.00306],[-76.4839,39.00292],[-76.46299,38.9808]],[[-76.09548,38.84133],[-76.0428,38.8409],[-76.04289,38.8298],[-76.03229,38.8297],[-76.03277,38.79667],[-76.02545,38.79664],[-76.02541,38.77462],[-76.03308,38.77472],[-76.03366,38.73073],[-76.05462,38.73094],[-76.0548,38.72005],[-76.10753,38.72043],[-76.10714,38.75338],[-76.11754,38.75346],[-76.11701,38.79731],[-76.09601,38.79715],[-76.09548,38.84133]],[[-77.23397,39.16838],[-77.25516,39.14647],[-77.25496,39.11343],[-77.18093,39.05337],[-77.14907,39.0477],[-77.12798,39.04779],[-77.10683,39.05325],[-77.10688,39.0917],[-77.11775,39.10827],[-77.16011,39.12485],[-77.15975,39.15214],[-77.17048,39.16302],[-77.21284,39.17272],[-77.23397,39.16838]]],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:"wms",template:"https://geodata.md.gov/imap/services/Transportation/MD_ColorBasemap/MapServer/WmsServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=MD_ColorBasemap&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-76.23413,37.92037],[-76.59805,38.15832],[-76.94,38.27053],[-77.03819,38.41379],[-77.23526,38.33627],[-77.31216,38.41056],[-77.26273,38.56642],[-77.043,38.71338],[-77.04987,38.7937],[-76.92627,38.8925],[-77.04094,38.9845],[-77.12162,38.92523],[-77.15012,38.95514],[-77.25243,38.97543],[-77.25929,39.02425],[-77.34581,39.05492],[-77.46185,39.07038],[-77.53738,39.13965],[-77.47421,39.22481],[-77.57275,39.30428],[-77.72347,39.32899],[-77.77702,39.46323],[-77.86148,39.51622],[-77.84088,39.60886],[-77.95624,39.59299],[-78.16635,39.69556],[-78.27003,39.62156],[-78.3387,39.64007],[-78.46641,39.52364],[-78.6628,39.54006],[-78.79875,39.60622],[-78.9814,39.4468],[-79.06723,39.47649],[-79.48505,39.19954],[-79.48557,39.72158],[-75.78836,39.72181],[-75.69099,38.46058],[-75.04924,38.45816],[-75.04984,38.40222],[-75.08151,38.32321],[-75.09773,38.30907],[-75.187,38.09755],[-75.23798,38.0224],[-75.61821,37.98967],[-75.86369,37.90953],[-76.23413,37.92037]]],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:"Metropole_Ruhr_RVR-DOP10",name:"Metropole Ruhr: Luftbilder (10 cm)",type:"wms",template:"https://geodaten.metropoleruhr.de/dop/dop?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=DOP&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[6.51691,51.81714],[6.52258,51.81469],[6.52281,51.81041],[6.52834,51.81053],[6.53991,51.80134],[6.5511,51.799],[6.56818,51.78992],[6.57476,51.79606],[6.58457,51.79369],[6.59102,51.8024],[6.60911,51.80019],[6.61081,51.79423],[6.63264,51.79981],[6.65946,51.7892],[6.66837,51.77738],[6.7138,51.78084],[6.70876,51.77131],[6.72131,51.76899],[6.7475,51.77035],[6.74862,51.77551],[6.75824,51.77656],[6.7698,51.76649],[6.77219,51.74596],[6.78862,51.74884],[6.79861,51.74217],[6.81927,51.74341],[6.81956,51.73741],[6.82683,51.72983],[6.8403,51.73694],[6.84995,51.73712],[6.85551,51.73636],[6.8586,51.72956],[6.9103,51.74592],[6.90861,51.75275],[6.91511,51.76144],[6.9157,51.7786],[6.93527,51.7738],[6.95606,51.77245],[6.97559,51.79936],[6.98794,51.80129],[6.99485,51.80141],[6.99497,51.79884],[7.02118,51.80014],[7.0244,51.7899],[7.03141,51.78745],[7.0316,51.78317],[7.03847,51.78414],[7.05392,51.77839],[7.06079,51.77936],[7.0609,51.77679],[7.07333,51.777],[7.07867,51.78137],[7.11433,51.78795],[7.13435,51.80542],[7.1616,51.81528],[7.16419,51.8196],[7.19177,51.82174],[7.2141,51.81694],[7.22121,51.81191],[7.23658,51.80785],[7.23668,51.80528],[7.24916,51.80461],[7.2535,51.79953],[7.26179,51.79966],[7.26485,51.79198],[7.26245,51.78252],[7.27229,51.77838],[7.26002,51.77391],[7.26012,51.77134],[7.2688,51.76118],[7.27577,51.75957],[7.27889,51.75019],[7.31079,51.74636],[7.3151,51.74214],[7.31519,51.73957],[7.31102,51.74036],[7.3125,51.73781],[7.32081,51.73707],[7.31169,51.72237],[7.29963,51.71277],[7.2985,51.70589],[7.31069,51.71207],[7.30825,51.70346],[7.32762,51.70202],[7.33057,51.69692],[7.34427,51.69969],[7.34599,51.69028],[7.33919,51.68761],[7.35589,51.68356],[7.35877,51.68017],[7.3781,51.67959],[7.39086,51.66947],[7.40617,51.6654],[7.41031,51.66545],[7.4101,51.67145],[7.43089,51.6683],[7.43892,51.67527],[7.44854,51.67625],[7.44933,51.69341],[7.44094,51.69673],[7.43792,51.7044],[7.42406,51.70593],[7.42245,51.71277],[7.43451,51.72321],[7.44825,51.72511],[7.46718,51.7365],[7.47273,51.73572],[7.4771,51.72892],[7.4826,51.72985],[7.47877,51.72037],[7.48435,51.71872],[7.48449,51.71444],[7.49119,51.72053],[7.49947,51.72063],[7.50214,51.72324],[7.51738,51.72172],[7.51788,51.70629],[7.53035,51.70473],[7.52922,51.69701],[7.53349,51.69277],[7.54458,51.6912],[7.5378,51.68768],[7.54477,51.6852],[7.5528,51.69301],[7.56651,51.69575],[7.56642,51.69832],[7.58706,51.70029],[7.59379,51.70551],[7.6048,51.7065],[7.60743,51.71082],[7.6143,51.71176],[7.61419,51.71518],[7.62663,51.71447],[7.62814,51.7102],[7.64321,51.71381],[7.6531,51.70621],[7.65428,51.71308],[7.668,51.71581],[7.66915,51.72353],[7.68832,51.72889],[7.69283,51.71608],[7.7012,51.71275],[7.71352,51.71631],[7.71481,51.71976],[7.71899,51.71809],[7.71749,51.72236],[7.72163,51.7224],[7.72555,51.73016],[7.73659,51.73028],[7.73638,51.73799],[7.75154,51.73901],[7.7699,51.72378],[7.77119,51.72722],[7.78908,51.72912],[7.79037,51.73256],[7.80282,51.73183],[7.80137,51.73439],[7.80825,51.73531],[7.81228,51.73964],[7.82058,51.73887],[7.82457,51.74491],[7.83287,51.74413],[7.83314,51.73385],[7.83739,51.72961],[7.85815,51.72724],[7.85822,51.72467],[7.86374,51.72472],[7.87187,51.7308],[7.87745,51.72828],[7.88038,51.72145],[7.88875,51.7181],[7.88912,51.70267],[7.90148,51.70536],[7.90568,51.70283],[7.91249,51.70632],[7.92768,51.7056],[7.92912,51.70305],[7.94014,51.704],[7.93746,51.70055],[7.94296,51.70146],[7.96108,51.69305],[7.97631,51.69061],[7.97779,51.68633],[7.9875,51.68385],[7.98761,51.67871],[7.99732,51.67622],[7.9974,51.67279],[7.98365,51.67096],[7.96286,51.67592],[7.95466,51.67242],[7.95366,51.65612],[7.94689,51.65092],[7.94984,51.64237],[7.94443,51.63804],[7.93477,51.6388],[7.93224,51.62935],[7.92406,51.62585],[7.92414,51.62242],[7.91195,51.61374],[7.91632,51.60349],[7.91378,51.59489],[7.87529,51.59282],[7.86837,51.59446],[7.85742,51.59179],[7.85889,51.58837],[7.82749,51.57863],[7.84327,51.55307],[7.83262,51.53925],[7.83277,51.53325],[7.84115,51.52819],[7.8345,51.51955],[7.83755,51.50758],[7.83212,51.50496],[7.83912,51.49988],[7.83923,51.4956],[7.84474,51.49479],[7.8506,51.48028],[7.83418,51.4784],[7.82198,51.47228],[7.80819,51.47471],[7.79876,51.46776],[7.78906,51.47109],[7.76169,51.46823],[7.74785,51.47237],[7.7425,51.46717],[7.73567,51.46623],[7.72864,51.47216],[7.69838,51.4744],[7.67525,51.46728],[7.65606,51.46621],[7.65347,51.46103],[7.63843,51.45914],[7.63589,51.45226],[7.62083,51.45122],[7.61407,51.44772],[7.61977,51.44092],[7.62525,51.44099],[7.62127,51.43666],[7.62825,51.43245],[7.62561,51.42899],[7.63125,51.42391],[7.61633,51.41859],[7.62183,51.4178],[7.62196,51.41352],[7.63313,51.40679],[7.61322,51.38512],[7.60485,51.39017],[7.60609,51.39447],[7.59647,51.39521],[7.58704,51.38995],[7.59,51.38313],[7.58465,51.37878],[7.58644,51.36509],[7.59234,51.35144],[7.59934,51.34638],[7.59257,51.34373],[7.59407,51.33946],[7.58186,51.33588],[7.58334,51.33247],[7.57655,51.33067],[7.57816,51.32298],[7.58373,51.31962],[7.57837,51.31612],[7.58134,51.30844],[7.58547,51.30763],[7.58305,51.29732],[7.56826,51.28942],[7.56582,51.27996],[7.55089,51.27635],[7.54977,51.26862],[7.52923,51.27008],[7.52797,51.26663],[7.51302,51.26387],[7.51049,51.25784],[7.50371,51.25604],[7.50385,51.25175],[7.49563,51.2525],[7.49438,51.24906],[7.49708,51.24995],[7.50271,51.24488],[7.50143,51.24229],[7.48262,51.23262],[7.469,51.23158],[7.46505,51.22724],[7.45129,51.23049],[7.44191,51.22522],[7.44478,51.22098],[7.43534,51.21742],[7.43816,51.21489],[7.43413,51.21312],[7.42995,51.21563],[7.42962,51.22506],[7.42408,51.22756],[7.41182,51.22653],[7.41342,51.2197],[7.39824,51.22463],[7.39521,51.23317],[7.40319,51.23928],[7.3934,51.246],[7.38793,51.24593],[7.38672,51.24162],[7.37853,51.24151],[7.37289,51.24657],[7.35526,51.2429],[7.35405,51.23859],[7.34849,51.24109],[7.339,51.23924],[7.33872,51.24695],[7.32904,51.25024],[7.3238,51.24417],[7.31284,51.24487],[7.31027,51.24054],[7.30481,51.24046],[7.29643,51.24549],[7.29764,51.24979],[7.28262,51.24957],[7.27541,51.25975],[7.2715,51.25455],[7.26734,51.25621],[7.26578,51.26133],[7.27623,51.27434],[7.26764,51.2845],[7.25531,51.28518],[7.26537,51.30847],[7.26521,51.31276],[7.25974,51.31268],[7.26511,51.31533],[7.26365,51.31788],[7.23393,51.308],[7.22973,51.31051],[7.2271,51.3079],[7.22296,51.3087],[7.22309,51.30527],[7.20682,51.30159],[7.20026,51.29463],[7.18792,51.2953],[7.18232,51.29864],[7.16869,51.29757],[7.18065,51.30633],[7.16674,51.31211],[7.16924,51.31815],[7.16503,51.32066],[7.1662,51.32582],[7.15645,51.32996],[7.15351,51.33505],[7.14807,51.33411],[7.14927,51.33842],[7.14513,51.33921],[7.15292,51.34962],[7.14882,51.34956],[7.14731,51.35296],[7.15665,51.35911],[7.15911,51.36601],[7.15189,51.37532],[7.14634,51.37695],[7.13957,51.37513],[7.13802,51.37939],[7.13262,51.37759],[7.127,51.38093],[7.12163,51.37827],[7.12153,51.38084],[7.11742,51.38078],[7.11626,51.37561],[7.11215,51.37555],[7.11205,51.37812],[7.1039,51.37627],[7.09853,51.37361],[7.10004,51.37021],[7.0919,51.36836],[7.08765,51.37172],[7.08088,51.3699],[7.07796,51.37414],[7.0552,51.36176],[7.04973,51.36167],[7.04404,51.36671],[7.03604,51.36144],[7.01944,51.36544],[7.01,51.36185],[7.00745,51.35752],[6.98689,51.35803],[6.98301,51.35282],[6.97743,51.35529],[6.97621,51.35184],[6.96545,51.34737],[6.95033,51.34882],[6.94748,51.35134],[6.9257,51.34839],[6.92422,51.35093],[6.92825,51.35272],[6.92137,51.35346],[6.92391,51.35779],[6.90565,51.36775],[6.90022,51.3668],[6.8904,51.37176],[6.87848,51.36297],[6.86745,51.36449],[6.85115,51.36162],[6.84552,51.36495],[6.84991,51.35903],[6.83385,51.35101],[6.82295,51.34995],[6.81731,51.35328],[6.81615,51.34897],[6.80939,51.34713],[6.80649,51.3505],[6.7941,51.35198],[6.79314,51.34339],[6.77673,51.34308],[6.7475,51.35281],[6.73831,51.34492],[6.72749,51.34214],[6.71287,51.33328],[6.69193,51.34144],[6.66428,51.3469],[6.65435,51.35356],[6.65789,51.36477],[6.67409,51.36938],[6.67794,51.3746],[6.67511,51.37626],[6.6684,51.37356],[6.67309,51.38908],[6.66081,51.38798],[6.65693,51.38362],[6.64602,51.38254],[6.64443,51.3868],[6.63626,51.38577],[6.63586,51.39348],[6.611,51.39726],[6.59479,51.39265],[6.57148,51.39302],[6.56618,51.38948],[6.55797,51.38931],[6.55496,51.39439],[6.54679,51.39337],[6.54505,51.40019],[6.53816,51.4009],[6.52939,51.41101],[6.52596,51.42379],[6.5149,51.42527],[6.51453,51.43213],[6.51987,51.43481],[6.52092,51.44084],[6.51119,51.4432],[6.50821,51.44743],[6.50273,51.44731],[6.50198,51.46101],[6.50709,51.46798],[6.49868,51.47123],[6.49698,51.4772],[6.49012,51.47705],[6.48714,51.48127],[6.4818,51.47859],[6.47608,51.48275],[6.47404,51.49471],[6.46699,51.49799],[6.46245,51.50561],[6.45407,51.508],[6.45497,51.51659],[6.44796,51.51901],[6.45326,51.52255],[6.44876,51.52931],[6.45562,51.52946],[6.47816,51.51966],[6.47499,51.52731],[6.48673,51.53871],[6.46262,51.55191],[6.49612,51.56806],[6.46176,51.56732],[6.42276,51.5759],[6.41912,51.56725],[6.40847,51.56101],[6.38918,51.56144],[6.37657,51.56545],[6.36951,51.56872],[6.36916,51.57471],[6.37726,51.57747],[6.37284,51.58251],[6.37372,51.59111],[6.35235,51.60349],[6.33482,51.59709],[6.32362,51.60026],[6.32067,51.60363],[6.33275,51.60905],[6.33392,51.6125],[6.30035,51.62117],[6.30143,51.62633],[6.29113,51.63725],[6.29225,51.64156],[6.29903,51.64343],[6.32563,51.63632],[6.32819,51.63981],[6.35403,51.64554],[6.35313,51.66095],[6.36553,51.66123],[6.36262,51.66374],[6.37069,51.66735],[6.38091,51.6813],[6.38062,51.68643],[6.37195,51.6931],[6.35808,51.6945],[6.35482,51.703],[6.3682,51.71016],[6.37642,51.7112],[6.38041,51.71387],[6.37731,51.7198],[6.38829,51.7209],[6.38789,51.72775],[6.40932,51.73937],[6.41055,51.74197],[6.40346,51.74524],[6.40597,51.74959],[6.40178,51.75035],[6.40287,51.75552],[6.41405,51.75319],[6.42134,51.7465],[6.42188,51.73708],[6.40877,51.72478],[6.40921,51.71708],[6.4164,51.71209],[6.44839,51.70765],[6.46246,51.70281],[6.47677,51.71855],[6.48908,51.72053],[6.48418,51.73414],[6.48942,51.7394],[6.48908,51.74539],[6.48171,51.75381],[6.53363,51.76434],[6.52478,51.77444],[6.50784,51.78094],[6.4898,51.80714],[6.48961,51.81056],[6.51162,51.81274],[6.51691,51.81714]]],terms_url:"http://www.rvr-online.de/",terms_text:"Datengrundlage: Regionalverband Ruhr, www.rvr-online.de"},{id:"miljodirektoratet-vern",name:"Miljødirektoratet Protected Areas overlay",type:"wms",template:"https://arcgisproxy.miljodirektoratet.no/arcgis/services/vern/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=naturvern_klasser_omrade,naturvern_punkt&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[0,22],polygon:[[[-10.95725,71.60964],[-6.16765,71.62095],[-6.13756,70.30991],[-10.92717,70.29784],[-10.95725,71.60964]],[[16.81947,74.9482],[21.25771,74.94213],[21.23712,73.8918],[16.79889,73.89828],[16.81947,74.9482]],[[4.04288,79.93593],[20.65421,81.54417],[36.6503,80.40108],[26.76265,75.8129],[13.88667,75.79135],[4.04288,79.93593]],[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"http://kart.naturbase.no/",terms_text:"© Miljødirektoratet",description:"Norwegian national parks, nature reserves and other protected areas and objects from Naturbase, including Svalbard/Spitsbergen",icon:"http://www.miljodirektoratet.no/Framework/favicon-32.png",overlay:true},{id:"miljodirektoratet-friluftsomrader",name:"Miljødirektoratet Public Recreation Areas overlay",type:"wms",template:"https://arcgisproxy.miljodirektoratet.no/arcgis/services/friluftsliv_statlig_sikra/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=friluftsliv_statlig_sikra&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"http://www.miljostatus.no/tema/friluftsliv/statlig-sikra-friluftlivsomrader/",terms_text:"© Miljødirektoratet",description:"Public recreation areas with State ownership (\"friluftsområder\").",icon:"http://www.miljodirektoratet.no/Framework/favicon-32.png",overlay:true},{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.8196,-9.35174],[-36.82017,-9.26142],[-36.82465,-9.26133],[-36.83064,-9.26147],[-36.83673,-9.2615],[-36.84228,-9.26148],[-36.84562,-9.2616],[-36.85564,-9.2616],[-36.86214,-9.26159],[-36.8659,-9.26147],[-36.86724,-9.2615],[-36.86952,-9.26149],[-36.87127,-9.26157],[-36.87476,-9.26153],[-36.87816,-9.26163],[-36.88321,-9.2617],[-36.88565,-9.26167],[-36.88857,-9.26148],[-36.89217,-9.26151],[-36.89383,-9.26163],[-36.8974,-9.26175],[-36.91122,-9.26183],[-36.9111,-9.26651],[-36.91112,-9.28542],[-36.91121,-9.29066],[-36.91118,-9.29368],[-36.91099,-9.29929],[-36.91091,-9.30729],[-36.9109,-9.3123],[-36.91083,-9.31597],[-36.91084,-9.32013],[-36.91098,-9.32395],[-36.91099,-9.32587],[-36.91079,-9.32964],[-36.91079,-9.33523],[-36.91074,-9.33944],[-36.91092,-9.34311],[-36.91084,-9.34471],[-36.91066,-9.35229],[-36.89277,-9.35225],[-36.87735,-9.35212],[-36.86463,-9.35203],[-36.85761,-9.35194],[-36.84344,-9.35191],[-36.83115,-9.3518],[-36.8196,-9.35174]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"mml-tausta",name:"MML Background Map",type:"tms",template:"http://tiles.kartat.kapsi.fi/taustakartta/{zoom}/{x}/{y}.jpg",scaleExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",description:"Background map from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mml-orto",name:"MML Orthophoto",type:"tms",template:"http://tiles.kartat.kapsi.fi/ortokuva/{zoom}/{x}/{y}.jpg",scaleExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",best:true,description:"Ortophotos from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mml-topo",name:"MML Topographic Map",type:"tms",template:"http://tiles.kartat.kapsi.fi/peruskartta/{zoom}/{x}/{y}.jpg",scaleExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",description:"Topographic map from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mtbmap-no",name:"MTBmap.no",type:"tms",template:"https://mtbmap.no/tiles/osm/mtbmap/{zoom}/{x}/{y}.jpg",scaleExtent:[3,14],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.mtbmap.no/",terms_text:"© MTBmap.no",description:"Norwegian mountain biking map from OSM (max zoom 14-16, varies per region)",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/no/MTBmapno.png"},{id:"MunichLatestAerialImagery",name:"Munich latest aerial imagery 60cm",type:"wms",template:"https://ogc.muenchen.de/wms/opendata_luftbild?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=bgl0&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:[11,22],polygon:[[[11.48878,48.053],[11.55589,48.05323],[11.55583,48.06224],[11.56915,48.06229],[11.56908,48.07128],[11.64986,48.07155],[11.64993,48.06256],[11.70326,48.06274],[11.70313,48.08074],[11.71673,48.08079],[11.71667,48.08968],[11.7299,48.08972],[11.72963,48.12566],[11.74313,48.1257],[11.74292,48.15276],[11.72943,48.15271],[11.72936,48.16152],[11.71612,48.16147],[11.71592,48.18859],[11.7027,48.18855],[11.70263,48.19752],[11.67558,48.19743],[11.67537,48.22446],[11.66176,48.22441],[11.66169,48.23355],[11.64863,48.2335],[11.64857,48.24246],[11.54064,48.2421],[11.54058,48.25093],[11.52735,48.25088],[11.52728,48.26001],[11.47335,48.25983],[11.47356,48.23291],[11.46014,48.23287],[11.46021,48.22373],[11.43336,48.22364],[11.43343,48.21439],[11.3798,48.21421],[11.37987,48.20518],[11.36607,48.20514],[11.36621,48.18741],[11.35259,48.18737],[11.35266,48.17817],[11.33946,48.17813],[11.33973,48.14216],[11.36684,48.14225],[11.36697,48.12443],[11.38083,48.12448],[11.3809,48.11558],[11.44769,48.1158],[11.44804,48.07087],[11.46186,48.07091],[11.46193,48.06193],[11.48872,48.06202],[11.48878,48.053]]],terms_url:"http://www.geodatenservice-muenchen.de/",terms_text:"Datenquelle: dl-de/by-2-0: Landeshauptstadt München – Kommunalreferat – GeodatenService – www.geodatenservice-muenchen.de",icon:"http://www.muenchen.de/media/css/images/favicon_114x114.png"},{id:"openlabs-geoportal-public-transport",name:"Municipality of Tirana - Public Transport (Open Labs GeoPortal) (overlay)",type:"tms",template:"https://geoportal.openlabs.cc/mapcache/tms/1.0.0/public-transport@GoogleMapsCompatibleExtended/{zoom}/{x}/{-y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",scaleExtent:[0,21],polygon:[[[19.73762,41.30154],[19.88628,41.27213],[19.86877,41.38582],[19.68338,41.3732],[19.73762,41.30154]]],terms_url:"https://geoportal.openlabs.cc/",terms_text:"Data provided by the Muncipality of Tirana hosted by Open Labs",description:"Bus stops & lines provided by the Muncipality of Tirana hosted by Open Labs",overlay:true},{id:"openlabs-geoportal-tirana",name:"Municipality of Tirana (Open Labs GeoPortal)",type:"tms",template:"https://geoportal.openlabs.cc/mapcache/tms/1.0.0/tirana@GoogleMapsCompatibleExtended/{zoom}/{x}/{-y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",scaleExtent:[0,21],polygon:[[[19.70226,41.1404],[19.77573,41.11868],[19.86431,41.12126],[20.24986,41.3495],[20.03082,41.41184],[19.92577,41.5204],[19.88869,41.50755],[19.88937,41.42265],[19.81659,41.46177],[19.7335,41.43037],[19.74174,41.37887],[19.65797,41.37475],[19.57214,41.24322],[19.61815,41.22567],[19.67171,41.22722],[19.70226,41.1404]]],terms_url:"https://geoportal.openlabs.cc",terms_text:"Data provided by the Muncipality of Tirana hosted by Open Labs",description:"Streets & Builings provided by the Muncipality of Tirana hosted by Open Labs"},{id:"NC-US",name:"NC Latest Orthoimagery",type:"wms",template:"https://services.nconemap.gov/secure/services/Imagery/Orthoimagery_Latest/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:"2014-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",polygon:[[[-81.6792,36.5974],[-80.25359,36.54793],[-75.8409,36.5671],[-75.4323,35.6441],[-75.50475,35.18806],[-75.70525,35.17684],[-76.14745,34.94077],[-76.53472,34.55487],[-76.69676,34.66789],[-77.27904,34.53224],[-77.68828,34.26482],[-77.9435,33.8269],[-78.21288,33.89402],[-78.5301,33.8304],[-79.6693,34.7916],[-80.8122,34.8085],[-80.84685,34.96329],[-80.95122,35.05552],[-81.06383,35.01729],[-81.07482,35.13417],[-82.3632,35.1805],[-82.9989,34.9919],[-84.3333,34.9767],[-84.27184,35.28229],[-84.09056,35.27332],[-83.91478,35.53301],[-83.55498,35.5911],[-83.2556,35.73392],[-82.98644,35.81414],[-82.92327,35.96767],[-82.67882,36.0854],[-82.60192,36.08984],[-82.536,35.96989],[-82.35472,36.14752],[-82.04436,36.14309],[-81.90428,36.33803],[-81.74224,36.37342],[-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:"landsat-niger-2012_10",name:"Niger Delta Oct 2012 Landsat",type:"tms",template:"http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/niger_oct_2012_321/{zoom}/{x}/{y}.png",endDate:"2012-10-01T00:00:00.000Z",startDate:"2012-10-01T00:00:00.000Z",scaleExtent:[1,13],polygon:[[[-6.92922,13.78574],[-5.13295,13.51884],[-5.07802,13.74039],[-3.60036,13.52418],[-3.54543,13.74039],[-2.06227,13.52685],[-1.3564,16.58454],[-3.17464,16.85285],[-3.22408,16.62665],[-4.72371,16.85022],[-4.76766,16.63455],[-6.27553,16.84759],[-6.92922,13.78574]]]},{id:"geodata.state.nj.us-Infrared2015",name:"NJ 2015 Aerial Imagery (Infrared)",type:"wms",template:"https://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.08543],[-74.93534,40.07256],[-75.05653,40.00868],[-75.14236,39.95791],[-75.14456,39.88322],[-75.18515,39.88042],[-75.24499,39.85486],[-75.33339,39.8495],[-75.41531,39.80156],[-75.45131,39.78304],[-75.57744,39.62346],[-75.54245,39.56827],[-75.57847,39.48183],[-74.91678,38.84647],[-74.31702,39.38739],[-74.06708,39.75155],[-73.92141,40.49222],[-74.2382,40.49378],[-74.23859,40.54916],[-74.20211,40.54924],[-74.20228,40.57648],[-74.18406,40.57609],[-74.18436,40.63146],[-74.07587,40.63078],[-74.07532,40.64457],[-74.02124,40.65811],[-74.02081,40.69919],[-74.00265,40.69929],[-74.00247,40.74037],[-73.98434,40.74026],[-73.98402,40.78145],[-73.96591,40.78158],[-73.96597,40.80868],[-73.94777,40.80861],[-73.94769,40.82232],[-73.92966,40.82225],[-73.92906,40.86355],[-73.91104,40.86329],[-73.91061,40.91838],[-73.8923,40.91831],[-73.89215,40.95961],[-73.87413,40.95942],[-73.87386,40.99251],[-74.70601,41.36513],[-74.75716,41.34769],[-74.79801,41.32268],[-74.84024,41.27864],[-74.90547,41.17038],[-74.98152,41.1126],[-75.03902,41.03819],[-75.13515,40.99441],[-75.13773,40.97309],[-75.05705,40.86757],[-75.06846,40.85037],[-75.09687,40.85096],[-75.10099,40.83927],[-75.09018,40.82238],[-75.1367,40.77729],[-75.1724,40.78067],[-75.19833,40.75389],[-75.20506,40.69131],[-75.20373,40.61832],[-75.19764,40.57367],[-75.16777,40.55907],[-75.10237,40.56702],[-75.06906,40.5365],[-75.07421,40.45505],[-75.06134,40.4165],[-75.02684,40.40252],[-74.9671,40.3952],[-74.94461,40.33817],[-74.86839,40.29157],[-74.84402,40.24796],[-74.77552,40.21428],[-74.76334,40.19172],[-74.72918,40.16392],[-74.72609,40.14949],[-74.78805,40.12468],[-74.8229,40.13033],[-74.86599,40.08543]]],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:"https://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.08543],[-74.93534,40.07256],[-75.05653,40.00868],[-75.14236,39.95791],[-75.14456,39.88322],[-75.18515,39.88042],[-75.24499,39.85486],[-75.33339,39.8495],[-75.41531,39.80156],[-75.45131,39.78304],[-75.57744,39.62346],[-75.54245,39.56827],[-75.57847,39.48183],[-74.91678,38.84647],[-74.31702,39.38739],[-74.06708,39.75155],[-73.92141,40.49222],[-74.2382,40.49378],[-74.23859,40.54916],[-74.20211,40.54924],[-74.20228,40.57648],[-74.18406,40.57609],[-74.18436,40.63146],[-74.07587,40.63078],[-74.07532,40.64457],[-74.02124,40.65811],[-74.02081,40.69919],[-74.00265,40.69929],[-74.00247,40.74037],[-73.98434,40.74026],[-73.98402,40.78145],[-73.96591,40.78158],[-73.96597,40.80868],[-73.94777,40.80861],[-73.94769,40.82232],[-73.92966,40.82225],[-73.92906,40.86355],[-73.91104,40.86329],[-73.91061,40.91838],[-73.8923,40.91831],[-73.89215,40.95961],[-73.87413,40.95942],[-73.87386,40.99251],[-74.70601,41.36513],[-74.75716,41.34769],[-74.79801,41.32268],[-74.84024,41.27864],[-74.90547,41.17038],[-74.98152,41.1126],[-75.03902,41.03819],[-75.13515,40.99441],[-75.13773,40.97309],[-75.05705,40.86757],[-75.06846,40.85037],[-75.09687,40.85096],[-75.10099,40.83927],[-75.09018,40.82238],[-75.1367,40.77729],[-75.1724,40.78067],[-75.19833,40.75389],[-75.20506,40.69131],[-75.20373,40.61832],[-75.19764,40.57367],[-75.16777,40.55907],[-75.10237,40.56702],[-75.06906,40.5365],[-75.07421,40.45505],[-75.06134,40.4165],[-75.02684,40.40252],[-74.9671,40.3952],[-74.94461,40.33817],[-74.86839,40.29157],[-74.84402,40.24796],[-74.77552,40.21428],[-74.76334,40.19172],[-74.72918,40.16392],[-74.72609,40.14949],[-74.78805,40.12468],[-74.8229,40.13033],[-74.86599,40.08543]]],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:"https://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.45706,26.39706],[120.44256,26.3708],[120.44713,26.35315],[120.4673,26.34058],[120.49787,26.33409],[120.5141,26.34016],[120.53412,26.36416],[120.5297,26.38421],[120.49567,26.40158],[120.45706,26.39706]],[[119.90072,25.98586],[119.89601,25.96489],[119.91313,25.94704],[119.95035,25.92785],[119.99056,25.92606],[120.01984,25.93633],[120.02778,25.95574],[120.02753,25.98452],[119.99899,26.00103],[119.94043,26.00281],[119.90072,25.98586]],[[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.6855,20.85476],[116.63091,20.81496],[116.59417,20.76008],[116.57972,20.69675],[116.58931,20.63259],[116.62177,20.57534],[116.67319,20.53192],[116.73737,20.50758],[116.80657,20.50527],[116.87244,20.52526],[116.92703,20.56514],[116.96377,20.62008],[116.97822,20.68345],[116.96863,20.74759],[116.93617,20.80477],[116.88475,20.84811],[116.82057,20.8724],[116.75137,20.87471],[116.6855,20.85476]],[[118.22615,24.45633],[118.29364,24.45385],[118.28515,24.4751],[118.30974,24.49168],[118.37677,24.47293],[118.41009,24.53323],[118.4479,24.52841],[118.47464,24.45993],[118.51299,24.43155],[118.50658,24.42023],[118.48116,24.43324],[118.46106,24.40892],[118.42615,24.39704],[118.39701,24.42842],[118.37656,24.42584],[118.33976,24.38146],[118.30319,24.37058],[118.25742,24.41392],[118.13813,24.37248],[118.16173,24.40224],[118.20942,24.41396],[118.18958,24.43522],[118.21763,24.43021],[118.22615,24.45633]],[[120.22345,26.30045],[120.25508,26.31004],[120.26989,26.33687],[120.25919,26.36522],[120.22925,26.37848],[120.19762,26.3689],[120.18282,26.34207],[120.19352,26.31372],[120.22345,26.30045]],[[119.43745,25.00475],[119.4342,24.98862],[119.45419,24.97226],[119.48274,24.97184],[119.48984,24.99379],[119.47159,25.00692],[119.43745,25.00475]],[[119.88699,26.18038],[119.89323,26.12031],[119.92851,26.10802],[119.97794,26.12236],[120.03668,26.15173],[120.10981,26.21349],[120.11927,26.27137],[120.06292,26.31726],[119.99237,26.31649],[119.94677,26.28988],[119.90204,26.24398],[119.88699,26.18038]]],terms_url:"https://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:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{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.48974,-12.81113],[-38.54485,-13.01392],[-38.47755,-13.03466],[-38.33473,-12.94685],[-38.30006,-12.90669],[-38.33954,-12.90435],[-38.35482,-12.83021],[-38.38091,-12.82184],[-38.40717,-12.86754],[-38.46537,-12.81599],[-38.48974,-12.81113]]],description:"Streets geometry and names of Salvador, Bahia. Source: Faces de Logradouro - IBGE.",overlay:true},{id:"kelkkareitit",name:"Nordic snowmobile overlay",type:"tms",template:"https://tiles.kelkkareitit.fi/kelkkareitit/{zoom}/{x}/{y}.png",scaleExtent:[3,18],polygon:[[[27.53173,60.21799],[31.35496,62.51233],[31.63513,62.90773],[30.09154,64.91889],[30.21239,65.87473],[29.13573,66.90422],[30.19041,67.67609],[28.70726,68.42748],[29.02587,68.9505],[31.04735,69.53452],[31.78344,70.44784],[28.32274,71.32192],[23.76342,71.29023],[17.1826,69.99806],[12.10691,68.01581],[9.97556,64.85828],[4.13084,61.95963],[4.57029,59.00664],[6.21826,57.95859],[8.14086,57.8506],[10.41502,58.75682],[12.63702,56.0383],[12.7716,55.25095],[14.2932,55.19769],[18.58886,56.84297],[20.69823,59.3444],[27.53173,60.21799]]],terms_url:"https://kelkkareitit.fi/",terms_text:"© Kelkkareitit.fi",description:"Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)",icon:"https://kelkkareitit.fi/img/favicon.png",overlay:true},{id:"geovekst-nib",name:"Norway Orthophoto",type:"tms",template:"https://waapi.webatlas.no/maptiles/tiles/webatlas-orto-newup/wa_grid/{zoom}/{x}/{y}.jpeg?api_key=b8e36d51-119a-423b-b156-d744d54123d5",scaleExtent:[0,21],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://www.norgeibilder.no",terms_text:"© Geovekst",best:true,description:"Most recent Norwegian orthophotos, courtesy of Geovekst and Norkart.",icon:"https://register.geonorge.no/data/organizations/_L_norgeibilder96x96.png"},{id:"npd-offshore",name:"NPD Offshore Installations overlay",type:"wms",template:"http://npdwms.npd.no/NPD_FactMap.asp?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Surface_labels,Surface,Pipelines,Pipelines_labels,Fields_labels,Fields&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[6,20],polygon:[[[8.51989,57.6454],[3.25195,56.08737],[2.61185,56.59434],[1.96321,57.90482],[1.48178,58.42936],[1.98303,60.31063],[1.78802,61.35659],[-0.49061,63.88725],[1.36226,67.01603],[14.99771,74.50082],[36.99371,74.50155],[36.99989,73.68633],[32.06909,70.27429],[23.97215,70.47356],[16.25974,68.58447],[12.12888,64.81157],[5.38328,61.92862],[5.7678,58.85355],[8.51989,57.6454]]],terms_url:"http://www.npd.no/no/Kart/Faktakart/",terms_text:"© Oljedirektoratet",description:"Production platforms and oil/natural gas fields on the Norwegian continental shelf",icon:"https://register.geonorge.no/data/organizations/870917732_od_liten.png",overlay:true},{id:"nve-snoskred",name:"NVE Avalanche Danger Areas overlay",type:"wms",template:"https://gis3.nve.no/map/services/SkredSnoAktR/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Snoskred-Aktsomhetsomrader&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[5,13],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/flaum-og-skred/kartlegging/aktsemdkart/aktsomhetskart-for-snoskred/",terms_text:"© NVE",description:"Potential snowslide areas, computed from theoretical height model. Valid for drops higher than 20-50 meters. Dark red=trigger area.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-nettanlegg",name:"NVE Electricity Network overlay",type:"wms",template:"https://gis3.nve.no/map/services/Nettanlegg1/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Sentralnett,Regionalnett,Distribusjonsnett,Sjokabler,Master og stolper,Transformatorstasjoner&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Power lines (high voltage network) including transformers, submarine cables and pylons. Local distribution network is not included.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-vannkraft",name:"NVE Hydropower Plants overlay",type:"wms",template:"https://gis3.nve.no/map/services/Vannkraft1/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vannkraftverk,Vannvei,Dam&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Hydropower plants including waterways (tunnel, canal, pipeline) and dams",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-vindkraft",name:"NVE Wind Power Plants overlay",type:"wms",template:"https://gis3.nve.no/map/services/Vindkraft/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vindkraft_utbygd,Vindkraft_under_bygging,Vindkraftomrade_konsesjonsbehandling,Vindturbin_konsesjonsbehandling&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Wind power turbines, farms and concession areas. Red colour = concession denied.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"orthos.dhses.ny.gov_latest",name:"NYS Orthos Online",type:"wms",template:"https://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.91231,45.03606],[-73.47788,45.02996],[-73.33846,45.03098],[-73.31978,45.00558],[-73.32265,44.98525],[-73.34852,44.9283],[-73.36721,44.8397],[-73.34277,44.81727],[-73.34565,44.77647],[-73.37296,44.73463],[-73.37008,44.67946],[-73.39739,44.64471],[-73.39308,44.60276],[-73.39739,44.54543],[-73.34996,44.51264],[-73.34565,44.49521],[-73.37871,44.4706],[-73.30828,44.43572],[-73.30397,44.41827],[-73.33271,44.33917],[-73.30828,44.27128],[-73.30828,44.25172],[-73.38014,44.14868],[-73.40458,44.04133],[-73.3399,43.79596],[-73.28097,43.64222],[-73.2091,43.54957],[-73.21342,43.51206],[-73.24647,42.67557],[-73.45919,42.14284],[-73.47069,42.03938],[-73.48794,41.73764],[-73.49944,41.64319],[-73.47788,41.62708],[-73.43189,41.57979],[-73.42614,41.56366],[-73.42685,41.45926],[-73.43979,41.40322],[-73.44985,41.38328],[-73.43835,41.37033],[-73.42757,41.35901],[-73.41751,41.3439],[-73.41895,41.27642],[-73.43045,41.24455],[-73.46566,41.19752],[-73.52962,41.14505],[-73.55477,41.13368],[-73.61586,41.13531],[-73.62664,41.10878],[-73.62736,41.05407],[-73.63958,40.99118],[-73.61873,40.98195],[-73.59933,40.96568],[-73.59933,40.93474],[-73.63455,40.91682],[-73.68054,40.89183],[-73.69851,40.87988],[-73.68629,40.87064],[-73.66257,40.87934],[-73.63814,40.90541],[-73.59789,40.91193],[-73.57562,40.9179],[-73.52675,40.92388],[-73.50159,40.94288],[-73.4901,40.95374],[-73.41751,40.96079],[-73.38374,40.96133],[-73.33702,40.95591],[-73.30828,40.93637],[-73.27091,40.92659],[-73.2091,40.91953],[-73.18682,40.92714],[-73.16814,40.93148],[-73.16598,40.95971],[-73.16886,40.97002],[-73.12933,40.98195],[-73.10777,40.98195],[-73.06681,40.9749],[-72.8584,40.97436],[-72.71826,40.98195],[-72.65574,41.00528],[-72.64424,41.00473],[-72.62628,40.99226],[-72.54148,41.03889],[-72.4768,41.06328],[-72.45811,41.08928],[-72.41859,41.09308],[-72.36612,41.13856],[-72.36037,41.1418],[-72.32229,41.15479],[-72.29067,41.16399],[-72.21449,41.18238],[-72.20083,41.19157],[-72.04848,41.25914],[-72.02548,41.2937],[-71.93924,41.30774],[-71.92343,41.30666],[-71.90259,41.2991],[-71.90187,41.28939],[-71.99458,41.24509],[-72.10453,41.19806],[-72.18287,41.16723],[-72.18934,41.16237],[-72.25186,41.12232],[-72.30432,41.10445],[-72.31582,41.09524],[-72.27917,41.08441],[-72.2727,41.08062],[-72.26839,41.04973],[-72.21736,41.04811],[-72.19652,41.04215],[-72.18646,41.05298],[-72.17137,41.0584],[-72.14981,41.05895],[-72.15628,41.09633],[-72.15268,41.1077],[-72.14909,41.14667],[-72.134,41.14505],[-72.07076,41.10553],[-72.07435,41.05678],[-72.08657,41.03185],[-72.10957,41.0069],[-72.08729,41.01287],[-72.06213,41.02534],[-72.04561,41.03239],[-72.01902,41.03293],[-72.00895,41.04215],[-72.00177,41.05136],[-71.96368,41.07737],[-71.922,41.08874],[-71.88966,41.08766],[-71.85588,41.08062],[-71.84582,41.07466],[-71.85588,41.05298],[-71.89038,41.03727],[-71.91625,41.03022],[-71.99099,41.00365],[-72.07938,40.97273],[-72.31941,40.88205],[-72.4423,40.8402],[-72.62771,40.7869],[-72.76569,40.75043],[-72.88499,40.71286],[-72.95973,40.68671],[-73.03735,40.66],[-73.08118,40.64855],[-73.22994,40.61637],[-73.32193,40.6131],[-73.35211,40.61855],[-73.55477,40.56944],[-73.75959,40.57708],[-73.88248,40.54815],[-73.9335,40.53449],[-73.945,40.53395],[-73.94572,40.56289],[-74.08227,40.56234],[-74.08011,40.54924],[-74.12251,40.52084],[-74.15772,40.51373],[-74.18719,40.50117],[-74.22887,40.48696],[-74.26121,40.48532],[-74.2763,40.4957],[-74.27918,40.54378],[-74.26983,40.56671],[-74.25834,40.57217],[-74.22528,40.57217],[-74.226,40.58309],[-74.25115,40.59564],[-74.25259,40.62237],[-74.24324,40.64091],[-74.2339,40.64909],[-74.20228,40.654],[-74.12538,40.65673],[-74.11532,40.69107],[-74.09951,40.68998],[-74.07795,40.71068],[-74.06286,40.7183],[-74.05208,40.7439],[-74.02549,40.79288],[-73.98094,40.86901],[-73.96225,40.92551],[-73.94931,40.96459],[-73.94644,40.99877],[-73.98165,41.01612],[-74.04561,41.04323],[-74.18072,41.09524],[-74.30792,41.14938],[-74.44087,41.21537],[-74.52783,41.25914],[-74.61335,41.30234],[-74.65791,41.31098],[-74.70246,41.33581],[-74.76714,41.38975],[-74.79661,41.41023],[-74.85338,41.42263],[-74.90728,41.43179],[-74.99783,41.47111],[-75.04167,41.52708],[-75.08479,41.59323],[-75.08407,41.61848],[-75.07329,41.66467],[-75.08766,41.70278],[-75.08766,41.71351],[-75.12144,41.76177],[-75.11928,41.79232],[-75.13078,41.81696],[-75.18755,41.83838],[-75.25295,41.84962],[-75.28745,41.85497],[-75.29823,41.88227],[-75.30613,41.9304],[-75.34063,41.94003],[-75.3665,41.9566],[-75.37225,41.97744],[-75.58066,41.97957],[-75.58137,41.92399],[-75.78906,41.92666],[-75.78691,41.98278],[-79.77687,41.98118],[-79.7819,42.20994],[-79.77184,42.28017],[-79.72153,42.29824],[-79.57349,42.36731],[-79.42976,42.46599],[-79.3737,42.49991],[-79.25728,42.54546],[-79.18973,42.5624],[-79.16529,42.56981],[-79.12074,42.62483],[-79.0963,42.64598],[-79.06899,42.6967],[-79.03162,42.71043],[-78.98851,42.72311],[-78.88358,42.77693],[-78.88646,42.8149],[-78.93964,42.88655],[-78.93964,42.93603],[-79.04887,42.96969],[-79.04743,43.05167],[-79.09343,43.05272],[-79.09199,43.09262],[-79.08624,43.26556],[-79.06468,43.27602],[-78.84909,43.33041],[-78.72979,43.35237],[-78.63924,43.37013],[-78.54869,43.37953],[-78.47826,43.38789],[-77.95508,43.38476],[-77.73158,43.34714],[-77.71146,43.34034],[-77.66259,43.31159],[-77.61516,43.28387],[-77.55336,43.253],[-77.5282,43.25509],[-77.45634,43.27864],[-77.42256,43.28492],[-77.16385,43.29433],[-77.0503,43.29381],[-76.94178,43.29329],[-76.91447,43.30793],[-76.85051,43.3163],[-76.80236,43.32832],[-76.75996,43.35184],[-76.64785,43.42809],[-76.54509,43.48026],[-76.51993,43.49486],[-76.44304,43.52717],[-76.4222,43.53811],[-76.28206,43.53863],[-76.23822,43.55686],[-76.24038,43.74147],[-76.30649,43.82915],[-76.31152,43.8675],[-76.34602,43.8618],[-76.40064,43.86128],[-76.47178,43.88408],[-76.46675,43.90893],[-76.4186,43.93119],[-76.37189,43.93223],[-76.36974,43.90272],[-76.33308,43.92964],[-76.27847,43.92964],[-76.27847,43.90427],[-76.26697,43.89599],[-76.23607,43.91204],[-76.19295,43.93326],[-76.19007,43.95086],[-76.21523,43.96017],[-76.25044,43.94982],[-76.31224,43.94775],[-76.30578,43.9762],[-76.33093,44.00464],[-76.39561,44.0248],[-76.39848,44.06251],[-76.37548,44.06457],[-76.3762,44.0909],[-76.47107,44.09297],[-76.46604,44.10948],[-76.44232,44.1296],[-76.39848,44.13218],[-76.39776,44.20435],[-76.3762,44.21671],[-76.23966,44.21929],[-76.23966,44.22804],[-76.21738,44.22856],[-76.21523,44.3479],[-76.11893,44.37103],[-76.04634,44.39157],[-75.93423,44.43418],[-75.83721,44.50341],[-75.76822,44.55823],[-75.69923,44.60379],[-75.63168,44.64829],[-75.56772,44.70501],[-75.50448,44.74586],[-75.45274,44.78157],[-75.31763,44.8723],[-75.15378,44.93745],[-75.09054,44.97305],[-74.97411,45.02793],[-74.91985,45.03682],[-74.91231,45.03606]]],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:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/ny/NYS_Orthos_Online.png"},{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.7822,-9.54444],[-37.7826,-9.45388],[-37.81147,-9.45412],[-37.81735,-9.45451],[-37.82057,-9.45416],[-37.87394,-9.45428],[-37.87358,-9.54475],[-37.7822,-9.54444]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"osmbe-nl",name:"OpenStreetMap (Belgian Style - Dutch)",type:"tms",template:"https://tile.openstreetmap.be/osmbe-nl/{zoom}/{x}/{y}.png",scaleExtent:[0,18],polygon:[[[5.47007,49.49196],[5.44409,49.51409],[5.46213,49.53677],[5.43766,49.54766],[5.42566,49.59145],[5.40775,49.60448],[5.35207,49.62396],[5.34232,49.61192],[5.30544,49.60645],[5.3026,49.63608],[5.32535,49.6575],[5.27025,49.68827],[5.24458,49.67985],[5.16215,49.6918],[5.16164,49.71172],[5.12622,49.70442],[5.09058,49.75946],[5.06262,49.75724],[5.01261,49.77534],[4.9921,49.79533],[4.95485,49.79586],[4.94404,49.78583],[4.90589,49.78055],[4.84827,49.78972],[4.86599,49.81918],[4.84266,49.86913],[4.85659,49.86973],[4.87961,49.91078],[4.84433,49.94482],[4.78844,49.95381],[4.78535,49.97018],[4.79004,49.98569],[4.81194,49.99563],[4.81579,50.02853],[4.83599,50.04069],[4.82339,50.04664],[4.81641,50.06702],[4.83456,50.06856],[4.83709,50.09442],[4.84472,50.10023],[4.85447,50.1029],[4.866,50.09623],[4.86587,50.12038],[4.8776,50.13223],[4.89443,50.13779],[4.88043,50.1403],[4.87725,50.15205],[4.8529,50.15168],[4.83169,50.1526],[4.82334,50.15923],[4.78067,50.14092],[4.76486,50.13634],[4.75217,50.11158],[4.71293,50.09598],[4.70278,50.09336],[4.68851,50.06595],[4.70309,50.05587],[4.68731,50.01802],[4.69495,49.99662],[4.69461,49.99504],[4.63074,49.98584],[4.58965,49.98336],[4.55981,49.96757],[4.54315,49.9679],[4.52365,49.94973],[4.51156,49.94579],[4.47953,49.94584],[4.44588,49.93656],[4.40593,49.94785],[4.39149,49.94697],[4.38072,49.95088],[4.34921,49.95202],[4.3137,49.96541],[4.19616,49.9536],[4.19304,49.95746],[4.19582,49.96629],[4.13704,49.97691],[4.15996,49.99544],[4.13683,50.00786],[4.13272,50.01973],[4.16174,50.05032],[4.17458,50.04772],[4.22857,50.06873],[4.19529,50.10571],[4.19766,50.12037],[4.19566,50.13394],[4.15448,50.12716],[4.13656,50.12909],[4.12568,50.13511],[4.13677,50.15213],[4.14989,50.1647],[4.14686,50.17314],[4.15567,50.19785],[4.14799,50.21344],[4.15979,50.21579],[4.19179,50.24106],[4.21836,50.25492],[4.20676,50.27068],[4.17487,50.27492],[4.16567,50.28779],[4.155,50.27742],[4.16937,50.26848],[4.16851,50.25626],[4.13426,50.25572],[4.13228,50.26754],[4.12086,50.27276],[4.12139,50.29732],[4.10928,50.30112],[4.0977,50.31201],[4.08017,50.30809],[4.07339,50.31754],[4.03817,50.33987],[4.02738,50.35491],[3.98611,50.34137],[3.96482,50.34012],[3.96355,50.34742],[3.90223,50.3257],[3.88419,50.32554],[3.88429,50.33511],[3.85645,50.34099],[3.84244,50.35243],[3.81321,50.34251],[3.80551,50.35098],[3.74124,50.34624],[3.73556,50.32532],[3.73175,50.30705],[3.70911,50.3021],[3.68231,50.31988],[3.66397,50.34724],[3.65542,50.37075],[3.66788,50.38597],[3.67276,50.40227],[3.66777,50.42262],[3.66743,50.43635],[3.65685,50.4464],[3.66129,50.45399],[3.64419,50.4618],[3.6099,50.4935],[3.58162,50.48917],[3.56897,50.4982],[3.49868,50.48577],[3.49448,50.49918],[3.51582,50.52075],[3.4742,50.53204],[3.44739,50.50415],[3.43663,50.5083],[3.42736,50.50327],[3.37405,50.48993],[3.35949,50.50325],[3.32767,50.50732],[3.31872,50.51788],[3.30319,50.51966],[3.28718,50.52552],[3.27549,50.53872],[3.27524,50.59381],[3.25497,50.62115],[3.24349,50.64031],[3.23893,50.65864],[3.24019,50.67023],[3.26029,50.67692],[3.25131,50.69091],[3.25881,50.69312],[3.24518,50.71225],[3.23779,50.71086],[3.22148,50.70958],[3.20498,50.71072],[3.18953,50.72603],[3.19445,50.7316],[3.14457,50.78871],[3.12547,50.78553],[3.11348,50.79278],[3.10455,50.78042],[3.08585,50.77064],[3.05758,50.77987],[3.04064,50.77484],[3.03691,50.77003],[3.02927,50.76813],[3.01945,50.77263],[2.99536,50.76043],[2.96822,50.74763],[2.9557,50.75181],[2.93962,50.74441],[2.94602,50.73167],[2.9349,50.72822],[2.92939,50.70786],[2.92206,50.70224],[2.91184,50.70267],[2.91281,50.69463],[2.90742,50.69209],[2.90017,50.69202],[2.88533,50.70547],[2.87992,50.70199],[2.86855,50.70242],[2.84646,50.72043],[2.81843,50.71386],[2.78869,50.72508],[2.77811,50.74686],[2.76469,50.75397],[2.75409,50.76251],[2.75922,50.77052],[2.73745,50.77967],[2.7236,50.79079],[2.71636,50.8123],[2.6788,50.81207],[2.67057,50.81562],[2.63543,50.80987],[2.61055,50.84419],[2.59427,50.84743],[2.60628,50.86565],[2.60151,50.90993],[2.58525,50.91825],[2.62479,50.94743],[2.62148,50.95406],[2.60263,50.98638],[2.56946,51.00113],[2.55892,51.06596],[2.34072,51.31453],[3.01078,51.59839],[3.32658,51.43728],[3.37581,51.3584],[3.38739,51.33392],[3.36094,51.31523],[3.3789,51.30251],[3.36832,51.29778],[3.38177,51.28732],[3.38342,51.27485],[3.38922,51.27329],[3.41852,51.25984],[3.43471,51.24621],[3.45031,51.24219],[3.527,51.24651],[3.51433,51.28799],[3.54179,51.29123],[3.56145,51.29637],[3.57559,51.29428],[3.58905,51.30652],[3.63839,51.29078],[3.6582,51.29056],[3.69139,51.28043],[3.71763,51.27428],[3.77605,51.26777],[3.79652,51.25635],[3.79031,51.24163],[3.78934,51.22711],[3.79294,51.21546],[3.85827,51.21334],[3.88901,51.22423],[3.89467,51.21743],[3.88782,51.20283],[3.91256,51.20837],[3.91482,51.21509],[3.9281,51.22508],[3.93751,51.2174],[3.95603,51.22117],[4.01551,51.24825],[4.0551,51.24402],[4.1651,51.2938],[4.23804,51.35274],[4.21772,51.36206],[4.21546,51.37487],[4.33535,51.37775],[4.34197,51.36012],[4.38556,51.35574],[4.39906,51.35785],[4.42462,51.3668],[4.42309,51.37577],[4.38147,51.41805],[4.39426,51.44251],[4.37771,51.44595],[4.38055,51.45075],[4.4768,51.47912],[4.53739,51.48358],[4.54967,51.47364],[4.53097,51.44965],[4.53758,51.42456],[4.57427,51.43404],[4.6431,51.42478],[4.64951,51.42741],[4.66744,51.42777],[4.66465,51.44625],[4.69115,51.45283],[4.70175,51.46691],[4.72792,51.48435],[4.74476,51.48977],[4.74945,51.49905],[4.75827,51.50302],[4.7766,51.50625],[4.81666,51.49552],[4.82318,51.48441],[4.84355,51.48177],[4.83884,51.46588],[4.84529,51.45817],[4.82521,51.44674],[4.83103,51.42488],[4.88072,51.4166],[4.91431,51.45952],[4.95767,51.4548],[4.94134,51.42928],[4.93775,51.40655],[4.96007,51.42194],[4.99955,51.44324],[5.00816,51.47134],[5.01937,51.48074],[5.03235,51.48827],[5.04093,51.4876],[5.04722,51.47217],[5.08032,51.47226],[5.10643,51.43135],[5.0727,51.39365],[5.11662,51.36118],[5.13225,51.3472],[5.13581,51.31594],[5.15592,51.31278],[5.20039,51.32325],[5.24326,51.3057],[5.22742,51.26844],[5.238,51.26255],[5.26216,51.26778],[5.335,51.26474],[5.34493,51.27681],[5.41551,51.2639],[5.44065,51.28246],[5.48215,51.30064],[5.51628,51.29599],[5.55816,51.26613],[5.56283,51.22287],[5.65253,51.19899],[5.65947,51.19052],[5.71011,51.18671],[5.74598,51.19455],[5.76873,51.18843],[5.78118,51.18082],[5.78447,51.15925],[5.82594,51.16827],[5.85709,51.14477],[5.83976,51.12993],[5.81435,51.11524],[5.83555,51.10842],[5.8338,51.09577],[5.82291,51.09124],[5.8119,51.0943],[5.79816,51.09023],[5.80612,51.07955],[5.80458,51.05888],[5.77731,51.05804],[5.76027,51.03223],[5.77383,51.02859],[5.77829,51.02399],[5.76759,51.00526],[5.76846,50.9985],[5.76419,50.99502],[5.74816,50.98087],[5.72174,50.96128],[5.73469,50.95683],[5.7426,50.96113],[5.74604,50.96209],[5.75617,50.95898],[5.76011,50.95227],[5.73223,50.9221],[5.72625,50.9059],[5.70051,50.90955],[5.69711,50.8958],[5.68051,50.88068],[5.64516,50.86533],[5.64337,50.84974],[5.64049,50.84701],[5.64576,50.83961],[5.64567,50.83789],[5.65094,50.83431],[5.65568,50.82591],[5.70296,50.80821],[5.69338,50.79687],[5.70259,50.78396],[5.69204,50.75629],[5.7218,50.76538],[5.73762,50.75842],[5.73912,50.76522],[5.76476,50.7837],[5.77748,50.78344],[5.78519,50.7684],[5.7927,50.77138],[5.80759,50.75681],[5.84525,50.76609],[5.84901,50.75975],[5.88667,50.77108],[5.89689,50.75501],[5.95896,50.76308],[6.02001,50.75521],[6.04208,50.74557],[6.03953,50.7295],[6.11623,50.72364],[6.1491,50.68465],[6.16312,50.67169],[6.17755,50.65576],[6.18715,50.6505],[6.18348,50.6457],[6.18205,50.63583],[6.26822,50.62829],[6.27251,50.62033],[6.24102,50.58657],[6.22795,50.58535],[6.18304,50.55597],[6.1833,50.54646],[6.19789,50.53715],[6.22586,50.49832],[6.26954,50.50961],[6.35349,50.49244],[6.34706,50.46422],[6.37423,50.45989],[6.3825,50.43975],[6.37408,50.40637],[6.35129,50.38206],[6.40305,50.34866],[6.41162,50.32769],[6.40783,50.31893],[6.38558,50.31658],[6.36388,50.30021],[6.32792,50.3186],[6.31289,50.31636],[6.29335,50.2909],[6.29547,50.27422],[6.28111,50.26236],[6.23624,50.25692],[6.21151,50.24816],[6.1981,50.23275],[6.18166,50.23125],[6.1789,50.22147],[6.19337,50.20761],[6.19683,50.17988],[6.15231,50.16841],[6.15923,50.14002],[6.13978,50.12527],[6.10856,50.1326],[6.11273,50.16093],[6.10156,50.16551],[6.08452,50.16697],[6.0821,50.15275],[6.06344,50.14834],[6.03055,50.15829],[6.02136,50.17685],[5.96932,50.16795],[5.96515,50.12813],[5.90347,50.11172],[5.89064,50.07554],[5.86237,50.06368],[5.8749,50.04624],[5.86392,50.02594],[5.82586,50.00934],[5.82665,50.00135],[5.8448,49.99123],[5.83952,49.9756],[5.80883,49.95773],[5.78215,49.957],[5.76822,49.91307],[5.74481,49.89975],[5.78087,49.88794],[5.78897,49.87213],[5.77636,49.86265],[5.75667,49.8703],[5.76191,49.85693],[5.75803,49.84287],[5.74291,49.83555],[5.75151,49.81985],[5.75473,49.79514],[5.7909,49.79765],[5.8179,49.75977],[5.83544,49.74713],[5.82702,49.72616],[5.86996,49.72777],[5.88817,49.70952],[5.86372,49.68213],[5.91262,49.66488],[5.90382,49.65192],[5.90876,49.63876],[5.89899,49.63401],[5.89117,49.63469],[5.87663,49.60771],[5.84953,49.59399],[5.87403,49.58991],[5.8736,49.57435],[5.84053,49.55222],[5.82582,49.54931],[5.81858,49.5461],[5.79504,49.55029],[5.77149,49.55832],[5.76226,49.554],[5.76126,49.53952],[5.74792,49.53452],[5.73009,49.53954],[5.6987,49.53744],[5.66008,49.55039],[5.64371,49.54565],[5.6228,49.5283],[5.62589,49.51698],[5.61175,49.50102],[5.59116,49.51734],[5.55638,49.52373],[5.54257,49.5105],[5.47007,49.49196]]],terms_url:"https://openstreetmap.org/",terms_text:"© OpenStreetMap contributors, CC-BY-SA; Tiles courtesy of GEO-6",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"osmbe-fr",name:"OpenStreetMap (Belgian Style - French)",type:"tms",template:"https://tile.openstreetmap.be/osmbe-fr/{zoom}/{x}/{y}.png",scaleExtent:[0,18],polygon:[[[5.47007,49.49196],[5.44409,49.51409],[5.46213,49.53677],[5.43766,49.54766],[5.42566,49.59145],[5.40775,49.60448],[5.35207,49.62396],[5.34232,49.61192],[5.30544,49.60645],[5.3026,49.63608],[5.32535,49.6575],[5.27025,49.68827],[5.24458,49.67985],[5.16215,49.6918],[5.16164,49.71172],[5.12622,49.70442],[5.09058,49.75946],[5.06262,49.75724],[5.01261,49.77534],[4.9921,49.79533],[4.95485,49.79586],[4.94404,49.78583],[4.90589,49.78055],[4.84827,49.78972],[4.86599,49.81918],[4.84266,49.86913],[4.85659,49.86973],[4.87961,49.91078],[4.84433,49.94482],[4.78844,49.95381],[4.78535,49.97018],[4.79004,49.98569],[4.81194,49.99563],[4.81579,50.02853],[4.83599,50.04069],[4.82339,50.04664],[4.81641,50.06702],[4.83456,50.06856],[4.83709,50.09442],[4.84472,50.10023],[4.85447,50.1029],[4.866,50.09623],[4.86587,50.12038],[4.8776,50.13223],[4.89443,50.13779],[4.88043,50.1403],[4.87725,50.15205],[4.8529,50.15168],[4.83169,50.1526],[4.82334,50.15923],[4.78067,50.14092],[4.76486,50.13634],[4.75217,50.11158],[4.71293,50.09598],[4.70278,50.09336],[4.68851,50.06595],[4.70309,50.05587],[4.68731,50.01802],[4.69495,49.99662],[4.69461,49.99504],[4.63074,49.98584],[4.58965,49.98336],[4.55981,49.96757],[4.54315,49.9679],[4.52365,49.94973],[4.51156,49.94579],[4.47953,49.94584],[4.44588,49.93656],[4.40593,49.94785],[4.39149,49.94697],[4.38072,49.95088],[4.34921,49.95202],[4.3137,49.96541],[4.19616,49.9536],[4.19304,49.95746],[4.19582,49.96629],[4.13704,49.97691],[4.15996,49.99544],[4.13683,50.00786],[4.13272,50.01973],[4.16174,50.05032],[4.17458,50.04772],[4.22857,50.06873],[4.19529,50.10571],[4.19766,50.12037],[4.19566,50.13394],[4.15448,50.12716],[4.13656,50.12909],[4.12568,50.13511],[4.13677,50.15213],[4.14989,50.1647],[4.14686,50.17314],[4.15567,50.19785],[4.14799,50.21344],[4.15979,50.21579],[4.19179,50.24106],[4.21836,50.25492],[4.20676,50.27068],[4.17487,50.27492],[4.16567,50.28779],[4.155,50.27742],[4.16937,50.26848],[4.16851,50.25626],[4.13426,50.25572],[4.13228,50.26754],[4.12086,50.27276],[4.12139,50.29732],[4.10928,50.30112],[4.0977,50.31201],[4.08017,50.30809],[4.07339,50.31754],[4.03817,50.33987],[4.02738,50.35491],[3.98611,50.34137],[3.96482,50.34012],[3.96355,50.34742],[3.90223,50.3257],[3.88419,50.32554],[3.88429,50.33511],[3.85645,50.34099],[3.84244,50.35243],[3.81321,50.34251],[3.80551,50.35098],[3.74124,50.34624],[3.73556,50.32532],[3.73175,50.30705],[3.70911,50.3021],[3.68231,50.31988],[3.66397,50.34724],[3.65542,50.37075],[3.66788,50.38597],[3.67276,50.40227],[3.66777,50.42262],[3.66743,50.43635],[3.65685,50.4464],[3.66129,50.45399],[3.64419,50.4618],[3.6099,50.4935],[3.58162,50.48917],[3.56897,50.4982],[3.49868,50.48577],[3.49448,50.49918],[3.51582,50.52075],[3.4742,50.53204],[3.44739,50.50415],[3.43663,50.5083],[3.42736,50.50327],[3.37405,50.48993],[3.35949,50.50325],[3.32767,50.50732],[3.31872,50.51788],[3.30319,50.51966],[3.28718,50.52552],[3.27549,50.53872],[3.27524,50.59381],[3.25497,50.62115],[3.24349,50.64031],[3.23893,50.65864],[3.24019,50.67023],[3.26029,50.67692],[3.25131,50.69091],[3.25881,50.69312],[3.24518,50.71225],[3.23779,50.71086],[3.22148,50.70958],[3.20498,50.71072],[3.18953,50.72603],[3.19445,50.7316],[3.14457,50.78871],[3.12547,50.78553],[3.11348,50.79278],[3.10455,50.78042],[3.08585,50.77064],[3.05758,50.77987],[3.04064,50.77484],[3.03691,50.77003],[3.02927,50.76813],[3.01945,50.77263],[2.99536,50.76043],[2.96822,50.74763],[2.9557,50.75181],[2.93962,50.74441],[2.94602,50.73167],[2.9349,50.72822],[2.92939,50.70786],[2.92206,50.70224],[2.91184,50.70267],[2.91281,50.69463],[2.90742,50.69209],[2.90017,50.69202],[2.88533,50.70547],[2.87992,50.70199],[2.86855,50.70242],[2.84646,50.72043],[2.81843,50.71386],[2.78869,50.72508],[2.77811,50.74686],[2.76469,50.75397],[2.75409,50.76251],[2.75922,50.77052],[2.73745,50.77967],[2.7236,50.79079],[2.71636,50.8123],[2.6788,50.81207],[2.67057,50.81562],[2.63543,50.80987],[2.61055,50.84419],[2.59427,50.84743],[2.60628,50.86565],[2.60151,50.90993],[2.58525,50.91825],[2.62479,50.94743],[2.62148,50.95406],[2.60263,50.98638],[2.56946,51.00113],[2.55892,51.06596],[2.34072,51.31453],[3.01078,51.59839],[3.32658,51.43728],[3.37581,51.3584],[3.38739,51.33392],[3.36094,51.31523],[3.3789,51.30251],[3.36832,51.29778],[3.38177,51.28732],[3.38342,51.27485],[3.38922,51.27329],[3.41852,51.25984],[3.43471,51.24621],[3.45031,51.24219],[3.527,51.24651],[3.51433,51.28799],[3.54179,51.29123],[3.56145,51.29637],[3.57559,51.29428],[3.58905,51.30652],[3.63839,51.29078],[3.6582,51.29056],[3.69139,51.28043],[3.71763,51.27428],[3.77605,51.26777],[3.79652,51.25635],[3.79031,51.24163],[3.78934,51.22711],[3.79294,51.21546],[3.85827,51.21334],[3.88901,51.22423],[3.89467,51.21743],[3.88782,51.20283],[3.91256,51.20837],[3.91482,51.21509],[3.9281,51.22508],[3.93751,51.2174],[3.95603,51.22117],[4.01551,51.24825],[4.0551,51.24402],[4.1651,51.2938],[4.23804,51.35274],[4.21772,51.36206],[4.21546,51.37487],[4.33535,51.37775],[4.34197,51.36012],[4.38556,51.35574],[4.39906,51.35785],[4.42462,51.3668],[4.42309,51.37577],[4.38147,51.41805],[4.39426,51.44251],[4.37771,51.44595],[4.38055,51.45075],[4.4768,51.47912],[4.53739,51.48358],[4.54967,51.47364],[4.53097,51.44965],[4.53758,51.42456],[4.57427,51.43404],[4.6431,51.42478],[4.64951,51.42741],[4.66744,51.42777],[4.66465,51.44625],[4.69115,51.45283],[4.70175,51.46691],[4.72792,51.48435],[4.74476,51.48977],[4.74945,51.49905],[4.75827,51.50302],[4.7766,51.50625],[4.81666,51.49552],[4.82318,51.48441],[4.84355,51.48177],[4.83884,51.46588],[4.84529,51.45817],[4.82521,51.44674],[4.83103,51.42488],[4.88072,51.4166],[4.91431,51.45952],[4.95767,51.4548],[4.94134,51.42928],[4.93775,51.40655],[4.96007,51.42194],[4.99955,51.44324],[5.00816,51.47134],[5.01937,51.48074],[5.03235,51.48827],[5.04093,51.4876],[5.04722,51.47217],[5.08032,51.47226],[5.10643,51.43135],[5.0727,51.39365],[5.11662,51.36118],[5.13225,51.3472],[5.13581,51.31594],[5.15592,51.31278],[5.20039,51.32325],[5.24326,51.3057],[5.22742,51.26844],[5.238,51.26255],[5.26216,51.26778],[5.335,51.26474],[5.34493,51.27681],[5.41551,51.2639],[5.44065,51.28246],[5.48215,51.30064],[5.51628,51.29599],[5.55816,51.26613],[5.56283,51.22287],[5.65253,51.19899],[5.65947,51.19052],[5.71011,51.18671],[5.74598,51.19455],[5.76873,51.18843],[5.78118,51.18082],[5.78447,51.15925],[5.82594,51.16827],[5.85709,51.14477],[5.83976,51.12993],[5.81435,51.11524],[5.83555,51.10842],[5.8338,51.09577],[5.82291,51.09124],[5.8119,51.0943],[5.79816,51.09023],[5.80612,51.07955],[5.80458,51.05888],[5.77731,51.05804],[5.76027,51.03223],[5.77383,51.02859],[5.77829,51.02399],[5.76759,51.00526],[5.76846,50.9985],[5.76419,50.99502],[5.74816,50.98087],[5.72174,50.96128],[5.73469,50.95683],[5.7426,50.96113],[5.74604,50.96209],[5.75617,50.95898],[5.76011,50.95227],[5.73223,50.9221],[5.72625,50.9059],[5.70051,50.90955],[5.69711,50.8958],[5.68051,50.88068],[5.64516,50.86533],[5.64337,50.84974],[5.64049,50.84701],[5.64576,50.83961],[5.64567,50.83789],[5.65094,50.83431],[5.65568,50.82591],[5.70296,50.80821],[5.69338,50.79687],[5.70259,50.78396],[5.69204,50.75629],[5.7218,50.76538],[5.73762,50.75842],[5.73912,50.76522],[5.76476,50.7837],[5.77748,50.78344],[5.78519,50.7684],[5.7927,50.77138],[5.80759,50.75681],[5.84525,50.76609],[5.84901,50.75975],[5.88667,50.77108],[5.89689,50.75501],[5.95896,50.76308],[6.02001,50.75521],[6.04208,50.74557],[6.03953,50.7295],[6.11623,50.72364],[6.1491,50.68465],[6.16312,50.67169],[6.17755,50.65576],[6.18715,50.6505],[6.18348,50.6457],[6.18205,50.63583],[6.26822,50.62829],[6.27251,50.62033],[6.24102,50.58657],[6.22795,50.58535],[6.18304,50.55597],[6.1833,50.54646],[6.19789,50.53715],[6.22586,50.49832],[6.26954,50.50961],[6.35349,50.49244],[6.34706,50.46422],[6.37423,50.45989],[6.3825,50.43975],[6.37408,50.40637],[6.35129,50.38206],[6.40305,50.34866],[6.41162,50.32769],[6.40783,50.31893],[6.38558,50.31658],[6.36388,50.30021],[6.32792,50.3186],[6.31289,50.31636],[6.29335,50.2909],[6.29547,50.27422],[6.28111,50.26236],[6.23624,50.25692],[6.21151,50.24816],[6.1981,50.23275],[6.18166,50.23125],[6.1789,50.22147],[6.19337,50.20761],[6.19683,50.17988],[6.15231,50.16841],[6.15923,50.14002],[6.13978,50.12527],[6.10856,50.1326],[6.11273,50.16093],[6.10156,50.16551],[6.08452,50.16697],[6.0821,50.15275],[6.06344,50.14834],[6.03055,50.15829],[6.02136,50.17685],[5.96932,50.16795],[5.96515,50.12813],[5.90347,50.11172],[5.89064,50.07554],[5.86237,50.06368],[5.8749,50.04624],[5.86392,50.02594],[5.82586,50.00934],[5.82665,50.00135],[5.8448,49.99123],[5.83952,49.9756],[5.80883,49.95773],[5.78215,49.957],[5.76822,49.91307],[5.74481,49.89975],[5.78087,49.88794],[5.78897,49.87213],[5.77636,49.86265],[5.75667,49.8703],[5.76191,49.85693],[5.75803,49.84287],[5.74291,49.83555],[5.75151,49.81985],[5.75473,49.79514],[5.7909,49.79765],[5.8179,49.75977],[5.83544,49.74713],[5.82702,49.72616],[5.86996,49.72777],[5.88817,49.70952],[5.86372,49.68213],[5.91262,49.66488],[5.90382,49.65192],[5.90876,49.63876],[5.89899,49.63401],[5.89117,49.63469],[5.87663,49.60771],[5.84953,49.59399],[5.87403,49.58991],[5.8736,49.57435],[5.84053,49.55222],[5.82582,49.54931],[5.81858,49.5461],[5.79504,49.55029],[5.77149,49.55832],[5.76226,49.554],[5.76126,49.53952],[5.74792,49.53452],[5.73009,49.53954],[5.6987,49.53744],[5.66008,49.55039],[5.64371,49.54565],[5.6228,49.5283],[5.62589,49.51698],[5.61175,49.50102],[5.59116,49.51734],[5.55638,49.52373],[5.54257,49.5105],[5.47007,49.49196]]],terms_url:"https://openstreetmap.org/",terms_text:"© OpenStreetMap contributors, CC-BY-SA; Tiles courtesy of GEO-6",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{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:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png",overlay:true},{id:"osm-hu-ortho",name:"openstreetmap.hu orthophotos",type:"tms",template:"http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/openstreetmap.hu.orthophotos/mercator/{zoom}/{x}/{y}.png",scaleExtent:[0,21],polygon:[[[18.8577,47.44553],[18.86169,47.44883],[18.86491,47.44704],[18.8609,47.44373],[18.8577,47.44553]],[[18.80614,47.59304],[18.81376,47.5974],[18.82295,47.59011],[18.81533,47.58574],[18.80614,47.59304]],[[17.66691,46.92167],[17.66369,46.93033],[17.67207,46.93178],[17.67529,46.92312],[17.66691,46.92167]],[[17.6725,46.93546],[17.67529,46.92708],[17.68409,46.92845],[17.68129,46.93683],[17.6725,46.93546]],[[17.82155,46.96075],[17.82507,46.9547],[17.83347,46.95701],[17.82995,46.96304],[17.82155,46.96075]],[[18.62796,47.19818],[18.63943,47.20324],[18.64953,47.1926],[18.63806,47.18753],[18.62796,47.19818]],[[17.51223,46.8789],[17.51406,46.88166],[17.5214,46.87939],[17.51957,46.87662],[17.51223,46.8789]],[[17.67724,46.91844],[17.68718,46.92344],[17.70594,46.90603],[17.69249,46.89926],[17.68144,46.90951],[17.68275,46.90595],[17.68198,46.90582],[17.68667,46.89926],[17.67947,46.89686],[17.67405,46.90445],[17.67131,46.90398],[17.66666,46.91662],[17.67724,46.91844]],[[18.80776,47.55615],[18.81638,47.55969],[18.81351,47.56305],[18.80473,47.55949],[18.80776,47.55615]],[[18.98706,47.46989],[18.97962,47.47042],[18.98056,47.47648],[18.988,47.47595],[18.98706,47.46989]],[[18.98356,47.41149],[19.00839,47.42511],[19.01568,47.41932],[18.9907,47.40518],[18.98356,47.41149]],[[19.02652,47.87563],[19.03163,47.87613],[19.03305,47.86957],[19.02793,47.86907],[19.02652,47.87563]],[[18.00803,46.86674],[18.01095,46.86028],[18.01323,46.86064],[18.01626,46.8536],[18.01682,46.85371],[18.01852,46.84948],[18.02021,46.84631],[18.02961,46.84829],[18.02742,46.85392],[18.03388,46.85534],[18.03056,46.86395],[18.03367,46.86456],[18.03058,46.87154],[18.00803,46.86674]],[[17.99509,46.87632],[17.98585,46.87595],[17.98535,46.88397],[17.98599,46.88412],[17.98531,46.88537],[17.95829,46.87876],[17.96077,46.87351],[17.92868,46.86631],[17.92467,46.87372],[17.93136,46.87535],[17.92995,46.87822],[17.9553,46.88415],[17.9946,46.89341],[17.99786,46.88671],[17.98771,46.88443],[17.98774,46.88411],[17.99415,46.88442],[17.99509,46.87632]],[[18.86533,47.42808],[18.87291,47.42455],[18.87701,47.42871],[18.86799,47.43238],[18.86774,47.43208],[18.86517,47.43317],[18.86477,47.4327],[18.86441,47.43285],[18.86288,47.43108],[18.86328,47.43092],[18.86288,47.43046],[18.86516,47.42947],[18.86448,47.42875],[18.86553,47.42829],[18.86533,47.42808]],[[19.16232,47.59776],[19.16893,47.59033],[19.17815,47.59512],[19.17291,47.60068],[19.16232,47.59776]],[[18.13162,47.02619],[18.14103,47.02111],[18.13923,47.01957],[18.15704,47.01044],[18.16271,47.00242],[18.16463,46.99571],[18.16639,46.9959],[18.16702,46.99363],[18.17101,46.99454],[18.1722,46.99571],[18.16977,47.00416],[18.17656,47.00709],[18.1761,47.00771],[18.17639,47.00781],[18.17057,47.01414],[18.1748,47.01815],[18.17782,47.01428],[18.18518,47.01746],[18.17933,47.0239],[18.17589,47.02268],[18.17277,47.02434],[18.17219,47.02377],[18.17159,47.02407],[18.16938,47.0221],[18.16216,47.02596],[18.16485,47.02832],[18.16245,47.02947],[18.16323,47.03025],[18.1521,47.03554],[18.15156,47.03498],[18.1503,47.03563],[18.14513,47.03112],[18.14337,47.0322],[18.1454,47.03419],[18.14441,47.03467],[18.14522,47.03539],[18.14168,47.03697],[18.13111,47.02745],[18.13226,47.0269],[18.13162,47.02619]]],terms_text:"openstreetmap.hu"},{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.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,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.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,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.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,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.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,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:"ORTOFOTO_V1",name:"Orthophoto 1st cycle (1994-1999) - Latvia",type:"wms",template:"https://services.lgia.gov.lv/arcfree/services/Ortofoto_v1/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",polygon:[[[27.66415,55.75354],[27.68475,55.93319],[28.26703,56.1908],[28.23682,56.49827],[27.82757,56.94886],[27.90997,57.37037],[27.58313,57.56387],[26.93219,57.63598],[26.5202,57.58596],[26.0368,57.87192],[25.1991,58.10487],[24.31744,57.90258],[24.31744,57.19669],[23.93567,56.9788],[23.55115,56.98479],[23.23804,57.10283],[23.14465,57.37333],[22.60632,57.60215],[22.60083,57.76953],[21.66699,57.56681],[21.40057,57.29625],[21.38409,57.0177],[21.04626,56.80026],[20.99133,56.36615],[21.0545,56.0392],[21.28796,56.05608],[21.29895,56.1908],[22.11743,56.41936],[24.44379,56.24425],[24.81183,56.3996],[25.15515,56.1694],[25.58087,56.12962],[26.53668,55.66146],[26.91296,55.66766],[27.0805,55.80991],[27.66415,55.75354]]],terms_text:"Latvijas Ģeotelpiskās informācijas aģentūras brīvais WMS serviss 1994 - 1999.gada Latvijas ortofotokarte"},{id:"ORTOS_DGRF_2004_06",name:"Ortofotos DGRF 2004-2006 (WMS)",type:"wms",template:"http://mapas.dgterritorio.pt:8888/wms/produtos?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Ortos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2006-01-01T00:00:00.000Z",startDate:"2004-01-01T00:00:00.000Z",scaleExtent:[14,19],polygon:[[[-7.31278,36.98391],[-7.44461,37.5718],[-7.1933,37.97019],[-6.97357,38.00807],[-6.90628,38.24142],[-7.06627,38.20743],[-7.27158,38.45628],[-7.20429,38.72356],[-7.0134,38.85468],[-6.91315,39.03839],[-6.97357,39.13113],[-7.17957,39.23651],[-7.28668,39.48497],[-7.44873,39.61838],[-7.34162,39.60886],[-6.99692,39.64906],[-6.81839,40.0192],[-7.01065,40.19986],[-6.85272,40.24285],[-6.76209,40.35073],[-6.77994,40.8886],[-6.88637,41.01151],[-6.79642,41.01721],[-6.63849,41.21689],[-6.4531,41.24116],[-6.29311,41.38763],[-6.15715,41.5908],[-6.31165,41.68932],[-6.51215,41.71188],[-6.49841,41.88081],[-6.56296,41.97991],[-6.80191,42.00951],[-7.20497,42.00135],[-7.22763,41.8849],[-7.36908,41.87058],[-7.72751,41.92885],[-7.92526,41.94009],[-8.07907,41.84706],[-8.1601,41.91812],[-8.01796,42.05031],[-8.19924,42.18681],[-8.39356,42.1023],[-8.66066,42.07886],[-8.88382,41.88081],[-9.17084,41.86956],[-9.04175,41.43655],[-9.01978,40.65981],[-9.15711,40.26695],[-9.81903,39.52099],[-9.74213,38.6512],[-9.12964,37.88136],[-9.27246,36.99378],[-9.09394,36.68604],[-7.80579,36.74989],[-7.31278,36.98391]]],terms_url:"http://www.dgterritorio.pt/dados_abertos/ortofotos/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"ORTOS_DGT_2014_15",name:"Ortofotos Litoral DGT 2014-2015 (WMS)",type:"wms",template:"http://ows.dgterritorio.pt/wss/service/ortos2014-2015-wms/guest?language=por&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Ortoimagens_2014-2015_Litoral&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",scaleExtent:[1,20],polygon:[[[-7.38968,37.19205],[-7.52426,37.18002],[-7.89505,36.98171],[-8.15186,37.10886],[-8.65036,37.14062],[-8.95111,37.03545],[-8.78632,37.34833],[-8.76434,37.55111],[-8.7561,38.38258],[-8.47664,38.33466],[-8.47183,38.40141],[-8.66066,38.46596],[-8.66959,38.60882],[-9.142,38.53689],[-8.81104,38.67372],[-8.79318,38.85468],[-8.95935,38.9829],[-9.18732,38.84934],[-9.2395,38.72838],[-9.37821,38.74659],[-9.38233,39.07891],[-9.29169,39.2514],[-9.31915,39.33642],[-9.17084,39.38526],[-9.06372,39.48815],[-9.02252,39.69662],[-8.78632,40.14529],[-8.86322,40.2093],[-8.72589,40.53155],[-8.64075,40.50858],[-8.62427,40.63063],[-8.53089,40.6004],[-8.535,40.71292],[-8.61466,40.89275],[-8.61878,41.10419],[-8.53089,41.16728],[-8.66959,41.21689],[-8.72315,41.41081],[-8.76984,41.65958],[-8.66547,41.73955],[-8.81104,41.72316],[-8.81104,41.85217],[-8.74649,41.9125],[-8.83576,41.93089],[-8.91815,41.84501],[-8.89343,41.70778],[-8.82065,41.50755],[-8.73139,41.16315],[-8.67508,41.069],[-8.68469,40.90729],[-8.93326,40.17573],[-8.88107,40.12219],[-9.11453,39.64694],[-9.11865,39.5623],[-9.3013,39.40543],[-9.43039,39.37571],[-9.34799,39.23864],[-9.45099,39.04799],[-9.45786,38.89317],[-9.53201,38.78835],[-9.50043,38.68551],[-9.28894,38.663],[-9.19418,38.54172],[-9.25324,38.38473],[-9.03488,38.42347],[-8.92502,38.46757],[-8.81241,38.35997],[-8.7973,38.14968],[-8.91953,37.95286],[-8.84262,37.8651],[-8.83988,37.40617],[-9.02664,37.01023],[-8.92914,36.97513],[-8.61466,37.099],[-8.15048,37.05956],[-7.8923,36.93672],[-7.48993,37.15156],[-7.39105,37.15813],[-7.38968,37.19205]]],terms_url:"http://www.dgterritorio.pt/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{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.45854,49.90441],[-6.3872,49.98411],[-6.22968,49.98962],[-6.21713,49.86801],[-6.45512,49.85918],[-6.45854,49.90441]],[[-1.44951,60.86341],[-0.71671,60.85451],[-0.73497,60.43598],[-0.69388,60.41682],[-0.72584,60.39427],[-0.73954,60.04847],[-0.92674,60.04619],[-0.93815,59.82662],[-1.45865,59.8312],[-1.44552,60.0536],[-1.46321,60.0536],[-1.46435,60.063],[-1.57165,60.06385],[-1.56936,60.179],[-1.64356,60.1807],[-1.64356,60.18922],[-1.82162,60.1895],[-1.82048,60.36155],[-1.8416,60.36973],[-1.82162,60.38328],[-1.81799,60.59343],[-1.45317,60.59343],[-1.44951,60.86341]],[[-4.90892,54.42421],[-4.2826,54.44299],[-4.25354,54.02977],[-4.87664,54.02218],[-4.90892,54.42421]],[[-5.86674,59.14446],[-5.776,59.14709],[-5.772,59.10141],[-5.86218,59.09906],[-5.86674,59.14446]],[[-1.70659,59.57036],[-1.55792,59.56935],[-1.55649,59.49657],[-1.70545,59.49758],[-1.70659,59.57036]],[[-7.68658,58.2941],[-7.53306,58.3007],[-7.52564,58.26469],[-7.67973,58.25779],[-7.68658,58.2941]],[[-4.53383,59.03599],[-4.48132,59.03716],[-4.47961,59.01866],[-4.53326,59.01807],[-4.53383,59.03599]],[[-8.67107,57.87699],[-8.46732,57.88973],[-8.44678,57.7907],[-8.65109,57.77792],[-8.67107,57.87699]],[[-5.23955,50.35306],[-5.79201,50.33849],[-5.76005,49.9317],[-4.65514,49.95815],[-4.67797,50.28601],[-4.24422,50.28017],[-4.24878,50.20425],[-3.38129,50.20425],[-3.42238,50.51882],[-3.11648,50.52463],[-3.12105,50.65796],[-2.67364,50.66195],[-2.59535,50.63943],[-2.5905,50.57284],[-2.47912,50.57335],[-2.47589,50.50667],[-2.39679,50.50564],[-2.40164,50.57233],[-1.04003,50.57182],[-1.03357,50.70593],[-0.5493,50.70388],[-0.54607,50.78866],[-0.09247,50.7856],[-0.08763,50.71819],[0.47897,50.71206],[0.48704,50.81825],[0.97615,50.80499],[0.99229,51.01263],[1.44912,51.00044],[1.47818,51.40904],[1.02296,51.42716],[1.03588,51.76409],[1.61054,51.7501],[1.64606,52.156],[1.72677,52.15402],[1.74937,52.44818],[1.78707,52.48116],[1.7591,52.52251],[1.79335,52.96027],[0.37981,52.99585],[0.38952,53.25112],[0.34786,53.25112],[0.32389,53.28219],[0.34615,53.65385],[0.12849,53.65755],[0.11658,53.66747],[0.13506,54.06557],[-0.06098,54.06591],[-0.04142,54.47094],[-0.56627,54.47718],[-0.55921,54.65651],[-1.16656,54.66235],[-1.16374,54.84261],[-1.33162,54.84391],[-1.32571,55.24708],[-1.52945,55.24871],[-1.52418,55.65401],[-1.76388,55.65401],[-1.77337,55.97191],[-2.16079,55.9683],[-2.15433,56.06214],[-2.45781,56.05853],[-2.41906,56.64172],[-2.09622,56.64172],[-2.0833,57.00213],[-1.92834,57.01268],[-1.9181,57.35909],[-1.75022,57.36257],[-1.76959,57.76086],[-3.69376,57.75742],[-3.70667,57.98064],[-3.5969,57.97721],[-3.60336,58.12073],[-3.02223,58.13096],[-3.02869,58.54108],[-2.8479,58.53097],[-2.86081,58.84305],[-2.67962,58.8415],[-2.68419,58.88517],[-2.63397,58.90522],[-2.67962,58.93351],[-2.68876,59.02292],[-2.36687,59.02292],[-2.37029,59.26529],[-2.3429,59.2822],[-2.37144,59.29969],[-2.37372,59.37071],[-2.3429,59.38582],[-2.37258,59.40035],[-2.37144,59.42591],[-3.07342,59.42301],[-3.07114,59.34336],[-3.1031,59.33114],[-3.07456,59.31367],[-3.07228,59.2326],[-3.38503,59.14842],[-3.37476,58.93528],[-3.56538,58.93233],[-3.55483,58.69759],[-5.28086,58.66677],[-5.25342,58.35141],[-5.50685,58.34379],[-5.47618,58.03236],[-5.8975,58.02124],[-5.8523,57.61718],[-6.13963,57.61372],[-6.15416,57.74232],[-6.29137,57.73801],[-6.33657,58.13988],[-6.11219,58.14669],[-6.14738,58.51063],[-6.29348,58.54162],[-6.84137,58.29773],[-7.00574,58.29293],[-7.10162,58.20644],[-7.25731,58.17931],[-7.25311,58.10049],[-7.40707,58.09056],[-7.39135,57.79114],[-7.79099,57.77332],[-7.76242,57.54442],[-7.6985,57.14532],[-7.79438,57.13045],[-7.71676,56.73686],[-7.01221,56.76544],[-6.97992,56.54539],[-7.06386,56.54539],[-7.04449,56.35626],[-6.50068,56.38129],[-6.44914,55.97936],[-6.56329,55.96915],[-6.53937,55.70301],[-6.55955,55.69073],[-6.53453,55.67617],[-6.52162,55.57044],[-5.89126,55.59234],[-5.85601,55.23207],[-5.22936,55.2516],[-5.18371,54.62541],[-3.6656,54.65184],[-3.64962,54.432],[-3.54004,54.43067],[-3.53091,54.02902],[-3.06977,54.03036],[-3.06757,53.82214],[-3.08049,53.77399],[-3.06192,53.74775],[-3.06112,53.6737],[-3.21447,53.67084],[-3.20577,53.42262],[-3.27996,53.35522],[-3.28967,53.36084],[-3.33275,53.36493],[-3.37613,53.35403],[-4.0889,53.34331],[-4.09455,53.4612],[-4.69741,53.44486],[-4.68828,53.33186],[-4.72024,53.28958],[-4.68371,53.24862],[-4.67687,53.15426],[-4.84808,53.14468],[-4.81783,52.74403],[-4.25458,52.75589],[-4.22888,52.25488],[-4.26076,52.25364],[-4.27246,52.24326],[-4.81363,52.23009],[-4.80792,52.11389],[-5.38891,52.09917],[-5.37179,51.91297],[-5.42087,51.91015],[-5.41402,51.84532],[-5.36836,51.84744],[-5.34668,51.55953],[-4.77368,51.57585],[-4.76569,51.48851],[-4.19154,51.49704],[-4.18698,51.43447],[-3.61512,51.44443],[-3.61055,51.37465],[-3.14941,51.37893],[-3.14941,51.29193],[-4.30387,51.27459],[-4.28612,51.05087],[-4.85433,51.03666],[-4.83722,50.72128],[-5.26183,50.70827],[-5.23955,50.35306]],[[-2.15027,60.17132],[-2.00302,60.16961],[-2.00131,60.0997],[-2.14855,60.10112],[-2.15027,60.17132]],[[-6.2086,59.11635],[-6.12299,59.11664],[-6.12185,59.0715],[-6.20974,59.0715],[-6.2086,59.11635]],[[-4.41596,59.0889],[-4.4212,59.07708],[-4.39719,59.07791],[-4.39134,59.08973],[-4.41596,59.0889]]]},{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,15],polygon:[[[-3.68466,55.23744],[-3.65106,54.42892],[-3.54463,54.43072],[-3.52815,54.02593],[-3.07016,54.03137],[-3.06123,53.6717],[-3.21298,53.67048],[-3.20371,53.35568],[-4.10424,53.34297],[-4.11042,53.46005],[-4.71124,53.44799],[-4.69339,53.15171],[-4.84307,53.1476],[-4.81595,52.74378],[-4.25342,52.75541],[-4.22733,52.24378],[-4.81303,52.23117],[-4.80754,52.11452],[-5.38913,52.09892],[-5.3493,51.56085],[-4.77252,51.57622],[-4.76772,51.48652],[-4.19299,51.49806],[-4.18956,51.43518],[-3.61278,51.44502],[-3.61072,51.37307],[-3.15067,51.37864],[-3.14723,51.28984],[-4.29462,51.2718],[-4.28363,51.04744],[-4.85423,51.03406],[-4.83707,50.76556],[-5.2621,50.75427],[-5.23395,50.34984],[-5.79562,50.33319],[-5.76228,49.92913],[-4.64717,49.96094],[-4.66914,50.2753],[-4.25166,50.2832],[-4.24617,50.19361],[-3.40159,50.20679],[-3.41395,50.52041],[-3.13105,50.52391],[-3.1338,50.66078],[-2.66963,50.66252],[-2.66688,50.5719],[-1.04228,50.56929],[-1.04502,50.70429],[-0.54652,50.69994],[-0.54103,50.79031],[-0.08784,50.78424],[-0.08887,50.72211],[0.47693,50.70907],[0.48242,50.81939],[0.98024,50.8068],[0.99328,51.01333],[1.44784,51.00036],[1.47805,51.40478],[1.018,51.41634],[1.04272,51.76742],[1.6195,51.75084],[1.65246,52.15456],[1.72662,52.15245],[1.79529,52.9594],[0.60396,52.99123],[0.60327,52.97222],[0.38148,52.97883],[0.39625,53.24796],[0.31934,53.24961],[0.34269,53.65319],[0.11609,53.65726],[0.13738,54.06181],[-0.06243,54.06584],[-0.04183,54.46924],[-0.56781,54.47722],[-0.56163,54.65715],[-1.18098,54.66271],[-1.17755,54.84183],[-1.33342,54.84381],[-1.32655,55.24743],[-1.53117,55.24821],[-1.52636,55.6528],[-1.76394,55.6528],[-1.76257,55.96765],[-2.40321,55.96727],[-2.39772,55.56243],[-2.16151,55.56282],[-2.15808,55.2486],[-2.92158,55.24571],[-3.68466,55.23744]]]},{id:"OS-OpenData_Locator",name:"OS OpenData Locator",type:"tms",template:"http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png",scaleExtent:[0,22],polygon:[[[-0.88639,61.11666],[-9.24009,57.92465],[-6.61235,55.46835],[-6.1039,55.40191],[-5.61358,55.06607],[-5.40088,54.90562],[-5.29371,54.77201],[-5.11832,54.5911],[-4.92368,54.38599],[-4.94067,53.59884],[-5.44172,52.27725],[-6.03376,51.6012],[-7.54473,49.33762],[-2.59721,50.2588],[0.65674,50.64047],[1.32419,50.83256],[1.87586,51.19234],[2.05883,52.88863],[-1.61452,56.47933],[-1.21085,57.64972],[-1.69525,59.08903],[0.21543,60.43058],[-0.88639,61.11666]]],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.82929,50.02297],[-5.82929,50.25482],[-5.37336,50.25482],[-5.37336,50.35306],[-5.1756,50.35306],[-5.1756,50.59254],[-4.99707,50.59254],[-4.99707,50.69356],[-4.79657,50.69356],[-4.79657,50.78221],[-4.69495,50.78221],[-4.69495,50.96074],[-4.60431,50.96074],[-4.60431,51.06921],[-4.37922,51.06921],[-4.37922,51.25218],[-3.90393,51.25218],[-3.90393,51.2917],[-3.71717,51.2917],[-3.71717,51.2453],[-3.14862,51.2453],[-3.14862,51.36207],[-3.74463,51.36207],[-3.74463,51.43404],[-3.82978,51.43404],[-3.82978,51.52982],[-4.08521,51.52982],[-4.08521,51.49393],[-4.37922,51.49393],[-4.37922,51.54272],[-5.14442,51.54272],[-5.14442,51.6296],[-5.73871,51.6296],[-5.73871,51.77404],[-5.50954,51.77404],[-5.50954,51.98026],[-5.1988,51.98026],[-5.1988,52.09734],[-4.88806,52.09734],[-4.88806,52.18316],[-4.49575,52.18316],[-4.49575,52.29257],[-4.30154,52.29257],[-4.30154,52.36853],[-4.18112,52.36853],[-4.18112,52.79337],[-4.44137,52.79337],[-4.44137,52.73696],[-4.85698,52.73696],[-4.85698,52.93173],[-4.7288,52.93173],[-4.7288,53.50386],[-4.15782,53.50386],[-4.15782,53.41135],[-3.31105,53.41135],[-3.31105,53.50386],[-3.23337,53.50386],[-3.23337,54.01592],[-3.39262,54.01592],[-3.39262,54.1981],[-3.55964,54.1981],[-3.55964,54.43373],[-3.7189,54.43373],[-3.7189,54.7219],[-4.30154,54.7219],[-4.30154,54.61407],[-5.04731,54.61407],[-5.04731,54.75329],[-5.22987,54.75329],[-5.22987,55.21908],[-5.65326,55.21908],[-5.65326,55.25009],[-5.89796,55.25009],[-5.89796,55.48225],[-6.59332,55.48225],[-6.59332,56.30134],[-7.17277,56.30134],[-7.17277,56.56018],[-6.81717,56.56018],[-6.81717,56.69917],[-6.53153,56.69917],[-6.53153,56.9067],[-6.81168,56.9067],[-6.81168,57.37166],[-6.8721,57.37166],[-6.8721,57.55189],[-7.09732,57.55189],[-7.09732,57.24111],[-7.17423,57.24111],[-7.17423,56.9067],[-7.37198,56.9067],[-7.37198,56.80759],[-7.5203,56.80759],[-7.5203,56.71425],[-7.83068,56.71425],[-7.83068,56.89946],[-7.64941,56.89946],[-7.64941,57.47396],[-7.83068,57.47396],[-7.83068,57.79156],[-7.47362,57.79156],[-7.47362,58.08606],[-7.18798,58.08606],[-7.18798,58.3672],[-6.80346,58.3672],[-6.80346,58.41558],[-6.63866,58.41558],[-6.63866,58.46733],[-6.51781,58.46733],[-6.51781,58.56256],[-6.05362,58.56256],[-6.05362,58.15688],[-6.14701,58.15688],[-6.14701,58.11059],[-6.27998,58.11059],[-6.27998,57.71227],[-6.15913,57.71227],[-6.15913,57.66676],[-5.93391,57.66676],[-5.93391,57.88925],[-5.80643,57.88925],[-5.80643,57.96218],[-5.61417,57.96218],[-5.61417,58.09112],[-5.49082,58.09112],[-5.49082,58.37333],[-5.31991,58.37333],[-5.31991,58.75015],[-3.572,58.75015],[-3.572,59.20918],[-3.19445,59.20918],[-3.19445,59.47592],[-2.24358,59.47592],[-2.24358,59.13887],[-2.4611,59.13887],[-2.4611,58.81859],[-2.74077,58.81859],[-2.74077,58.58047],[-2.91167,58.58047],[-2.91167,58.11575],[-3.48654,58.11575],[-3.48654,57.74039],[-1.71532,57.74039],[-1.71532,57.22256],[-1.97945,57.22256],[-1.97945,56.87607],[-2.1659,56.87607],[-2.1659,56.63332],[-2.36011,56.63332],[-2.36011,56.04775],[-1.97945,56.04775],[-1.97945,55.86509],[-1.4745,55.86509],[-1.4745,55.24999],[-1.3222,55.24999],[-1.3222,54.82217],[-1.055,54.82217],[-1.055,54.67466],[-0.66188,54.67466],[-0.66188,54.55275],[-0.32476,54.55275],[-0.32476,54.28652],[0.00928,54.28652],[0.00928,53.79385],[0.2082,53.79385],[0.2082,53.52177],[0.41635,53.52177],[0.41635,53.02989],[1.42734,53.02989],[1.42734,52.92021],[1.83339,52.92021],[1.83339,52.04249],[1.52355,52.04249],[1.52355,51.82613],[1.2697,51.82613],[1.2697,51.69675],[1.11665,51.69675],[1.11665,51.44035],[1.52355,51.44035],[1.52355,51.33318],[1.45076,51.33318],[1.45076,51.02076],[1.06999,51.02076],[1.06999,50.90084],[0.77881,50.90084],[0.77881,50.72984],[-0.7256,50.72984],[-0.7256,50.70384],[-1.00744,50.70384],[-1.00744,50.57363],[-2.36253,50.57363],[-2.36253,50.48464],[-2.49878,50.48464],[-2.49878,50.57363],[-3.40964,50.57363],[-3.40964,50.20578],[-3.69224,50.20578],[-3.69224,50.13477],[-5.00547,50.13477],[-5.00547,49.94745],[-5.28395,49.94745],[-5.28395,50.02297],[-5.82929,50.02297]],[[-6.45807,49.86736],[-6.45807,49.94999],[-6.39788,49.94999],[-6.39788,50.00538],[-6.17996,50.00538],[-6.17996,49.91686],[-6.25402,49.91686],[-6.25402,49.86736],[-6.45807,49.86736]],[[-5.83432,49.93216],[-5.83432,49.97546],[-5.76833,49.97546],[-5.76833,49.93216],[-5.83432,49.93216]],[[-1.94838,60.68857],[-1.94838,60.30588],[-1.75431,60.30588],[-1.75431,60.12844],[-1.57549,60.12844],[-1.57549,59.79792],[-1.0317,59.79792],[-1.0317,60.03545],[-0.66269,60.03545],[-0.66269,60.91039],[-1.10344,60.91039],[-1.10344,60.804],[-1.35063,60.804],[-1.35063,60.68857],[-1.94838,60.68857]],[[-2.20338,60.19686],[-2.20338,60.09294],[-1.9864,60.09294],[-1.9864,60.19686],[-2.20338,60.19686]],[[-1.75431,59.56983],[-1.75431,59.46394],[-1.53733,59.46394],[-1.53733,59.56983],[-1.75431,59.56983]],[[-4.5586,59.13705],[-4.5586,58.95691],[-4.2867,58.95691],[-4.2867,59.13705],[-4.5586,59.13705]],[[-6.27877,59.20257],[-6.27877,59.02278],[-5.66506,59.02278],[-5.66506,59.20257],[-6.27877,59.20257]],[[-8.71635,57.94406],[-8.71635,57.73059],[-8.35929,57.73059],[-8.35929,57.94406],[-8.71635,57.94406]],[[-7.6077,50.4021],[-7.6077,50.26887],[-7.39072,50.26887],[-7.39072,50.4021],[-7.6077,50.4021]],[[-7.73043,58.35799],[-7.73043,58.24831],[-7.51345,58.24831],[-7.51345,58.35799],[-7.73043,58.35799]]]},{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:[[[-6.37546,57.1045],[-6.12998,57.11183],[-6.12586,56.94143],[-6.26045,56.93892],[-6.26045,56.83765],[-6.24259,56.65806],[-6.3552,56.65655],[-6.37649,56.79029],[-7.02812,56.76396],[-6.99636,56.54246],[-7.04391,56.53937],[-7.03206,56.44201],[-6.98331,56.44353],[-6.97593,56.36063],[-6.45271,56.37964],[-6.44035,56.2013],[-6.19315,56.21199],[-6.18354,56.12483],[-6.36379,56.11641],[-6.36173,55.98258],[-6.48944,55.97912],[-6.47777,55.84134],[-6.55467,55.8371],[-6.53545,55.66049],[-6.45442,55.66087],[-6.44412,55.57285],[-6.19985,55.57266],[-5.96845,55.58857],[-5.98562,55.7686],[-5.90665,55.77169],[-5.88949,55.59284],[-5.80983,55.594],[-5.79335,55.41395],[-5.827,55.41395],[-5.80915,55.24247],[-5.61826,55.24873],[-5.62101,55.26713],[-5.46239,55.27026],[-5.48642,55.514],[-5.43836,55.51516],[-5.42943,55.42681],[-5.24129,55.43071],[-5.19464,54.80351],[-5.07105,54.80668],[-5.05221,54.62471],[-4.3223,54.65173],[-4.33123,54.7319],[-4.06786,54.73697],[-4.06786,54.76471],[-3.55699,54.77342],[-3.55837,54.83754],[-2.42098,54.84671],[-2.42647,55.25265],[-2.03097,55.25265],[-2.01449,55.56606],[-1.76455,55.56606],[-1.76455,55.9724],[-2.35026,55.96548],[-2.5796,56.06527],[-2.58234,56.37071],[-2.65032,56.36919],[-2.65581,56.50585],[-2.48965,56.50509],[-2.42785,56.55356],[-2.42373,56.73026],[-2.1628,56.73177],[-2.17104,56.99301],[-2.00075,56.99301],[-1.98479,57.3159],[-1.83476,57.31553],[-1.83441,57.36074],[-1.75167,57.36111],[-1.74893,57.63046],[-1.83613,57.63009],[-1.83544,57.70171],[-2.00436,57.70207],[-2.00367,57.71968],[-3.22281,57.71418],[-3.22629,57.76157],[-3.51331,57.77622],[-3.50914,57.71051],[-3.84766,57.70611],[-3.85182,57.76853],[-3.79925,57.76989],[-3.80474,57.88578],[-3.85556,57.88651],[-3.85937,57.97558],[-3.79513,57.97656],[-3.79483,58.03052],[-3.69733,58.03161],[-3.69458,58.06722],[-3.52391,58.07437],[-3.52978,58.16007],[-3.35774,58.16286],[-3.3483,58.28742],[-3.07638,58.29121],[-3.03004,58.43744],[-3.01768,58.65814],[-2.85837,58.66028],[-2.86524,58.7943],[-2.75812,58.79715],[-2.76636,58.87461],[-2.6208,58.88668],[-2.62766,58.97527],[-2.54114,58.97668],[-2.54217,59.0841],[-2.52363,59.08375],[-2.52913,59.1574],[-2.43849,59.15705],[-2.4378,59.246],[-2.36914,59.24705],[-2.3688,59.40748],[-2.52947,59.40748],[-2.52741,59.33436],[-2.70319,59.33576],[-2.70525,59.40608],[-3.12891,59.40433],[-3.12411,59.15951],[-3.40288,59.1574],[-3.39464,58.9689],[-3.4276,58.96961],[-3.42572,58.88526],[-3.45215,58.87071],[-3.51017,58.86911],[-3.50708,58.78826],[-3.38555,58.79004],[-3.3828,58.6999],[-3.4494,58.69847],[-3.45078,58.65385],[-3.50159,58.65421],[-3.5009,58.62705],[-3.72612,58.62383],[-3.72475,58.60595],[-4.6476,58.5895],[-4.65996,58.67171],[-5.10697,58.66135],[-5.09804,58.58091],[-5.23743,58.57769],[-5.22455,58.26305],[-5.4127,58.25818],[-5.39965,58.12245],[-5.53286,58.11991],[-5.52393,57.99494],[-5.55346,57.99422],[-5.54728,57.93995],[-5.85696,57.93157],[-5.83181,57.73361],[-5.86374,57.73224],[-5.85773,57.66096],[-6.19624,57.64975],[-6.20242,57.72353],[-6.41666,57.7162],[-6.42421,57.75945],[-6.4764,57.75725],[-6.46884,57.71326],[-6.53339,57.71216],[-6.52721,57.6391],[-6.692,57.63395],[-6.68102,57.54341],[-6.78195,57.53826],[-6.75311,57.31608],[-6.50592,57.32498],[-6.49768,57.28084],[-6.4812,57.27824],[-6.47159,57.19203],[-6.38644,57.19352],[-6.37546,57.1045]],[[-7.65043,56.77461],[-7.40667,56.79304],[-7.41972,56.88281],[-7.38676,56.90268],[-7.25836,56.91056],[-7.24806,57.07141],[-7.11485,57.077],[-7.16772,57.43466],[-7.0352,57.44094],[-7.05236,57.69026],[-6.86834,57.6976],[-6.87315,57.71631],[-6.70286,57.72217],[-6.71591,57.81117],[-6.53188,57.81958],[-6.53875,57.88133],[-6.22015,57.89265],[-6.24143,58.09935],[-6.12676,58.10152],[-6.17758,58.53105],[-6.46734,58.52029],[-6.4591,58.45102],[-6.63145,58.44455],[-6.6239,58.39169],[-6.79212,58.38485],[-6.78869,58.34956],[-6.90885,58.34415],[-6.89718,58.25503],[-7.20136,58.24166],[-7.14094,57.83201],[-7.37509,57.82104],[-7.36822,57.69503],[-7.6573,57.68292],[-7.67652,57.80715],[-7.79257,57.80202],[-7.77327,57.67734],[-7.70756,57.68024],[-7.69376,57.59088],[-7.75947,57.58797],[-7.74587,57.49965],[-7.51241,57.5085],[-7.47911,57.29468],[-7.52855,57.2932],[-7.51276,57.05871],[-7.61163,57.05386],[-7.59859,56.87493],[-7.66725,56.87268],[-7.65043,56.77461]],[[-1.46238,59.82831],[-1.21519,59.83107],[-1.21519,59.96194],[-1.10533,59.96056],[-1.0986,60.09498],[-0.97632,60.09346],[-0.96352,60.3476],[-0.74028,60.34484],[-0.7147,60.84722],[-1.08215,60.85901],[-1.08455,60.76944],[-1.21296,60.77011],[-1.21579,60.68079],[-1.23364,60.68113],[-1.23467,60.5909],[-1.27132,60.59191],[-1.27338,60.64581],[-1.45466,60.64648],[-1.45397,60.59224],[-1.6373,60.59292],[-1.63954,60.3507],[-1.73172,60.35095],[-1.73172,60.18067],[-1.64177,60.17931],[-1.64177,60.1448],[-1.46393,60.14344],[-1.46238,59.82831]],[[-6.21496,56.97437],[-6.22525,57.06445],[-6.29117,57.06184],[-6.29237,57.08062],[-6.62162,57.06943],[-6.61338,57.00629],[-6.46163,57.01302],[-6.4582,56.96776],[-6.21496,56.97437]],[[-2.12774,60.10855],[-2.12803,60.16207],[-2.00203,60.16224],[-2.00174,60.10872],[-2.12774,60.10855]],[[-6.68977,56.95804],[-6.69228,56.9759],[-6.65984,56.97726],[-6.65733,56.9594],[-6.68977,56.95804]],[[-7.66365,58.25846],[-7.66844,58.28502],[-7.54896,58.29098],[-7.54417,58.26442],[-7.66365,58.25846]],[[-8.65104,57.78885],[-8.66674,57.875],[-8.48272,57.88449],[-8.46702,57.79836],[-8.65104,57.78885]]]},{id:"osmie_barony",name:"OSMIE Baronies",type:"tms",template:"https://tile.openstreetmap.ie/barony/{zoom}/{x}/{y}.png",scaleExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_cps",name:"OSMIE Civil Parishes",type:"tms",template:"https://tile.openstreetmap.ie/civilparish/{zoom}/{x}/{y}.png",scaleExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_dail_ea",name:"OSMIE Dail Election Areas",type:"tms",template:"https://tile.openstreetmap.ie/dail_ea/{zoom}/{x}/{y}.png",scaleExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_eds",name:"OSMIE EDs",type:"tms",template:"https://tile.openstreetmap.ie/ed/{zoom}/{x}/{y}.png",scaleExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_local_ea",name:"OSMIE Local Election Areas",type:"tms",template:"https://tile.openstreetmap.ie/local_ea/{zoom}/{x}/{y}.png",scaleExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_tie_not_counties",name:"OSMIE T.ie Land not in Counties",type:"tms",template:"https://www.townlands.ie/tiles/not_counties/{zoom}/{x}/{y}.png",scaleExtent:[2,19],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_tds",name:"OSMIE Townlands",type:"tms",template:"https://tile.openstreetmap.ie/townland/{zoom}/{x}/{y}.png",scaleExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{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.28907,-9.71916],[-37.28904,-9.71114],[-37.28911,-9.7022],[-37.28915,-9.69175],[-37.28919,-9.68886],[-37.28927,-9.68069],[-37.28926,-9.67732],[-37.28936,-9.66999],[-37.28936,-9.66599],[-37.28931,-9.66133],[-37.28941,-9.65526],[-37.28946,-9.64556],[-37.2895,-9.63489],[-37.28954,-9.62926],[-37.2964,-9.62885],[-37.31188,-9.62897],[-37.32762,-9.62914],[-37.33181,-9.62919],[-37.34338,-9.62917],[-37.35876,-9.62923],[-37.37175,-9.6293],[-37.37839,-9.62913],[-37.38051,-9.62922],[-37.38061,-9.63143],[-37.38054,-9.63785],[-37.38043,-9.63895],[-37.38053,-9.64147],[-37.38051,-9.64876],[-37.3805,-9.6543],[-37.38043,-9.656],[-37.38024,-9.66028],[-37.38022,-9.66551],[-37.38019,-9.67054],[-37.38016,-9.67896],[-37.38013,-9.68781],[-37.38009,-9.70116],[-37.38003,-9.71053],[-37.3801,-9.71743],[-37.38005,-9.71959],[-37.37932,-9.71954],[-37.37392,-9.71956],[-37.36582,-9.71945],[-37.35849,-9.71946],[-37.35334,-9.71938],[-37.34414,-9.71937],[-37.33423,-9.71923],[-37.32933,-9.71927],[-37.3218,-9.71924],[-37.31983,-9.71927],[-37.31094,-9.7192],[-37.29589,-9.71921],[-37.28907,-9.71916]]],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.58664,-9.46124],[-36.58665,-9.45851],[-36.58619,-9.41968],[-36.58604,-9.41452],[-36.58596,-9.40593],[-36.58585,-9.39509],[-36.58579,-9.39163],[-36.58565,-9.38983],[-36.58549,-9.38249],[-36.58529,-9.37965],[-36.58511,-9.37744],[-36.58503,-9.37059],[-36.5889,-9.37058],[-36.59064,-9.37065],[-36.59389,-9.3706],[-36.60037,-9.37073],[-36.61046,-9.37049],[-36.62288,-9.37021],[-36.63377,-9.37002],[-36.63835,-9.36986],[-36.64743,-9.36997],[-36.65141,-9.36994],[-36.65534,-9.36972],[-36.65647,-9.36974],[-36.66111,-9.37024],[-36.66276,-9.37026],[-36.66704,-9.36973],[-36.67052,-9.36966],[-36.67325,-9.36966],[-36.67602,-9.36987],[-36.67593,-9.3726],[-36.67597,-9.37679],[-36.67639,-9.38138],[-36.67654,-9.38464],[-36.67663,-9.39265],[-36.67675,-9.39829],[-36.67689,-9.40875],[-36.67707,-9.41887],[-36.67717,-9.43179],[-36.67724,-9.43395],[-36.67718,-9.43753],[-36.67728,-9.44311],[-36.6773,-9.44933],[-36.67741,-9.45528],[-36.6774,-9.45938],[-36.67735,-9.46017],[-36.67568,-9.46021],[-36.66625,-9.4603],[-36.66224,-9.4603],[-36.65736,-9.46042],[-36.6504,-9.46047],[-36.63543,-9.46065],[-36.61979,-9.46083],[-36.61433,-9.46083],[-36.61029,-9.46097],[-36.60647,-9.46097],[-36.60186,-9.46099],[-36.59426,-9.46112],[-36.58664,-9.46124]]],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:"https://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png",scaleExtent:[12,19],polygon:[[[120.33659,15.98577],[120.44599,15.984],[120.44613,15.97446],[120.47646,15.97459],[120.59425,15.94683],[120.59806,16.09079],[120.59654,16.198],[120.36854,16.21853],[120.34758,16.04231],[120.33659,15.98577]],[[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.39003,-9.78589],[-37.39019,-9.7762],[-37.38993,-9.76575],[-37.38991,-9.75256],[-37.39015,-9.74102],[-37.39003,-9.73201],[-37.39012,-9.72254],[-37.39015,-9.71289],[-37.39019,-9.70341],[-37.3902,-9.69548],[-37.40377,-9.6955],[-37.41728,-9.6956],[-37.43224,-9.69569],[-37.44319,-9.69573],[-37.44723,-9.69582],[-37.45682,-9.69585],[-37.47062,-9.69591],[-37.47373,-9.69591],[-37.47586,-9.69604],[-37.48128,-9.69605],[-37.48131,-9.6989],[-37.48122,-9.70087],[-37.48121,-9.70239],[-37.48135,-9.70545],[-37.48138,-9.71046],[-37.48134,-9.71617],[-37.4812,-9.71875],[-37.48125,-9.72035],[-37.48136,-9.72134],[-37.48134,-9.7241],[-37.4813,-9.72506],[-37.48103,-9.72732],[-37.48102,-9.73088],[-37.48127,-9.73462],[-37.48131,-9.73638],[-37.48131,-9.73893],[-37.48131,-9.74388],[-37.4813,-9.74989],[-37.48122,-9.75315],[-37.48102,-9.75855],[-37.48084,-9.7642],[-37.48085,-9.76526],[-37.48094,-9.76675],[-37.48093,-9.76881],[-37.48084,-9.7721],[-37.48087,-9.77486],[-37.48076,-9.77993],[-37.48081,-9.7863],[-37.46382,-9.78623],[-37.45353,-9.7862],[-37.43979,-9.78611],[-37.42998,-9.78607],[-37.4208,-9.786],[-37.40853,-9.78596],[-37.39545,-9.78593],[-37.39003,-9.78589]]],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.54795,43.73118],[8.10697,43.86701],[8.73593,44.38944],[10.18338,43.85116],[9.55016,43.13605],[10.27725,42.27515],[11.69748,42.08118],[12.90059,40.84897],[14.97466,40.20869],[16.04773,38.8953],[13.1086,38.74113],[11.77717,37.93605],[14.40624,36.74299],[15.13467,36.59364],[15.42867,37.027],[15.21993,37.43376],[15.4836,37.92936],[16.01644,37.8036],[17.21669,38.87425],[17.21669,39.40468],[16.55477,39.78775],[17.05464,40.45144],[18.32906,39.70539],[18.68773,40.0587],[18.04964,40.67064],[16.00545,41.52122],[16.38448,41.85964],[15.51837,42.1537],[14.57997,42.2461],[13.56099,43.65128],[12.57889,44.0867],[12.28795,44.62204],[12.56398,44.97092],[12.34151,45.17458],[12.41696,45.40557],[13.09252,45.62826],[13.69549,45.70806],[13.78445,45.5825],[13.9191,45.6322],[13.8235,45.7176],[13.59784,45.8072],[13.64307,45.98326],[13.52963,45.96588],[13.47474,46.00546],[13.66472,46.17392],[13.47587,46.22725],[13.42218,46.20758],[13.37671,46.29668],[13.59777,46.44137],[13.68684,46.43881],[13.7148,46.5222],[12.9151,46.60953],[12.38708,46.71529],[12.27591,46.88651],[12.17486,46.90895],[12.11675,47.01241],[12.21781,47.03996],[12.19254,47.09331],[11.74789,46.98484],[11.33355,46.99862],[11.10618,46.92966],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258],[10.66405,46.87614],[10.47197,46.85698],[10.38659,46.67847],[10.49375,46.62049],[10.46136,46.53164],[10.25309,46.57432],[10.23674,46.63484],[10.10307,46.61003],[10.03715,46.44479],[10.165,46.41051],[10.10506,46.3372],[10.17862,46.25626],[10.07055,46.21668],[9.95249,46.38045],[9.73086,46.35071],[9.71273,46.29266],[9.57015,46.2958],[9.46117,46.37481],[9.45936,46.50873],[9.40487,46.46621],[9.36128,46.5081],[9.28136,46.49685],[9.24503,46.23616],[8.95601,45.96503],[9.09065,45.89906],[9.0298,45.82127],[8.90992,45.8333],[8.9408,45.86682],[8.88904,45.95465],[8.78551,45.99063],[8.85617,46.0748],[8.62242,46.12112],[8.45032,46.26869],[8.42464,46.46367],[8.08814,46.26692],[8.15493,46.1834],[8.11383,46.11577],[8.02906,46.10331],[7.98881,45.99867],[7.9049,45.99945],[7.85949,45.91485],[7.56343,45.97421],[7.10685,45.85653],[7.04151,45.92435],[6.95315,45.85163],[6.80785,45.83265],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.509],[7.18019,45.40071],[7.10572,45.32924],[7.13115,45.25386],[6.85144,45.13226],[6.7697,45.16044],[6.62803,45.11175],[6.66981,45.02324],[6.74791,45.01939],[6.75518,44.89915],[7.02217,44.82519],[7.07484,44.68073],[6.95133,44.66264],[6.85507,44.53072],[6.94504,44.43112],[6.88784,44.42043],[6.89171,44.36637],[7.00764,44.23736],[7.36364,44.11882],[7.68694,44.17487],[7.72508,44.07578],[7.49355,43.86551],[7.54795,43.73118]],[[8.17134,39.14848],[8.62453,38.75119],[9.09831,39.03764],[9.03102,39.13144],[9.26585,39.18575],[9.64076,39.0227],[9.89894,40.67991],[9.50068,41.39257],[8.30317,40.91071],[8.41304,41.16139],[8.21254,41.13864],[8.07521,40.59862],[8.36154,40.35],[8.27914,39.98585],[8.38283,39.6536],[8.17134,39.14848]],[[12.51489,35.53423],[12.64054,35.5306],[12.63861,35.48641],[12.51296,35.49005],[12.51489,35.53423]],[[11.91218,36.85688],[12.08179,36.85523],[12.07958,36.70974],[11.90998,36.71139],[11.91218,36.85688]],[[12.84019,35.88131],[12.89186,35.88145],[12.89198,35.85003],[12.84031,35.84989],[12.84019,35.88131]]]},{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.33149,41.64637],[12.41178,41.64791],[12.41499,41.54635],[12.49574,41.54789],[12.4985,41.49619],[12.57948,41.49843],[12.58062,41.42932],[12.60632,41.4288],[12.60746,41.39663],[12.8293,41.39818],[12.83159,41.34688],[12.9128,41.34843],[12.9151,41.29726],[12.99585,41.2983],[12.99791,41.19636],[13.1679,41.19808],[13.16721,41.24692],[13.41337,41.24829],[13.4152,41.19705],[13.8341,41.19808],[13.83341,41.2476],[13.91737,41.24847],[13.91668,41.39749],[14.0011,41.39784],[13.99996,41.49774],[14.08415,41.49826],[14.08346,41.65014],[14.00087,41.6498],[13.99973,41.75051],[13.83433,41.74965],[13.83364,41.80047],[13.75151,41.79978],[13.7499,41.84987],[13.41841,41.8497],[13.41681,41.95027],[13.33445,41.94959],[13.3333,42.00041],[13.25141,41.99973],[13.25003,42.05051],[13.08509,42.04966],[13.08394,42.097],[13.33399,42.09819],[13.33376,42.1472],[13.41772,42.14822],[13.41635,42.25052],[13.33399,42.24984],[13.33353,42.30094],[13.25141,42.29992],[13.25003,42.54699],[13.41795,42.54817],[13.41589,42.75065],[13.33468,42.74947],[13.33307,42.90056],[13.16836,42.89938],[13.16721,42.95079],[12.96419,42.95012],[12.96258,43.0003],[12.91877,42.9998],[12.91601,43.25078],[12.83526,43.24994],[12.83228,43.50107],[12.66321,43.4994],[12.66482,43.45112],[12.58567,43.44996],[12.58246,43.5508],[12.50171,43.5498],[12.49987,43.65131],[12.16242,43.64915],[12.16494,43.60132],[12.07891,43.5995],[12.0819,43.45196],[11.99541,43.44913],[11.99862,43.34661],[12.07891,43.34795],[12.08075,43.30189],[11.9961,43.29955],[11.99862,43.20214],[11.91237,43.19929],[11.91466,43.15212],[11.83207,43.14944],[11.8323,43.09653],[11.91099,43.09837],[11.91466,42.90191],[11.82909,42.89922],[11.83139,42.85231],[11.74582,42.84945],[11.74811,42.65236],[11.6731,42.64966],[11.67493,42.6105],[11.49485,42.59936],[11.49852,42.49593],[11.57812,42.49796],[11.58156,42.45244],[11.41226,42.44872],[11.41524,42.34656],[11.49599,42.34792],[11.49921,42.29636],[11.57835,42.29822],[11.58225,42.24628],[11.66185,42.24832],[11.66621,42.09649],[11.74536,42.09819],[11.74903,41.99666],[11.91443,41.99922],[11.91535,41.98626],[11.99403,41.98745],[11.99862,41.89685],[12.07868,41.89907],[12.08144,41.84594],[12.16311,41.84799],[12.16563,41.6964],[12.3292,41.69863],[12.33149,41.64637]]]},{id:"PCN-Italy-2012",name:"PCN 2012 - Italy",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_12.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.ORTOIMMAGINI.2012&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[7.54795,43.73118],[8.10697,43.86701],[8.73593,44.38944],[10.18338,43.85116],[9.55016,43.13605],[10.27725,42.27515],[11.69748,42.08118],[12.90059,40.84897],[14.97466,40.20869],[16.04773,38.8953],[13.1086,38.74113],[11.77717,37.93605],[14.40624,36.74299],[15.13467,36.59364],[15.42867,37.027],[15.21993,37.43376],[15.4836,37.92936],[16.01644,37.8036],[17.21669,38.87425],[17.21669,39.40468],[16.55477,39.78775],[17.05464,40.45144],[18.32906,39.70539],[18.68773,40.0587],[18.04964,40.67064],[16.00545,41.52122],[16.38448,41.85964],[15.51837,42.1537],[14.57997,42.2461],[13.56099,43.65128],[12.57889,44.0867],[12.28795,44.62204],[12.56398,44.97092],[12.34151,45.17458],[12.41696,45.40557],[13.09252,45.62826],[13.69549,45.70806],[13.78445,45.5825],[13.9191,45.6322],[13.8235,45.7176],[13.59784,45.8072],[13.64307,45.98326],[13.52963,45.96588],[13.47474,46.00546],[13.66472,46.17392],[13.47587,46.22725],[13.42218,46.20758],[13.37671,46.29668],[13.59777,46.44137],[13.68684,46.43881],[13.7148,46.5222],[12.9151,46.60953],[12.38708,46.71529],[12.27591,46.88651],[12.17486,46.90895],[12.11675,47.01241],[12.21781,47.03996],[12.19254,47.09331],[11.74789,46.98484],[11.33355,46.99862],[11.10618,46.92966],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258],[10.66405,46.87614],[10.47197,46.85698],[10.38659,46.67847],[10.49375,46.62049],[10.46136,46.53164],[10.25309,46.57432],[10.23674,46.63484],[10.10307,46.61003],[10.03715,46.44479],[10.165,46.41051],[10.10506,46.3372],[10.17862,46.25626],[10.07055,46.21668],[9.95249,46.38045],[9.73086,46.35071],[9.71273,46.29266],[9.57015,46.2958],[9.46117,46.37481],[9.45936,46.50873],[9.40487,46.46621],[9.36128,46.5081],[9.28136,46.49685],[9.24503,46.23616],[8.95601,45.96503],[9.09065,45.89906],[9.0298,45.82127],[8.90992,45.8333],[8.9408,45.86682],[8.88904,45.95465],[8.78551,45.99063],[8.85617,46.0748],[8.62242,46.12112],[8.45032,46.26869],[8.42464,46.46367],[8.08814,46.26692],[8.15493,46.1834],[8.11383,46.11577],[8.02906,46.10331],[7.98881,45.99867],[7.9049,45.99945],[7.85949,45.91485],[7.56343,45.97421],[7.10685,45.85653],[7.04151,45.92435],[6.95315,45.85163],[6.80785,45.83265],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.509],[7.18019,45.40071],[7.10572,45.32924],[7.13115,45.25386],[6.85144,45.13226],[6.7697,45.16044],[6.62803,45.11175],[6.66981,45.02324],[6.74791,45.01939],[6.75518,44.89915],[7.02217,44.82519],[7.07484,44.68073],[6.95133,44.66264],[6.85507,44.53072],[6.94504,44.43112],[6.88784,44.42043],[6.89171,44.36637],[7.00764,44.23736],[7.36364,44.11882],[7.68694,44.17487],[7.72508,44.07578],[7.49355,43.86551],[7.54795,43.73118]],[[8.17134,39.14848],[8.62453,38.75119],[9.09831,39.03764],[9.03102,39.13144],[9.26585,39.18575],[9.64076,39.0227],[9.89894,40.67991],[9.50068,41.39257],[8.30317,40.91071],[8.41304,41.16139],[8.21254,41.13864],[8.07521,40.59862],[8.36154,40.35],[8.27914,39.98585],[8.38283,39.6536],[8.17134,39.14848]],[[12.51489,35.53423],[12.64054,35.5306],[12.63861,35.48641],[12.51296,35.49005],[12.51489,35.53423]],[[11.91218,36.85688],[12.08179,36.85523],[12.07958,36.70974],[11.90998,36.71139],[11.91218,36.85688]],[[12.84019,35.88131],[12.89186,35.88145],[12.89198,35.85003],[12.84031,35.84989],[12.84019,35.88131]]]},{id:"Actueel_ortho25_WMS",name:"PDOK aerial imagery Beeldmateriaal.nl 25cm latest",type:"tms",template:"https://geodata.nationaalgeoregister.nl/luchtfoto/rgb/wmts?FORMAT=image/jpeg&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Actueel_ortho25&STYLE=&FORMAT=image/jpeg&tileMatrixSet=OGC:1.0:GoogleMapsCompatible&tileMatrix={zoom}&tileRow={y}&tileCol={x}",scaleExtent:[0,19],polygon:[[[3.14377,51.35984],[3.1575,51.24113],[3.33878,51.11544],[3.91281,51.05851],[4.65714,51.28067],[4.89334,51.26348],[5.17899,51.12579],[5.38498,51.13096],[5.54428,51.05678],[5.42069,50.85956],[5.46738,50.70326],[5.65689,50.61926],[6.14853,50.62143],[6.30234,50.85782],[6.29959,50.95438],[6.26389,51.01835],[6.37238,51.09259],[6.40122,51.20114],[6.37375,51.25102],[6.44516,51.31587],[6.42044,51.5496],[6.34354,51.67922],[6.79672,51.76429],[7.04666,51.91024],[7.07138,52.04559],[7.27188,52.17041],[7.30759,52.38551],[7.20596,52.53195],[7.28287,52.61458],[7.29935,52.77853],[7.44217,52.97827],[7.43393,53.28314],[7.04392,53.55159],[6.78299,53.63635],[6.23917,53.54016],[5.6871,53.51241],[5.17349,53.43885],[4.81644,53.23384],[4.65164,53.06583],[4.54178,52.48598],[4.32205,52.19568],[4.08104,52.01369],[4.02199,52.01623],[3.93684,51.96379],[3.95195,51.88079],[3.84483,51.84942],[3.62373,51.70752],[3.65532,51.66069],[3.63335,51.62746],[3.54683,51.62234],[3.39577,51.56091],[3.38203,51.51735],[3.49876,51.43267],[3.32985,51.38556],[3.14377,51.35984]]],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:"Nationwide data set 25cm resolution color aerial imagery of the most recent year.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/nl/PDOK-Luchtfoto-Beeldmateriaal-25cm-latest.png"},{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.71918,-9.65236],[-37.71918,-9.63874],[-37.71914,-9.6321],[-37.71924,-9.62114],[-37.71929,-9.61023],[-37.71934,-9.59988],[-37.7194,-9.58891],[-37.71945,-9.57802],[-37.71944,-9.57173],[-37.71952,-9.56684],[-37.71956,-9.56225],[-37.71998,-9.56218],[-37.72258,-9.56195],[-37.72818,-9.56203],[-37.73254,-9.562],[-37.74107,-9.56206],[-37.74845,-9.56202],[-37.75926,-9.56216],[-37.76972,-9.56227],[-37.78036,-9.56244],[-37.78537,-9.56236],[-37.78907,-9.56233],[-37.79562,-9.56245],[-37.79771,-9.56237],[-37.81006,-9.56243],[-37.81061,-9.56241],[-37.81053,-9.56531],[-37.81049,-9.57629],[-37.81046,-9.58742],[-37.81038,-9.59757],[-37.81031,-9.61798],[-37.81018,-9.65197],[-37.81018,-9.6523],[-37.81024,-9.65259],[-37.80664,-9.65245],[-37.80206,-9.65253],[-37.79597,-9.65237],[-37.79179,-9.65252],[-37.78815,-9.65246],[-37.78723,-9.65242],[-37.78035,-9.65241],[-37.77865,-9.65223],[-37.77625,-9.6523],[-37.77475,-9.65219],[-37.77234,-9.65223],[-37.7696,-9.65245],[-37.76623,-9.65251],[-37.76345,-9.65246],[-37.7604,-9.6525],[-37.75102,-9.65237],[-37.75012,-9.65249],[-37.74155,-9.65248],[-37.7403,-9.65239],[-37.73785,-9.65246],[-37.73443,-9.65238],[-37.73106,-9.65243],[-37.72651,-9.65237],[-37.72195,-9.65225],[-37.71992,-9.65228],[-37.71918,-9.65236]]],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:"https://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}",scaleExtent:[0,20],polygon:[[[-17.88463,28.44606],[-17.89395,28.52255],[-18.02125,28.74819],[-18.02241,28.80384],[-17.9424,28.87261],[-17.89118,28.87371],[-17.89033,28.85151],[-17.76759,28.85378],[-17.76698,28.83122],[-17.74127,28.832],[-17.73949,28.76422],[-17.71398,28.76497],[-17.71293,28.73037],[-17.75744,28.69318],[-17.75708,28.67413],[-17.74579,28.67435],[-17.74573,28.61656],[-17.75197,28.58337],[-17.76225,28.5592],[-17.78331,28.54167],[-17.78316,28.49366],[-17.80861,28.4925],[-17.80601,28.4469],[-17.88463,28.44606]],[[-18.1661,27.78516],[-18.16349,27.69492],[-18.08898,27.69634],[-18.08734,27.67387],[-18.03641,27.67537],[-18.03501,27.63026],[-17.959,27.6324],[-17.86033,27.7926],[-17.86303,27.83688],[-17.8884,27.83649],[-17.88913,27.85905],[-17.99065,27.85675],[-18.03868,27.76558],[-18.11464,27.76379],[-18.11546,27.78636],[-18.1661,27.78516]],[[-17.36038,28.06398],[-17.36297,28.17572],[-17.33756,28.17637],[-17.33846,28.2213],[-17.18579,28.22388],[-17.08208,28.13518],[-17.08084,28.068],[-17.13154,28.06681],[-17.15633,28.02146],[-17.23211,28.02037],[-17.23199,27.99804],[-17.25768,27.99784],[-17.25785,28.01997],[-17.30867,28.01923],[-17.36038,28.06398]],[[-16.92782,28.32758],[-16.92866,28.37219],[-16.87767,28.37293],[-16.87807,28.39542],[-16.52143,28.42261],[-16.44571,28.49113],[-16.44625,28.53597],[-16.42059,28.53627],[-16.42092,28.55884],[-16.34433,28.55976],[-16.3446,28.58221],[-16.19125,28.58372],[-16.19162,28.60684],[-16.12793,28.60782],[-16.1278,28.59218],[-16.09951,28.5925],[-16.09934,28.51638],[-16.16481,28.51612],[-16.16475,28.49386],[-16.23858,28.44847],[-16.26535,28.44761],[-16.26586,28.403],[-16.31675,28.40176],[-16.31631,28.38019],[-16.34208,28.37951],[-16.34083,28.2893],[-16.41584,28.19761],[-16.4151,28.13113],[-16.51533,28.01648],[-16.61684,28.01532],[-16.61681,27.99305],[-16.71842,27.99192],[-16.7191,28.03714],[-16.7447,28.03679],[-16.74534,28.08181],[-16.7707,28.08161],[-16.8224,28.1259],[-16.82317,28.17087],[-16.8487,28.17075],[-16.85028,28.26079],[-16.87565,28.26055],[-16.87608,28.28322],[-16.90151,28.28277],[-16.90239,28.32793],[-16.92782,28.32758]],[[-15.85374,27.90089],[-15.8542,27.99018],[-15.82895,27.99066],[-15.82911,28.03558],[-15.7783,28.03632],[-15.75328,28.08143],[-15.72788,28.08157],[-15.72826,28.17186],[-15.49897,28.1728],[-15.49874,28.15041],[-15.44978,28.15075],[-15.45016,28.19614],[-15.39728,28.19614],[-15.39644,28.03836],[-15.37103,28.03802],[-15.37065,28.01532],[-15.34578,28.01532],[-15.34548,27.92544],[-15.3708,27.92524],[-15.37057,27.83521],[-15.39598,27.83474],[-15.421,27.78797],[-15.47181,27.78939],[-15.47188,27.76665],[-15.52277,27.76678],[-15.54771,27.72161],[-15.62361,27.72134],[-15.62415,27.74199],[-15.70075,27.74335],[-15.80167,27.81105],[-15.85374,27.90089]],[[-14.52156,28.04678],[-14.52244,28.11841],[-14.41575,28.11561],[-14.21688,28.22788],[-14.21537,28.33903],[-14.16417,28.45283],[-14.11151,28.4748],[-14.03358,28.72267],[-13.95652,28.74494],[-13.95617,28.76659],[-13.82902,28.76643],[-13.82896,28.78798],[-13.80007,28.78793],[-13.8013,28.71899],[-13.82757,28.71935],[-13.82786,28.6518],[-13.80258,28.6519],[-13.80339,28.53842],[-13.82885,28.53847],[-13.83151,28.39702],[-13.91582,28.22414],[-13.98564,28.22357],[-14.03696,28.17958],[-14.13871,28.17999],[-14.13866,28.15791],[-14.21537,28.15781],[-14.21472,28.11189],[-14.29132,28.04524],[-14.33197,28.03687],[-14.44578,28.04698],[-14.44666,28.0658],[-14.49628,28.06826],[-14.49593,28.04585],[-14.52156,28.04678]],[[-13.80066,28.84566],[-13.80093,28.82311],[-13.77569,28.82305],[-13.69729,28.88982],[-13.69729,28.91277],[-13.60725,28.9118],[-13.43886,29.00024],[-13.43746,29.13513],[-13.4117,29.13499],[-13.41056,29.22298],[-13.45928,29.25559],[-13.45974,29.2942],[-13.50913,29.29456],[-13.51006,29.31635],[-13.56354,29.31729],[-13.56406,29.27138],[-13.53892,29.2712],[-13.53897,29.25004],[-13.56613,29.25013],[-13.5666,29.203],[-13.51565,29.20223],[-13.51565,29.18206],[-13.5398,29.18278],[-13.54089,29.13753],[-13.65782,29.13685],[-13.71322,29.09351],[-13.76634,29.09345],[-13.85025,29.01659],[-13.85182,28.98343],[-13.85244,28.91486],[-13.90131,28.89245],[-13.9024,28.84698],[-13.80066,28.84566]],[[1.64799,38.99907],[1.73217,38.99936],[1.73147,39.04417],[1.64895,39.04319],[1.64816,39.12764],[1.39486,39.12657],[1.39544,39.08642],[1.22811,39.08526],[1.22911,39.0029],[1.14487,39.0018],[1.14528,38.832],[1.31136,38.83316],[1.31219,38.79065],[1.39469,38.79162],[1.39519,38.75296],[1.31128,38.75193],[1.31259,38.62388],[1.6489,38.62511],[1.64807,38.71115],[1.58456,38.71012],[1.58116,38.70054],[1.54915,38.70028],[1.51972,38.70921],[1.50355,38.72532],[1.48133,38.91551],[1.55189,38.92544],[1.56673,38.95666],[1.64874,38.95833],[1.64799,38.99907]],[[2.54507,39.41667],[2.43933,39.41611],[2.43871,39.48469],[2.43902,39.49934],[2.31223,39.49934],[2.31192,39.54179],[2.22907,39.541],[2.22835,39.62606],[2.34601,39.62709],[2.92704,39.96016],[3.14566,39.96005],[3.14608,40.00198],[3.23139,40.00198],[3.23129,39.83292],[3.14823,39.83316],[3.14844,39.79357],[3.48148,39.79318],[3.48035,39.5959],[3.31506,39.47846],[3.31462,39.37855],[3.08302,39.24994],[2.97986,39.25015],[2.97904,39.3335],[2.72874,39.33342],[2.72885,39.45814],[2.64569,39.45774],[2.64538,39.49966],[2.54528,39.49942],[2.54507,39.41667]],[[3.81204,40.04344],[3.72908,40.0438],[3.72862,39.95842],[3.81266,39.9576],[3.81228,39.91644],[3.9609,39.91598],[4.19381,39.79131],[4.31503,39.79058],[4.31599,39.83293],[4.39874,39.83204],[4.39737,39.91858],[4.3158,39.91933],[4.31619,40.0434],[4.2319,40.04436],[4.23248,40.08478],[4.14915,40.08611],[4.14906,40.12552],[4.0628,40.12722],[4.06242,40.08499],[3.81287,40.08529],[3.81204,40.04344]],[[-8.89106,41.82289],[-9.1092,42.57511],[-9.03655,42.73066],[-9.08834,42.72696],[-9.14661,42.77503],[-9.21855,42.90163],[-9.2761,42.86051],[-9.30991,42.93113],[-9.27898,42.9822],[-9.30991,43.06004],[-9.25236,43.10417],[-9.2315,43.17032],[-9.14733,43.21018],[-9.06748,43.19916],[-9.03367,43.24267],[-8.99842,43.24477],[-8.99986,43.29558],[-8.93727,43.30553],[-8.92936,43.32699],[-8.8639,43.32908],[-8.87613,43.37407],[-8.82217,43.37354],[-8.78548,43.31914],[-8.70635,43.305],[-8.60996,43.3296],[-8.55097,43.32332],[-8.52435,43.3364],[-8.52507,43.36465],[-8.45745,43.39184],[-8.36105,43.41118],[-8.36033,43.46342],[-8.33444,43.57974],[-8.27761,43.57088],[-8.06467,43.72392],[-7.99921,43.7234],[-7.9172,43.78264],[-7.85605,43.79146],[-7.83591,43.73743],[-7.66284,43.80982],[-7.31889,43.67827],[-7.19975,43.58308],[-6.24882,43.6075],[-6.12293,43.57901],[-5.85204,43.6799],[-5.60363,43.57087],[-5.28553,43.56191],[-5.17875,43.49916],[-4.90899,43.48367],[-4.61562,43.4192],[-4.18399,43.42492],[-3.80295,43.51954],[-3.74,43.48693],[-3.56128,43.54236],[-3.1083,43.38163],[-2.93857,43.46246],[-2.74524,43.47551],[-2.30462,43.31706],[-1.9854,43.3563],[-1.85528,43.39725],[-1.7698,43.39644],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[3.23049,42.37644],[3.31415,42.37604],[3.31412,42.33399],[3.39785,42.33404],[3.39739,42.29009],[3.31389,42.29084],[3.31397,42.20702],[3.14759,42.2073],[3.14759,42.12606],[3.23055,42.126],[3.24668,41.95294],[3.19452,41.85589],[3.06054,41.76474],[2.78358,41.63718],[2.26293,41.42716],[2.16492,41.29893],[1.86008,41.22322],[1.3763,41.11627],[1.17937,41.04646],[1.08585,41.04849],[0.75854,40.81956],[0.9114,40.73376],[0.87813,40.67514],[0.66502,40.53587],[0.55801,40.55022],[0.43392,40.37576],[0.26756,40.19192],[0.16415,40.06472],[0.07513,40.01447],[0.01039,39.89522],[-0.09392,39.81169],[-0.18474,39.63117],[-0.29085,39.50363],[-0.28636,39.33343],[-0.18564,39.17746],[-0.21352,39.15585],[-0.11101,38.97222],[0.00949,38.88268],[0.12189,38.87218],[0.23429,38.79864],[0.25587,38.72642],[0.09581,38.61338],[-0.0022,38.60706],[-0.05705,38.52691],[-0.27197,38.47624],[-0.37987,38.39312],[-0.38347,38.33813],[-0.45091,38.33108],[-0.50487,38.28309],[-0.48238,38.19481],[-0.42933,38.16583],[-0.45451,38.14886],[-0.584,38.17219],[-0.61367,38.11986],[-0.63705,37.96122],[-0.68111,37.94562],[-0.73237,37.88107],[-0.72158,37.78306],[-0.68831,37.734],[-0.66415,37.62315],[-0.71939,37.58784],[-0.91963,37.53758],[-1.11071,37.51641],[-1.33832,37.52867],[-1.44089,37.39037],[-1.6767,37.27652],[-1.85408,36.91229],[-2.06835,36.69291],[-2.21588,36.66192],[-2.37219,36.78018],[-2.68129,36.65911],[-2.92015,36.66756],[-3.09402,36.71263],[-3.46108,36.65488],[-3.72804,36.69291],[-4.37435,36.66333],[-4.65712,36.44042],[-4.9188,36.45313],[-5.16995,36.35135],[-5.28411,36.19702],[-5.26809,36.12418],[-5.35248,36.12247],[-5.35161,36.04014],[-5.43658,36.03889],[-5.43532,36.00344],[-5.68886,36.00365],[-5.68996,36.04053],[-5.85506,36.03856],[-5.85668,36.12421],[-5.93848,36.12215],[-5.94003,36.16556],[-5.99834,36.1645],[-6.03573,36.1781],[-6.07752,36.22241],[-6.15061,36.28646],[-6.23154,36.37701],[-6.33585,36.53106],[-6.32146,36.58163],[-6.40419,36.6235],[-6.47433,36.74897],[-6.41588,36.79939],[-6.49052,36.91738],[-6.62989,37.0194],[-6.87448,37.10838],[-7.04264,37.18507],[-7.26474,37.18435],[-7.37535,37.15354],[-7.40832,37.16822],[-7.42029,37.21183],[-7.42492,37.23505],[-7.43805,37.2452],[-7.44597,37.33261],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]],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.23942,-9.35157],[-37.23947,-9.34387],[-37.23942,-9.33792],[-37.23954,-9.33022],[-37.23973,-9.32791],[-37.23974,-9.3228],[-37.23964,-9.32085],[-37.23971,-9.31864],[-37.2398,-9.31706],[-37.23982,-9.31561],[-37.24053,-9.30933],[-37.24051,-9.30004],[-37.24008,-9.29687],[-37.23998,-9.29546],[-37.23992,-9.29319],[-37.23989,-9.28978],[-37.23995,-9.28818],[-37.24008,-9.28641],[-37.24036,-9.28212],[-37.24038,-9.27897],[-37.24051,-9.27557],[-37.24004,-9.26979],[-37.24018,-9.26721],[-37.24018,-9.26612],[-37.23995,-9.26455],[-37.23983,-9.26151],[-37.24333,-9.26136],[-37.24936,-9.26146],[-37.26445,-9.26161],[-37.28016,-9.26172],[-37.28294,-9.26171],[-37.29581,-9.26178],[-37.30685,-9.26178],[-37.31419,-9.26189],[-37.32437,-9.26192],[-37.33078,-9.26175],[-37.33057,-9.27275],[-37.33048,-9.28007],[-37.33054,-9.28117],[-37.33069,-9.28427],[-37.3307,-9.28535],[-37.33064,-9.28617],[-37.33071,-9.28717],[-37.33064,-9.28769],[-37.33062,-9.29027],[-37.33043,-9.29308],[-37.33038,-9.29655],[-37.33034,-9.30591],[-37.3304,-9.31203],[-37.33038,-9.32194],[-37.33041,-9.3342],[-37.33035,-9.34185],[-37.3303,-9.34783],[-37.33035,-9.35202],[-37.31509,-9.35194],[-37.30011,-9.3519],[-37.29531,-9.35183],[-37.28899,-9.35171],[-37.28497,-9.35182],[-37.27851,-9.35173],[-37.27431,-9.35181],[-37.27115,-9.3517],[-37.26351,-9.35168],[-37.26046,-9.35164],[-37.25402,-9.35177],[-37.24705,-9.35163],[-37.23942,-9.35157]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"e-mapa.net-buildings",name:"polska.e-mapa.net: Buildings",type:"wms",template:"http://wms.epodgik.pl/cgi-bin/KrajowaIntegracjaEwidencjiGruntow?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[0,19],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"https://polska.e-mapa.net/",terms_text:"polska.e-mapa.net - Geoportal otwartych danych przestrzennych",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/polskae-mapanetBuildings.png"},{id:"debicki-buildings",name:"Powiat dębicki: Buildings",type:"wms",template:"https://debica.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,adresy,EBU,EBT,S&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[0,19],polygon:[[[21.53768,50.01085],[21.51944,50.05423],[21.58099,50.1233],[21.48804,50.18059],[21.13725,50.14835],[21.13939,50.12721],[21.18058,50.12101],[21.14315,50.05965],[21.15356,49.92854],[21.27892,49.92554],[21.22448,49.8861],[21.22362,49.84258],[21.35177,49.8349],[21.36368,49.86838],[21.41585,49.82003],[21.47943,49.8398],[21.52679,49.88911],[21.47689,50.00135],[21.53768,50.01085]]],terms_text:"Powiat dębicki",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"lancucki-buildings",name:"Powiat łańcucki: Buildings",type:"wms",template:"https://lancut.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=EBT,budynki,adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[0,19],polygon:[[[22.17224,50.10121],[22.12574,50.1079],[22.0823,50.17206],[22.13591,50.1867],[22.173,50.18117],[22.18418,50.22914],[22.235,50.24718],[22.3856,50.16031],[22.40346,50.13331],[22.45275,50.12745],[22.45275,50.10676],[22.41768,50.08997],[22.38364,50.08915],[22.38542,50.05393],[22.35315,50.05067],[22.3562,50.00627],[22.31478,49.99451],[22.32139,49.94614],[22.29979,49.92455],[22.24161,49.92847],[22.20901,49.93728],[22.22382,49.96085],[22.16683,50.00412],[22.1387,50.00251],[22.12015,50.04626],[22.17224,50.10121]]],terms_text:"Powiat łańcucki",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"lubaczowski-buildings",name:"Powiat lubaczowski: Buildings",type:"wms",template:"https://lubaczow.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=S,EBT,adresy,budynki_ewid&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[0,19],polygon:[[[23.29224,50.09693],[23.55763,50.25704],[23.51394,50.26643],[23.522,50.29892],[23.40991,50.3083],[23.44482,50.35653],[23.38072,50.3699],[23.38829,50.4058],[23.35821,50.41105],[23.2527,50.36601],[23.19379,50.40529],[23.01962,50.2928],[22.84161,50.30574],[22.83572,50.27037],[22.82426,50.26923],[22.79651,50.20933],[22.86603,50.18949],[22.87414,50.13786],[22.93233,50.1678],[22.88954,50.11501],[22.95351,50.07178],[23.05556,50.04967],[22.99884,49.99028],[23.14951,49.97563],[23.29224,50.09693]]],terms_text:"Powiat lubaczowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"poznanski-buildings",name:"Powiat poznański: Buildings",type:"wms",template:"http://wms.podgik.poznan.pl/cgi-bin/poznan?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[16.9585,52.46312],[17.03946,52.33605],[16.84291,52.36501],[16.78596,52.46566],[16.70022,52.53819],[16.6415,52.5288],[16.44898,52.36793],[16.47775,52.2696],[16.5659,52.26813],[16.58375,52.17007],[17.08099,52.14981],[17.37124,52.34522],[17.39853,52.44037],[17.35338,52.53949],[17.13689,52.57783],[17.13126,52.6419],[17.01608,52.68366],[16.9158,52.65079],[16.85814,52.58191],[16.7367,52.57459],[16.70022,52.53824],[16.78598,52.46567],[16.9585,52.46312]]],terms_text:"PODGIK Poznań",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatpoznaskiOrthophotomap(aerialimage).png"},{id:"sropczyce-buildings",name:"Powiat ropczycko-sędziszowski: Buildings",type:"wms",template:"https://spropczyce.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[0,19],polygon:[[[21.60041,50.21025],[21.74199,50.16538],[21.792,50.17829],[21.81459,50.15264],[21.78741,50.10859],[21.82597,50.09149],[21.82552,50.02925],[21.78666,49.97585],[21.70632,49.96022],[21.683,49.92431],[21.60062,49.91793],[21.54249,49.8862],[21.5188,49.89119],[21.45315,49.99268],[21.50364,50.0198],[21.49298,50.07161],[21.55535,50.11909],[21.50429,50.16559],[21.59816,50.17866],[21.60041,50.21025]]],terms_text:"Powiat ropczycko-sędziszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"rzeszowski-buildings",name:"Powiat rzeszowski: Buildings",type:"wms",template:"https://powiatrzeszowski.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,EBT,EBU&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[0,19],polygon:[[[22.18219,50.17339],[22.09834,50.17176],[22.18016,50.09784],[22.13779,50.00695],[22.09444,50.00841],[22.02839,50.06668],[21.9354,50.06636],[21.98164,49.94977],[22.05278,50.0097],[22.1771,50.00555],[22.23319,49.96829],[22.31144,49.87008],[22.34961,49.72826],[21.99951,49.82808],[21.84961,49.95739],[21.7495,49.96981],[21.78503,50.14212],[21.93307,50.24748],[22.08291,50.26471],[21.98553,50.31545],[22.0901,50.37369],[22.19821,50.35265],[22.2536,50.2647],[22.18219,50.17339]]],terms_text:"Powiat rzeszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"rzeszowski-aerial",name:"Powiat rzeszowski: Orthophotomap (aerial image)",type:"wms",template:"https://powiatrzeszowski.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[0,19],polygon:[[[22.18219,50.17339],[22.09834,50.17176],[22.18016,50.09784],[22.13779,50.00695],[22.09444,50.00841],[22.02839,50.06668],[21.9354,50.06636],[21.98164,49.94977],[22.05278,50.0097],[22.1771,50.00555],[22.23319,49.96829],[22.31144,49.87008],[22.34961,49.72826],[21.99951,49.82808],[21.84961,49.95739],[21.7495,49.96981],[21.78503,50.14212],[21.93307,50.24748],[22.08291,50.26471],[21.98553,50.31545],[22.0901,50.37369],[22.19821,50.35265],[22.2536,50.2647],[22.18219,50.17339]]],terms_text:"Powiat rzeszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"stalowowolski-buildings",name:"Powiat stalowowolski: Buildings",type:"wms",template:"https://stalowawola.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=EBT,adresy,budynki,centroidy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[0,19],polygon:[[[22.017,50.35811],[22.09292,50.44916],[22.06785,50.51434],[22.09722,50.54302],[22.16347,50.52686],[22.23795,50.5503],[22.26768,50.60465],[22.22757,50.6653],[22.16235,50.66969],[22.20843,50.75403],[22.16239,50.80039],[22.0546,50.82234],[21.94394,50.77639],[21.86228,50.80439],[21.83413,50.75035],[21.87465,50.70066],[21.84046,50.65749],[21.97582,50.53164],[21.84797,50.47196],[21.88045,50.3913],[22.017,50.35811]]],terms_text:"Powiat stalowowolski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"poznan-buildings",name:"Poznań: Buildings",type:"wms",template:"http://wms2.geopoz.poznan.pl:8080/geoserver/sip/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki_ewidencyjne_sql&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",scaleExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"poznan-ortofotomapa2014",name:"Poznań: Orthophotomap 2014 (aerial image)",type:"wms",template:"http://wms1.geopoz.poznan.pl:6080/arcgis/services/sip/ortofotomapa_2014/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa_2014_image&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",scaleExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"poznan-ortofotomapa2016",name:"Poznań: Orthophotomap 2016 (aerial image)",type:"wms",template:"http://wms1.geopoz.poznan.pl:6080/arcgis/services/sip/ortofotomapy/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa_2016_image&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",scaleExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"PrahaIPRlatestorthophoto",name:"Praha IPR latest orthophoto",type:"wms",template:"http://giswa1.mag.mepnet.cz/arcgis/services/MAP/letecke_snimky_posledni_snimkovani_cache/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:4326",scaleExtent:[1,20],polygon:[[[14.81232,49.93089],[14.18755,49.87687],[14.12025,50.19882],[14.74502,50.25247],[14.81232,49.93089]]]},{id:"PrahaIPRlow-vegetationorthophoto",name:"Praha IPR low-vegetation orthophoto",type:"wms",template:"http://giswa1.mag.mepnet.cz/arcgis/services/MAP/mimovegetacni_snimkovani_cache/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:4326",scaleExtent:[1,20],polygon:[[[14.30454,49.99538],[14.31604,49.94205],[14.35,49.94508],[14.35384,49.92726],[14.42385,49.93352],[14.42009,49.95097],[14.48865,49.95709],[14.48479,49.97501],[14.55386,49.98117],[14.55012,49.99852],[14.58455,50.00159],[14.5883,49.98424],[14.69168,49.99346],[14.67634,50.06453],[14.71279,50.06777],[14.70115,50.12158],[14.6647,50.11834],[14.661,50.13543],[14.62755,50.13246],[14.61965,50.16895],[14.58543,50.16591],[14.58163,50.18344],[14.40776,50.168],[14.41156,50.15045],[14.37765,50.14744],[14.3738,50.16524],[14.33893,50.16214],[14.34278,50.14434],[14.27368,50.1382],[14.27749,50.12058],[14.2088,50.11447],[14.21289,50.09557],[14.24656,50.09857],[14.25417,50.06336],[14.21987,50.0603],[14.2237,50.04259],[14.258,50.04565],[14.26953,49.99226],[14.30454,49.99538]]]},{id:"przemysl-buildings",name:"Przemyśl: Buildings",type:"wms",template:"http://przemysl.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=adresy,budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[0,19],polygon:[[[22.72268,49.76885],[22.73002,49.76787],[22.73097,49.77612],[22.72027,49.77662],[22.71787,49.78062],[22.73104,49.78553],[22.7244,49.79043],[22.73458,49.80441],[22.73167,49.81429],[22.7261,49.8165],[22.72762,49.82124],[22.74395,49.8187],[22.75952,49.80939],[22.79042,49.81462],[22.81169,49.80571],[22.79738,49.80146],[22.80384,49.79247],[22.83118,49.79664],[22.85752,49.78561],[22.84549,49.76746],[22.82485,49.77105],[22.82004,49.75674],[22.77358,49.74439],[22.73838,49.75895],[22.72205,49.74644],[22.71065,49.76288],[22.72268,49.76885]]],terms_text:"Miasto Przemyśl",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"przemysl-aerial",name:"Przemyśl: Ortophotomap (aerial image)",type:"wms",template:"http://przemysl.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[0,23],polygon:[[[22.72268,49.76885],[22.73002,49.76787],[22.73097,49.77612],[22.72027,49.77662],[22.71787,49.78062],[22.73104,49.78553],[22.7244,49.79043],[22.73458,49.80441],[22.73167,49.81429],[22.7261,49.8165],[22.72762,49.82124],[22.74395,49.8187],[22.75952,49.80939],[22.79042,49.81462],[22.81169,49.80571],[22.79738,49.80146],[22.80384,49.79247],[22.83118,49.79664],[22.85752,49.78561],[22.84549,49.76746],[22.82485,49.77105],[22.82004,49.75674],[22.77358,49.74439],[22.73838,49.75895],[22.72205,49.74644],[22.71065,49.76288],[22.72268,49.76885]]],terms_text:"Miasto Przemyśl",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"RABA-KGZ-3000",name:"RABA-KGZ: Slovenia built-up areas",type:"tms",template:"http://wms.openstreetmap.de/tms/RABA3000/{zoom}/{x}/{y}.png",scaleExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"https://wiki.openstreetmap.org/wiki/Slovenia_Landcover_Import_-_RABA-KGZ",terms_text:"Copyright ©2015 Ministrstvo za kmetijstvo, gozdarstvo in prehrano (mkgp.gov.si). Some rights reserved.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/RABA-KGZSloveniafarmlanduse.png"},{id:"RABA-KGZ",name:"RABA-KGZ: Slovenia farmland use",type:"tms",template:"http://wms.openstreetmap.de/tms/RABA/{zoom}/{x}/{y}.png",scaleExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"https://wiki.openstreetmap.org/wiki/Slovenia_Landcover_Import_-_RABA-KGZ",terms_text:"Copyright ©2015 Ministrstvo za kmetijstvo, gozdarstvo in prehrano (mkgp.gov.si). Some rights reserved.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/RABA-KGZSloveniafarmlanduse.png"},{id:"riksantikvaren-kulturminner",name:"Riksantikvaren Heritage Sites overlay",type:"wms",template:"https://kart.ra.no/arcgis/services/Distribusjon/Kulturminner/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=3,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[13,22],polygon:[[[-10.95725,71.60964],[-6.16765,71.62095],[-6.13756,70.30991],[-10.92717,70.29784],[-10.95725,71.60964]],[[16.81947,74.9482],[21.25771,74.94213],[21.23712,73.8918],[16.79889,73.89828],[16.81947,74.9482]],[[4.04288,79.93593],[20.65421,81.54417],[36.6503,80.40108],[26.76265,75.8129],[13.88667,75.79135],[4.04288,79.93593]],[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.riksantikvaren.no/Veiledning/Data-og-tjenester/Karttjenester",terms_text:"© Riksantikvaren",description:"Archeological and architectural monuments/sites and cultural environments protected by law (''enkeltminner'') from the Norwegian Directorate for Cultural Heritage",icon:"https://www.riksantikvaren.no/extension/riksantikvaren/design/internetsite/images/logo_na.png",overlay:true},{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.17709,-22.96971],[-43.14586,-22.96959],[-43.14605,-22.92719],[-43.15625,-22.92731],[-43.15647,-22.87557],[-43.17739,-22.87494],[-43.17742,-22.88553],[-43.19804,-22.88571],[-43.19804,-22.85429],[-43.21875,-22.85444],[-43.21901,-22.83365],[-43.22937,-22.83365],[-43.22934,-22.82371],[-43.19869,-22.82353],[-43.19856,-22.83413],[-43.18826,-22.83398],[-43.18804,-22.84448],[-43.16667,-22.84442],[-43.16683,-22.83404],[-43.15638,-22.83407],[-43.15654,-22.81336],[-43.10436,-22.81306],[-43.10446,-22.80288],[-43.09387,-22.80276],[-43.0941,-22.73998],[-43.13599,-22.73992],[-43.13569,-22.75067],[-43.12573,-22.75055],[-43.12556,-22.77118],[-43.14595,-22.77109],[-43.14612,-22.76055],[-43.17771,-22.76088],[-43.17758,-22.77115],[-43.18807,-22.7713],[-43.18807,-22.78166],[-43.25067,-22.78163],[-43.25057,-22.79198],[-43.28054,-22.79282],[-43.30343,-22.79312],[-43.33353,-22.79297],[-43.33347,-22.80258],[-43.38574,-22.8024],[-43.38542,-22.81255],[-43.41691,-22.81285],[-43.41675,-22.82341],[-43.42717,-22.82335],[-43.4274,-22.83374],[-43.45844,-22.83362],[-43.45864,-22.81276],[-43.48984,-22.813],[-43.48994,-22.7965],[-43.50208,-22.79746],[-43.51543,-22.79737],[-43.52078,-22.79591],[-43.54169,-22.79603],[-43.54179,-22.80234],[-43.54653,-22.80246],[-43.54666,-22.81189],[-43.55251,-22.81279],[-43.56991,-22.81294],[-43.56998,-22.8197],[-43.57361,-22.82326],[-43.58348,-22.82329],[-43.58352,-22.83347],[-43.59391,-22.83374],[-43.59394,-22.85468],[-43.66099,-22.85459],[-43.66099,-22.85983],[-43.70852,-22.86019],[-43.70836,-22.86503],[-43.72206,-22.86488],[-43.72213,-22.86847],[-43.75015,-22.86859],[-43.75009,-22.8753],[-43.76038,-22.87527],[-43.75992,-22.8785],[-43.75976,-22.88457],[-43.76132,-22.88586],[-43.78129,-22.8858],[-43.78126,-22.89591],[-43.80213,-22.89621],[-43.80135,-22.91137],[-43.80119,-22.92758],[-43.79213,-22.92776],[-43.7922,-22.93822],[-43.78191,-22.93799],[-43.78184,-22.94869],[-43.75067,-22.94845],[-43.7506,-22.95909],[-43.72986,-22.95886],[-43.72966,-22.97984],[-43.70904,-22.97966],[-43.70891,-22.99033],[-43.69846,-22.99006],[-43.69836,-23.00065],[-43.66735,-23.00044],[-43.66726,-23.01117],[-43.63125,-23.00937],[-43.63131,-23.02079],[-43.63586,-23.02091],[-43.63602,-23.03164],[-43.67771,-23.03164],[-43.67765,-23.04233],[-43.67086,-23.0423],[-43.67109,-23.0631],[-43.64599,-23.06304],[-43.64605,-23.05276],[-43.60475,-23.05255],[-43.60452,-23.06307],[-43.58381,-23.06289],[-43.58368,-23.08404],[-43.54186,-23.08383],[-43.54195,-23.06319],[-43.52147,-23.06301],[-43.5213,-23.07352],[-43.50043,-23.07337],[-43.50043,-23.04218],[-43.45877,-23.04221],[-43.4587,-23.03194],[-43.43782,-23.03182],[-43.43776,-23.02154],[-43.3235,-23.02121],[-43.3233,-23.04212],[-43.31291,-23.04195],[-43.31275,-23.05267],[-43.30239,-23.05258],[-43.30236,-23.04227],[-43.29194,-23.04215],[-43.29197,-23.03194],[-43.27109,-23.03182],[-43.27119,-23.01093],[-43.26061,-23.01087],[-43.26067,-23.00059],[-43.25057,-23.00047],[-43.25054,-23.01126],[-43.23989,-23.01102],[-43.23986,-23.00062],[-43.21908,-23.0005],[-43.21904,-22.99021],[-43.20901,-22.99009],[-43.20862,-23.08389],[-43.18768,-23.08377],[-43.18761,-23.07334],[-43.13582,-23.07337],[-43.13589,-23.05249],[-43.17732,-23.05255],[-43.17709,-22.96971]]],terms_url:"https://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:"https://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.30363,-22.43698],[-44.10842,-22.06579],[-44.5313,-23.7863],[-42.70469,-24.16178],[-42.30363,-22.43698]]],terms_url:"https://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:"https://{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.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://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:"Ruda_Slaska-aerial_image",name:"Ruda Śląska: Orthophotomap (aerial image)",type:"wms",template:"https://rudaslaska.geoportal2.pl/map/wmsorto/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[0,23],polygon:[[[18.84294,50.32508],[18.84008,50.33091],[18.85132,50.33437],[18.86262,50.3305],[18.88693,50.333],[18.89493,50.3319],[18.90045,50.32562],[18.89713,50.31146],[18.89312,50.31149],[18.89114,50.30778],[18.8972,50.2999],[18.89073,50.29586],[18.90211,50.29204],[18.90706,50.28637],[18.90853,50.27823],[18.93583,50.27379],[18.94106,50.25859],[18.93848,50.25317],[18.95086,50.24267],[18.96531,50.24084],[18.94611,50.22907],[18.89932,50.22516],[18.90251,50.21749],[18.89075,50.21557],[18.89292,50.20913],[18.86474,50.20512],[18.85673,50.22078],[18.85258,50.22331],[18.84619,50.21761],[18.83341,50.21715],[18.83533,50.22307],[18.83051,50.23099],[18.82411,50.23055],[18.81641,50.23709],[18.81619,50.24125],[18.80635,50.24596],[18.80344,50.24293],[18.78831,50.24456],[18.79552,50.2768],[18.81681,50.27732],[18.81919,50.28794],[18.83893,50.29795],[18.83849,50.3004],[18.82699,50.30342],[18.82691,50.32073],[18.83007,50.32371],[18.84294,50.32508]]],terms_text:"Urząd Miasta Ruda Śląska"},{id:"Rzeszow-buildings",name:"Rzeszów: Buildings",type:"wms",template:"http://wms.erzeszow.pl/?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=komunikacja,budynki,adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[0,19],polygon:[[[22.09538,50.08157],[22.0947,50.05584],[22.08892,50.05589],[22.08874,50.03671],[22.09505,50.03682],[22.09435,49.98723],[22.0609,49.98754],[22.0605,49.96525],[22.04757,49.96509],[22.04724,49.95792],[22.03139,49.95845],[22.0312,49.9574],[22.0014,49.95833],[22.00019,49.9375],[22.0014,49.93746],[22.00029,49.92047],[21.96799,49.92088],[21.969,49.93683],[21.95393,49.93706],[21.95441,49.94373],[21.94192,49.94378],[21.94253,49.96646],[21.93676,49.9665],[21.93776,49.97828],[21.92898,49.97858],[21.92951,49.98858],[21.91606,49.9888],[21.9165,50.01192],[21.90572,50.01195],[21.90653,50.04136],[21.87425,50.04183],[21.87546,50.06072],[21.90465,50.06083],[21.90672,50.0835],[22.09538,50.08157]]],terms_text:"Urząd Miasta Rzeszowa"},{id:"Rzeszow-aerial_image",name:"Rzeszów: Orthophotomap (aerial image)",type:"wms",template:"http://wms.erzeszow.pl/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=rastry&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[0,23],polygon:[[[22.09538,50.08157],[22.0947,50.05584],[22.08892,50.05589],[22.08874,50.03671],[22.09505,50.03682],[22.09435,49.98723],[22.0609,49.98754],[22.0605,49.96525],[22.04757,49.96509],[22.04724,49.95792],[22.03139,49.95845],[22.0312,49.9574],[22.0014,49.95833],[22.00019,49.9375],[22.0014,49.93746],[22.00029,49.92047],[21.96799,49.92088],[21.969,49.93683],[21.95393,49.93706],[21.95441,49.94373],[21.94192,49.94378],[21.94253,49.96646],[21.93676,49.9665],[21.93776,49.97828],[21.92898,49.97858],[21.92951,49.98858],[21.91606,49.9888],[21.9165,50.01192],[21.90572,50.01195],[21.90653,50.04136],[21.87425,50.04183],[21.87546,50.06072],[21.90465,50.06083],[21.90672,50.0835],[22.09538,50.08157]]],terms_text:"Urząd Miasta Rzeszowa"},{id:"SanJuanMetroAreaUSACEOrthophotos",name:"San Juan Metro Area: 2013 USACE Orthophotos",type:"tms",template:"http://imagery-pr-usace-2013.s3-website-us-east-1.amazonaws.com/tiles/{zoom}/{x}/{y}.jpg",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",scaleExtent:[0,20],polygon:[[[-66.15007,18.35002],[-66.03337,18.35002],[-66.03328,18.45634],[-66.05464,18.45636],[-66.05463,18.46542],[-66.08303,18.46544],[-66.08302,18.47451],[-66.13034,18.47455],[-66.13034,18.4796],[-66.13983,18.47961],[-66.13984,18.46557],[-66.14995,18.46558],[-66.15007,18.35002]]]},{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.20224,-9.41356],[-37.20188,-9.37768],[-37.20208,-9.37455],[-37.20192,-9.36733],[-37.20169,-9.36045],[-37.20172,-9.35501],[-37.20195,-9.35101],[-37.20191,-9.34773],[-37.20175,-9.33835],[-37.2017,-9.33505],[-37.20171,-9.33301],[-37.20142,-9.32833],[-37.20121,-9.32469],[-37.20117,-9.32351],[-37.21425,-9.32346],[-37.21537,-9.3234],[-37.22078,-9.32328],[-37.23727,-9.32313],[-37.25181,-9.32293],[-37.2656,-9.32276],[-37.2803,-9.32259],[-37.29191,-9.32245],[-37.29205,-9.33522],[-37.29304,-9.4122],[-37.28357,-9.41235],[-37.27789,-9.4125],[-37.2716,-9.41249],[-37.26506,-9.41262],[-37.26165,-9.41274],[-37.25499,-9.41276],[-37.24991,-9.41296],[-37.24616,-9.41297],[-37.24108,-9.41303],[-37.23461,-9.41321],[-37.2284,-9.41325],[-37.22165,-9.41335],[-37.21686,-9.41346],[-37.21292,-9.41343],[-37.20224,-9.41356]]],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.1415,-9.83171],[-36.05047,-9.83246],[-36.04959,-9.74246],[-36.14059,-9.74166],[-36.1415,-9.83171]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"GEOSN-DOP-2005",name:"Saxony historical aerial imagery 2005",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-2005/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dop_2005&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2005-01-01T00:00:00.000Z",startDate:"2005-01-01T00:00:00.000Z",polygon:[[[13.86571,50.71509],[13.86683,50.73012],[13.90116,50.73012],[13.90184,50.74446],[13.91043,50.74446],[13.91043,50.77378],[13.95266,50.77486],[13.95197,50.78897],[13.99969,50.78941],[13.999,50.79831],[14.16715,50.79762],[14.1747,50.8462],[14.32851,50.84534],[14.33503,50.87643],[14.41674,50.876],[14.41674,50.95025],[14.33263,50.95133],[14.3364,50.99802],[14.58188,50.99608],[14.57742,50.94895],[14.54068,50.95003],[14.54446,50.89831],[14.60557,50.89116],[14.60454,50.83439],[14.6605,50.83352],[14.65673,50.79578],[14.83422,50.79469],[14.84727,50.89138],[14.9204,50.88943],[14.9331,50.99478],[14.99902,50.99673],[15.00142,51.09709],[15.04159,51.09709],[15.04228,51.35317],[14.99696,51.35317],[15.00314,51.49959],[14.91593,51.50301],[14.91662,51.55043],[14.74908,51.55129],[14.75114,51.60121],[14.41056,51.59993],[14.41125,51.55129],[14.07891,51.54915],[14.07479,51.49831],[13.99446,51.50002],[13.99446,51.39817],[13.53921,51.39989],[13.53852,51.42516],[13.50041,51.42505],[13.50179,51.44945],[13.41596,51.45094],[13.41699,51.50013],[13.3315,51.50055],[13.33047,51.44966],[13.24945,51.44987],[13.25116,51.60036],[13.16773,51.60057],[13.16739,51.65023],[13.08328,51.65066],[13.08362,51.69941],[12.66202,51.70027],[12.66065,51.64832],[12.4162,51.65045],[12.41345,51.60057],[12.16146,51.60015],[12.16146,51.50109],[12.07631,51.50023],[12.07974,51.39625],[12.16008,51.39753],[12.16214,51.34995],[12.07906,51.35253],[12.07906,51.24562],[12.16214,51.24691],[12.16352,51.0958],[12.24317,51.09709],[12.2454,51.04813],[12.49688,51.04883],[12.49894,50.89966],[12.33346,50.89923],[12.32797,50.84984],[12.20712,50.8494],[12.20506,50.69829],[12.24694,50.69744],[12.24694,50.65023],[11.91529,50.64849],[11.91598,50.59839],[11.83221,50.59817],[11.83255,50.39922],[11.91495,50.39922],[11.91461,50.34886],[11.99486,50.34659],[11.99838,50.29897],[12.16506,50.29912],[12.16549,50.24904],[12.23673,50.24871],[12.24823,50.24212],[12.24772,50.14904],[12.33149,50.14893],[12.33852,50.19335],[12.33286,50.23927],[12.3538,50.23619],[12.35998,50.24926],[12.41457,50.24948],[12.41594,50.29906],[12.49851,50.29874],[12.49834,50.34948],[12.58142,50.34915],[12.58125,50.39896],[12.69489,50.39962],[12.70622,50.39426],[12.71257,50.39875],[13.0813,50.39907],[13.0813,50.4992],[13.24816,50.49898],[13.24884,50.54809],[13.33124,50.54918],[13.33056,50.59911],[13.50908,50.59759],[13.50462,50.62656],[13.5393,50.62635],[13.53827,50.65481],[13.54633,50.65547],[13.54599,50.66983],[13.5544,50.67027],[13.55457,50.68908],[13.54736,50.68887],[13.54582,50.69969],[13.63886,50.69947],[13.63955,50.71425],[13.86571,50.71509]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=3f38c3f3-03db-4a2a-b6da-2704b9a1d5f0",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-2012_2014",name:"Saxony historical aerial imagery 2012-2014",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop_2012_2014/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dop_2012_2014_rgb&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:[[[13.86571,50.71509],[13.86683,50.73012],[13.90116,50.73012],[13.90184,50.74446],[13.91043,50.74446],[13.91043,50.77378],[13.95266,50.77486],[13.95197,50.78897],[13.99969,50.78941],[13.999,50.79831],[14.16715,50.79762],[14.1747,50.8462],[14.32851,50.84534],[14.33503,50.87643],[14.41674,50.876],[14.41674,50.95025],[14.33263,50.95133],[14.3364,50.99802],[14.58188,50.99608],[14.57742,50.94895],[14.54068,50.95003],[14.54446,50.89831],[14.60557,50.89116],[14.60454,50.83439],[14.6605,50.83352],[14.65673,50.79578],[14.83422,50.79469],[14.84727,50.89138],[14.9204,50.88943],[14.9331,50.99478],[14.99902,50.99673],[15.00142,51.09709],[15.04159,51.09709],[15.04228,51.35317],[14.99696,51.35317],[15.00314,51.49959],[14.91593,51.50301],[14.91662,51.55043],[14.74908,51.55129],[14.75114,51.60121],[14.41056,51.59993],[14.41125,51.55129],[14.07891,51.54915],[14.07479,51.49831],[13.99446,51.50002],[13.99446,51.39817],[13.53921,51.39989],[13.53852,51.42516],[13.50041,51.42505],[13.50179,51.44945],[13.41596,51.45094],[13.41699,51.50013],[13.3315,51.50055],[13.33047,51.44966],[13.24945,51.44987],[13.25116,51.60036],[13.16773,51.60057],[13.16739,51.65023],[13.08328,51.65066],[13.08362,51.69941],[12.66202,51.70027],[12.66065,51.64832],[12.4162,51.65045],[12.41345,51.60057],[12.16146,51.60015],[12.16146,51.50109],[12.07631,51.50023],[12.07974,51.39625],[12.16008,51.39753],[12.16214,51.34995],[12.07906,51.35253],[12.07906,51.24562],[12.16214,51.24691],[12.16352,51.0958],[12.24317,51.09709],[12.2454,51.04813],[12.49688,51.04883],[12.49894,50.89966],[12.33346,50.89923],[12.32797,50.84984],[12.20712,50.8494],[12.20506,50.69829],[12.24694,50.69744],[12.24694,50.65023],[11.91529,50.64849],[11.91598,50.59839],[11.83221,50.59817],[11.83255,50.39922],[11.91495,50.39922],[11.91461,50.34886],[11.99486,50.34659],[11.99838,50.29897],[12.16506,50.29912],[12.16549,50.24904],[12.23673,50.24871],[12.24823,50.24212],[12.24772,50.14904],[12.33149,50.14893],[12.33852,50.19335],[12.33286,50.23927],[12.3538,50.23619],[12.35998,50.24926],[12.41457,50.24948],[12.41594,50.29906],[12.49851,50.29874],[12.49834,50.34948],[12.58142,50.34915],[12.58125,50.39896],[12.69489,50.39962],[12.70622,50.39426],[12.71257,50.39875],[13.0813,50.39907],[13.0813,50.4992],[13.24816,50.49898],[13.24884,50.54809],[13.33124,50.54918],[13.33056,50.59911],[13.50908,50.59759],[13.50462,50.62656],[13.5393,50.62635],[13.53827,50.65481],[13.54633,50.65547],[13.54599,50.66983],[13.5544,50.67027],[13.55457,50.68908],[13.54736,50.68887],[13.54582,50.69969],[13.63886,50.69947],[13.63955,50.71425],[13.86571,50.71509]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=8c276e3c-88af-462f-8128-6900bc7dd4f8",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{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.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=cd01c334-7e32-482f-bd43-af286707178a",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-CIR",name:"Saxony latest aerial imagery infrared",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-cir/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dop_020_cir&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=ba87bbed-4cb5-4539-a9f5-f863de752f52",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DTK",name:"Saxony topographic map",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dtk-pg-color/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dtk_pg_color&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=d6d24c6d-94ea-447d-8a0c-40afdedeb5c6",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-WebAtlas",name:"Saxony WebAtlasSN",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_webatlas-sn/guest?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vegetation,Siedlung,Gewaesser,Verkehr,Administrative_Einheiten,Beschriftung&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=475a9197-620f-4dcb-b8aa-7f71b626443f",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"Geodatastyrelsen_Denmark",name:"SDFE aerial imagery",type:"tms",template:"https://osmtools.septima.dk/mapproxy/tiles/1.0.0/kortforsyningen_ortoforaar/EPSG3857/{zoom}/{x}/{y}.jpeg",scaleExtent:[0,21],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_url:"https://download.kortforsyningen.dk/content/vilkaar-og-betingelser",terms_text:"Geodatastyrelsen og Danske Kommuner",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_Cadastral_Parcels_INSPIRE_View",name:"SDFE Cadastral Parcels INSPIRE View",type:"wms",template:"https://kortforsyningen.kms.dk/cp_inspire?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=CP.CadastralParcel&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_DTK_Kort25",name:"SDFE DTK Kort25",type:"wms",template:"https://kortforsyningen.kms.dk/topo25?FORMAT=image/png&VERSION=1.1.1&login=OpenStreetMapDK2015&password=Gall4Peters&SERVICE=WMS&REQUEST=GetMap&Layers=topo25_klassisk&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[0,19],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_Skaermkort",name:"SDFE Skærmkort",type:"wms",template:"https://kortforsyningen.kms.dk/topo_skaermkort?FORMAT=image/png&VERSION=1.1.1&login=OpenStreetMapDK2015&password=Gall4Peters&SERVICE=WMS&REQUEST=GetMap&Layers=dtk_skaermkort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[0,19],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"SDFE_Overflade_Skyggekort_40cm",name:"SDFE Surface Shadow Map (40 cm)",type:"wms",template:"https://kortforsyningen.kms.dk/dhm?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=dhm_overflade_skyggekort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"SDFE_Terraen_Skyggekort_40cm",name:"SDFE Terrain Shadow Map (40 cm)",type:"wms",template:"https://kortforsyningen.kms.dk/dhm?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=dhm_terraen_skyggekort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{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.71165,38.25894],[15.23718,38.81938],[14.27124,38.55246],[13.15063,38.75408],[11.96411,37.97451],[12.52441,37.54022],[11.87897,36.79609],[12.49695,35.47409],[12.68921,35.46962],[14.57336,36.66401],[15.29709,36.62875],[15.39854,37.42171],[15.71165,38.25894]]]},{id:"Siemianowice_Slaskie-buildings",name:"Siemianowice Śląskie: Buildings",type:"wms",template:"https://siemianowice.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,drogi,adresy,ulice&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[0,19],polygon:[[[19.03103,50.33933],[19.0316,50.35413],[19.0656,50.35373],[19.06529,50.34219],[19.06118,50.33749],[19.06069,50.31967],[19.05603,50.31975],[19.05562,50.30155],[19.06432,50.3015],[19.06366,50.27175],[19.04379,50.27179],[19.04375,50.27478],[19.0213,50.27505],[19.02156,50.28398],[19.01027,50.28856],[18.98791,50.28871],[18.98822,50.3022],[18.98143,50.30226],[18.98213,50.33977],[19.03103,50.33933]]],terms_text:"Urząd Miasta Siemianowice Śląskie"},{id:"Siemianowice_Slaskie-aerial_image",name:"Siemianowice Śląskie: Orthophotomap (aerial image)",type:"wms",template:"https://siemianowice.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",scaleExtent:[0,23],polygon:[[[19.03103,50.33933],[19.0316,50.35413],[19.0656,50.35373],[19.06529,50.34219],[19.06118,50.33749],[19.06069,50.31967],[19.05603,50.31975],[19.05562,50.30155],[19.06432,50.3015],[19.06366,50.27175],[19.04379,50.27179],[19.04375,50.27478],[19.0213,50.27505],[19.02156,50.28398],[19.01027,50.28856],[18.98791,50.28871],[18.98822,50.3022],[18.98143,50.30226],[18.98213,50.33977],[19.03103,50.33933]]],terms_text:"Urząd Miasta Siemianowice Śląskie"},{id:"sc2012",name:"SIG Santa Catarina OrtoRGB 2012",type:"wms",template:"http://sigsc.sc.gov.br/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.62488,-26.91624],[-48.62416,-26.83409],[-48.56163,-26.83412],[-48.56165,-26.74919],[-48.62675,-26.74918],[-48.62715,-26.73276],[-48.64126,-26.733],[-48.64174,-26.70912],[-48.62414,-26.70913],[-48.62418,-26.50079],[-48.57099,-26.50077],[-48.57155,-26.47415],[-48.55418,-26.47381],[-48.5545,-26.45736],[-48.56155,-26.45747],[-48.56161,-26.41746],[-48.4991,-26.41747],[-48.49909,-26.25081],[-48.43664,-26.25079],[-48.43661,-26.20752],[-48.4601,-26.20751],[-48.46195,-26.1242],[-48.56161,-26.12419],[-48.56163,-25.95753],[-48.62411,-25.95753],[-48.62411,-25.94507],[-48.68838,-25.94607],[-48.6884,-25.95752],[-49.25089,-25.95752],[-49.2509,-25.9992],[-49.31339,-25.9992],[-49.31338,-26.0825],[-49.37591,-26.0825],[-49.37591,-26.12419],[-49.50093,-26.12418],[-49.50092,-26.16586],[-49.68661,-26.16585],[-49.68661,-26.12417],[-49.74907,-26.08246],[-49.74908,-26.04084],[-49.8116,-26.04085],[-49.81159,-25.99918],[-49.93657,-25.99915],[-49.93661,-25.98244],[-50.00091,-25.98288],[-50.00094,-25.99915],[-50.31338,-25.99916],[-50.31342,-26.04083],[-50.37411,-26.04084],[-50.3741,-25.9992],[-50.49914,-25.99918],[-50.49911,-25.98414],[-50.62593,-25.98452],[-50.62595,-26.04084],[-50.6884,-26.04161],[-50.68845,-26.12416],[-50.75094,-26.12414],[-50.75095,-26.20752],[-51.12595,-26.20747],[-51.12595,-26.24913],[-51.18848,-26.24918],[-51.31344,-26.33245],[-51.31347,-26.62414],[-51.4366,-26.62415],[-51.43659,-26.56476],[-51.62409,-26.5641],[-51.62411,-26.5408],[-51.99907,-26.5408],[-52.06158,-26.49911],[-52.06158,-26.45747],[-52.12408,-26.45749],[-52.12406,-26.41579],[-52.37407,-26.4158],[-52.37409,-26.39133],[-52.56156,-26.3894],[-52.56158,-26.37415],[-52.62408,-26.37417],[-52.62409,-26.33247],[-53.12408,-26.33247],[-53.1241,-26.31707],[-53.1618,-26.3165],[-53.16136,-26.29082],[-53.18656,-26.29083],[-53.24907,-26.24911],[-53.24906,-26.23919],[-53.31159,-26.23824],[-53.3741,-26.22882],[-53.43845,-26.22777],[-53.43843,-26.24914],[-53.5616,-26.24916],[-53.56159,-26.23983],[-53.65501,-26.23814],[-53.65623,-26.29263],[-53.67011,-26.31684],[-53.68846,-26.33242],[-53.70322,-26.3741],[-53.70929,-26.38449],[-53.7098,-26.39568],[-53.70619,-26.40722],[-53.70721,-26.45927],[-53.71438,-26.46168],[-53.71476,-26.48118],[-53.73047,-26.49913],[-53.73146,-26.54081],[-53.75096,-26.5408],[-53.75095,-26.62417],[-53.7602,-26.62414],[-53.76125,-26.6675],[-53.75098,-26.66751],[-53.75096,-26.74298],[-53.72737,-26.7434],[-53.72133,-26.74905],[-53.72141,-26.75093],[-53.74571,-26.75943],[-53.74612,-26.77704],[-53.71948,-26.77755],[-53.72084,-26.83416],[-53.70047,-26.83414],[-53.70277,-26.93108],[-53.71168,-26.93091],[-53.71224,-26.95557],[-53.751,-26.95479],[-53.75092,-26.99915],[-53.76467,-26.99915],[-53.8037,-27.03751],[-53.80454,-27.07258],[-53.80809,-27.07249],[-53.80862,-27.09613],[-53.8269,-27.09577],[-53.82762,-27.12414],[-53.84644,-27.12413],[-53.84765,-27.17014],[-53.83506,-27.18932],[-53.83536,-27.20054],[-53.68847,-27.20284],[-53.68849,-27.22789],[-53.43654,-27.23246],[-53.43655,-27.16751],[-53.37598,-27.16751],[-53.37601,-27.23352],[-53.24905,-27.23564],[-53.24905,-27.20922],[-53.06344,-27.20918],[-53.06345,-27.2334],[-52.81348,-27.23685],[-52.81346,-27.27653],[-52.75096,-27.27732],[-52.75096,-27.29249],[-52.4385,-27.29252],[-52.43848,-27.32689],[-52.37603,-27.32753],[-52.37599,-27.3342],[-52.25098,-27.33418],[-52.25099,-27.34669],[-52.18655,-27.34728],[-52.18657,-27.33419],[-52.12598,-27.3342],[-52.12599,-27.36413],[-52.02979,-27.36489],[-52.03036,-27.42442],[-51.97534,-27.42479],[-51.97603,-27.50088],[-51.93845,-27.50085],[-51.93845,-27.54252],[-51.68846,-27.54247],[-51.68847,-27.55742],[-51.59903,-27.5579],[-51.59923,-27.59481],[-51.56351,-27.59498],[-51.56348,-27.62586],[-51.50088,-27.62586],[-51.50095,-27.66754],[-51.43937,-27.6675],[-51.43954,-27.70932],[-51.37597,-27.7095],[-51.37601,-27.75089],[-51.31349,-27.7509],[-51.31346,-27.79253],[-51.18847,-27.79251],[-51.18848,-27.87586],[-51.12598,-27.87586],[-51.12597,-27.91752],[-51.06348,-27.9175],[-51.06347,-27.95919],[-51.00095,-28.00086],[-50.9385,-28.00086],[-50.93849,-28.16755],[-50.81346,-28.16752],[-50.81345,-28.29253],[-50.75096,-28.29251],[-50.68845,-28.33418],[-50.68849,-28.41754],[-50.626,-28.41752],[-50.56352,-28.44094],[-50.43848,-28.44051],[-50.43847,-28.45917],[-50.37597,-28.45921],[-50.37598,-28.47554],[-50.18844,-28.47454],[-50.18849,-28.51143],[-50.12398,-28.51104],[-50.12402,-28.50086],[-49.87597,-28.50085],[-49.87601,-28.5142],[-49.81347,-28.51369],[-49.81347,-28.58255],[-49.83003,-28.58251],[-49.82951,-28.62597],[-49.8759,-28.66572],[-50.001,-28.74915],[-50.001,-29.04083],[-50.03319,-29.04081],[-50.03219,-29.14711],[-50.12602,-29.14774],[-50.12598,-29.16579],[-50.13613,-29.16581],[-50.1885,-29.19623],[-50.1885,-29.31905],[-50.1422,-29.31873],[-50.14208,-29.33422],[-50.126,-29.33418],[-50.12599,-29.36238],[-49.99906,-29.36153],[-49.99904,-29.24031],[-49.93848,-29.23986],[-49.93851,-29.25087],[-49.87601,-29.25087],[-49.876,-29.30098],[-49.82262,-29.30052],[-49.82227,-29.33419],[-49.81347,-29.33422],[-49.81354,-29.3411],[-49.68654,-29.33991],[-49.68651,-29.29255],[-49.62399,-29.29252],[-49.62398,-29.25085],[-49.56149,-29.25083],[-49.56145,-29.16749],[-49.49901,-29.16746],[-49.49902,-29.08419],[-49.4365,-29.08418],[-49.43651,-29.04251],[-49.37405,-29.04248],[-49.37402,-28.9592],[-49.31153,-28.95917],[-49.31152,-28.91749],[-49.24898,-28.9175],[-49.24897,-28.87582],[-49.18655,-28.87585],[-49.18653,-28.83414],[-49.12402,-28.83418],[-49.12401,-28.7925],[-49.06149,-28.79247],[-49.06146,-28.75084],[-48.99903,-28.75085],[-48.99903,-28.70919],[-48.93658,-28.70918],[-48.93658,-28.66752],[-48.87405,-28.66751],[-48.87404,-28.62585],[-48.74912,-28.62585],[-48.74912,-28.54254],[-48.68656,-28.54253],[-48.68658,-28.33417],[-48.62408,-28.33416],[-48.62406,-28.08418],[-48.5616,-28.08418],[-48.56159,-27.95919],[-48.49905,-27.95916],[-48.49904,-27.91581],[-48.56157,-27.9158],[-48.5616,-27.87584],[-48.49902,-27.87586],[-48.49902,-27.83422],[-48.43657,-27.83418],[-48.43661,-27.62583],[-48.37406,-27.62585],[-48.37405,-27.50086],[-48.31157,-27.50086],[-48.31153,-27.24913],[-48.43657,-27.24913],[-48.43654,-27.20916],[-48.37402,-27.2092],[-48.37405,-27.1658],[-48.43656,-27.1658],[-48.43656,-27.12415],[-48.49906,-27.12413],[-48.49907,-27.08667],[-48.50022,-27.08666],[-48.50031,-27.08247],[-48.5616,-27.08248],[-48.56159,-27.04252],[-48.49906,-27.04252],[-48.49906,-26.99913],[-48.56156,-26.99913],[-48.56157,-26.91579],[-48.62488,-26.91624]]],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:"SIGIP-2012",name:"SIGIP - Orthophoto 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/sigip2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",scaleExtent:[14,20],polygon:[[[6.71057,46.54396],[6.72968,46.54408],[6.72995,46.52605],[6.71085,46.52596],[6.71113,46.50796],[6.6922,46.50788],[6.6923,46.49883],[6.63531,46.49847],[6.63488,46.52547],[6.65381,46.52558],[6.65361,46.54358],[6.69163,46.54384],[6.69155,46.55284],[6.71047,46.55293],[6.71057,46.54396]]],terms_url:"https://www.sigip.ch/",terms_text:"SIGIP"},{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.81969,47.49272],[16.81969,49.50303],[22.83883,49.50303],[22.83883,47.49272],[16.81969,47.49272]]],icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"skoterleder",name:"Snowmobile map Sweden",type:"tms",template:"https://tiles.skoterleder.org/tiles/{zoom}/{x}/{y}.png",scaleExtent:[5,14],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[23.87328,65.21069],[30.14647,65.19226],[30.19042,67.62596],[29.43236,69.62651],[27.93822,70.14037],[20.73119,69.2756],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://skoterleder.org/",terms_text:"© Skoterleder.org",description:"Snowmobile trails",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Sweden_road_sign_D9.svg/200px-Sweden_road_sign_D9.svg.png"},{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",endDate:"2017-03-01T00:00:00.000Z",startDate:"2017-03-01T00:00:00.000Z",scaleExtent:[11,20],polygon:[[[18.79273,47.37079],[18.79194,47.37048],[18.79139,47.37063],[18.79011,47.37176],[18.78916,47.37345],[18.78722,47.37566],[18.78603,47.37765],[18.78498,47.37905],[18.7837,47.38032],[18.78267,47.38195],[18.7814,47.38368],[18.77934,47.38713],[18.77666,47.3894],[18.76472,47.3967],[18.7617,47.39966],[18.75631,47.40328],[18.75837,47.40653],[18.7588,47.40776],[18.762,47.41217],[18.76304,47.41315],[18.76593,47.41471],[18.77041,47.41766],[18.77247,47.41809],[18.77248,47.4203],[18.8086,47.44041],[18.81742,47.43539],[18.82092,47.43572],[18.82804,47.43755],[18.83021,47.43526],[18.83585,47.43754],[18.84049,47.43346],[18.84765,47.43572],[18.851,47.43281],[18.869,47.43961],[18.87361,47.43597],[18.87499,47.43342],[18.87386,47.43248],[18.87604,47.42797],[18.8605,47.423],[18.86621,47.41798],[18.87243,47.41086],[18.8663,47.40773],[18.86964,47.40471],[18.86777,47.40207],[18.86509,47.40052],[18.87081,47.39838],[18.86772,47.39699],[18.86992,47.39655],[18.87649,47.39478],[18.87749,47.39495],[18.87867,47.39462],[18.88358,47.38996],[18.88291,47.38967],[18.88539,47.3853],[18.87748,47.38339],[18.88181,47.37605],[18.87914,47.37393],[18.88638,47.36923],[18.88206,47.36773],[18.87973,47.36641],[18.8747,47.36252],[18.87282,47.36137],[18.87028,47.36063],[18.86688,47.35853],[18.86234,47.35637],[18.85567,47.35199],[18.84874,47.34728],[18.83192,47.33841],[18.82497,47.34258],[18.8162,47.34925],[18.81079,47.35357],[18.80823,47.356],[18.80645,47.35854],[18.80708,47.35902],[18.80635,47.36021],[18.80465,47.36175],[18.80381,47.36335],[18.80055,47.36545],[18.79988,47.36617],[18.79416,47.36975],[18.79273,47.37079]],[[18.91871,47.40938],[18.91826,47.40998],[18.92067,47.41156],[18.9251,47.41372],[18.93473,47.41917],[18.94063,47.42241],[18.94982,47.41938],[18.95155,47.4175],[18.9569,47.41923],[18.9577,47.41878],[18.95755,47.41435],[18.96211,47.40507],[18.96266,47.40118],[18.96316,47.39903],[18.95446,47.39673],[18.95276,47.39526],[18.95202,47.39362],[18.95119,47.39356],[18.94692,47.39799],[18.94411,47.39845],[18.94161,47.39869],[18.93735,47.39633],[18.93617,47.39683],[18.93122,47.4],[18.9312,47.40023],[18.92924,47.40205],[18.92561,47.40605],[18.92466,47.40635],[18.92293,47.40926],[18.91871,47.40938]]],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.83968,-32.79834],[17.88935,-32.69728],[18.00364,-32.69822],[18.09917,-32.74853],[18.28987,-32.55266],[18.29302,-32.04871],[18.10545,-31.6455],[17.85293,-31.3444],[17.548,-30.90217],[17.40445,-30.63747],[17.24937,-30.39917],[16.9937,-29.65436],[16.7988,-29.19437],[16.54941,-28.84159],[16.44987,-28.69188],[16.4491,-28.55158],[16.60026,-28.48257],[16.75141,-28.4487],[16.74622,-28.2459],[16.88551,-28.04729],[16.99295,-28.0244],[17.05297,-28.02571],[17.10076,-28.03388],[17.20115,-28.09305],[17.20263,-28.23284],[17.24746,-28.23382],[17.2508,-28.19889],[17.35119,-28.19759],[17.35156,-28.24427],[17.40158,-28.24524],[17.41491,-28.34898],[17.40083,-28.548],[17.4527,-28.54897],[17.45121,-28.64951],[17.49836,-28.68721],[17.60282,-28.683],[17.64997,-28.69679],[17.65259,-28.73815],[17.80139,-28.73815],[17.99943,-28.75606],[18.00027,-28.79562],[18.15745,-28.87181],[18.50638,-28.87181],[18.61536,-28.82959],[18.90875,-28.82775],[19.1047,-28.94885],[19.19691,-28.93785],[19.24301,-28.85162],[19.23149,-28.80296],[19.25873,-28.70099],[19.44315,-28.69732],[19.55003,-28.49583],[19.69673,-28.49399],[19.69882,-28.44794],[19.85076,-28.44333],[19.84971,-28.40278],[19.99536,-28.39909],[19.98937,-24.74979],[20.29167,-24.91923],[20.47246,-25.15017],[20.65324,-25.45294],[20.73326,-25.6802],[20.8281,-25.89635],[20.84292,-26.21585],[20.65028,-26.48409],[20.65324,-26.82049],[21.08891,-26.84693],[21.67277,-26.839],[21.7765,-26.66963],[21.97211,-26.64314],[22.28034,-26.32747],[22.57078,-26.1334],[22.77528,-25.67752],[23.00052,-25.27619],[23.46583,-25.27351],[23.88372,-25.59737],[24.2364,-25.6134],[24.60391,-25.78966],[25.1107,-25.73894],[25.50784,-25.68554],[25.64418,-25.48238],[25.84193,-24.78054],[25.84664,-24.75385],[26.39285,-24.63329],[26.47391,-24.56533],[26.509,-24.48424],[26.58619,-24.40758],[26.73006,-24.30145],[26.85674,-24.24995],[26.85744,-24.10269],[26.92155,-23.8991],[26.93183,-23.84619],[26.97148,-23.69943],[27.00061,-23.63676],[27.0578,-23.60526],[27.13605,-23.52034],[27.33396,-23.39738],[27.51441,-23.35939],[27.59581,-23.20855],[27.80986,-23.0995],[27.88285,-23.06205],[27.93829,-22.94965],[28.04076,-22.82551],[28.20568,-22.65529],[28.33972,-22.56394],[28.49061,-22.5607],[28.61088,-22.54002],[28.82818,-22.45502],[28.92853,-22.42323],[28.95941,-22.30901],[29.01626,-22.20834],[29.23241,-22.16935],[29.35312,-22.18429],[29.6549,-22.11864],[29.77771,-22.1362],[29.9293,-22.18494],[30.11668,-22.28303],[30.25634,-22.29148],[30.30336,-22.33952],[30.50618,-22.30576],[30.83743,-22.28498],[31.00586,-22.30771],[31.18342,-22.32329],[31.29306,-22.36746],[31.56806,-23.19034],[31.55683,-23.44308],[31.69311,-23.61752],[31.71197,-23.74114],[31.77747,-23.88006],[31.88863,-23.94811],[31.91444,-24.17467],[31.99483,-24.30409],[32.01667,-24.4406],[32.00773,-24.65366],[32.01964,-24.91407],[32.03552,-25.08498],[32.01964,-25.38214],[31.99285,-25.44938],[31.99979,-25.51657],[32.00575,-25.6079],[32.00575,-25.66248],[31.93627,-25.84037],[31.98094,-25.95465],[31.86878,-26.00373],[31.41621,-25.72777],[31.32291,-25.74386],[31.25046,-25.82965],[31.1393,-25.91627],[31.11647,-25.99124],[30.96561,-26.26658],[30.89217,-26.32797],[30.85346,-26.40356],[30.82269,-26.44888],[30.80226,-26.52407],[30.80384,-26.80821],[30.90209,-26.78075],[30.91003,-26.84895],[30.98249,-26.90826],[30.97653,-27.00292],[31.00344,-27.04416],[31.15433,-27.19804],[31.50156,-27.31112],[31.97002,-27.31112],[31.97002,-27.12047],[31.97697,-27.05066],[32.00025,-26.79839],[32.10698,-26.79846],[32.31145,-26.84795],[32.89999,-26.85161],[32.88609,-26.9817],[32.70943,-27.47854],[32.62407,-27.77751],[32.5814,-28.07479],[32.53872,-28.2288],[32.42756,-28.50216],[32.36404,-28.59457],[32.07026,-28.84698],[31.98788,-28.90695],[31.77648,-28.96949],[31.46385,-29.28593],[31.35963,-29.38543],[31.16808,-29.63074],[31.06486,-29.78935],[31.05345,-29.84705],[31.06699,-29.86403],[31.04555,-29.9502],[30.95186,-30.00339],[30.86518,-30.10241],[30.72447,-30.3925],[30.35563,-30.93089],[30.09724,-31.24583],[29.86731,-31.43043],[29.74094,-31.50147],[29.48131,-31.69787],[28.89432,-32.28989],[28.54971,-32.58946],[28.14365,-32.83207],[28.07487,-32.94169],[27.84509,-33.08287],[27.3758,-33.38607],[26.88054,-33.6459],[26.59169,-33.74808],[26.45273,-33.79358],[26.20675,-33.75489],[26.00779,-33.7224],[25.80555,-33.75243],[25.75111,-33.80065],[25.65291,-33.85436],[25.65291,-33.94698],[25.71958,-34.00401],[25.72028,-34.05112],[25.55089,-34.06315],[25.35046,-34.05026],[25.28106,-34.00203],[25.04763,-33.99946],[24.95472,-34.00436],[24.94966,-34.10104],[24.87704,-34.15065],[24.87629,-34.20053],[24.85326,-34.21896],[24.76453,-34.20179],[24.50014,-34.20033],[24.34867,-34.11638],[24.19888,-34.1019],[23.99634,-34.05144],[23.80175,-34.05243],[23.74936,-34.01119],[23.49735,-34.00901],[23.41552,-34.04346],[23.41543,-34.11404],[22.90009,-34.0993],[22.84124,-34.05479],[22.64703,-34.05026],[22.64598,-34.00728],[22.57002,-34.00641],[22.50505,-34.06459],[22.252,-34.06459],[22.22213,-34.10147],[22.16212,-34.1057],[22.17124,-34.15218],[22.15769,-34.21809],[22.00156,-34.21722],[21.9497,-34.322],[21.86115,-34.40071],[21.56147,-34.40201],[21.5468,-34.36612],[21.50174,-34.36699],[21.5007,-34.40201],[21.41949,-34.44652],[21.19787,-34.44782],[21.09882,-34.39913],[21.00337,-34.37539],[20.89319,-34.39971],[20.89766,-34.4854],[20.74468,-34.48281],[20.5042,-34.48626],[20.25272,-34.70148],[20.08035,-34.83619],[19.99233,-34.83791],[19.89907,-34.82758],[19.89383,-34.7936],[19.5973,-34.79618],[19.39297,-34.64202],[19.28771,-34.64048],[19.28614,-34.59866],[19.34744,-34.52445],[19.32853,-34.45344],[19.098,-34.44998],[19.07256,-34.38024],[19.00235,-34.35256],[18.95206,-34.39494],[18.7975,-34.39364],[18.79842,-34.10164],[18.50175,-34.10153],[18.49995,-34.36169],[18.44773,-34.362],[18.44799,-34.35227],[18.39744,-34.3514],[18.39717,-34.3023],[18.35657,-34.30056],[18.34793,-34.20204],[18.29721,-34.19503],[18.29511,-33.99371],[18.33745,-33.99141],[18.34766,-33.84924],[18.34793,-33.78155],[18.41247,-33.74488],[18.36155,-33.65016],[18.2992,-33.58559],[18.21668,-33.44887],[18.13899,-33.39741],[17.94735,-33.16026],[17.88552,-33.05757],[17.84859,-32.96685],[17.83968,-32.85073],[17.83968,-32.79834]]],best:true},{id:"South-Tyrol-Orthofoto2011",name:"South Tyrol Orthofoto 2011",type:"tms",template:"https://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:"https://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:"https://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:"https://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-Orthofoto2014",name:"South Tyrol Orthofoto 2014",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",scaleExtent:[0,18],polygon:[[[12.23442,46.84254],[12.24913,46.82785],[12.24913,46.81945],[12.25753,46.81735],[12.26173,46.80686],[12.26594,46.80686],[12.26804,46.79637],[12.26173,46.79427],[12.27014,46.78587],[12.27224,46.76908],[12.28485,46.76698],[12.29745,46.7439],[12.30166,46.7439],[12.30166,46.7376],[12.28695,46.7376],[12.23652,46.72081],[12.18819,46.71451],[12.16298,46.70192],[12.10835,46.69353],[12.08944,46.68303],[12.05792,46.68093],[12.04531,46.67464],[12.03481,46.67464],[12.03061,46.68303],[12.0096,46.68303],[11.98438,46.66834],[11.94866,46.66414],[11.93816,46.65575],[11.90874,46.64525],[11.89193,46.64525],[11.8457,46.62846],[11.82049,46.62636],[11.80998,46.60748],[11.79528,46.60328],[11.78897,46.59069],[11.78057,46.58859],[11.76586,46.55501],[11.75325,46.54871],[11.73855,46.52982],[11.73224,46.52982],[11.72384,46.51513],[11.71543,46.51513],[11.71333,46.50254],[11.70913,46.50254],[11.70913,46.49624],[11.69652,46.48575],[11.69442,46.47735],[11.66711,46.47525],[11.66711,46.44587],[11.6608,46.44587],[11.64399,46.45846],[11.63769,46.45846],[11.63349,46.44587],[11.62508,46.44797],[11.62508,46.43957],[11.61878,46.43957],[11.61458,46.42278],[11.61037,46.42278],[11.61037,46.41649],[11.62508,46.41229],[11.62508,46.3934],[11.61458,46.38291],[11.60617,46.38291],[11.60407,46.37241],[11.58306,46.37241],[11.58306,46.34932],[11.55995,46.32414],[11.53894,46.32834],[11.53894,46.34513],[11.52423,46.34723],[11.50111,46.34723],[11.49901,46.32834],[11.48851,46.33044],[11.49271,46.32204],[11.41917,46.32414],[11.41707,46.25278],[11.35613,46.24858],[11.34773,46.25698],[11.34563,46.26747],[11.34143,46.26747],[11.33722,46.25068],[11.31201,46.24858],[11.30991,46.25278],[11.3015,46.25278],[11.2889,46.24019],[11.2889,46.2234],[11.25108,46.2234],[11.24898,46.2129],[11.16283,46.215],[11.16283,46.24858],[11.12711,46.24858],[11.13131,46.25278],[11.12291,46.25488],[11.12501,46.29895],[11.16283,46.29895],[11.16283,46.36821],[11.16703,46.36821],[11.16703,46.38081],[11.17543,46.3871],[11.17754,46.3997],[11.20485,46.3997],[11.20695,46.42068],[11.19014,46.42068],[11.19014,46.42698],[11.19435,46.42698],[11.19855,46.44167],[11.20485,46.44587],[11.20695,46.47315],[11.19014,46.47525],[11.18804,46.48365],[11.15232,46.47525],[11.08298,46.47525],[11.08088,46.43537],[11.04096,46.42068],[11.01154,46.42068],[10.99894,46.44587],[10.98843,46.44587],[10.98423,46.45217],[10.96952,46.45217],[10.96112,46.48365],[10.95691,46.48365],[10.95481,46.49414],[10.94851,46.49624],[10.94431,46.50673],[10.91069,46.49624],[10.90018,46.49624],[10.89808,46.51093],[10.85606,46.50254],[10.84135,46.54241],[10.86446,46.54661],[10.86236,46.55081],[10.76571,46.54031],[10.72158,46.55081],[10.59762,46.55291],[10.5619,46.54871],[10.53668,46.55291],[10.50096,46.54871],[10.48415,46.55501],[10.46314,46.55501],[10.47155,46.5676],[10.47365,46.59069],[10.47785,46.59069],[10.47785,46.61797],[10.46944,46.62636],[10.44843,46.63476],[10.42532,46.62846],[10.3938,46.63056],[10.3896,46.64525],[10.3812,46.64735],[10.3833,46.66414],[10.3791,46.66834],[10.3791,46.69353],[10.3854,46.72081],[10.3896,46.72081],[10.3938,46.7376],[10.41692,46.75229],[10.41692,46.78587],[10.42112,46.79847],[10.42532,46.79847],[10.42532,46.80686],[10.43373,46.81106],[10.43793,46.79007],[10.44423,46.78377],[10.44843,46.7439],[10.45264,46.7439],[10.45684,46.72711],[10.46104,46.72711],[10.46524,46.71032],[10.46944,46.71032],[10.47365,46.67254],[10.47995,46.67044],[10.48415,46.65575],[10.48836,46.65575],[10.48415,46.62846],[10.48836,46.62846],[10.48836,46.62217],[10.49886,46.62007],[10.52828,46.62427],[10.49886,46.63056],[10.49886,46.64525],[10.50516,46.64316],[10.49886,46.66204],[10.51777,46.65785],[10.58921,46.66204],[10.63123,46.65365],[10.79302,46.65575],[10.79723,46.65155],[10.88127,46.65155],[10.89178,46.65785],[10.9275,46.66414],[10.94431,46.67464],[10.98003,46.67464],[11.00104,46.68303],[11.02415,46.68303],[11.05147,46.69772],[11.12711,46.70822],[11.13971,46.71242],[11.14392,46.71871],[11.17543,46.72081],[11.19855,46.7334],[11.24898,46.7355],[11.25318,46.72291],[11.2952,46.72921],[11.30571,46.70822],[11.31831,46.70822],[11.33722,46.71871],[11.38555,46.72081],[11.43178,46.7376],[11.50952,46.7439],[11.54734,46.75649],[11.56835,46.75649],[11.58306,46.76698],[11.60617,46.76908],[11.61037,46.77538],[11.69862,46.79427],[11.71753,46.79427],[11.72174,46.79007],[11.73855,46.75859],[11.74905,46.75019],[11.76166,46.70192],[11.76586,46.70192],[11.78687,46.71661],[11.8331,46.72291],[11.86041,46.7376],[11.90874,46.7439],[11.92135,46.75229],[11.95286,46.75859],[11.95917,46.76488],[11.99489,46.77538],[12.00749,46.77538],[12.0096,46.77958],[12.03061,46.78168],[12.05792,46.79427],[12.09995,46.79847],[12.13566,46.81316],[12.15878,46.81316],[12.18609,46.82785],[12.21551,46.83205],[12.23442,46.84254]],[[11.97388,46.96637],[11.99489,46.96007],[11.99489,46.95587],[12.0096,46.95797],[12.0117,46.94748],[12.0159,46.94748],[12.0117,46.94118],[12.018,46.93908],[12.02851,46.92229],[12.00749,46.9118],[11.97388,46.9055],[11.95707,46.89501],[11.91714,46.88871],[11.85831,46.86982],[11.8394,46.86982],[11.80158,46.85303],[11.76166,46.84464],[11.74905,46.83415],[11.68181,46.81945],[11.67971,46.81526],[11.6545,46.81106],[11.64399,46.80476],[11.63769,46.80686],[11.63139,46.82155],[11.62508,46.82155],[11.62298,46.83205],[11.61037,46.84464],[11.61668,46.84884],[11.61458,46.85723],[11.61037,46.85723],[11.61668,46.86563],[11.64609,46.86563],[11.68602,46.88242],[11.69022,46.88871],[11.74905,46.89711],[11.75325,46.90341],[11.78057,46.9076],[11.80158,46.9202],[11.8457,46.92649],[11.87722,46.94118],[11.89613,46.94328],[11.92135,46.95797],[11.96757,46.96217],[11.97388,46.96637]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog/",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0",best:true},{id:"South-Tyrol-Orthofoto-2014-2015",name:"South Tyrol Orthofoto 2014/2015",type:"tms",template:"https://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:"https://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:"https://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:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano",description:"Topographical basemap of South Tyrol"},{id:"SPW2009",name:"SPW(allonie) 2009-2010 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2009_2010/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:"2010-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2012",name:"SPW(allonie) 2012-2013 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2012_2013/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:"2013-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2015",name:"SPW(allonie) 2015 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2015/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",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2016",name:"SPW(allonie) 2016 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2016/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:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW_ORTHO_LAST",name:"SPW(allonie) most recent aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_LAST/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",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW_PICC",name:"SPW(allonie) PICC numerical imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/TOPOGRAPHIE/PICC_VDIFF/MapServer/WmsServer?SERVICE=WMS&VERSION=1.1.1&FORMAT=image/png8&TRANSPARENT=FALSE&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&LAYERS=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",projection:"EPSG:3857",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPWrelief2014",name:"SPW(allonie) shaded relief",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/RELIEF/WALLONIE_MNT_2013_2014_HILLSHADE/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:"2014-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"ssb-sentrum",name:"SSB City Centres overlay",type:"wms",template:"https://ogc.ssb.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_193&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.ssb.no/arealsentrum/",terms_text:"© SSB",description:"Downtown areas with significant commercial and service activities.",icon:"http://www.fosterhjemsforening.no/wp-content/uploads/2015/06/SSB_logo1.png",overlay:true},{id:"ssb-tettsteder",name:"SSB Urban Areas overlay",type:"wms",template:"https://ogc.ssb.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_198&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.ssb.no/beftett",terms_text:"© SSB",description:"Human settlements of at least 200 people with less than 200 meters between households",icon:"http://www.fosterhjemsforening.no/wp-content/uploads/2015/06/SSB_logo1.png",overlay:true},{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.29431,46.92376],[7.29827,46.92747],[7.30616,46.93095],[7.30433,46.93623],[7.30686,46.94037],[7.32464,46.94328],[7.32845,46.94641],[7.34141,46.94608],[7.34385,46.94737],[7.34346,46.94879],[7.35136,46.94855],[7.35056,46.95021],[7.35309,46.95193],[7.3582,46.95118],[7.3685,46.95662],[7.37151,46.96073],[7.37503,46.95983],[7.37851,46.96147],[7.38062,46.96547],[7.38321,46.9663],[7.3938,46.96693],[7.40005,46.96918],[7.40829,46.96869],[7.42817,46.9738],[7.43271,46.97269],[7.43536,46.96843],[7.43785,46.96843],[7.44125,46.97679],[7.44569,46.97479],[7.44838,46.97564],[7.4477,46.97901],[7.44405,46.97807],[7.44127,46.97982],[7.45067,46.99015],[7.45221,46.98968],[7.45465,46.97782],[7.46804,46.97583],[7.47079,46.97],[7.47019,46.96741],[7.47816,46.97118],[7.48452,46.97016],[7.48613,46.9679],[7.48579,46.96468],[7.47847,46.9629],[7.48029,46.96068],[7.47893,46.95878],[7.47978,46.9566],[7.47701,46.95446],[7.48405,46.94999],[7.48339,46.9452],[7.49556,46.93962],[7.49351,46.93766],[7.4908,46.93876],[7.4895,46.93687],[7.47667,46.93695],[7.47811,46.93625],[7.4747,46.93392],[7.47535,46.93299],[7.4691,46.92924],[7.47077,46.9255],[7.45857,46.93484],[7.44764,46.93043],[7.43542,46.93497],[7.4338,46.93312],[7.43764,46.93074],[7.41469,46.93682],[7.41384,46.93157],[7.40708,46.93038],[7.40806,46.92563],[7.40213,46.9242],[7.40148,46.92119],[7.38757,46.93045],[7.38231,46.92728],[7.38002,46.92989],[7.38087,46.93241],[7.37487,46.93143],[7.37489,46.93271],[7.36807,46.93239],[7.36831,46.93043],[7.36041,46.92859],[7.36056,46.9272],[7.33878,46.92454],[7.33937,46.91967],[7.32746,46.91903],[7.32692,46.9236],[7.32437,46.92519],[7.30823,46.92229],[7.29431,46.92376]]],terms_text:"Orthophoto 2016, Vermessungsamt Stadt Bern",best:true},{id:"Bern-2012",name:"Stadt Bern 10cm/25cm (2012)",type:"tms",template:"https://mapproxy.osm.ch/tiles/bern2012/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",scaleExtent:[14,19],polygon:[[[7.3807,47.00952],[7.38073,47.02301],[7.43853,47.02303],[7.43865,47.01408],[7.45174,47.014],[7.45172,47.00503],[7.54111,47.005],[7.54111,46.99873],[7.54378,46.99871],[7.54375,46.98696],[7.55682,46.987],[7.55685,46.96003],[7.51744,46.96001],[7.51744,46.95108],[7.53051,46.95106],[7.53051,46.92407],[7.51741,46.92405],[7.51738,46.91505],[7.53042,46.91507],[7.53048,46.9061],[7.54358,46.90602],[7.54358,46.87905],[7.55659,46.87903],[7.55662,46.8611],[7.54349,46.86104],[7.5434,46.85212],[7.49095,46.85212],[7.49107,46.87907],[7.47794,46.87909],[7.47797,46.89707],[7.45168,46.89713],[7.45171,46.88808],[7.43855,46.88814],[7.43858,46.87015],[7.41233,46.87015],[7.41236,46.87907],[7.39917,46.87911],[7.3992,46.86108],[7.38613,46.86114],[7.3861,46.85218],[7.373,46.85216],[7.37303,46.86112],[7.34677,46.8611],[7.3468,46.88808],[7.25488,46.88796],[7.25485,46.90596],[7.24172,46.90592],[7.24169,46.91497],[7.22856,46.91493],[7.22833,46.96887],[7.24146,46.96891],[7.24149,46.98688],[7.26769,46.98694],[7.26777,46.99593],[7.28078,46.99595],[7.2809,47.0094],[7.3807,47.00952]]],terms_text:"Orthophoto 2012, Vermessungsamt Stadt Bern"},{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",scaleExtent:[0,21],polygon:[[[8.68,47.32],[8.74,47.32],[8.74,47.365],[8.68,47.365],[8.68,47.32]]],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",scaleExtent:[0,21],polygon:[[[8.44624,47.44143],[8.63178,47.43968],[8.62895,47.31377],[8.44381,47.31555],[8.44624,47.44143]]],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",scaleExtent:[0,21],polygon:[[[8.56681,47.34713],[8.56665,47.34706],[8.56563,47.34684],[8.56575,47.34666],[8.56509,47.34645],[8.54207,47.33502],[8.54073,47.33376],[8.5403,47.33396],[8.54019,47.33372],[8.54042,47.33358],[8.5388,47.33208],[8.53642,47.33076],[8.53622,47.33018],[8.53345,47.32992],[8.5318,47.3295],[8.53145,47.32846],[8.53102,47.32789],[8.52974,47.32777],[8.52969,47.32687],[8.52899,47.32698],[8.52813,47.32685],[8.52802,47.32635],[8.52755,47.32639],[8.52762,47.32616],[8.52579,47.32619],[8.52563,47.32575],[8.52426,47.32608],[8.5242,47.32486],[8.52372,47.32416],[8.52304,47.32433],[8.52193,47.32436],[8.52194,47.32394],[8.51932,47.32401],[8.51868,47.32386],[8.51768,47.3232],[8.51642,47.32308],[8.5156,47.32315],[8.51472,47.32272],[8.51295,47.3229],[8.51162,47.32222],[8.50957,47.32202],[8.5095,47.32165],[8.50788,47.32203],[8.50735,47.32173],[8.50529,47.32144],[8.50476,47.32121],[8.5043,47.32074],[8.50317,47.32022],[8.50241,47.32053],[8.50227,47.32082],[8.50152,47.32129],[8.50102,47.32198],[8.50095,47.32259],[8.5006,47.32278],[8.50078,47.3237],[8.50066,47.32451],[8.50098,47.32595],[8.5015,47.3265],[8.50159,47.32732],[8.50188,47.32765],[8.50132,47.32883],[8.5014,47.32903],[8.50069,47.32979],[8.50087,47.33053],[8.50063,47.3311],[8.50112,47.33183],[8.50075,47.33202],[8.50078,47.33224],[8.50106,47.3326],[8.50191,47.33303],[8.5022,47.33364],[8.50177,47.33412],[8.50152,47.33504],[8.50199,47.33666],[8.50161,47.33728],[8.49877,47.33968],[8.49808,47.34169],[8.49702,47.34247],[8.49709,47.34326],[8.49798,47.34365],[8.4981,47.34387],[8.49817,47.34453],[8.49773,47.34521],[8.49636,47.34648],[8.4951,47.34691],[8.49467,47.3476],[8.49285,47.34828],[8.49206,47.3495],[8.49145,47.34964],[8.49128,47.34983],[8.49089,47.35067],[8.49,47.35056],[8.48813,47.352],[8.48691,47.35203],[8.4868,47.3522],[8.48728,47.35311],[8.4871,47.3534],[8.48501,47.35469],[8.48463,47.35536],[8.48463,47.3567],[8.48426,47.35737],[8.48321,47.35814],[8.48272,47.35907],[8.48205,47.35954],[8.47879,47.36078],[8.47698,47.36029],[8.47365,47.36081],[8.47275,47.36079],[8.47169,47.36132],[8.47053,47.36166],[8.46951,47.36438],[8.4664,47.36574],[8.46583,47.3661],[8.46545,47.36664],[8.46485,47.36681],[8.46427,47.36728],[8.46418,47.36838],[8.4649,47.36897],[8.46482,47.36911],[8.46938,47.37136],[8.47042,47.3726],[8.47022,47.37395],[8.46868,47.37382],[8.46761,47.37357],[8.46544,47.37444],[8.46288,47.37603],[8.45995,47.3775],[8.45638,47.37801],[8.45116,47.37817],[8.45047,47.37836],[8.44847,47.37967],[8.44801,47.38025],[8.45174,47.38062],[8.45371,47.38027],[8.45614,47.38072],[8.45669,47.38094],[8.45673,47.38244],[8.45745,47.38222],[8.45843,47.38231],[8.45841,47.38263],[8.45745,47.38325],[8.45767,47.3834],[8.45756,47.38371],[8.45807,47.38388],[8.46004,47.38594],[8.46088,47.38704],[8.46121,47.38795],[8.46104,47.38803],[8.46381,47.39053],[8.46518,47.39132],[8.46556,47.39113],[8.46618,47.39113],[8.46727,47.39065],[8.46697,47.39131],[8.46739,47.3929],[8.4671,47.39334],[8.46607,47.39378],[8.4651,47.39453],[8.46484,47.39481],[8.46488,47.39508],[8.46535,47.39492],[8.46854,47.39461],[8.47018,47.39401],[8.47066,47.39439],[8.47191,47.39388],[8.47208,47.39408],[8.47152,47.3943],[8.47151,47.3949],[8.4721,47.39517],[8.47301,47.39506],[8.47349,47.396],[8.46516,47.39829],[8.46568,47.39922],[8.46759,47.39873],[8.46806,47.39957],[8.46615,47.40006],[8.4677,47.403],[8.4699,47.40298],[8.47551,47.40381],[8.47815,47.40387],[8.47819,47.40508],[8.47738,47.40517],[8.47705,47.40619],[8.47729,47.40914],[8.47703,47.40935],[8.47543,47.40971],[8.47583,47.41077],[8.47605,47.41072],[8.47628,47.41102],[8.47665,47.41097],[8.47725,47.41194],[8.47488,47.41241],[8.47394,47.41222],[8.47303,47.41146],[8.47268,47.41058],[8.47101,47.41094],[8.47113,47.41137],[8.47085,47.41167],[8.47044,47.41159],[8.47031,47.41253],[8.46876,47.41225],[8.46801,47.41334],[8.46863,47.41363],[8.46857,47.41408],[8.46955,47.41484],[8.47007,47.41557],[8.46913,47.41649],[8.46913,47.41693],[8.46962,47.41752],[8.47158,47.41763],[8.4772,47.41974],[8.47688,47.42016],[8.47783,47.42212],[8.47895,47.42172],[8.47937,47.42113],[8.47972,47.42141],[8.48131,47.42134],[8.48171,47.423],[8.48294,47.42266],[8.48292,47.42222],[8.48609,47.42155],[8.48658,47.42164],[8.48683,47.42186],[8.48796,47.42201],[8.48851,47.42271],[8.49019,47.42234],[8.491,47.4239],[8.49006,47.42435],[8.49007,47.42532],[8.49027,47.42536],[8.49017,47.42578],[8.48552,47.42712],[8.48481,47.42784],[8.48466,47.42873],[8.48437,47.42896],[8.48445,47.42979],[8.48579,47.43103],[8.49562,47.43281],[8.50027,47.43442],[8.50207,47.43467],[8.50364,47.43402],[8.50997,47.43213],[8.51155,47.43116],[8.51274,47.43085],[8.516,47.43174],[8.51628,47.43175],[8.51681,47.43133],[8.51872,47.4319],[8.51979,47.43167],[8.52463,47.43126],[8.52549,47.43316],[8.5303,47.43207],[8.53063,47.43266],[8.533,47.43228],[8.53374,47.43251],[8.53467,47.432],[8.53521,47.43188],[8.53606,47.43187],[8.5374,47.4314],[8.53964,47.43126],[8.5401,47.4311],[8.54033,47.43186],[8.54363,47.43143],[8.54284,47.43289],[8.54311,47.43288],[8.54451,47.4325],[8.54459,47.43262],[8.54607,47.43207],[8.54858,47.43142],[8.55009,47.43128],[8.55098,47.43102],[8.55199,47.43104],[8.55535,47.43066],[8.5561,47.42803],[8.55684,47.42624],[8.55783,47.42554],[8.55697,47.4249],[8.55736,47.42472],[8.5569,47.42424],[8.55723,47.4241],[8.55419,47.4208],[8.56082,47.41817],[8.56129,47.41829],[8.56235,47.41632],[8.56282,47.41643],[8.56323,47.41565],[8.56622,47.41632],[8.56692,47.41629],[8.56735,47.41649],[8.5678,47.41684],[8.56875,47.41855],[8.56903,47.41871],[8.5696,47.41868],[8.56944,47.41926],[8.57223,47.41893],[8.57367,47.42004],[8.57378,47.4178],[8.57342,47.41711],[8.57386,47.41438],[8.57384,47.41324],[8.57331,47.41257],[8.5726,47.41207],[8.573,47.41144],[8.58806,47.40797],[8.58894,47.40756],[8.59312,47.40704],[8.59728,47.40631],[8.59722,47.406],[8.59608,47.40612],[8.59378,47.40222],[8.59622,47.40154],[8.5948,47.39918],[8.59725,47.39851],[8.59644,47.39715],[8.59637,47.39663],[8.59623,47.39646],[8.59453,47.39712],[8.59392,47.39647],[8.59335,47.39614],[8.59208,47.39691],[8.59172,47.39681],[8.59148,47.397],[8.58828,47.3958],[8.58905,47.39501],[8.58995,47.39478],[8.58818,47.39351],[8.58752,47.39321],[8.58747,47.39297],[8.58619,47.3928],[8.58442,47.39195],[8.58369,47.39008],[8.58305,47.38905],[8.58316,47.38831],[8.58437,47.38834],[8.58432,47.38894],[8.58492,47.39011],[8.58528,47.3904],[8.58696,47.39017],[8.5869,47.38977],[8.58765,47.38905],[8.58698,47.38793],[8.59181,47.38638],[8.59307,47.38565],[8.59299,47.38523],[8.59354,47.38522],[8.59274,47.38417],[8.59082,47.38476],[8.59013,47.38381],[8.58966,47.384],[8.58956,47.38373],[8.59217,47.38311],[8.59151,47.38244],[8.59384,47.38081],[8.59407,47.38061],[8.59406,47.38029],[8.59556,47.3796],[8.59574,47.37927],[8.59721,47.37849],[8.59674,47.37782],[8.59702,47.37716],[8.5976,47.37661],[8.59705,47.37589],[8.59778,47.37557],[8.59828,47.3751],[8.59855,47.37473],[8.59813,47.37447],[8.6002,47.37331],[8.60053,47.3734],[8.60096,47.37312],[8.60194,47.37198],[8.60192,47.37171],[8.60324,47.37131],[8.60607,47.36871],[8.60745,47.36816],[8.60812,47.36761],[8.61067,47.3673],[8.612,47.36684],[8.61308,47.36776],[8.61344,47.36779],[8.61366,47.36802],[8.61549,47.3677],[8.61645,47.36841],[8.61665,47.36828],[8.61764,47.36681],[8.61709,47.36626],[8.61682,47.36535],[8.61565,47.36466],[8.61495,47.36458],[8.61557,47.36342],[8.61566,47.36273],[8.61482,47.36263],[8.6147,47.36151],[8.61929,47.36121],[8.61996,47.36104],[8.62174,47.36007],[8.62257,47.35983],[8.62187,47.35946],[8.62133,47.35746],[8.62351,47.35592],[8.62352,47.35561],[8.62544,47.35466],[8.62416,47.35397],[8.62245,47.35364],[8.62209,47.35334],[8.61989,47.35367],[8.61976,47.35385],[8.61844,47.35382],[8.61839,47.35425],[8.61708,47.35414],[8.61569,47.35442],[8.6152,47.3541],[8.61386,47.35402],[8.61255,47.35437],[8.61156,47.35394],[8.61107,47.35352],[8.61042,47.35337],[8.60946,47.35352],[8.60776,47.35333],[8.60607,47.35363],[8.60506,47.35359],[8.6038,47.353],[8.60305,47.35219],[8.6032,47.35207],[8.60294,47.35175],[8.603,47.35076],[8.60262,47.35073],[8.6016,47.35073],[8.60104,47.35105],[8.60026,47.35112],[8.5996,47.35145],[8.59859,47.35145],[8.59824,47.35165],[8.59689,47.3514],[8.59666,47.35161],[8.59596,47.35169],[8.59564,47.3519],[8.59494,47.35161],[8.59454,47.35175],[8.5939,47.35161],[8.5935,47.35211],[8.59229,47.3523],[8.59189,47.35278],[8.59118,47.35321],[8.59047,47.35271],[8.59014,47.35286],[8.58846,47.35289],[8.58797,47.35307],[8.58748,47.35267],[8.5863,47.35288],[8.58591,47.35231],[8.5853,47.35201],[8.58462,47.35141],[8.58417,47.35129],[8.58438,47.35116],[8.58398,47.35085],[8.58348,47.35104],[8.58335,47.35087],[8.58221,47.35101],[8.58246,47.35062],[8.57851,47.34873],[8.57827,47.34888],[8.57786,47.34865],[8.57686,47.34878],[8.57688,47.34859],[8.57625,47.34839],[8.57308,47.34751],[8.573,47.34765],[8.57214,47.34744],[8.57163,47.34728],[8.5717,47.34712],[8.57029,47.34672],[8.56968,47.3476],[8.56741,47.34674],[8.56681,47.34713]]],terms_text:"Stadt Zürich Open Government Data"},{id:"stamen-terrain-background",name:"Stamen Terrain",type:"tms",template:"https://stamen-tiles-{switch:a,b,c,d}.a.ssl.fastly.net/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. Data by OpenStreetMap, under ODbL",icon:"https://stamen.com/wp-content/uploads/2016/07/stamen_compass_rose_small-01.png"},{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.75248,51.08219],[-0.75952,51.08563],[-0.80143,51.14579],[-0.83989,51.14407],[-0.83577,51.18024],[-0.85295,51.20113],[-0.85227,51.20962],[-0.84952,51.2179],[-0.82669,51.24037],[-0.8121,51.24692],[-0.77365,51.24596],[-0.75442,51.23811],[-0.75408,51.23392],[-0.74464,51.23338],[-0.74307,51.28472],[-0.7515,51.30695],[-0.76644,51.3121],[-0.78206,51.32702],[-0.78154,51.33881],[-0.73743,51.37205],[-0.71923,51.37697],[-0.67958,51.3848],[-0.68078,51.39015],[-0.65314,51.39176],[-0.63014,51.39058],[-0.62911,51.39701],[-0.62344,51.39776],[-0.61314,51.42956],[-0.60025,51.44591],[-0.58671,51.44454],[-0.57624,51.4532],[-0.56268,51.45235],[-0.54774,51.447],[-0.53727,51.44486],[-0.5371,51.45267],[-0.54396,51.45459],[-0.54053,51.46989],[-0.53092,51.47609],[-0.50912,51.47448],[-0.5086,51.46957],[-0.49006,51.46828],[-0.45264,51.46069],[-0.44869,51.44293],[-0.44148,51.44186],[-0.44183,51.43694],[-0.41127,51.43801],[-0.40149,51.42795],[-0.38071,51.42624],[-0.38054,51.41617],[-0.34913,51.41382],[-0.3275,51.40375],[-0.30398,51.39904],[-0.30192,51.37547],[-0.30948,51.36969],[-0.31119,51.35297],[-0.29557,51.35415],[-0.29231,51.36733],[-0.2851,51.36808],[-0.27875,51.37719],[-0.26553,51.38372],[-0.24115,51.3848],[-0.21231,51.36283],[-0.21077,51.34986],[-0.19086,51.35029],[-0.15429,51.33388],[-0.14966,51.30577],[-0.10743,51.29665],[-0.08872,51.30996],[-0.08786,51.32208],[-0.0652,51.32154],[-0.06417,51.32648],[-0.05198,51.32637],[-0.05284,51.33463],[-0.03308,51.34309],[0.00192,51.33763],[0.01188,51.3282],[0.01393,51.29944],[0.02029,51.29944],[0.02406,51.30727],[0.03316,51.30867],[0.04552,51.30545],[0.05239,51.28774],[0.06166,51.25778],[0.06406,51.24155],[0.04621,51.21263],[0.04071,51.21091],[0.04483,51.19898],[0.04947,51.19973],[0.05582,51.19446],[0.06114,51.17907],[0.06234,51.15421],[0.05771,51.14171],[0.02046,51.13654],[-0.0446,51.13364],[-0.1567,51.13525],[-0.15721,51.129],[-0.22879,51.11834],[-0.24733,51.11834],[-0.25008,51.12114],[-0.29935,51.1137],[-0.32218,51.11198],[-0.32235,51.10584],[-0.3596,51.10196],[-0.35891,51.11133],[-0.38638,51.11176],[-0.3869,51.10625],[-0.4281,51.09472],[-0.48568,51.09516],[-0.48713,51.08723],[-0.52974,51.08654],[-0.53023,51.07899],[-0.61046,51.07655],[-0.60997,51.08067],[-0.6578,51.07922],[-0.65828,51.07434],[-0.68365,51.07075],[-0.6998,51.07083],[-0.72966,51.07449],[-0.75248,51.08219]]]},{id:"Swietochlowice-2008",name:"Świętochłowice: Orthophotomap 2008 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2008&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",scaleExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Swietochlowice-2009",name:"Świętochłowice: Orthophotomap 2009 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2009&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2009-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",scaleExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Swietochlowice-2012",name:"Świętochłowice: Orthophotomap 2012 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2012&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",scaleExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{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.14599,46.22811],[20.13323,46.22904],[20.12584,46.22987],[20.12233,46.23099],[20.12085,46.23175],[20.11897,46.23351],[20.11312,46.24136],[20.11203,46.2433],[20.11157,46.245],[20.11119,46.24709],[20.11129,46.24877],[20.11159,46.25097],[20.11222,46.2528],[20.11299,46.25427],[20.11354,46.25535],[20.11477,46.2568],[20.13523,46.27685],[20.13664,46.27751],[20.13789,46.27803],[20.13939,46.27835],[20.14088,46.27846],[20.16115,46.27816],[20.16211,46.27816],[20.16359,46.2777],[20.16618,46.27615],[20.16878,46.27386],[20.16961,46.27144],[20.16959,46.27045],[20.17009,46.27044],[20.17399,46.26433],[20.17662,46.25829],[20.1948,46.25492],[20.18587,46.24481],[20.18466,46.24531],[20.17804,46.23831],[20.17818,46.23771],[20.17953,46.2371],[20.17257,46.23002],[20.16983,46.23504],[20.16877,46.23629],[20.16703,46.23785],[20.16594,46.23873],[20.16544,46.239],[20.16548,46.239],[20.16352,46.24014],[20.16021,46.2412],[20.15927,46.24153],[20.15927,46.24158],[20.15835,46.24185],[20.15495,46.24229],[20.15108,46.23515],[20.14938,46.23246],[20.14599,46.22811]]],terms_url:"http://www.geo.u-szeged.hu",terms_text:"SZTE TFGT - University of Szeged",best:true,description:"Inner part of Szeged"},{id:"TW_NLSC_WMS_EMAP6",name:"Taiwan e-Map Open Data",type:"tms",template:"https://wmts.nlsc.gov.tw/wmts/EMAP6_OPENDATA/default/GoogleMapsCompatible/{zoom}/{y}/{x}",scaleExtent:[0,15],polygon:[[[120.45706,26.39706],[120.44256,26.3708],[120.44713,26.35315],[120.4673,26.34058],[120.49787,26.33409],[120.5141,26.34016],[120.53412,26.36416],[120.5297,26.38421],[120.49567,26.40158],[120.45706,26.39706]],[[119.90072,25.98586],[119.89601,25.96489],[119.91313,25.94704],[119.95035,25.92785],[119.99056,25.92606],[120.01984,25.93633],[120.02778,25.95574],[120.02753,25.98452],[119.99899,26.00103],[119.94043,26.00281],[119.90072,25.98586]],[[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.6855,20.85476],[116.63091,20.81496],[116.59417,20.76008],[116.57972,20.69675],[116.58931,20.63259],[116.62177,20.57534],[116.67319,20.53192],[116.73737,20.50758],[116.80657,20.50527],[116.87244,20.52526],[116.92703,20.56514],[116.96377,20.62008],[116.97822,20.68345],[116.96863,20.74759],[116.93617,20.80477],[116.88475,20.84811],[116.82057,20.8724],[116.75137,20.87471],[116.6855,20.85476]],[[118.22615,24.45633],[118.29364,24.45385],[118.28515,24.4751],[118.30974,24.49168],[118.37677,24.47293],[118.41009,24.53323],[118.4479,24.52841],[118.47464,24.45993],[118.51299,24.43155],[118.50658,24.42023],[118.48116,24.43324],[118.46106,24.40892],[118.42615,24.39704],[118.39701,24.42842],[118.37656,24.42584],[118.33976,24.38146],[118.30319,24.37058],[118.25742,24.41392],[118.13813,24.37248],[118.16173,24.40224],[118.20942,24.41396],[118.18958,24.43522],[118.21763,24.43021],[118.22615,24.45633]],[[120.22345,26.30045],[120.25508,26.31004],[120.26989,26.33687],[120.25919,26.36522],[120.22925,26.37848],[120.19762,26.3689],[120.18282,26.34207],[120.19352,26.31372],[120.22345,26.30045]],[[119.43745,25.00475],[119.4342,24.98862],[119.45419,24.97226],[119.48274,24.97184],[119.48984,24.99379],[119.47159,25.00692],[119.43745,25.00475]],[[119.88699,26.18038],[119.89323,26.12031],[119.92851,26.10802],[119.97794,26.12236],[120.03668,26.15173],[120.10981,26.21349],[120.11927,26.27137],[120.06292,26.31726],[119.99237,26.31649],[119.94677,26.28988],[119.90204,26.24398],[119.88699,26.18038]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TW_NLSC_WMS_LANDSECT",name:"Taiwan Land-Section Data",type:"wms",template:"https://maps.nlsc.gov.tw/S_Maps/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LANDSECT&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[120.45706,26.39706],[120.44256,26.3708],[120.44713,26.35315],[120.4673,26.34058],[120.49787,26.33409],[120.5141,26.34016],[120.53412,26.36416],[120.5297,26.38421],[120.49567,26.40158],[120.45706,26.39706]],[[119.90072,25.98586],[119.89601,25.96489],[119.91313,25.94704],[119.95035,25.92785],[119.99056,25.92606],[120.01984,25.93633],[120.02778,25.95574],[120.02753,25.98452],[119.99899,26.00103],[119.94043,26.00281],[119.90072,25.98586]],[[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.6855,20.85476],[116.63091,20.81496],[116.59417,20.76008],[116.57972,20.69675],[116.58931,20.63259],[116.62177,20.57534],[116.67319,20.53192],[116.73737,20.50758],[116.80657,20.50527],[116.87244,20.52526],[116.92703,20.56514],[116.96377,20.62008],[116.97822,20.68345],[116.96863,20.74759],[116.93617,20.80477],[116.88475,20.84811],[116.82057,20.8724],[116.75137,20.87471],[116.6855,20.85476]],[[118.22615,24.45633],[118.29364,24.45385],[118.28515,24.4751],[118.30974,24.49168],[118.37677,24.47293],[118.41009,24.53323],[118.4479,24.52841],[118.47464,24.45993],[118.51299,24.43155],[118.50658,24.42023],[118.48116,24.43324],[118.46106,24.40892],[118.42615,24.39704],[118.39701,24.42842],[118.37656,24.42584],[118.33976,24.38146],[118.30319,24.37058],[118.25742,24.41392],[118.13813,24.37248],[118.16173,24.40224],[118.20942,24.41396],[118.18958,24.43522],[118.21763,24.43021],[118.22615,24.45633]],[[120.22345,26.30045],[120.25508,26.31004],[120.26989,26.33687],[120.25919,26.36522],[120.22925,26.37848],[120.19762,26.3689],[120.18282,26.34207],[120.19352,26.31372],[120.22345,26.30045]],[[119.43745,25.00475],[119.4342,24.98862],[119.45419,24.97226],[119.48274,24.97184],[119.48984,24.99379],[119.47159,25.00692],[119.43745,25.00475]],[[119.88699,26.18038],[119.89323,26.12031],[119.92851,26.10802],[119.97794,26.12236],[120.03668,26.15173],[120.10981,26.21349],[120.11927,26.27137],[120.06292,26.31726],[119.99237,26.31649],[119.94677,26.28988],[119.90204,26.24398],[119.88699,26.18038]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TW_NLSC_WMS_Village",name:"Taiwan Village Boundaries",type:"wms",template:"https://maps.nlsc.gov.tw/S_Maps/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Village&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[120.45706,26.39706],[120.44256,26.3708],[120.44713,26.35315],[120.4673,26.34058],[120.49787,26.33409],[120.5141,26.34016],[120.53412,26.36416],[120.5297,26.38421],[120.49567,26.40158],[120.45706,26.39706]],[[119.90072,25.98586],[119.89601,25.96489],[119.91313,25.94704],[119.95035,25.92785],[119.99056,25.92606],[120.01984,25.93633],[120.02778,25.95574],[120.02753,25.98452],[119.99899,26.00103],[119.94043,26.00281],[119.90072,25.98586]],[[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.6855,20.85476],[116.63091,20.81496],[116.59417,20.76008],[116.57972,20.69675],[116.58931,20.63259],[116.62177,20.57534],[116.67319,20.53192],[116.73737,20.50758],[116.80657,20.50527],[116.87244,20.52526],[116.92703,20.56514],[116.96377,20.62008],[116.97822,20.68345],[116.96863,20.74759],[116.93617,20.80477],[116.88475,20.84811],[116.82057,20.8724],[116.75137,20.87471],[116.6855,20.85476]],[[118.22615,24.45633],[118.29364,24.45385],[118.28515,24.4751],[118.30974,24.49168],[118.37677,24.47293],[118.41009,24.53323],[118.4479,24.52841],[118.47464,24.45993],[118.51299,24.43155],[118.50658,24.42023],[118.48116,24.43324],[118.46106,24.40892],[118.42615,24.39704],[118.39701,24.42842],[118.37656,24.42584],[118.33976,24.38146],[118.30319,24.37058],[118.25742,24.41392],[118.13813,24.37248],[118.16173,24.40224],[118.20942,24.41396],[118.18958,24.43522],[118.21763,24.43021],[118.22615,24.45633]],[[120.22345,26.30045],[120.25508,26.31004],[120.26989,26.33687],[120.25919,26.36522],[120.22925,26.37848],[120.19762,26.3689],[120.18282,26.34207],[120.19352,26.31372],[120.22345,26.30045]],[[119.43745,25.00475],[119.4342,24.98862],[119.45419,24.97226],[119.48274,24.97184],[119.48984,24.99379],[119.47159,25.00692],[119.43745,25.00475]],[[119.88699,26.18038],[119.89323,26.12031],[119.92851,26.10802],[119.97794,26.12236],[120.03668,26.15173],[120.10981,26.21349],[120.11927,26.27137],[120.06292,26.31726],[119.99237,26.31649],[119.94677,26.28988],[119.90204,26.24398],[119.88699,26.18038]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TEClines",name:"TEC bus lines",type:"wms",template:"https://geodata.tec-wl.be/arcgis/rest/services/Lignes/MapServer/export?f=image&format=png8&transparent=True&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}",projection:"EPSG:3857",polygon:[[[5.40236,49.50688],[5.81984,49.54253],[6.1714,49.62089],[5.85829,49.68846],[5.7704,49.85343],[5.894,50.11832],[6.15492,50.13593],[6.39662,50.36775],[6.28126,50.46576],[6.11372,50.7933],[5.72646,50.77941],[5.70998,50.85229],[5.61385,50.80024],[5.46278,50.79677],[5.21284,50.70119],[4.94917,50.80371],[4.75966,50.80718],[4.72121,50.88869],[4.60585,50.77941],[4.48775,50.85749],[4.36964,50.85056],[4.15266,50.72728],[3.59236,50.76725],[3.29848,50.76377],[3.04579,50.80024],[2.86177,50.72728],[2.89748,50.68553],[3.0815,50.76725],[3.19685,50.68031],[3.28749,50.52691],[3.67201,50.47625],[3.68574,50.31692],[3.99062,50.27305],[4.14992,50.17465],[4.24055,50.08661],[4.15266,49.99842],[4.18562,49.96486],[4.55366,49.94542],[4.69923,50.03372],[4.81184,50.0919],[4.84206,50.01607],[4.86677,49.90475],[4.85854,49.80382],[5.08925,49.7648],[5.34743,49.60843],[5.40236,49.50688]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/TECbusstops.png",overlay:true},{id:"TECstops",name:"TEC bus stops",type:"wms",template:"https://geodata.tec-wl.be/arcgis/rest/services/Poteaux/MapServer/export?f=image&format=png8&transparent=True&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}",projection:"EPSG:3857",polygon:[[[5.40236,49.50688],[5.81984,49.54253],[6.1714,49.62089],[5.85829,49.68846],[5.7704,49.85343],[5.894,50.11832],[6.15492,50.13593],[6.39662,50.36775],[6.28126,50.46576],[6.11372,50.7933],[5.72646,50.77941],[5.70998,50.85229],[5.61385,50.80024],[5.46278,50.79677],[5.21284,50.70119],[4.94917,50.80371],[4.75966,50.80718],[4.72121,50.88869],[4.60585,50.77941],[4.48775,50.85749],[4.36964,50.85056],[4.15266,50.72728],[3.59236,50.76725],[3.29848,50.76377],[3.04579,50.80024],[2.86177,50.72728],[2.89748,50.68553],[3.0815,50.76725],[3.19685,50.68031],[3.28749,50.52691],[3.67201,50.47625],[3.68574,50.31692],[3.99062,50.27305],[4.14992,50.17465],[4.24055,50.08661],[4.15266,49.99842],[4.18562,49.96486],[4.55366,49.94542],[4.69923,50.03372],[4.81184,50.0919],[4.84206,50.01607],[4.86677,49.90475],[4.85854,49.80382],[5.08925,49.7648],[5.34743,49.60843],[5.40236,49.50688]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/TECbusstops.png",overlay:true},{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.31164,-9.95468],[-36.31158,-9.94382],[-36.31145,-9.93197],[-36.31127,-9.92436],[-36.31123,-9.91848],[-36.31119,-9.91637],[-36.31141,-9.91324],[-36.3111,-9.90922],[-36.31108,-9.90318],[-36.31099,-9.89379],[-36.31089,-9.8842],[-36.31078,-9.87412],[-36.31068,-9.86457],[-36.3318,-9.86432],[-36.34001,-9.86437],[-36.3478,-9.86425],[-36.35917,-9.8642],[-36.37047,-9.86404],[-36.38448,-9.86386],[-36.40164,-9.86364],[-36.40221,-9.9225],[-36.40249,-9.93177],[-36.40259,-9.94183],[-36.40248,-9.94804],[-36.40266,-9.9537],[-36.3855,-9.95384],[-36.38283,-9.95392],[-36.37096,-9.95399],[-36.36232,-9.95423],[-36.34747,-9.95422],[-36.33287,-9.95446],[-36.3291,-9.95456],[-36.32089,-9.95459],[-36.31164,-9.95468]]],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.99854,34.56018],[-95.55655,33.99257],[-93.89679,33.61039],[-93.98468,32.04103],[-93.41614,31.02505],[-93.74531,29.57268],[-96.50492,28.23159],[-97.36942,26.95467],[-97.04867,25.8053],[-99.07342,26.32559],[-100.76599,29.02532],[-102.33154,29.84339],[-103.13355,28.88112],[-104.28879,29.28831],[-104.72698,29.94816],[-104.72697,30.23535],[-106.5345,31.78457],[-106.75767,31.78457],[-106.75766,32.04386],[-106.61848,32.04385],[-103.11949,32.04376],[-103.09544,36.50046],[-103.05798,36.54269],[-100.00042,36.54222],[-99.99854,34.56018]]],terms_url:"https://tnris.org/maps-and-data/online-mapping-services",terms_text:"Texas Natural Resources Information System"},{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.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-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:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/TIGER2017RoadsOverlay.png",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.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif",overlay:true},{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.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",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.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",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.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",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.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",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.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,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:"https://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",endDate:"2013-09-01T00:00:00.000Z",startDate:"2013-09-01T00:00:00.000Z",polygon:[[[18.91731,47.40854],[18.91691,47.40849],[18.91606,47.40885],[18.91565,47.40905],[18.91458,47.40938],[18.91385,47.4097],[18.91376,47.40976],[18.91314,47.41038],[18.9122,47.41098],[18.91041,47.41175],[18.90932,47.41258],[18.90841,47.41317],[18.90676,47.41443],[18.90481,47.41568],[18.90362,47.41597],[18.90317,47.41616],[18.90062,47.41742],[18.90042,47.41755],[18.89968,47.41797],[18.89888,47.41818],[18.89814,47.41835],[18.89752,47.41855],[18.89666,47.41901],[18.8958,47.41954],[18.89421,47.4205],[18.89055,47.42209],[18.88743,47.42332],[18.88554,47.42424],[18.88436,47.42476],[18.88189,47.42553],[18.88085,47.42598],[18.8801,47.42629],[18.87956,47.42649],[18.87741,47.42738],[18.87602,47.42789],[18.87508,47.42836],[18.87281,47.42934],[18.87164,47.42968],[18.8714,47.43001],[18.87259,47.4323],[18.87273,47.43278],[18.87274,47.43324],[18.87244,47.43482],[18.87206,47.43526],[18.86891,47.43712],[18.86561,47.4375],[18.86466,47.43774],[18.86404,47.43809],[18.86378,47.43791],[18.8634,47.43784],[18.863,47.43798],[18.85195,47.44715],[18.85217,47.44847],[18.8593,47.45387],[18.85839,47.45512],[18.85777,47.45568],[18.85718,47.456],[18.8572,47.45636],[18.86015,47.45839],[18.86194,47.4595],[18.86099,47.46071],[18.85979,47.46201],[18.85929,47.46236],[18.85859,47.46272],[18.85713,47.46333],[18.85634,47.4636],[18.85628,47.46403],[18.85719,47.46528],[18.85663,47.46551],[18.85653,47.4658],[18.85693,47.46656],[18.85836,47.46953],[18.85826,47.4698],[18.85827,47.46991],[18.85838,47.47019],[18.85844,47.47027],[18.85852,47.47033],[18.85862,47.47036],[18.85873,47.47038],[18.8589,47.47036],[18.86146,47.46973],[18.86277,47.46929],[18.86617,47.46785],[18.86794,47.46656],[18.86997,47.46524],[18.8708,47.46457],[18.87268,47.46333],[18.87536,47.46113],[18.87687,47.45927],[18.88943,47.45987],[18.89024,47.45988],[18.90371,47.45534],[18.90427,47.4552],[18.90493,47.45506],[18.90542,47.4551],[18.90567,47.45505],[18.90629,47.45477],[18.90648,47.45453],[18.9066,47.45447],[18.90678,47.45439],[18.90811,47.45399],[18.90837,47.45395],[18.9089,47.45384],[18.90954,47.4537],[18.91326,47.45317],[18.91353,47.4532],[18.91372,47.45317],[18.91386,47.45307],[18.91431,47.45294],[18.91598,47.453],[18.91807,47.45317],[18.91846,47.453],[18.91903,47.45161],[18.92173,47.4508],[18.92246,47.45069],[18.92418,47.45025],[18.92756,47.44989],[18.92972,47.44951],[18.93221,47.44922],[18.93347,47.44932],[18.93921,47.44935],[18.94229,47.44903],[18.94549,47.4489],[18.94826,47.4487],[18.95003,47.44824],[18.9547,47.44722],[18.95749,47.44692],[18.95802,47.44715],[18.95844,47.44708],[18.95877,47.44666],[18.96145,47.4393],[18.96368,47.4358],[18.96598,47.43288],[18.96899,47.4297],[18.9701,47.42704],[18.97009,47.42679],[18.96695,47.4246],[18.95735,47.41842],[18.95676,47.4184],[18.95606,47.41813],[18.95385,47.41739],[18.95144,47.41665],[18.95131,47.41664],[18.9327,47.41703],[18.93257,47.41696],[18.93201,47.41674],[18.93149,47.4164],[18.93114,47.41612],[18.92123,47.41091],[18.91957,47.40987],[18.91927,47.40961],[18.91731,47.40854]]],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:"https://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",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[18.91731,47.40854],[18.91691,47.40849],[18.91606,47.40885],[18.91565,47.40905],[18.91458,47.40938],[18.91385,47.4097],[18.91376,47.40976],[18.91314,47.41038],[18.9122,47.41098],[18.91041,47.41175],[18.90932,47.41258],[18.90841,47.41317],[18.90676,47.41443],[18.90481,47.41568],[18.90362,47.41597],[18.90317,47.41616],[18.90062,47.41742],[18.90042,47.41755],[18.89968,47.41797],[18.89888,47.41818],[18.89814,47.41835],[18.89752,47.41855],[18.89666,47.41901],[18.8958,47.41954],[18.89421,47.4205],[18.89055,47.42209],[18.88743,47.42332],[18.88554,47.42424],[18.88436,47.42476],[18.88189,47.42553],[18.88085,47.42598],[18.8801,47.42629],[18.87956,47.42649],[18.87741,47.42738],[18.87602,47.42789],[18.87508,47.42836],[18.87281,47.42934],[18.87164,47.42968],[18.8714,47.43001],[18.87259,47.4323],[18.87273,47.43278],[18.87274,47.43324],[18.87244,47.43482],[18.87206,47.43526],[18.86891,47.43712],[18.86561,47.4375],[18.86466,47.43774],[18.86404,47.43809],[18.86378,47.43791],[18.8634,47.43784],[18.863,47.43798],[18.85195,47.44715],[18.85217,47.44847],[18.8593,47.45387],[18.85839,47.45512],[18.85777,47.45568],[18.85718,47.456],[18.8572,47.45636],[18.86015,47.45839],[18.86194,47.4595],[18.86099,47.46071],[18.85979,47.46201],[18.85929,47.46236],[18.85859,47.46272],[18.85713,47.46333],[18.85634,47.4636],[18.85628,47.46403],[18.85719,47.46528],[18.85663,47.46551],[18.85653,47.4658],[18.85693,47.46656],[18.85836,47.46953],[18.85826,47.4698],[18.85827,47.46991],[18.85838,47.47019],[18.85844,47.47027],[18.85852,47.47033],[18.85862,47.47036],[18.85873,47.47038],[18.8589,47.47036],[18.86146,47.46973],[18.86277,47.46929],[18.86617,47.46785],[18.86794,47.46656],[18.86997,47.46524],[18.8708,47.46457],[18.87268,47.46333],[18.87536,47.46113],[18.87687,47.45927],[18.88943,47.45987],[18.89024,47.45988],[18.90371,47.45534],[18.90427,47.4552],[18.90493,47.45506],[18.90542,47.4551],[18.90567,47.45505],[18.90629,47.45477],[18.90648,47.45453],[18.9066,47.45447],[18.90678,47.45439],[18.90811,47.45399],[18.90837,47.45395],[18.9089,47.45384],[18.90954,47.4537],[18.91326,47.45317],[18.91353,47.4532],[18.91372,47.45317],[18.91386,47.45307],[18.91431,47.45294],[18.91598,47.453],[18.91807,47.45317],[18.91846,47.453],[18.91903,47.45161],[18.92173,47.4508],[18.92246,47.45069],[18.92418,47.45025],[18.92756,47.44989],[18.92972,47.44951],[18.93221,47.44922],[18.93347,47.44932],[18.93921,47.44935],[18.94229,47.44903],[18.94549,47.4489],[18.94826,47.4487],[18.95003,47.44824],[18.9547,47.44722],[18.95749,47.44692],[18.95802,47.44715],[18.95844,47.44708],[18.95877,47.44666],[18.96145,47.4393],[18.96368,47.4358],[18.96598,47.43288],[18.96899,47.4297],[18.9701,47.42704],[18.97009,47.42679],[18.96695,47.4246],[18.95735,47.41842],[18.95676,47.4184],[18.95606,47.41813],[18.95385,47.41739],[18.95144,47.41665],[18.95131,47.41664],[18.9327,47.41703],[18.93257,47.41696],[18.93201,47.41674],[18.93149,47.4164],[18.93114,47.41612],[18.92123,47.41091],[18.91957,47.40987],[18.91927,47.40961],[18.91731,47.40854]]],terms_url:"http://www.torokbalint.hu/",terms_text:"Törökbálint",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.192,43.63288],[1.20154,43.63297],[1.20111,43.65549],[1.2228,43.6557],[1.22262,43.66534],[1.22753,43.66538],[1.22754,43.66564],[1.23376,43.66569],[1.23376,43.66502],[1.23512,43.66503],[1.23509,43.66707],[1.24436,43.66716],[1.24416,43.67439],[1.2494,43.67443],[1.2494,43.67466],[1.25557,43.67472],[1.25557,43.67445],[1.25695,43.67447],[1.25688,43.67853],[1.28749,43.67883],[1.28708,43.70132],[1.30882,43.70146],[1.30865,43.71277],[1.33033,43.71295],[1.33002,43.73052],[1.33671,43.73058],[1.33673,43.73122],[1.37343,43.73105],[1.37358,43.72458],[1.46045,43.72529],[1.46078,43.7028],[1.48249,43.70295],[1.48298,43.66921],[1.50468,43.66936],[1.50484,43.65812],[1.52655,43.65827],[1.52669,43.64703],[1.54837,43.64716],[1.54854,43.63594],[1.57022,43.63608],[1.57051,43.61358],[1.54882,43.61343],[1.5491,43.59095],[1.57077,43.59107],[1.57094,43.57983],[1.57937,43.57989],[1.57948,43.57377],[1.58091,43.57378],[1.58109,43.55738],[1.57123,43.55731],[1.57165,43.52355],[1.39848,43.52226],[1.39865,43.51101],[1.3121,43.51025],[1.3119,43.52152],[1.29026,43.52131],[1.28986,43.54382],[1.31152,43.54401],[1.31133,43.55526],[1.30369,43.55519],[1.30361,43.55951],[1.29554,43.55943],[1.29554,43.55955],[1.28956,43.55945],[1.28929,43.57754],[1.26757,43.57736],[1.2674,43.58861],[1.25355,43.5885],[1.25338,43.59563],[1.2518,43.59563],[1.2518,43.59494],[1.23504,43.59478],[1.23504,43.5946],[1.22396,43.5946],[1.22394,43.59947],[1.21397,43.5993],[1.21388,43.60464],[1.20206,43.60448],[1.20195,43.61048],[1.19243,43.61037],[1.192,43.63288]]],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.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],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.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],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.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],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.54575,47.46526],[0.54585,47.46082],[0.53922,47.4607],[0.53935,47.45624],[0.5328,47.4561],[0.5329,47.45157],[0.52619,47.4514],[0.52659,47.44249],[0.50009,47.44207],[0.50024,47.43758],[0.4936,47.43743],[0.4937,47.43293],[0.46061,47.43246],[0.46072,47.42798],[0.4541,47.42781],[0.45493,47.40539],[0.46154,47.40545],[0.46191,47.39649],[0.46843,47.3966],[0.46913,47.37864],[0.47571,47.37876],[0.47621,47.3652],[0.48283,47.36535],[0.48296,47.36083],[0.47635,47.36074],[0.47665,47.35173],[0.47005,47.35162],[0.4702,47.34713],[0.46375,47.34701],[0.45714,47.34241],[0.45729,47.33791],[0.45067,47.33781],[0.45084,47.33331],[0.44422,47.3332],[0.44438,47.32871],[0.43114,47.3285],[0.43163,47.315],[0.43824,47.31511],[0.43838,47.31062],[0.47145,47.31114],[0.47131,47.31566],[0.47789,47.31575],[0.47807,47.31128],[0.48468,47.31136],[0.48486,47.30687],[0.49144,47.30698],[0.49174,47.29797],[0.48516,47.29787],[0.48543,47.28887],[0.47885,47.28877],[0.47916,47.27978],[0.48578,47.2799],[0.48591,47.27539],[0.49254,47.2755],[0.49267,47.27101],[0.4993,47.27111],[0.49943,47.26661],[0.51927,47.26692],[0.51942,47.26242],[0.52602,47.26252],[0.52587,47.26702],[0.5457,47.26734],[0.54555,47.27183],[0.55877,47.27204],[0.55863,47.27652],[0.56523,47.27663],[0.56508,47.28112],[0.57168,47.28123],[0.57152,47.28572],[0.57814,47.28583],[0.57799,47.29033],[0.5846,47.29043],[0.58431,47.29942],[0.5975,47.29961],[0.59766,47.29514],[0.65716,47.296],[0.6573,47.29151],[0.6705,47.29172],[0.67035,47.29621],[0.68362,47.29637],[0.68343,47.30089],[0.69006,47.30096],[0.68992,47.30547],[0.7362,47.30612],[0.73608,47.31061],[0.7559,47.31089],[0.75577,47.31539],[0.76238,47.31547],[0.76223,47.31999],[0.77549,47.32015],[0.77497,47.33882],[0.77458,47.35163],[0.76804,47.35159],[0.76759,47.36053],[0.77424,47.36062],[0.77335,47.39213],[0.76674,47.39202],[0.76644,47.40108],[0.77306,47.40111],[0.77289,47.41013],[0.76618,47.41002],[0.76603,47.4145],[0.75276,47.4143],[0.75298,47.40981],[0.74624,47.4097],[0.74594,47.42322],[0.73923,47.42315],[0.73887,47.43661],[0.73233,47.43652],[0.73219,47.44106],[0.7255,47.44098],[0.72542,47.44535],[0.73188,47.44548],[0.73185,47.45011],[0.73845,47.45023],[0.73831,47.45463],[0.74494,47.45474],[0.74432,47.4772],[0.73107,47.47697],[0.7309,47.48154],[0.71762,47.48126],[0.71779,47.47684],[0.69777,47.4765],[0.69805,47.47198],[0.69145,47.47189],[0.69173,47.46302],[0.6851,47.46293],[0.68494,47.46735],[0.67826,47.46733],[0.67798,47.47622],[0.67141,47.47616],[0.67104,47.4882],[0.65773,47.48797],[0.65782,47.48504],[0.65119,47.48483],[0.65147,47.47586],[0.64482,47.47572],[0.64493,47.47126],[0.6118,47.47075],[0.61188,47.46631],[0.60528,47.46612],[0.60542,47.46166],[0.59888,47.46155],[0.59902,47.45709],[0.57249,47.45669],[0.57218,47.46565],[0.54575,47.46526]]],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.77512,47.32983],[0.77427,47.35617],[0.77053,47.35611],[0.77024,47.36512],[0.77398,47.36517],[0.7728,47.40148],[0.7904,47.40147],[0.78988,47.4103],[0.79117,47.41047],[0.79108,47.41942],[0.79392,47.41942],[0.79319,47.43733],[0.79834,47.43742],[0.79808,47.45544],[0.80044,47.45541],[0.80138,47.46426],[0.80074,47.46899],[0.79396,47.47331],[0.78405,47.47323],[0.78387,47.47871],[0.77606,47.47859],[0.77585,47.48204],[0.77066,47.48219],[0.77044,47.4859],[0.76096,47.49092],[0.75718,47.49092],[0.73753,47.50336],[0.7259,47.50588],[0.71113,47.50576],[0.70418,47.50408],[0.69109,47.50038],[0.69045,47.49718],[0.67757,47.49683],[0.67757,47.49353],[0.66427,47.49301],[0.6635,47.48953],[0.65088,47.48958],[0.65133,47.48032],[0.64734,47.4803],[0.64747,47.47852],[0.64474,47.47846],[0.64479,47.47575],[0.64238,47.47578],[0.64225,47.47302],[0.63835,47.47294],[0.63792,47.47131],[0.60513,47.47079],[0.60513,47.46632],[0.59852,47.46603],[0.59878,47.46156],[0.592,47.46156],[0.59226,47.45976],[0.58084,47.45971],[0.58007,47.46145],[0.57234,47.46139],[0.57222,47.46512],[0.55874,47.46489],[0.5466,47.46052],[0.53269,47.45355],[0.52677,47.45315],[0.52677,47.45152],[0.52231,47.45123],[0.52256,47.44804],[0.51977,47.44776],[0.52007,47.44247],[0.4975,47.4416],[0.49716,47.44049],[0.49355,47.44015],[0.49355,47.43573],[0.47943,47.43575],[0.46171,47.42819],[0.45643,47.42088],[0.45489,47.41229],[0.45506,47.40218],[0.46149,47.40193],[0.46167,47.39641],[0.46879,47.39602],[0.47016,47.35173],[0.45677,47.3515],[0.45729,47.34254],[0.43085,47.34196],[0.43196,47.30602],[0.47154,47.3067],[0.47257,47.28004],[0.48527,47.28004],[0.48578,47.27084],[0.49935,47.27107],[0.49917,47.26245],[0.55273,47.26304],[0.55222,47.27201],[0.56561,47.27224],[0.56526,47.28156],[0.59118,47.28156],[0.59067,47.29099],[0.66912,47.29169],[0.6832,47.29564],[0.6832,47.30077],[0.69658,47.30123],[0.69641,47.3024],[0.71006,47.30245],[0.72293,47.30589],[0.72285,47.31043],[0.74165,47.31084],[0.75426,47.31392],[0.7625,47.31815],[0.76207,47.32013],[0.76619,47.32009],[0.76956,47.32207],[0.77233,47.32508],[0.77336,47.3267],[0.77512,47.32983]]],terms_url:"https://wiki.openstreetmap.org/wiki/Tours/Orthophoto",terms_text:"Orthophoto Tour(s)plus 2013"},{id:"trafikverket-baninfo",name:"Trafikverket Railway Network",type:"wms",template:"http://geo-baninfo.trafikverket.se/mapservice/wms.axd/BanInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Spar_Huvud_och_sidospar&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[7,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish railway network, including sidings",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat",name:"Trafikverket Road Network",type:"wms",template:"https://geo-netinfo.trafikverket.se/mapservice/wms.axd/NetInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vagtrafiknat,Funkvagklass,Farjeled&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[13,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB road network",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat-extra",name:"Trafikverket Road Network extra",type:"wms",template:"https://geo-netinfo.trafikverket.se/mapservice/wms.axd/NetInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vagnummer,Vaghinder,Rastplats,Rastficka,Hallplats,Farthinder,BroTunnel,ATK_Matplats&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",scaleExtent:[3,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB extra details: Highway reference, traffic calming, rest area, bus stop, bridge, tunnel, speed camera",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat-navn",name:"Trafikverket Street Names",type:"tms",template:"https://mapproxy.openstreetmap.se/tiles/1.0.0/nvdb_names/EPSG3857/{zoom}/{x}/{y}.png",scaleExtent:[15,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB street names",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"US_Forest_Service_roads_overlay",name:"U.S. Forest Roads Overlay",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/glassman/cjf4qjmps0tgv2qpahj977mvz/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1IjoiZ2xhc3NtYW4iLCJhIjoiRjk3dWdwYyJ9.Tg_fMJWxygeKBgVTrZHmGA",scaleExtent:[0,20],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.15715,68.72197],[-164.8554,67.02551],[-168.0022,66.00175],[-169.00874,66.00155],[-169.00754,64.99877],[-172.51433,63.87673],[-173.8197,59.74014],[-162.50181,58.00058],[-160.0159,58.00124],[-160.01497,57.00003],[-160.50548,56.9999],[-165.80926,54.82485],[-178.0001,52.24465],[-177.9993,51.25543],[-171.46891,51.82153],[-162.40251,53.95666],[-159.00757,55.0025],[-158.01907,55.00278],[-151.99632,55.99919],[-151.50034,57.99879],[-151.50129,58.99198],[-138.516,58.99532],[-138.51505,57.99864],[-133.99482,54.00317],[-130.00444,54.00434],[-130.00708,57.00005],[-131.97588,56.99952],[-135.12299,59.7566],[-138.00718,59.9918],[-139.17159,60.41272],[-140.9874,61.01186],[-140.9684,69.95351],[-156.17689,71.56333],[-160.41363,70.73977],[-163.02183,69.97074],[-164.9717,68.99469],[-167.15715,68.72197]]],description:"Highway: Green casing = unclassified. Brown casing = track. Surface: gravel = light brown fill, Asphalt = black, paved = gray, ground =white, concrete = blue, grass = green. Seasonal = white bars",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USForestService-overlay.png",overlay:true},{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.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.15715,68.72197],[-164.8554,67.02551],[-168.0022,66.00175],[-169.00874,66.00155],[-169.00754,64.99877],[-172.51433,63.87673],[-173.8197,59.74014],[-162.50181,58.00058],[-160.0159,58.00124],[-160.01497,57.00003],[-160.50548,56.9999],[-165.80926,54.82485],[-178.0001,52.24465],[-177.9993,51.25543],[-171.46891,51.82153],[-162.40251,53.95666],[-159.00757,55.0025],[-158.01907,55.00278],[-151.99632,55.99919],[-151.50034,57.99879],[-151.50129,58.99198],[-138.516,58.99532],[-138.51505,57.99864],[-133.99482,54.00317],[-130.00444,54.00434],[-130.00708,57.00005],[-131.97588,56.99952],[-135.12299,59.7566],[-138.00718,59.9918],[-139.17159,60.41272],[-140.9874,61.01186],[-140.9684,69.95351],[-156.17689,71.56333],[-160.41363,70.73977],[-163.02183,69.97074],[-164.9717,68.99469],[-167.15715,68.72197]]]},{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.45788,47.44582],[8.57392,47.44477],[8.57362,47.43124],[8.60266,47.43096],[8.60231,47.41746],[8.6318,47.41716],[8.6295,47.33628],[8.57162,47.33679],[8.57152,47.32292],[8.54236,47.3236],[8.54212,47.31013],[8.48418,47.31062],[8.48478,47.33762],[8.45582,47.33787],[8.45609,47.35135],[8.42713,47.35161],[8.42864,47.43259],[8.45745,47.43231],[8.45788,47.44582]]],terms_text:"Stadt Zürich Open Government Data"},{id:"UkraineKyiv2014DZK",name:"Ukraine - Kyiv 2014 (DZK)",type:"tms",template:"http://map.land.gov.ua/map/ortho_kiev/{zoom}/{x}/{-y}.jpg",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",scaleExtent:[0,16],polygon:[[[30.30752,50.57184],[30.33155,50.57402],[30.37687,50.57925],[30.42288,50.58143],[30.4318,50.58579],[30.44416,50.58797],[30.45515,50.58754],[30.46545,50.58449],[30.46819,50.57751],[30.49085,50.57489],[30.51351,50.57489],[30.52519,50.57402],[30.55608,50.55221],[30.58424,50.53869],[30.5966,50.53781],[30.60896,50.5365],[30.64329,50.5352],[30.65496,50.53563],[30.65496,50.54305],[30.66045,50.54916],[30.66801,50.55439],[30.67762,50.55876],[30.68792,50.56137],[30.70783,50.55614],[30.71127,50.56356],[30.71127,50.57838],[30.72157,50.58231],[30.71882,50.58972],[30.72981,50.59103],[30.74011,50.58841],[30.76208,50.58536],[30.77306,50.58274],[30.78336,50.57795],[30.80259,50.57141],[30.81014,50.56617],[30.82182,50.55439],[30.82525,50.53956],[30.81701,50.53432],[30.79504,50.52909],[30.78474,50.52559],[30.76276,50.51992],[30.76208,50.5125],[30.75315,50.50769],[30.74354,50.50376],[30.73805,50.49721],[30.74629,50.49197],[30.75521,50.48847],[30.74835,50.48236],[30.75178,50.47537],[30.75315,50.46794],[30.74835,50.46138],[30.75178,50.45439],[30.78886,50.43646],[30.7971,50.43165],[30.80328,50.41765],[30.8225,50.40846],[30.82044,50.40102],[30.82319,50.39358],[30.81289,50.39095],[30.80122,50.39139],[30.78954,50.39314],[30.77787,50.3927],[30.77856,50.3857],[30.77169,50.38001],[30.76208,50.37519],[30.75109,50.37256],[30.73873,50.37256],[30.72775,50.37475],[30.71813,50.37957],[30.71539,50.36512],[30.71127,50.35855],[30.70577,50.35241],[30.69753,50.34716],[30.68586,50.34453],[30.65084,50.34058],[30.63848,50.34014],[30.62681,50.33795],[30.62887,50.3305],[30.64947,50.29279],[30.66663,50.28314],[30.67144,50.27656],[30.6632,50.27085],[30.65153,50.26997],[30.64535,50.27612],[30.63368,50.27787],[30.62132,50.27656],[30.61857,50.2691],[30.62956,50.25637],[30.6378,50.25154],[30.64535,50.23792],[30.64398,50.2309],[30.63917,50.22387],[30.62956,50.21992],[30.6069,50.2164],[30.59591,50.2186],[30.59042,50.23353],[30.5863,50.241],[30.57531,50.25505],[30.56501,50.25944],[30.5657,50.2669],[30.56432,50.29718],[30.56638,50.30463],[30.5657,50.31209],[30.55677,50.31691],[30.54441,50.31735],[30.52587,50.32699],[30.51489,50.3305],[30.50253,50.33182],[30.48055,50.33664],[30.47163,50.34146],[30.46957,50.34935],[30.47025,50.35679],[30.46201,50.36205],[30.4524,50.35679],[30.44004,50.35548],[30.43661,50.36512],[30.43111,50.37212],[30.43661,50.37826],[30.43455,50.3857],[30.40914,50.39883],[30.39678,50.40014],[30.3906,50.40671],[30.37069,50.41546],[30.36314,50.42159],[30.3597,50.42902],[30.3597,50.43646],[30.35696,50.44389],[30.3446,50.44477],[30.32056,50.44258],[30.29585,50.44477],[30.28349,50.44477],[30.27799,50.43864],[30.27525,50.43165],[30.26563,50.42771],[30.25396,50.42902],[30.24572,50.42377],[30.23542,50.42771],[30.2416,50.43427],[30.2416,50.44214],[30.23679,50.4487],[30.23885,50.45613],[30.24297,50.46313],[30.24915,50.46968],[30.25671,50.47493],[30.26083,50.48192],[30.26563,50.48847],[30.26907,50.49983],[30.26151,50.50595],[30.26357,50.51381],[30.26975,50.51992],[30.28898,50.52821],[30.29722,50.53345],[30.30271,50.54],[30.30203,50.54741],[30.30477,50.55483],[30.32743,50.55221],[30.33086,50.55919],[30.32262,50.56486],[30.31233,50.56835],[30.30752,50.57184]]],description:"Works only from within Ukraine or with an Ukrainian proxy server."},{id:"Ukraine-orto10000-2012",name:"Ukraine - Orthophotomaps 2012",type:"tms",template:"http://212.26.144.110/tile2/orto_10000/{zoom}/{x}/{-y}.jpg",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",scaleExtent:[0,16],polygon:[[[23.6193,51.65491],[24.09803,51.64047],[24.39723,51.89353],[25.19178,51.95913],[26.12263,51.92224],[26.49829,51.80933],[27.09005,51.77026],[27.62861,51.62603],[28.02422,51.59093],[28.28021,51.68172],[28.37662,51.5806],[28.82542,51.5682],[29.19111,51.64253],[29.41718,51.4399],[29.67316,51.51238],[29.82276,51.47512],[30.21837,51.50824],[30.54417,51.30709],[30.63726,51.38599],[30.51425,51.63634],[30.983,52.09005],[31.2822,52.07984],[31.48832,52.13497],[32.11,52.05531],[32.31279,52.11864],[32.43912,52.32434],[32.93114,52.28368],[33.29683,52.39337],[33.75561,52.35277],[34.35734,51.78055],[34.14457,51.76409],[34.05813,51.67965],[34.22103,51.47098],[34.25095,51.30085],[34.7197,51.19056],[35.11199,51.21139],[35.1818,51.08626],[35.38792,51.03402],[35.40787,50.62878],[35.62063,50.38563],[36.06944,50.4513],[36.21571,50.41106],[36.31212,50.28802],[36.4717,50.32624],[36.59138,50.2519],[37.46571,50.45977],[37.735,50.11353],[38.05747,49.9384],[38.19377,49.95765],[38.19045,50.07514],[38.35002,50.08154],[38.41651,49.98972],[38.73899,49.97476],[39.00827,49.83344],[39.14457,49.89987],[39.27755,49.78195],[39.54018,49.74544],[39.79949,49.58406],[40.18845,49.6013],[40.0588,49.50424],[40.20508,49.24666],[39.93247,49.06185],[39.71638,49.01608],[40.08872,48.85448],[39.79617,48.78443],[39.69311,48.65283],[39.86266,48.5693],[39.99231,48.31348],[39.83274,47.92287],[39.74297,47.83144],[39.57675,47.81135],[38.86532,47.85153],[38.77555,47.68618],[38.38327,47.60106],[38.30348,47.52704],[38.30016,47.23891],[38.13393,47.05577],[37.5455,47.05124],[37.31279,46.87654],[37.20973,46.92651],[36.96039,46.83107],[36.7443,46.61685],[36.72436,46.7719],[36.4451,46.72407],[36.10601,46.4728],[36.20574,46.66022],[35.92316,46.64424],[35.43114,46.39948],[35.10202,45.97138],[35.0455,45.75145],[35.47436,45.33],[35.86,45.53297],[35.9963,45.43274],[36.11598,45.51899],[36.66452,45.4514],[36.65454,45.34168],[36.50494,45.31363],[36.47502,45.24111],[36.48832,45.04884],[35.81013,44.98539],[35.5076,45.11222],[35.42782,44.93364],[35.12196,44.76394],[34.67649,44.75686],[33.985,44.37078],[33.68912,44.38504],[33.38327,44.50608],[33.35002,44.589],[33.55282,44.93128],[33.42981,45.1263],[33.19377,45.14271],[32.83141,45.33935],[32.60534,45.30896],[32.44577,45.3557],[32.50893,45.47005],[32.87795,45.68181],[33.57941,45.90665],[33.58938,46.02681],[33.25694,46.07065],[33.02422,45.97138],[31.61133,46.19506],[31.27555,46.61457],[30.87662,46.56887],[30.43446,45.98756],[29.69643,45.55159],[29.79284,45.46306],[29.73965,45.15913],[29.47369,45.41407],[29.18114,45.38373],[28.74896,45.22004],[28.56611,45.23409],[28.29018,45.33],[28.23367,45.49103],[28.31678,45.56789],[28.483,45.54228],[28.47303,45.73753],[28.95175,46.03143],[29.02489,46.18125],[28.9318,46.49569],[29.18779,46.57116],[29.59337,46.45448],[29.81944,46.46593],[29.95574,46.68759],[29.8959,46.8197],[29.56013,46.96963],[29.54683,47.29982],[29.14789,47.50234],[29.23101,47.77562],[29.17117,47.934],[28.86864,47.99411],[28.63593,48.16513],[28.44311,48.06525],[28.36332,48.17178],[28.25694,48.15404],[27.735,48.43494],[27.55547,48.45258],[26.92383,48.34884],[26.36532,48.17178],[26.1193,47.97408],[25.3846,47.91618],[24.91585,47.70408],[24.52024,47.94291],[24.18446,47.90058],[23.58274,48.00523],[23.43646,47.96963],[23.15388,48.10522],[23.07077,47.98743],[22.858,47.9585],[22.76824,48.09856],[22.58539,48.103],[22.51558,48.2161],[22.11332,48.4217],[22.49896,49.06621],[22.58872,49.11193],[22.87795,49.04006],[22.7217,49.18151],[22.71837,49.64652],[23.24364,50.105],[24.04484,50.49785],[24.05813,50.68779],[23.9451,50.81399],[24.10135,50.85388],[23.62928,51.29462],[23.6193,51.65491]]],description:"Works only from within Ukraine or with an Ukrainian proxy server."},{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.97725,-9.20752],[-35.9772,-9.19398],[-35.97694,-9.19053],[-35.97678,-9.18607],[-35.97702,-9.18208],[-35.97704,-9.17968],[-35.97682,-9.17734],[-35.97664,-9.17517],[-35.97701,-9.17518],[-35.97696,-9.1707],[-35.97674,-9.17066],[-35.97661,-9.16645],[-35.97618,-9.16222],[-35.9761,-9.16026],[-35.97661,-9.16026],[-35.97672,-9.14608],[-35.97654,-9.14122],[-35.97666,-9.1332],[-35.97653,-9.12184],[-35.97648,-9.11748],[-35.98618,-9.11755],[-35.98947,-9.11733],[-36.00561,-9.11733],[-36.01859,-9.11736],[-36.04601,-9.11722],[-36.06734,-9.11698],[-36.06756,-9.16134],[-36.06771,-9.16405],[-36.06745,-9.16408],[-36.06756,-9.16657],[-36.06777,-9.16654],[-36.06798,-9.20701],[-36.0498,-9.20711],[-36.04671,-9.20698],[-36.02941,-9.20709],[-36.01355,-9.20718],[-35.99318,-9.20733],[-35.97725,-9.20752]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"URBIS2009",name:"URBIS 2009 aerial imagery",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:Ortho2009&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2009-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2012",name:"URBIS 2012 aerial imagery",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:Ortho2012&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2014",name:"URBIS 2014 aerial imagery",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:Ortho2014&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[4.4001,50.76373],[4.43093,50.77254],[4.43586,50.77237],[4.46549,50.78373],[4.48189,50.78835],[4.48269,50.79849],[4.46363,50.80686],[4.46407,50.81546],[4.48204,50.81699],[4.48103,50.82343],[4.47465,50.83505],[4.47403,50.84587],[4.46712,50.85447],[4.45257,50.85797],[4.45017,50.86151],[4.42968,50.86764],[4.43423,50.87384],[4.44147,50.87513],[4.44381,50.88004],[4.43534,50.88977],[4.43968,50.89475],[4.43287,50.90363],[4.42096,50.90917],[4.42023,50.91387],[4.38315,50.91381],[4.37879,50.90637],[4.37334,50.90289],[4.36241,50.906],[4.34824,50.90611],[4.33955,50.90685],[4.32771,50.90515],[4.31471,50.89842],[4.30413,50.89498],[4.2871,50.89192],[4.28725,50.88532],[4.29293,50.88265],[4.27948,50.8736],[4.27347,50.86822],[4.27364,50.85871],[4.27688,50.85575],[4.27644,50.84376],[4.26664,50.8405],[4.25488,50.83992],[4.24755,50.83453],[4.24799,50.82866],[4.24357,50.82599],[4.24376,50.81356],[4.25233,50.81268],[4.25649,50.80711],[4.27025,50.8073],[4.27222,50.80537],[4.28414,50.80241],[4.28885,50.80434],[4.29544,50.8043],[4.30046,50.79506],[4.31076,50.79299],[4.31444,50.78372],[4.32628,50.77221],[4.34194,50.76891],[4.34474,50.77029],[4.37535,50.76577],[4.3755,50.76381],[4.4001,50.76373]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2015",name:"URBIS 2015 aerial imagery",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:Ortho2015&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{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:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2017",name:"UrbIS-Ortho 2017",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:Ortho2017&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{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.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{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.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBISfr2013",name:"URBISfr numerical imagery (2013)",type:"wms",template:"https://gis.irisnet.be/arcgis/rest/services/basemap/urbisFR/MapServer/export?f=image&format=png8&transparent=False&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBISnl2013",name:"URBISnl numerical imagery (2013)",type:"wms",template:"https://gis.irisnet.be/arcgis/rest/services/basemap/urbisNL/MapServer/export?f=image&format=png8&transparent=False&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{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.25493,48.7529],[-123.25493,48.55923],[-123.19222,48.55923],[-123.19222,48.43484],[-122.94196,48.43484],[-122.94196,48.37208],[-122.88062,48.37208],[-122.88062,48.30948],[-122.81676,48.30948],[-122.81676,48.19046],[-123.00411,48.19046],[-123.00411,48.12759],[-123.05842,48.12759],[-123.05842,48.19051],[-123.25411,48.19051],[-123.25411,48.1275],[-123.37066,48.1275],[-123.37066,48.19084],[-124.05826,48.19084],[-124.05826,48.25344],[-124.18152,48.25344],[-124.18152,48.31647],[-124.43191,48.31647],[-124.43191,48.37826],[-124.55646,48.37826],[-124.55646,48.44083],[-124.75551,48.44083],[-124.75551,48.1915],[-124.81853,48.1915],[-124.81853,48.12284],[-124.7553,48.12284],[-124.7553,47.55353],[-124.38121,47.55353],[-124.38121,47.12187],[-124.19289,47.12187],[-124.19289,43.75694],[-124.44434,43.75694],[-124.44434,43.14256],[-124.63989,43.14256],[-124.63989,42.61945],[-124.44385,42.61945],[-124.44385,39.80807],[-123.88157,39.80807],[-123.88157,39.11028],[-123.75805,39.11028],[-123.75805,38.49688],[-123.27028,38.49688],[-123.27028,37.93319],[-122.81481,37.93319],[-122.81481,37.80196],[-122.56643,37.80196],[-122.56643,36.93196],[-121.8784,36.93196],[-121.8784,36.68976],[-122.00347,36.68976],[-122.00347,36.43411],[-121.94142,36.43411],[-121.94142,35.92976],[-121.5041,35.92976],[-121.5041,35.81003],[-121.37903,35.81003],[-121.37903,35.42392],[-120.94265,35.42392],[-120.94265,35.18497],[-120.8172,35.18497],[-120.8172,35.12199],[-120.69184,35.12199],[-120.69184,34.49668],[-120.50459,34.49668],[-120.50459,34.43397],[-120.00788,34.43397],[-120.00788,34.36826],[-119.52835,34.36826],[-119.52835,34.05764],[-119.0061,34.05764],[-119.0061,33.99753],[-118.50463,33.99753],[-118.50463,33.86946],[-118.44132,33.86946],[-118.44132,33.68653],[-118.06691,33.68653],[-118.06691,33.30638],[-117.503,33.30638],[-117.503,33.05003],[-117.31882,33.05003],[-117.31882,32.62059],[-117.1917,32.62059],[-117.1917,32.49746],[-116.7465,32.49746],[-116.7465,32.56092],[-115.99701,32.56092],[-115.99701,32.62649],[-114.88081,32.62649],[-114.88081,32.43408],[-114.62945,32.43408],[-114.62945,32.37316],[-114.44474,32.37316],[-114.44474,32.30754],[-114.25576,32.30754],[-114.25576,32.24446],[-114.06803,32.24446],[-114.06803,32.18291],[-113.81665,32.18291],[-113.81665,32.12076],[-113.63074,32.12076],[-113.63074,32.05651],[-113.44175,32.05651],[-113.44175,31.99844],[-113.2546,31.99844],[-113.2546,31.93254],[-113.06807,31.93254],[-113.06807,31.87181],[-112.81611,31.87181],[-112.81611,31.81042],[-112.63088,31.81042],[-112.63088,31.74647],[-112.44189,31.74647],[-112.44189,31.6856],[-112.25719,31.6856],[-112.25719,31.62104],[-112.00338,31.62104],[-112.00338,31.55958],[-111.81562,31.55958],[-111.81562,31.49702],[-111.62786,31.49702],[-111.62786,31.43399],[-111.4419,31.43399],[-111.4419,31.37339],[-111.25597,31.37339],[-111.25597,31.31132],[-108.18458,31.31132],[-108.18458,31.74595],[-106.50651,31.74595],[-106.50651,31.68423],[-106.37973,31.68423],[-106.37973,31.62175],[-106.31743,31.62175],[-106.31743,31.49682],[-106.25518,31.49682],[-106.25518,31.43449],[-106.19247,31.43449],[-106.19247,31.37213],[-106.00392,31.37213],[-106.00392,31.30933],[-105.94166,31.30933],[-105.94166,31.24575],[-105.87982,31.24575],[-105.87982,31.18362],[-105.81623,31.18362],[-105.81623,31.12072],[-105.69212,31.12072],[-105.69212,31.05848],[-105.63029,31.05848],[-105.63029,30.93283],[-105.50444,30.93283],[-105.50444,30.87159],[-105.4413,30.87159],[-105.4413,30.80846],[-105.37815,30.80846],[-105.37815,30.74718],[-105.19047,30.74718],[-105.19047,30.68432],[-105.12862,30.68432],[-105.12862,30.61997],[-105.00365,30.61997],[-105.00365,30.55891],[-104.9418,30.55891],[-104.9418,30.49632],[-104.8782,30.49632],[-104.8782,30.30983],[-104.81553,30.30983],[-104.81553,30.24783],[-104.75361,30.24783],[-104.75361,29.93539],[-104.69095,29.93539],[-104.69095,29.80902],[-104.62913,29.80902],[-104.62913,29.68436],[-104.56599,29.68436],[-104.56599,29.62235],[-104.50372,29.62235],[-104.50372,29.55954],[-104.44101,29.55954],[-104.44101,29.49748],[-104.25376,29.49748],[-104.25376,29.37167],[-104.1292,29.37167],[-104.1292,29.30916],[-104.06887,29.30916],[-104.06887,29.24673],[-103.81873,29.24673],[-103.81873,29.18431],[-103.75574,29.18431],[-103.75574,29.12232],[-103.56675,29.12232],[-103.56675,29.05981],[-103.50498,29.05981],[-103.50498,28.99675],[-103.31658,28.99675],[-103.31658,28.93469],[-103.05976,28.93469],[-103.05976,29.0593],[-102.99797,29.0593],[-102.99797,29.12129],[-102.93314,29.12129],[-102.93314,29.18486],[-102.8096,29.18486],[-102.8096,29.25262],[-102.87013,29.25262],[-102.87013,29.3081],[-102.80967,29.3081],[-102.80967,29.37155],[-102.74757,29.37155],[-102.74757,29.55819],[-102.68455,29.55819],[-102.68455,29.68477],[-102.49678,29.68477],[-102.49678,29.74577],[-102.30866,29.74577],[-102.30866,29.80866],[-102.19093,29.80866],[-102.19093,29.74601],[-101.50499,29.74601],[-101.50499,29.68468],[-101.38058,29.68468],[-101.38058,29.55945],[-101.31751,29.55945],[-101.31751,29.49589],[-101.19101,29.49589],[-101.19101,29.43261],[-101.0675,29.43261],[-101.0675,29.30881],[-100.94189,29.30881],[-100.94189,29.24562],[-100.81673,29.24562],[-100.81673,29.11904],[-100.75227,29.11904],[-100.75227,29.05782],[-100.69254,29.05782],[-100.69254,28.87204],[-100.62902,28.87204],[-100.62902,28.80954],[-100.56799,28.80954],[-100.56799,28.62255],[-100.50404,28.62255],[-100.50404,28.55838],[-100.44218,28.55838],[-100.44218,28.49683],[-100.37943,28.49683],[-100.37943,28.30929],[-100.31719,28.30929],[-100.31719,28.18357],[-100.25448,28.18357],[-100.25448,28.12139],[-100.12823,28.12139],[-100.12823,28.05921],[-100.06595,28.05921],[-100.06595,27.99661],[-100.00239,27.99661],[-100.00239,27.93322],[-99.94265,27.93322],[-99.94265,27.74547],[-99.81685,27.74547],[-99.81685,27.68343],[-99.75413,27.68343],[-99.75413,27.62215],[-99.62916,27.62215],[-99.62916,27.5589],[-99.56728,27.5589],[-99.56728,27.43538],[-99.50418,27.43538],[-99.50418,27.3774],[-99.56718,27.3774],[-99.56718,27.24637],[-99.50498,27.24637],[-99.50498,26.99656],[-99.44274,26.99656],[-99.44274,26.8728],[-99.38006,26.8728],[-99.38006,26.80682],[-99.31907,26.80682],[-99.31907,26.74736],[-99.25375,26.74736],[-99.25375,26.62101],[-99.19106,26.62101],[-99.19106,26.49567],[-99.13006,26.49567],[-99.13006,26.37138],[-99.00295,26.37138],[-99.00295,26.30938],[-98.81657,26.30938],[-98.81657,26.24578],[-98.69201,26.24578],[-98.69201,26.18371],[-98.44409,26.18371],[-98.44409,26.12172],[-98.38232,26.12172],[-98.38232,26.05965],[-98.25327,26.05965],[-98.25327,25.99869],[-98.01091,25.99869],[-98.01091,25.99323],[-97.69323,25.99323],[-97.69323,25.93341],[-97.63139,25.93341],[-97.63139,25.86959],[-97.50468,25.86959],[-97.50468,25.80735],[-97.30834,25.80735],[-97.30834,25.87312],[-97.24563,25.87312],[-97.24563,25.93537],[-97.11389,25.93537],[-97.11389,27.68092],[-97.0571,27.68092],[-97.0571,27.81082],[-95.58108,27.81082],[-95.58108,28.74688],[-94.27104,28.74688],[-94.27104,29.55941],[-92.50299,29.55941],[-92.50299,29.49748],[-91.87762,29.49748],[-91.87762,29.3727],[-91.37842,29.3727],[-91.37842,29.24683],[-91.3154,29.24683],[-91.3154,29.18443],[-91.12947,29.18443],[-91.12947,29.12326],[-91.00526,29.12326],[-91.00526,28.99684],[-89.45002,28.99684],[-89.45002,28.86774],[-88.81043,28.86774],[-88.81043,30.18419],[-85.87915,30.18419],[-85.87915,29.5455],[-84.83681,29.5455],[-84.83681,29.62252],[-84.74828,29.62252],[-84.74828,29.68362],[-84.68589,29.68362],[-84.68589,29.74684],[-83.6297,29.74684],[-83.6297,29.43244],[-83.31749,29.43244],[-83.31749,29.05794],[-82.87966,29.05794],[-82.87966,27.74535],[-82.81828,27.74535],[-82.81828,26.92909],[-82.37968,26.92909],[-82.37968,26.36942],[-81.87771,26.36942],[-81.87771,25.80597],[-81.50369,25.80597],[-81.50369,25.74748],[-81.44055,25.74748],[-81.44055,25.68515],[-81.31559,25.68515],[-81.31559,25.5601],[-81.25385,25.5601],[-81.25385,25.43424],[-81.1902,25.43424],[-81.1902,25.12343],[-81.12881,25.12343],[-81.12881,25.06194],[-81.06492,25.06194],[-81.06492,24.81578],[-81.62895,24.81578],[-81.62895,24.75384],[-81.69072,24.75384],[-81.69072,24.68994],[-81.81732,24.68994],[-81.81732,24.62792],[-82.191,24.62792],[-82.191,24.49629],[-81.62166,24.49629],[-81.62166,24.55948],[-81.37201,24.55948],[-81.37201,24.62207],[-81.05933,24.62207],[-81.05933,24.68483],[-80.93471,24.68483],[-80.93471,24.74748],[-80.74711,24.74748],[-80.74711,24.81006],[-80.36299,24.81006],[-80.36299,25.11759],[-80.12234,25.11759],[-80.12234,25.74724],[-80.05885,25.74724],[-80.05885,26.37083],[-79.99584,26.37083],[-79.99584,26.9398],[-80.05873,26.9398],[-80.05873,27.12775],[-80.12263,27.12775],[-80.12263,27.25343],[-80.1847,27.25343],[-80.1847,27.37812],[-80.24617,27.37812],[-80.24617,27.56587],[-80.30948,27.56587],[-80.30948,27.75303],[-80.37215,27.75303],[-80.37215,27.87745],[-80.43515,27.87745],[-80.43515,28.00334],[-80.49661,28.00334],[-80.49661,28.12773],[-80.55872,28.12773],[-80.55872,28.37235],[-80.49663,28.37235],[-80.49663,29.51603],[-81.12136,29.51603],[-81.12136,31.6847],[-80.60187,31.6847],[-80.60187,32.24753],[-79.4921,32.24753],[-79.4921,32.99703],[-79.11165,32.99703],[-79.11165,33.37295],[-78.61536,33.37295],[-78.61536,33.80976],[-77.9317,33.80976],[-77.9317,33.87182],[-77.86923,33.87182],[-77.86923,34.05525],[-77.68264,34.05525],[-77.68264,34.29746],[-77.24535,34.29746],[-77.24535,34.55986],[-76.49733,34.55986],[-76.49733,34.6228],[-76.43376,34.6228],[-76.43376,34.68493],[-76.37321,34.68493],[-76.37321,34.74677],[-76.30594,34.74677],[-76.30594,34.80855],[-76.2468,34.80855],[-76.2468,34.87284],[-76.18259,34.87284],[-76.18259,34.93353],[-76.12081,34.93353],[-76.12081,34.99524],[-75.9979,34.99524],[-75.9979,35.05782],[-75.87034,35.05782],[-75.87034,35.12191],[-75.74622,35.12191],[-75.74622,35.18189],[-75.49297,35.18189],[-75.49297,35.3083],[-75.43257,35.3083],[-75.43257,35.75425],[-75.49699,35.75425],[-75.49699,37.81056],[-75.3083,37.81056],[-75.3083,37.87201],[-75.2456,37.87201],[-75.2456,37.99548],[-75.18288,37.99548],[-75.18288,38.05851],[-75.11848,38.05851],[-75.11848,38.24691],[-75.05921,38.24691],[-75.05921,38.37043],[-74.99481,38.37043],[-74.99481,38.87184],[-74.48783,38.87184],[-74.48783,39.30894],[-74.17663,39.30894],[-74.17663,39.62247],[-74.0567,39.62247],[-74.0567,39.93318],[-73.9959,39.93318],[-73.9959,40.18549],[-73.93416,40.18549],[-73.93416,40.49595],[-73.8723,40.49595],[-73.8723,40.55271],[-71.80745,40.55271],[-71.80745,41.3088],[-70.88251,41.3088],[-70.88251,41.18498],[-70.74619,41.18498],[-70.74619,41.30919],[-70.43376,41.30919],[-70.43376,41.49639],[-69.93343,41.49639],[-69.93343,41.62308],[-69.86986,41.62308],[-69.86986,41.87769],[-69.93579,41.87769],[-69.93579,42.00323],[-69.99758,42.00323],[-69.99758,42.06502],[-70.06061,42.06502],[-70.06061,42.12943],[-70.55729,42.12943],[-70.55729,43.24871],[-70.49741,43.24871],[-70.49741,43.30922],[-70.37042,43.30922],[-70.37042,43.37196],[-70.30857,43.37196],[-70.30857,43.49699],[-70.18392,43.49699],[-70.18392,43.62235],[-70.05758,43.62235],[-70.05758,43.68502],[-69.74552,43.68502],[-69.74552,43.74766],[-69.24728,43.74766],[-69.24728,43.8107],[-69.05607,43.8107],[-69.05607,43.87172],[-68.99505,43.87172],[-68.99505,43.9982],[-68.49637,43.9982],[-68.49637,44.05974],[-68.3081,44.05974],[-68.3081,44.12214],[-68.18518,44.12214],[-68.18518,44.30814],[-67.9956,44.30814],[-67.9956,44.37275],[-67.8103,44.37275],[-67.8103,44.43518],[-67.49653,44.43518],[-67.49653,44.49688],[-67.37102,44.49688],[-67.37102,44.56006],[-67.18488,44.56006],[-67.18488,44.62133],[-67.12212,44.62133],[-67.12212,44.68679],[-67.05936,44.68679],[-67.05936,44.74737],[-66.93111,44.74737],[-66.93111,44.94066],[-66.99468,44.94066],[-66.99468,45.00245],[-67.05958,45.00245],[-67.05958,45.12734],[-67.1202,45.12734],[-67.1202,45.19101],[-67.24698,45.19101],[-67.24698,45.25344],[-67.31775,45.25344],[-67.31775,45.18984],[-67.37075,45.18984],[-67.37075,45.2534],[-67.43269,45.2534],[-67.43269,45.30834],[-67.37086,45.30834],[-67.37086,45.4397],[-67.43056,45.4397],[-67.43056,45.49501],[-67.37099,45.49501],[-67.37099,45.62645],[-67.6215,45.62645],[-67.6215,45.68961],[-67.68383,45.68961],[-67.68383,45.75326],[-67.74621,45.75326],[-67.74621,47.12682],[-67.87001,47.12682],[-67.87001,47.19003],[-67.93238,47.19003],[-67.93238,47.25397],[-67.99594,47.25397],[-67.99594,47.31497],[-68.12067,47.31497],[-68.12067,47.37808],[-68.44232,47.37808],[-68.44232,47.31661],[-68.63143,47.31661],[-68.63143,47.25447],[-68.9978,47.25447],[-68.9978,47.43989],[-69.06072,47.43989],[-69.06072,47.50476],[-69.25381,47.50476],[-69.25381,47.43981],[-69.31793,47.43981],[-69.31793,47.3786],[-69.44385,47.3786],[-69.44385,47.31563],[-69.50382,47.31563],[-69.50382,47.25258],[-69.56678,47.25258],[-69.56678,47.19109],[-69.63035,47.19109],[-69.63035,47.1287],[-69.69331,47.1287],[-69.69331,47.06543],[-69.75571,47.06543],[-69.75571,47.00428],[-69.81804,47.00428],[-69.81804,46.94153],[-69.8804,46.94153],[-69.8804,46.87925],[-69.94217,46.87925],[-69.94217,46.81774],[-70.00631,46.81774],[-70.00631,46.69203],[-70.07043,46.69203],[-70.07043,46.44259],[-70.19459,46.44259],[-70.19459,46.37859],[-70.2562,46.37859],[-70.2562,46.31526],[-70.32037,46.31526],[-70.32037,46.06512],[-70.3815,46.06512],[-70.3815,45.93552],[-70.32016,45.93552],[-70.32016,45.87948],[-70.44931,45.87948],[-70.44931,45.75387],[-70.507,45.75387],[-70.507,45.69169],[-70.63166,45.69169],[-70.63166,45.62916],[-70.75755,45.62916],[-70.75755,45.44147],[-70.88099,45.44147],[-70.88099,45.37806],[-71.13328,45.37806],[-71.13328,45.31515],[-71.38303,45.31515],[-71.38303,45.25342],[-71.50764,45.25342],[-71.50764,45.06557],[-73.94189,45.06557],[-73.94189,45.00312],[-74.74697,45.00312],[-74.74697,45.0649],[-74.8801,45.0649],[-74.8801,45.0029],[-75.06625,45.0029],[-75.06625,44.94152],[-75.25394,44.94152],[-75.25394,44.8776],[-75.37896,44.8776],[-75.37896,44.81535],[-75.44313,44.81535],[-75.44313,44.75361],[-75.56666,44.75361],[-75.56666,44.69099],[-75.62902,44.69099],[-75.62902,44.6285],[-75.75405,44.6285],[-75.75405,44.56638],[-75.81731,44.56638],[-75.81731,44.50289],[-75.87995,44.50289],[-75.87995,44.37849],[-76.13003,44.37849],[-76.13003,44.31592],[-76.1927,44.31592],[-76.1927,44.25344],[-76.31826,44.25344],[-76.31826,44.19167],[-76.3793,44.19167],[-76.3793,44.06537],[-76.44276,44.06537],[-76.44276,43.99638],[-76.31703,43.99638],[-76.31703,43.94146],[-76.50766,43.94146],[-76.50766,43.87233],[-76.383,43.87233],[-76.383,43.80919],[-76.25341,43.80919],[-76.25341,43.56652],[-76.50648,43.56652],[-76.50648,43.50339],[-76.63312,43.50339],[-76.63312,43.44323],[-76.69511,43.44323],[-76.69511,43.37869],[-76.81778,43.37869],[-76.81778,43.31807],[-77.682,43.31807],[-77.682,43.37894],[-78.05659,43.37894],[-78.05659,43.43969],[-78.43897,43.43969],[-78.43897,43.37944],[-78.88034,43.37944],[-78.88034,43.31497],[-79.12989,43.31497],[-79.12989,43.24293],[-79.06696,43.24293],[-79.06696,43.12999],[-79.12989,43.12999],[-79.12989,43.05773],[-79.07126,43.05773],[-79.07126,42.92949],[-78.94326,42.92949],[-78.94326,42.75422],[-79.06944,42.75422],[-79.06944,42.69416],[-79.13344,42.69416],[-79.13344,42.6297],[-79.19475,42.6297],[-79.19475,42.56635],[-79.37868,42.56635],[-79.37868,42.50334],[-79.4443,42.50334],[-79.4443,42.44106],[-79.56799,42.44106],[-79.56799,42.37753],[-79.69062,42.37753],[-79.69062,42.31711],[-79.81646,42.31711],[-79.81646,42.25345],[-80.00524,42.25345],[-80.00524,42.19092],[-80.19168,42.19092],[-80.19168,42.12726],[-80.3168,42.12726],[-80.3168,42.06699],[-80.50632,42.06699],[-80.50632,42.00343],[-80.69305,42.00343],[-80.69305,41.94151],[-80.94404,41.94151],[-80.94404,41.87812],[-81.19427,41.87812],[-81.19427,41.81665],[-81.31901,41.81665],[-81.31901,41.75455],[-81.44184,41.75455],[-81.44184,41.69096],[-81.50535,41.69096],[-81.50535,41.63016],[-82.74701,41.63016],[-82.74701,41.75369],[-82.88391,41.75369],[-82.88391,41.56561],[-82.99572,41.56561],[-82.99572,41.62704],[-83.12578,41.62704],[-83.12578,41.68784],[-83.24747,41.68784],[-83.24747,41.75369],[-83.37373,41.75369],[-83.37373,41.80928],[-83.3106,41.80928],[-83.3106,41.87161],[-83.24747,41.87161],[-83.24747,41.93614],[-83.18434,41.93614],[-83.18434,41.99609],[-83.12077,41.99609],[-83.12077,42.24648],[-83.05892,42.24648],[-83.05892,42.30896],[-82.86853,42.30896],[-82.86853,42.37177],[-82.80722,42.37177],[-82.80722,42.55855],[-82.75537,42.55855],[-82.75537,42.49549],[-82.5599,42.49549],[-82.5599,42.55855],[-82.49678,42.55855],[-82.49678,42.68336],[-82.43289,42.68336],[-82.43289,42.93422],[-82.37006,42.93422],[-82.37006,43.06481],[-82.43289,43.06481],[-82.43289,43.19176],[-82.49475,43.19176],[-82.49475,43.50346],[-82.55713,43.50346],[-82.55713,43.81609],[-82.61979,43.81609],[-82.61979,43.94221],[-82.68395,43.94221],[-82.68395,44.00226],[-82.74653,44.00226],[-82.74653,44.06705],[-82.87087,44.06705],[-82.87087,44.12919],[-83.00852,44.12919],[-83.00852,44.06648],[-83.13361,44.06648],[-83.13361,44.00539],[-83.24145,44.00539],[-83.24145,44.9962],[-83.18061,44.9962],[-83.18061,45.0673],[-83.24552,45.0673],[-83.24552,45.12874],[-83.30659,45.12874],[-83.30659,45.25515],[-83.37061,45.25515],[-83.37061,45.31659],[-83.43256,45.31659],[-83.43256,45.37921],[-83.61784,45.37921],[-83.61784,45.44197],[-83.80843,45.44197],[-83.80843,45.50362],[-84.05507,45.50362],[-84.05507,45.56479],[-84.12352,45.56479],[-84.12352,45.62878],[-84.18075,45.62878],[-84.18075,45.69147],[-84.31116,45.69147],[-84.31116,45.93371],[-83.821,45.93371],[-83.821,45.87251],[-83.49681,45.87251],[-83.49681,45.93371],[-83.43381,45.93371],[-83.43381,46.00169],[-83.49627,46.00169],[-83.49627,46.06682],[-83.56,46.06682],[-83.56,46.12616],[-83.99546,46.12616],[-83.99546,46.19317],[-84.05918,46.19317],[-84.05918,46.3815],[-84.11526,46.3815],[-84.11526,46.49536],[-84.05918,46.49536],[-84.05918,46.56827],[-84.25795,46.56827],[-84.25795,46.50512],[-84.30719,46.50512],[-84.30719,46.56827],[-84.44154,46.56827],[-84.44154,46.50453],[-84.99657,46.50453],[-84.99657,46.68429],[-84.92982,46.68429],[-84.92982,46.81808],[-85.31659,46.81808],[-85.31659,46.75358],[-87.55626,46.75358],[-87.55626,47.44074],[-87.68254,47.44074],[-87.68254,47.50356],[-88.25607,47.50356],[-88.25607,47.44337],[-88.44174,47.44337],[-88.44174,47.37899],[-88.50683,47.37899],[-88.50683,47.31539],[-88.63128,47.31539],[-88.63128,47.25398],[-88.75696,47.25398],[-88.75696,47.19347],[-88.88383,47.19347],[-88.88383,47.12847],[-88.94342,47.12847],[-88.94342,47.06621],[-89.07087,47.06621],[-89.07087,47.00268],[-89.25656,47.00268],[-89.25656,46.94108],[-90.36777,46.94108],[-90.36777,47.68448],[-90.307,47.68448],[-90.307,47.74602],[-89.99486,47.74602],[-89.99486,47.80827],[-89.80486,47.80827],[-89.80486,47.87006],[-89.67977,47.87006],[-89.67977,47.93396],[-89.49338,47.93396],[-89.49338,47.9958],[-89.42847,47.9958],[-89.42847,48.06564],[-89.99327,48.06564],[-89.99327,48.1283],[-90.74559,48.1283],[-90.74559,48.18931],[-90.80873,48.18931],[-90.80873,48.25221],[-91.06776,48.25221],[-91.06776,48.19167],[-91.19462,48.19167],[-91.19462,48.1279],[-91.68142,48.1279],[-91.68142,48.2526],[-91.93219,48.2526],[-91.93219,48.31425],[-91.99297,48.31425],[-91.99297,48.37808],[-92.31894,48.37808],[-92.31894,48.25291],[-92.37322,48.25291],[-92.37322,48.31534],[-92.43223,48.31534],[-92.43223,48.44114],[-92.49772,48.44114],[-92.49772,48.50178],[-92.56794,48.50178],[-92.56794,48.43958],[-92.62105,48.43958],[-92.62105,48.56508],[-92.80868,48.56508],[-92.80868,48.62869],[-92.80868,48.62674],[-92.93318,48.62674],[-92.93318,48.69221],[-93.00517,48.69221],[-93.00517,48.6283],[-93.12259,48.6283],[-93.12259,48.69221],[-93.31908,48.69221],[-93.31908,48.62674],[-93.50495,48.62674],[-93.50495,48.56352],[-93.74746,48.56352],[-93.74746,48.62674],[-93.81355,48.62674],[-93.81355,48.68988],[-94.24531,48.68988],[-94.24531,48.75543],[-94.61832,48.75543],[-94.61832,48.94104],[-94.6809,48.94104],[-94.6809,49.00297],[-94.74415,49.00297],[-94.74415,49.25361],[-94.80841,49.25361],[-94.80841,49.37841],[-95.11924,49.37841],[-95.11924,49.44253],[-95.19343,49.44253],[-95.19343,49.00353],[-96.87069,49.00353],[-96.87069,49.06561],[-99.00493,49.06561],[-99.00493,49.00507],[-109.36993,49.00507],[-109.36993,49.06682],[-109.50587,49.06682],[-109.50587,49.00507],[-114.183,49.00507],[-114.183,49.06873],[-114.75787,49.06873],[-114.75787,49.00507],[-115.43373,49.00507],[-115.43373,49.06714],[-116.50627,49.06714],[-116.50627,49.00507],[-117.30895,49.00507],[-117.30895,49.06598],[-119.88295,49.06598],[-119.88295,49.00507],[-120.12086,49.00507],[-120.12086,49.06784],[-121.44516,49.06784],[-121.44516,49.00507],[-121.93118,49.00507],[-121.93118,49.06561],[-122.81748,49.06561],[-122.81748,49.00291],[-122.87952,49.00291],[-122.87952,48.9347],[-122.81746,48.9347],[-122.81746,48.8102],[-122.75389,48.8102],[-122.75389,48.75338],[-122.87129,48.75338],[-122.87129,48.81539],[-123.00554,48.81539],[-123.00554,48.75295],[-123.12969,48.75295],[-123.12969,48.69022],[-123.18382,48.69022],[-123.18382,48.7529],[-123.25493,48.7529]],[[-122.93417,37.75215],[-122.93475,37.6842],[-123.0679,37.6849],[-123.06737,37.74753],[-123.12926,37.74785],[-123.12869,37.81569],[-123.05907,37.81532],[-123.05959,37.75281],[-122.93417,37.75215]],[[-71.62995,41.25409],[-71.49665,41.25414],[-71.49656,41.12297],[-71.62986,41.12291],[-71.62995,41.25409]],[[-70.31843,41.37752],[-70.31834,41.24482],[-70.19066,41.24487],[-70.19062,41.1886],[-69.9336,41.1887],[-69.93373,41.37919],[-69.99507,41.37917],[-69.99511,41.44316],[-70.07078,41.44313],[-70.0707,41.31449],[-70.24617,41.31443],[-70.24621,41.37755],[-70.31843,41.37752]],[[-68.94034,43.94041],[-68.68569,43.9405],[-68.68565,43.87218],[-68.74654,43.87216],[-68.7465,43.81025],[-68.80908,43.81023],[-68.80903,43.74673],[-68.87731,43.7467],[-68.87735,43.81178],[-68.94025,43.81176],[-68.94034,43.94041]],[[-123.12915,49.06451],[-122.99542,49.06451],[-122.99542,48.93432],[-123.12915,48.93432],[-123.12915,49.06451]],[[-82.94071,24.75359],[-82.87194,24.75359],[-82.87194,24.69057],[-82.74462,24.69057],[-82.74462,24.62146],[-82.8088,24.62146],[-82.8088,24.55949],[-82.94071,24.55949],[-82.94071,24.75359]]],icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USGSTopographicMaps.png"},{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.99594,52.00107],[-112.02896,52.00107],[-112.03995,56.01308],[-120.00494,56.00592],[-120.01712,60.01202],[-132.00197,60.00239],[-132.01208,63.00193],[-133.96883,63.0005],[-133.9724,63.99225],[-141.04429,63.98726],[-141.06879,69.92046],[-156.24893,71.51583],[-160.44571,70.83527],[-167.08145,68.42906],[-164.08218,67.03914],[-169.01504,65.68269],[-166.57608,64.50778],[-161.82999,64.05006],[-165.08194,63.2603],[-168.02628,59.78623],[-162.53311,59.73089],[-162.35733,58.55905],[-157.83096,58.31753],[-158.00674,57.52404],[-168.22403,53.51022],[-166.55411,53.14277],[-158.77579,54.88541],[-158.6824,55.74964],[-156.55106,56.00848],[-156.15555,56.77466],[-154.70535,56.14337],[-152.07413,57.37035],[-151.62918,58.22653],[-152.00821,58.98056],[-145.9877,60.24741],[-140.38467,59.48634],[-136.53946,57.8061],[-133.79288,54.83483],[-133.33145,53.14277],[-131.46378,51.69838],[-128.52493,51.74602],[-129.79385,50.90159],[-124.56436,47.49786],[-124.03702,45.48627],[-124.6962,42.90428],[-124.49844,40.34146],[-122.80655,37.53929],[-119.99405,33.37085],[-117.24747,32.5412],[-111.13907,31.1977],[-106.70059,31.23529],[-103.20694,28.64618],[-101.84463,29.8158],[-99.20792,26.28744],[-96.79092,25.75432],[-96.92276,27.96911],[-93.47305,29.68226],[-88.94669,28.87732],[-88.6171,30.17736],[-86.2001,30.36713],[-84.96963,29.43379],[-84.09073,30.06333],[-82.97012,28.95426],[-82.97012,27.26824],[-81.25626,25.07956],[-82.09122,24.56105],[-80.06973,24.76073],[-79.85001,27.11188],[-81.27823,30.70777],[-78.99307,33.20554],[-75.03799,35.5983],[-75.85098,37.24252],[-73.74161,40.4586],[-69.89639,41.60224],[-70.68741,43.17629],[-66.93008,44.69516],[-66.53458,43.08007],[-64.20547,43.35229],[-59.50333,45.73221],[-59.51431,46.24762],[-60.0032,46.25901],[-59.99222,47.24506],[-59.00894,47.2376],[-58.99796,47.50267],[-56.51504,47.50267],[-56.52603,46.7477],[-53.99918,46.7477],[-53.9772,46.48358],[-52.49405,46.46354],[-52.50504,48.75361],[-52.99667,48.75451],[-53.01315,49.99551],[-55.00168,50.0061],[-55.03738,53.74721],[-56.00418,53.73421],[-55.99594,52.00107]],[[-59.50127,43.74954],[-60.5024,43.74954],[-60.5024,44],[-59.9984,44],[-59.9984,44.2494],[-59.50127,44.2494],[-59.50127,43.74954]],[[-155.95024,20.49523],[-157.32675,20.49153],[-157.32903,21.23181],[-155.95251,21.23549],[-155.95024,20.49523]],[[-157.64488,21.24845],[-158.28534,21.24674],[-158.2869,21.74996],[-157.64643,21.75167],[-157.64488,21.24845]],[[-156.12602,20.3247],[-154.74617,20.32841],[-154.74174,18.87578],[-156.1216,18.87203],[-156.12602,20.3247]],[[-159.29077,22.24504],[-159.2893,21.76857],[-160.28917,21.76591],[-160.29064,22.24239],[-159.29077,22.24504]]],terms_url:"https://caltopo.com",terms_text:"© Caltopo",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USGSTopographicMaps.png"},{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.63086,57.56889],[25.16968,58.04882],[22.54395,57.76866],[21.54419,57.53352],[21.01685,56.81892],[21.01685,56.03523],[22.03857,56.38958],[24.71924,56.33481],[26.75171,55.66519],[28.19092,56.13943],[27.78442,57.40946],[26.63086,57.56889]]]},{id:"sjcgis.org-General_Basemap_WM",name:"Vector Streetmap for San Juan County WA",type:"tms",template:"https://sjcgis.org/arcgis/rest/services/Basemaps/General_Basemap_WM/MapServer/tile/{zoom}/{y}/{x}",scaleExtent:[0,19],polygon:[[[-123.27402,48.69297],[-123.00773,48.76726],[-123.00762,48.83158],[-122.7835,48.75842],[-122.6934,48.65852],[-122.76745,48.60361],[-122.74484,48.38708],[-123.24822,48.28353],[-123.11452,48.42261],[-123.21904,48.54857],[-123.27402,48.69297]]],best:true,description:"Public domain street and address data from the San Juan County, WA. Updated at least quarterly."},{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.43565,44.99918],[5.43193,44.9229],[5.43624,44.92284],[5.43472,44.89001],[5.43303,44.88995],[5.43065,44.85026],[5.43387,44.85014],[5.43285,44.82638],[5.43548,44.82626],[5.43497,44.8139],[5.44106,44.81372],[5.43717,44.74098],[5.4546,44.74044],[5.45282,44.70425],[5.5211,44.70245],[5.5233,44.73858],[5.58904,44.73684],[5.59298,44.81263],[5.5879,44.81299],[5.58977,44.84947],[5.58823,44.84938],[5.58972,44.87351],[5.53863,44.87503],[5.53947,44.88686],[5.52834,44.88733],[5.53002,44.92012],[5.53319,44.92012],[5.53761,44.99624],[5.43565,44.99918]]],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.198,-9.42067],[-36.19777,-9.41789],[-36.1978,-9.41528],[-36.19801,-9.41074],[-36.19789,-9.40857],[-36.19793,-9.40637],[-36.19797,-9.40561],[-36.19793,-9.40405],[-36.19799,-9.40312],[-36.19827,-9.40028],[-36.19829,-9.39496],[-36.19789,-9.39169],[-36.19844,-9.38932],[-36.19837,-9.3862],[-36.19794,-9.38167],[-36.19801,-9.37972],[-36.19834,-9.37867],[-36.19832,-9.37698],[-36.19817,-9.37586],[-36.19852,-9.37139],[-36.19822,-9.36239],[-36.19862,-9.35319],[-36.19849,-9.35097],[-36.19857,-9.34852],[-36.1988,-9.34668],[-36.1986,-9.34349],[-36.19877,-9.34084],[-36.19895,-9.33301],[-36.19877,-9.33039],[-36.28958,-9.33114],[-36.28938,-9.33319],[-36.2895,-9.33538],[-36.28925,-9.34124],[-36.28945,-9.34291],[-36.28928,-9.34521],[-36.28897,-9.37311],[-36.28915,-9.37481],[-36.28892,-9.37708],[-36.2889,-9.38541],[-36.28872,-9.38633],[-36.28872,-9.39343],[-36.28887,-9.39558],[-36.28877,-9.40129],[-36.28862,-9.40652],[-36.28872,-9.40715],[-36.28877,-9.42133],[-36.198,-9.42067]]],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.54475,48.17286],[16.54103,48.17657],[16.54978,48.17675],[16.54665,48.17162],[16.55629,48.16171],[16.55567,48.16446],[16.56161,48.16037],[16.57306,48.16319],[16.57603,48.13522],[16.54301,48.14333],[16.51377,48.15893],[16.4777,48.15744],[16.45536,48.13951],[16.43313,48.13788],[16.43701,48.11994],[16.42291,48.12306],[16.4083,48.11791],[16.40511,48.12198],[16.3246,48.13779],[16.31181,48.11945],[16.29806,48.12896],[16.2711,48.13385],[16.23607,48.13001],[16.2189,48.12377],[16.2181,48.12807],[16.23861,48.13205],[16.23843,48.13716],[16.22081,48.13555],[16.20986,48.14762],[16.22321,48.15318],[16.19798,48.15454],[16.19619,48.16396],[16.18183,48.17112],[16.19981,48.18616],[16.20739,48.20235],[16.20194,48.20479],[16.20962,48.20963],[16.1976,48.21479],[16.19778,48.22288],[16.18517,48.2232],[16.19911,48.22858],[16.19251,48.23671],[16.20677,48.26483],[16.24105,48.24837],[16.24154,48.23832],[16.25662,48.23988],[16.27043,48.25193],[16.26406,48.25492],[16.28556,48.25832],[16.29412,48.26395],[16.28617,48.2667],[16.28901,48.27051],[16.32741,48.27721],[16.34813,48.29048],[16.35351,48.28369],[16.3706,48.2817],[16.36714,48.28685],[16.37787,48.28832],[16.37557,48.29592],[16.37982,48.30201],[16.38536,48.30146],[16.38043,48.31507],[16.39518,48.32257],[16.39412,48.31926],[16.40287,48.31676],[16.41682,48.32253],[16.43803,48.31628],[16.44041,48.29192],[16.47547,48.27501],[16.48123,48.27343],[16.4835,48.27971],[16.48132,48.29351],[16.49645,48.29249],[16.51491,48.28554],[16.5067,48.2736],[16.51285,48.26784],[16.53263,48.2621],[16.54697,48.263],[16.53941,48.24284],[16.55274,48.239],[16.53627,48.20044],[16.54184,48.18206],[16.53631,48.17755],[16.54475,48.17286]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif",overlay:true},{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.54475,48.17286],[16.54103,48.17657],[16.54978,48.17675],[16.54665,48.17162],[16.55629,48.16171],[16.55567,48.16446],[16.56161,48.16037],[16.57306,48.16319],[16.57603,48.13522],[16.54301,48.14333],[16.51377,48.15893],[16.4777,48.15744],[16.45536,48.13951],[16.43313,48.13788],[16.43701,48.11994],[16.42291,48.12306],[16.4083,48.11791],[16.40511,48.12198],[16.3246,48.13779],[16.31181,48.11945],[16.29806,48.12896],[16.2711,48.13385],[16.23607,48.13001],[16.2189,48.12377],[16.2181,48.12807],[16.23861,48.13205],[16.23843,48.13716],[16.22081,48.13555],[16.20986,48.14762],[16.22321,48.15318],[16.19798,48.15454],[16.19619,48.16396],[16.18183,48.17112],[16.19981,48.18616],[16.20739,48.20235],[16.20194,48.20479],[16.20962,48.20963],[16.1976,48.21479],[16.19778,48.22288],[16.18517,48.2232],[16.19911,48.22858],[16.19251,48.23671],[16.20677,48.26483],[16.24105,48.24837],[16.24154,48.23832],[16.25662,48.23988],[16.27043,48.25193],[16.26406,48.25492],[16.28556,48.25832],[16.29412,48.26395],[16.28617,48.2667],[16.28901,48.27051],[16.32741,48.27721],[16.34813,48.29048],[16.35351,48.28369],[16.3706,48.2817],[16.36714,48.28685],[16.37787,48.28832],[16.37557,48.29592],[16.37982,48.30201],[16.38536,48.30146],[16.38043,48.31507],[16.39518,48.32257],[16.39412,48.31926],[16.40287,48.31676],[16.41682,48.32253],[16.43803,48.31628],[16.44041,48.29192],[16.47547,48.27501],[16.48123,48.27343],[16.4835,48.27971],[16.48132,48.29351],[16.49645,48.29249],[16.51491,48.28554],[16.5067,48.2736],[16.51285,48.26784],[16.53263,48.2621],[16.54697,48.263],[16.53941,48.24284],[16.55274,48.239],[16.53627,48.20044],[16.54184,48.18206],[16.53631,48.17755],[16.54475,48.17286]]],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.14995,48.10832],[16.14989,48.33315],[16.61873,48.33296],[16.61749,48.10813],[16.46644,48.10819],[16.46644,48.10744],[16.18104,48.10756],[16.18104,48.10831],[16.14995,48.10832]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{id:"Ville_de_Nyon-HD-2010",name:"Ville de Nyon - Orthophoto 2010 HD 5cm/pi",type:"tms",template:"http://osmdata.asitvd.ch/tiles/nyon2010/{zoom}/{x}/{y}.png",endDate:"2010-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",scaleExtent:[14,20],polygon:[[[6.24859,46.38252],[6.24848,46.38715],[6.24378,46.38944],[6.24182,46.39109],[6.2414,46.39159],[6.23919,46.39222],[6.23973,46.39373],[6.2379,46.3946],[6.23713,46.39698],[6.23071,46.40107],[6.22789,46.39903],[6.22326,46.40219],[6.22066,46.40189],[6.21582,46.40462],[6.21393,46.40698],[6.20989,46.40563],[6.20928,46.40528],[6.20985,46.40434],[6.20501,46.40332],[6.20527,46.40104],[6.20906,46.40131],[6.20951,46.4013],[6.2149,46.4008],[6.21154,46.39808],[6.21057,46.3968],[6.20954,46.39449],[6.21229,46.39243],[6.21374,46.39168],[6.21639,46.39079],[6.21296,46.38736],[6.21532,46.38514],[6.21403,46.38424],[6.2126,46.38232],[6.21211,46.38102],[6.21212,46.37992],[6.21231,46.37901],[6.21318,46.37697],[6.21454,46.37494],[6.21359,46.37463],[6.21365,46.37276],[6.22133,46.3699],[6.22752,46.36555],[6.22752,46.36541],[6.23738,46.37356],[6.24404,46.37842],[6.24859,46.38252]]],terms_url:"http://www.nyon.ch/fr/officiel/services-offices/informatique-et-population-776-3911",terms_text:"Ville de Nyon"},{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.96805,47.54631],[9.96809,47.54627],[9.97125,47.54425],[9.96484,47.53803],[9.9684,47.52802],[9.96526,47.52089],[9.99569,47.50278],[9.98736,47.49847],[10.00076,47.48211],[10.02301,47.48411],[10.03743,47.48918],[10.04477,47.48762],[10.05413,47.47589],[10.05347,47.46686],[10.06468,47.46364],[10.06999,47.45595],[10.08057,47.45536],[10.08857,47.46029],[10.09164,47.45893],[10.09385,47.44046],[10.10559,47.42872],[10.09374,47.41688],[10.07418,47.41472],[10.06914,47.41018],[10.08624,47.39952],[10.08284,47.39381],[10.09984,47.35476],[10.11934,47.37561],[10.14169,47.36718],[10.16587,47.36887],[10.16958,47.3713],[10.1694,47.38583],[10.1813,47.38725],[10.18185,47.39243],[10.19508,47.38935],[10.19988,47.38334],[10.21259,47.38039],[10.22705,47.38889],[10.23619,47.38192],[10.23168,47.37897],[10.23716,47.37357],[10.21699,47.35436],[10.2171,47.34988],[10.20424,47.33675],[10.20742,47.33232],[10.19951,47.32646],[10.21113,47.31898],[10.21597,47.31106],[10.21236,47.31122],[10.19913,47.29754],[10.18964,47.29394],[10.17961,47.29603],[10.17208,47.27908],[10.17404,47.27025],[10.17834,47.27011],[10.17449,47.2637],[10.21884,47.25533],[10.22343,47.24983],[10.21087,47.2478],[10.19776,47.23666],[10.20791,47.2328],[10.21428,47.21684],[10.21269,47.20432],[10.19963,47.19539],[10.19951,47.18525],[10.21151,47.17124],[10.2092,47.16537],[10.20851,47.15948],[10.21321,47.1577],[10.2222,47.15323],[10.22166,47.14925],[10.21481,47.14352],[10.20333,47.14215],[10.20887,47.13164],[10.18629,47.12886],[10.18652,47.11946],[10.17288,47.12033],[10.16299,47.11361],[10.15766,47.11426],[10.15442,47.10578],[10.13243,47.08122],[10.13459,47.06392],[10.15085,47.06184],[10.15693,47.04883],[10.14418,47.03355],[10.12326,47.02209],[10.13284,47.01204],[10.15447,47.00545],[10.15961,46.99882],[10.15442,46.99299],[10.16001,46.984],[10.14463,46.98301],[10.13492,46.96584],[10.13501,46.95483],[10.12684,46.9435],[10.09772,46.92676],[10.09954,46.91712],[10.10921,46.90834],[10.10908,46.89431],[10.12497,46.88014],[10.14147,46.87468],[10.13967,46.86217],[10.14506,46.8511],[10.13941,46.84738],[10.12309,46.84848],[10.11912,46.84417],[10.10518,46.8409],[10.09195,46.85143],[10.09265,46.85818],[10.08712,46.86128],[10.05488,46.8617],[10.0509,46.86442],[10.05192,46.87405],[10.03891,46.88611],[10.03221,46.88802],[10.01782,46.90161],[10.00494,46.89889],[9.98243,46.9062],[9.97793,46.91603],[9.96657,46.91222],[9.95907,46.91602],[9.94612,46.91235],[9.93758,46.91324],[9.92153,46.91882],[9.91231,46.92606],[9.90632,46.9253],[9.89449,46.93164],[9.87613,46.93463],[9.88071,46.94011],[9.87657,46.94071],[9.87488,46.95039],[9.87872,46.95707],[9.87073,46.96321],[9.88482,46.98546],[9.8923,46.99036],[9.88878,47.00072],[9.8707,47.00965],[9.87115,47.01306],[9.88035,47.01722],[9.87779,47.02055],[9.85974,47.02321],[9.85273,47.01641],[9.83612,47.01253],[9.82353,47.01986],[9.80756,47.02356],[9.78491,47.03849],[9.74808,47.03692],[9.74185,47.04268],[9.71821,47.04337],[9.70701,47.04805],[9.7076,47.05381],[9.69756,47.05239],[9.68392,47.05765],[9.68184,47.0621],[9.67743,47.06141],[9.65821,47.05818],[9.64506,47.05978],[9.64158,47.05598],[9.63654,47.0517],[9.62633,47.05133],[9.60705,47.06077],[9.6134,47.0695],[9.61153,47.0794],[9.61869,47.07817],[9.62339,47.08258],[9.63346,47.08344],[9.63564,47.09553],[9.62858,47.10756],[9.62083,47.11032],[9.63503,47.12813],[9.62467,47.13265],[9.62258,47.14135],[9.62587,47.1459],[9.62059,47.15164],[9.6089,47.14775],[9.59679,47.16294],[9.57946,47.17116],[9.56456,47.17029],[9.57302,47.1756],[9.57259,47.19079],[9.58032,47.19578],[9.58477,47.20532],[9.5687,47.21968],[9.55851,47.22416],[9.55176,47.22377],[9.56679,47.24288],[9.53073,47.27058],[9.54619,47.28005],[9.55634,47.29829],[9.58805,47.3173],[9.59966,47.3455],[9.61073,47.35571],[9.62446,47.36615],[9.65876,47.36946],[9.67255,47.38021],[9.67311,47.39194],[9.65162,47.40463],[9.64551,47.4312],[9.64512,47.4378],[9.65799,47.44779],[9.65898,47.4522],[9.62234,47.45747],[9.60904,47.47054],[9.60292,47.46198],[9.59514,47.46331],[9.58217,47.48276],[9.5622,47.49592],[9.55057,47.53718],[9.5827,47.53592],[9.60465,47.52952],[9.73478,47.53396],[9.73517,47.54661],[9.74164,47.55499],[9.7471,47.55569],[9.74337,47.55867],[9.75207,47.56747],[9.74806,47.57052],[9.75632,47.57262],[9.75633,47.57963],[9.76197,47.58096],[9.76553,47.58912],[9.76933,47.58739],[9.77697,47.59544],[9.79151,47.59352],[9.79999,47.59611],[9.81414,47.58807],[9.82381,47.5871],[9.82728,47.57997],[9.82079,47.57076],[9.82562,47.55922],[9.8171,47.55333],[9.81579,47.54767],[9.85023,47.54164],[9.85839,47.53388],[9.87451,47.52854],[9.87804,47.53876],[9.87515,47.54343],[9.88125,47.54814],[9.8891,47.54399],[9.89935,47.54475],[9.90666,47.54217],[9.91358,47.53255],[9.92189,47.52964],[9.93352,47.53265],[9.94108,47.53822],[9.9637,47.53472],[9.95883,47.54313],[9.96318,47.54229],[9.96805,47.54631]]],terms_url:"http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{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.96805,47.54631],[9.96809,47.54627],[9.97125,47.54425],[9.96484,47.53803],[9.9684,47.52802],[9.96526,47.52089],[9.99569,47.50278],[9.98736,47.49847],[10.00076,47.48211],[10.02301,47.48411],[10.03743,47.48918],[10.04477,47.48762],[10.05413,47.47589],[10.05347,47.46686],[10.06468,47.46364],[10.06999,47.45595],[10.08057,47.45536],[10.08857,47.46029],[10.09164,47.45893],[10.09385,47.44046],[10.10559,47.42872],[10.09374,47.41688],[10.07418,47.41472],[10.06914,47.41018],[10.08624,47.39952],[10.08284,47.39381],[10.09984,47.35476],[10.11934,47.37561],[10.14169,47.36718],[10.16587,47.36887],[10.16958,47.3713],[10.1694,47.38583],[10.1813,47.38725],[10.18185,47.39243],[10.19508,47.38935],[10.19988,47.38334],[10.21259,47.38039],[10.22705,47.38889],[10.23619,47.38192],[10.23168,47.37897],[10.23716,47.37357],[10.21699,47.35436],[10.2171,47.34988],[10.20424,47.33675],[10.20742,47.33232],[10.19951,47.32646],[10.21113,47.31898],[10.21597,47.31106],[10.21236,47.31122],[10.19913,47.29754],[10.18964,47.29394],[10.17961,47.29603],[10.17208,47.27908],[10.17404,47.27025],[10.17834,47.27011],[10.17449,47.2637],[10.21884,47.25533],[10.22343,47.24983],[10.21087,47.2478],[10.19776,47.23666],[10.20791,47.2328],[10.21428,47.21684],[10.21269,47.20432],[10.19963,47.19539],[10.19951,47.18525],[10.21151,47.17124],[10.2092,47.16537],[10.20851,47.15948],[10.21321,47.1577],[10.2222,47.15323],[10.22166,47.14925],[10.21481,47.14352],[10.20333,47.14215],[10.20887,47.13164],[10.18629,47.12886],[10.18652,47.11946],[10.17288,47.12033],[10.16299,47.11361],[10.15766,47.11426],[10.15442,47.10578],[10.13243,47.08122],[10.13459,47.06392],[10.15085,47.06184],[10.15693,47.04883],[10.14418,47.03355],[10.12326,47.02209],[10.13284,47.01204],[10.15447,47.00545],[10.15961,46.99882],[10.15442,46.99299],[10.16001,46.984],[10.14463,46.98301],[10.13492,46.96584],[10.13501,46.95483],[10.12684,46.9435],[10.09772,46.92676],[10.09954,46.91712],[10.10921,46.90834],[10.10908,46.89431],[10.12497,46.88014],[10.14147,46.87468],[10.13967,46.86217],[10.14506,46.8511],[10.13941,46.84738],[10.12309,46.84848],[10.11912,46.84417],[10.10518,46.8409],[10.09195,46.85143],[10.09265,46.85818],[10.08712,46.86128],[10.05488,46.8617],[10.0509,46.86442],[10.05192,46.87405],[10.03891,46.88611],[10.03221,46.88802],[10.01782,46.90161],[10.00494,46.89889],[9.98243,46.9062],[9.97793,46.91603],[9.96657,46.91222],[9.95907,46.91602],[9.94612,46.91235],[9.93758,46.91324],[9.92153,46.91882],[9.91231,46.92606],[9.90632,46.9253],[9.89449,46.93164],[9.87613,46.93463],[9.88071,46.94011],[9.87657,46.94071],[9.87488,46.95039],[9.87872,46.95707],[9.87073,46.96321],[9.88482,46.98546],[9.8923,46.99036],[9.88878,47.00072],[9.8707,47.00965],[9.87115,47.01306],[9.88035,47.01722],[9.87779,47.02055],[9.85974,47.02321],[9.85273,47.01641],[9.83612,47.01253],[9.82353,47.01986],[9.80756,47.02356],[9.78491,47.03849],[9.74808,47.03692],[9.74185,47.04268],[9.71821,47.04337],[9.70701,47.04805],[9.7076,47.05381],[9.69756,47.05239],[9.68392,47.05765],[9.68184,47.0621],[9.67743,47.06141],[9.65821,47.05818],[9.64506,47.05978],[9.64158,47.05598],[9.63654,47.0517],[9.62633,47.05133],[9.60705,47.06077],[9.6134,47.0695],[9.61153,47.0794],[9.61869,47.07817],[9.62339,47.08258],[9.63346,47.08344],[9.63564,47.09553],[9.62858,47.10756],[9.62083,47.11032],[9.63503,47.12813],[9.62467,47.13265],[9.62258,47.14135],[9.62587,47.1459],[9.62059,47.15164],[9.6089,47.14775],[9.59679,47.16294],[9.57946,47.17116],[9.56456,47.17029],[9.57302,47.1756],[9.57259,47.19079],[9.58032,47.19578],[9.58477,47.20532],[9.5687,47.21968],[9.55851,47.22416],[9.55176,47.22377],[9.56679,47.24288],[9.53073,47.27058],[9.54619,47.28005],[9.55634,47.29829],[9.58805,47.3173],[9.59966,47.3455],[9.61073,47.35571],[9.62446,47.36615],[9.65876,47.36946],[9.67255,47.38021],[9.67311,47.39194],[9.65162,47.40463],[9.64551,47.4312],[9.64512,47.4378],[9.65799,47.44779],[9.65898,47.4522],[9.62234,47.45747],[9.60904,47.47054],[9.60292,47.46198],[9.59514,47.46331],[9.58217,47.48276],[9.5622,47.49592],[9.55057,47.53718],[9.5827,47.53592],[9.60465,47.52952],[9.73478,47.53396],[9.73517,47.54661],[9.74164,47.55499],[9.7471,47.55569],[9.74337,47.55867],[9.75207,47.56747],[9.74806,47.57052],[9.75632,47.57262],[9.75633,47.57963],[9.76197,47.58096],[9.76553,47.58912],[9.76933,47.58739],[9.77697,47.59544],[9.79151,47.59352],[9.79999,47.59611],[9.81414,47.58807],[9.82381,47.5871],[9.82728,47.57997],[9.82079,47.57076],[9.82562,47.55922],[9.8171,47.55333],[9.81579,47.54767],[9.85023,47.54164],[9.85839,47.53388],[9.87451,47.52854],[9.87804,47.53876],[9.87515,47.54343],[9.88125,47.54814],[9.8891,47.54399],[9.89935,47.54475],[9.90666,47.54217],[9.91358,47.53255],[9.92189,47.52964],[9.93352,47.53265],[9.94108,47.53822],[9.9637,47.53472],[9.95883,47.54313],[9.96318,47.54229],[9.96805,47.54631]]],terms_url:"http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{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.54367,47.48479],[9.61451,47.45058],[9.61359,47.38272],[9.44246,47.24798],[9.44614,47.096],[9.42866,47.08911],[9.42498,47.01513],[9.85281,47.00196],[9.85741,46.89896],[9.9669,46.88952],[10.04511,46.8499],[10.15828,46.83353],[10.1592,46.89204],[10.14718,46.89248],[10.15115,46.94331],[10.16317,46.94287],[10.1647,46.96238],[10.17852,46.96681],[10.17576,47.10351],[10.22912,47.10226],[10.22084,47.24361],[10.26133,47.41261],[10.12423,47.40576],[10.09387,47.47795],[10.00462,47.50717],[9.98622,47.56121],[9.84361,47.56245],[9.84085,47.60714],[9.53999,47.60652],[9.54367,47.48479]]],terms_url:"http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{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.54367,47.48479],[9.61451,47.45058],[9.61359,47.38272],[9.44246,47.24798],[9.44614,47.096],[9.42866,47.08911],[9.42498,47.01513],[9.85281,47.00196],[9.85741,46.89896],[9.9669,46.88952],[10.04511,46.8499],[10.15828,46.83353],[10.1592,46.89204],[10.14718,46.89248],[10.15115,46.94331],[10.16317,46.94287],[10.1647,46.96238],[10.17852,46.96681],[10.17576,47.10351],[10.22912,47.10226],[10.22084,47.24361],[10.26133,47.41261],[10.12423,47.40576],[10.09387,47.47795],[10.00462,47.50717],[9.98622,47.56121],[9.84361,47.56245],[9.84085,47.60714],[9.53999,47.60652],[9.54367,47.48479]]],terms_url:"http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{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.17039,46.82979],[10.17108,46.93644],[10.18413,46.94113],[10.1855,47.10157],[10.23906,47.10437],[10.24283,47.15611],[10.25691,47.18704],[10.24558,47.27597],[10.25313,47.32347],[10.26893,47.32626],[10.26446,47.41102],[10.13194,47.4087],[10.13434,47.46107],[10.11752,47.46153],[10.11889,47.47337],[10.08731,47.47429],[10.08491,47.50724],[10.06843,47.507],[10.0674,47.5215],[10.02345,47.52428],[10.00079,47.57943],[9.84904,47.57757],[9.85042,47.61462],[9.72751,47.61277],[9.7203,47.59089],[9.70347,47.58915],[9.70313,47.54491],[9.68219,47.54491],[9.68047,47.55348],[9.56391,47.54931],[9.56202,47.53958],[9.55172,47.53958],[9.55172,47.53402],[9.52168,47.53471],[9.52701,47.30497],[9.50503,47.30264],[9.50091,47.23368],[9.52357,47.23228],[9.52426,47.16557],[9.54486,47.16405],[9.54383,47.15448],[9.57232,47.15401],[9.57026,47.12809],[9.59018,47.12867],[9.59189,47.10029],[9.57232,47.10017],[9.57713,47.02861],[9.72407,47.03048],[9.72304,47.01749],[9.77454,47.01562],[9.77626,47.00555],[9.79274,47.00391],[9.7948,46.99127],[9.83874,46.99314],[9.84012,46.90349],[9.89024,46.90725],[9.88543,46.88707],[9.95925,46.89141],[9.962,46.87675],[10.0001,46.87862],[9.99667,46.85715],[10.01864,46.85656],[10.02345,46.83073],[10.17039,46.82979]]],terms_url:"http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"wroclaw-orto2015",name:"Wrocław: Orthophotomap 2015 (aerial image)",type:"wms",template:"http://gis1.um.wroc.pl/arcgis/services/ogc/OGC_ortofoto_2015/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,23],polygon:[[[17.14217,51.12846],[17.15659,51.1499],[17.15933,51.16056],[17.15899,51.17886],[17.14371,51.18155],[17.13024,51.18128],[17.12466,51.17396],[17.11436,51.17746],[17.0778,51.17746],[17.07642,51.1766],[17.07548,51.16825],[17.06698,51.16745],[17.04698,51.17493],[17.03376,51.17729],[17.02741,51.17729],[17.02733,51.18246],[17.02252,51.18816],[17.01299,51.18816],[17.0093,51.18499],[17.00312,51.18504],[17.00261,51.20016],[16.99162,51.20559],[16.97008,51.20763],[16.96424,51.20989],[16.95394,51.20968],[16.94656,51.20586],[16.9233,51.2001],[16.90811,51.21043],[16.89927,51.21027],[16.89292,51.2071],[16.88322,51.2071],[16.88073,51.20489],[16.88047,51.19666],[16.88322,51.19048],[16.87403,51.18719],[16.87026,51.18203],[16.85455,51.18031],[16.8421,51.18488],[16.82434,51.18467],[16.82056,51.17875],[16.82099,51.16373],[16.82502,51.15647],[16.80915,51.15194],[16.80657,51.14613],[16.80648,51.1366],[16.80769,51.13595],[16.81687,51.13601],[16.8161,51.13337],[16.81636,51.12459],[16.82932,51.12329],[16.83266,51.11834],[16.82923,51.11386],[16.82923,51.10993],[16.83215,51.10869],[16.84949,51.10826],[16.85661,51.09899],[16.87901,51.09252],[16.88862,51.09258],[16.89197,51.09667],[16.92107,51.09662],[16.9209,51.09263],[16.91661,51.0812],[16.91686,51.07942],[16.93514,51.07948],[16.93849,51.0736],[16.95248,51.06686],[16.95068,51.05806],[16.95454,51.05369],[16.96188,51.0473],[16.96879,51.04568],[16.98072,51.04584],[16.98424,51.05197],[16.99969,51.04668],[17.00776,51.04422],[17.01973,51.04169],[17.03286,51.0419],[17.03415,51.04673],[17.04509,51.04339],[17.06363,51.04339],[17.07037,51.05286],[17.08363,51.04428],[17.095,51.04368],[17.10633,51.04376],[17.10835,51.04684],[17.10822,51.05377],[17.10226,51.05868],[17.11136,51.0716],[17.12341,51.07179],[17.12299,51.07856],[17.15088,51.07861],[17.17277,51.09344],[17.17277,51.09956],[17.17697,51.10303],[17.17676,51.1092],[17.16363,51.1203],[17.14217,51.12846]]],terms_text:"Urząd Miasta Wrocław",icon:"https://i.imgur.com/PRqROXB.png"},{id:"Zabrze-2011",name:"Zabrze: Orthophotomap 2011 (aerial image)",type:"wms",template:"http://siot.um.zabrze.pl/arcgis/services/UMZ_Ortofoto_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:4326",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",scaleExtent:[0,23],polygon:[[[18.74396,50.2753],[18.75586,50.27523],[18.75578,50.27633],[18.74516,50.28105],[18.74609,50.28886],[18.75084,50.28948],[18.74832,50.2957],[18.73379,50.29618],[18.73208,50.31571],[18.73613,50.31646],[18.73882,50.32763],[18.73725,50.33016],[18.73121,50.33169],[18.73054,50.3344],[18.73422,50.3371],[18.73428,50.34097],[18.73866,50.34308],[18.75419,50.34182],[18.75982,50.34624],[18.75438,50.34744],[18.75119,50.34979],[18.74603,50.36876],[18.75705,50.3692],[18.7639,50.36754],[18.77263,50.37628],[18.78436,50.37077],[18.78713,50.37295],[18.79821,50.37048],[18.80466,50.37561],[18.80165,50.37718],[18.80164,50.38222],[18.80509,50.38317],[18.81527,50.38167],[18.81446,50.37515],[18.82183,50.36883],[18.81737,50.36802],[18.82104,50.35843],[18.8159,50.35336],[18.81687,50.35076],[18.82294,50.35156],[18.83281,50.34962],[18.83474,50.3443],[18.84615,50.34448],[18.86293,50.32852],[18.8607,50.32776],[18.85088,50.33191],[18.84578,50.32923],[18.84891,50.32352],[18.83179,50.32028],[18.83192,50.30483],[18.84451,50.30286],[18.84429,50.29627],[18.82282,50.28615],[18.82845,50.28482],[18.82745,50.27972],[18.82322,50.27994],[18.8214,50.27414],[18.81392,50.27309],[18.79981,50.27351],[18.7987,50.2613],[18.7923,50.24641],[18.78261,50.24583],[18.76416,50.25145],[18.75396,50.25669],[18.75004,50.26402],[18.73991,50.26738],[18.73421,50.27084],[18.74396,50.2753]]],terms_text:"Urząd Miasta Zabrza"}];
23658 var presets = {aerialway:{fields:["aerialway"],geometry:["point","vertex","line"],tags:{aerialway:"*"},terms:["ski lift","funifor","funitel"],searchable:false,name:"Aerialway"},aeroway:{icon:"maki-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"},"advertising/column":{fields:["direction","lit"],geometry:["point","area"],tags:{advertising:"column"},name:"Advertising Column"},"aerialway/station":{icon:"maki-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:"maki-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:"maki-airport",geometry:["area"],terms:["ramp"],fields:["ref","surface"],tags:{aeroway:"apron"},name:"Apron"},"aeroway/gate":{icon:"maki-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:"maki-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:"maki-airport",geometry:["point","area"],terms:["airport","aerodrome"],fields:["name","operator","building_area"],tags:{aeroway:"terminal"},name:"Airport Terminal"},"allotments/plot":{geometry:["area"],fields:["name","ref"],tags:{allotments:"plot"},reference:{key:"allotments",value:"plot"},name:"Community Garden Plot"},"amenity/bus_station":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-swimming",geometry:["point","vertex","area"],tags:{amenity:"swimming_pool"},reference:{key:"leisure",value:"swimming_pool"},name:"Swimming Pool",searchable:false},"amenity/animal_boarding":{icon:"maki-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:"maki-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:"maki-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:"maki-theatre",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],terms:[],tags:{amenity:"arts_centre"},name:"Arts Center"},"amenity/atm":{icon:"maki-bank",fields:["operator","currency_multi","drive_through"],geometry:["point","vertex"],terms:["money","cash","machine"],tags:{amenity:"atm"},name:"ATM"},"amenity/bank":{icon:"maki-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:"maki-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:"maki-bbq",fields:["covered","fuel"],geometry:["point"],terms:["bbq","grill"],tags:{amenity:"bbq"},name:"Barbecue/Grill"},"amenity/bench":{icon:"temaki-bench",fields:["backrest"],geometry:["point","vertex","line"],terms:["seat"],tags:{amenity:"bench"},name:"Bench"},"amenity/bicycle_parking":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-bank",fields:["name","currency_multi","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["bureau de change","money changer"],tags:{amenity:"bureau_de_change"},name:"Currency Exchange"},"amenity/cafe":{icon:"maki-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:"maki-car",fields:["name","operator","capacity"],geometry:["point","area"],tags:{amenity:"car_pooling"},name:"Car Pooling"},"amenity/car_rental":{icon:"maki-car",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental"},name:"Car Rental"},"amenity/car_sharing":{icon:"maki-car",fields:["name","operator","capacity","payment_multi"],geometry:["point","area"],tags:{amenity:"car_sharing"},name:"Car Sharing"},"amenity/car_wash":{icon:"maki-car",fields:["address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"car_wash"},name:"Car Wash"},"amenity/casino":{icon:"temaki-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:"maki-car",fields:["operator","capacity"],geometry:["point"],tags:{amenity:"charging_station"},terms:["EV","Electric Vehicle","Supercharger"],name:"Charging Station"},"amenity/childcare":{icon:"maki-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:"maki-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:"maki-doctor",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:"maki-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:"maki-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:"temaki-clock",fields:["name","support","display","visibility","date","faces"],geometry:["point","vertex"],tags:{amenity:"clock"},name:"Clock"},"amenity/college":{icon:"maki-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:"maki-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:"maki-car",geometry:["point","area"],tags:{amenity:"compressed_air"},name:"Compressed Air"},"amenity/courthouse":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],geometry:["point","area"],tags:{amenity:"courthouse"},name:"Courthouse"},"amenity/crematorium":{icon:"maki-cemetery",fields:["name","website","phone","opening_hours","wheelchair"],geometry:["area","point"],tags:{amenity:"crematorium"},terms:["cemetery","funeral"],name:"Crematorium"},"amenity/dentist":{icon:"maki-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:"maki-doctor",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:"maki-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:"maki-drinking-water",geometry:["point"],tags:{amenity:"drinking_water"},terms:["fountain","potable"],name:"Drinking Water"},"amenity/driving_school":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"driving_school"},name:"Driving School"},"amenity/embassy":{icon:"maki-embassy",fields:["name","country","address","building_area"],geometry:["point","area"],tags:{amenity:"embassy"},name:"Embassy"},"amenity/fast_food":{icon:"maki-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:"maki-fire-station",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:[],tags:{amenity:"fire_station"},name:"Fire Station"},"amenity/food_court":{icon:"maki-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:"temaki-fountain",fields:["name"],geometry:["point","area"],tags:{amenity:"fountain"},name:"Fountain"},"amenity/fuel":{icon:"maki-fuel",fields:["name","brand","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:"maki-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:"maki-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:"temaki-binoculars",geometry:["point","vertex","area"],terms:["game","gun","lookout","rifle","shoot*","wild","watch"],tags:{amenity:"hunting_stand"},name:"Hunting Stand"},"amenity/ice_cream":{icon:"maki-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:"temaki-antenna",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:"maki-school",fields:["name","operator","address"],geometry:["point","area"],terms:["kindergarden","pre-school"],tags:{amenity:"kindergarten"},name:"Preschool/Kindergarten Grounds"},"amenity/library":{icon:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building","opening_hours"],geometry:["point","area"],tags:{amenity:"marketplace"},name:"Marketplace"},"amenity/monastery":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area"],geometry:["point","area"],terms:["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","monastery","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],tags:{amenity:"monastery"},name:"Monastery Grounds"},"amenity/motorcycle_parking":{icon:"fas-motorcycle",fields:["capacity","operator","covered","access_simple"],geometry:["point","vertex","area"],tags:{amenity:"motorcycle_parking"},name:"Motorcycle Parking"},"amenity/music_school":{icon:"maki-school",fields:["name","operator","address"],geometry:["point","area"],terms:["school of music"],tags:{amenity:"music_school"},name:"Music School"},"amenity/nightclub":{icon:"maki-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:"maki-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:"maki-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:"maki-shelter",fields:["bin","bench"],geometry:["point","vertex","area"],tags:{amenity:"shelter",shelter_type:"pavilion"},name:"Pavilion"},"amenity/pharmacy":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"temaki-hinduism",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:"maki-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:"maki-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:"temaki-shinto",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:"temaki-sikhism",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:"temaki-taoism",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:"maki-museum",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["museum","astronomy","observatory"],tags:{amenity:"planetarium"},name:"Planetarium"},"amenity/police":{icon:"maki-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:"maki-post",fields:["operator","collection_times","drive_through","ref"],geometry:["point","vertex"],tags:{amenity:"post_box"},terms:["letter","post"],name:"Mailbox"},"amenity/post_office":{icon:"maki-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:"maki-prison",fields:["name","operator","address"],geometry:["point","area"],terms:["cell","jail"],tags:{amenity:"prison"},name:"Prison Grounds"},"amenity/pub":{icon:"maki-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:"maki-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:"maki-library",fields:["name","operator","capacity","website"],geometry:["point","area"],terms:["library","bookcrossing"],tags:{amenity:"public_bookcase"},name:"Public Bookcase"},"amenity/ranger_station":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"temaki-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:"maki-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:"maki-shelter",fields:["name","shelter_type","building_area","bench","bin"],geometry:["point","vertex","area"],terms:["lean-to","gazebo","picnic"],tags:{amenity:"shelter"},name:"Shelter"},"amenity/shower":{icon:"temaki-shower",fields:["operator","opening_hours","fee","supervised","building_area"],geometry:["point","vertex","area"],terms:["rain closet"],tags:{amenity:"shower"},name:"Shower"},"amenity/smoking_area":{icon:"fas-smoking",fields:["name","shelter","bin","bench","opening_hours"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"smoking_area"},name:"Smoking Area"},"amenity/social_facility":{icon:"temaki-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:"temaki-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:"maki-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:"temaki-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:"maki-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:"maki-karaoke",fields:["name","studio","address","building_area"],geometry:["point","area"],terms:["recording","radio","television"],tags:{amenity:"studio"},name:"Studio"},"amenity/taxi":{icon:"fas-taxi",fields:["name","operator","capacity"],geometry:["point","vertex","area"],terms:["cab"],tags:{amenity:"taxi"},name:"Taxi Stand"},"amenity/telephone":{icon:"maki-telephone",fields:["operator","phone","fee","payment_multi","covered","indoor","booth"],geometry:["point","vertex"],tags:{amenity:"telephone"},terms:["phone"],name:"Telephone"},"amenity/theatre":{icon:"maki-theatre",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:["theatre","performance","play","musical"],tags:{amenity:"theatre"},name:"Theater"},"amenity/toilets":{icon:"maki-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:"maki-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:"maki-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:"temaki-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:"temaki-vending_machine",fields:["vending","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:"temaki-vending_machine",fields:["vending","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/coffee":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["coffee"],tags:{amenity:"vending_machine",vending:"coffee"},reference:{key:"vending",value:"coffee"},name:"Coffee Vending Machine"},"amenity/vending_machine/condoms":{icon:"temaki-vending_machine",fields:["vending","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:"temaki-vending_machine",fields:["vending","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/electronics":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["cable","charger","earbud","headphone","phone","tablet"],tags:{amenity:"vending_machine",vending:"electronics"},reference:{key:"vending",value:"electronics"},name:"Electronics Vending Machine"},"amenity/vending_machine/elongated_coin":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["coin","crush","elongated","flatten","penny","souvenir"],tags:{amenity:"vending_machine",vending:"elongated_coin"},reference:{key:"vending",value:"elongated_coin"},name:"Flat Coin Vending Machine"},"amenity/vending_machine/excrement_bags":{icon:"temaki-vending_machine",fields:["vending","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:"temaki-vending_machine",fields:["vending","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/food":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["food"],tags:{amenity:"vending_machine",vending:"food"},reference:{key:"vending",value:"food"},name:"Food Vending Machine"},"amenity/vending_machine/fuel":{icon:"maki-fuel",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],tags:{amenity:"vending_machine",vending:"fuel"},reference:{key:"vending",value:"fuel"},name:"Gas Pump"},"amenity/vending_machine/ice_cream":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["chocolate","ice cream","frozen","popsicle","vanilla"],tags:{amenity:"vending_machine",vending:"ice_cream"},reference:{key:"vending",value:"ice_cream"},name:"Ice Cream Vending Machine"},"amenity/vending_machine/newspapers":{icon:"temaki-vending_machine",fields:["vending","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:"temaki-vending_machine",fields:["vending","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:"temaki-vending_machine",fields:["vending","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:"temaki-vending_machine",fields:["vending","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/stamps":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["mail","postage","stamp"],tags:{amenity:"vending_machine",vending:"stamps"},reference:{key:"vending",value:"stamps"},name:"Postage Vending Machine"},"amenity/vending_machine/sweets":{icon:"temaki-vending_machine",fields:["vending","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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-drinking-water",geometry:["area","vertex","point"],tags:{amenity:"water_point"},name:"RV Drinking Water"},"amenity/watering_place":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"temaki-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/maze":{icon:"maki-amusement-park",fields:["name","operator"],geometry:["point","area"],terms:["theme park","amusement ride","labyrinth"],tags:{attraction:"maze"},name:"Maze"},"attraction/pirate_ship":{icon:"maki-danger",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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-roadblock",geometry:["point","vertex","line","area"],tags:{barrier:"*"},fields:["barrier"],name:"Barrier",matchScore:0.4},"barrier/entrance":{icon:"maki-entrance-alt1",geometry:["vertex"],tags:{barrier:"entrance"},name:"Entrance",searchable:false},"barrier/block":{icon:"maki-roadblock",fields:["access"],geometry:["point","vertex"],tags:{barrier:"block"},name:"Block"},"barrier/bollard":{icon:"maki-roadblock",fields:["access"],geometry:["point","vertex","line"],tags:{barrier:"bollard"},name:"Bollard"},"barrier/border_control":{icon:"maki-roadblock",fields:["access","building_area"],geometry:["vertex","area"],tags:{barrier:"border_control"},name:"Border Control"},"barrier/cattle_grid":{icon:"maki-barrier",geometry:["vertex"],tags:{barrier:"cattle_grid"},name:"Cattle Grid"},"barrier/city_wall":{icon:"maki-barrier",fields:["height"],geometry:["line","area"],tags:{barrier:"city_wall"},name:"City Wall"},"barrier/cycle_barrier":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],tags:{barrier:"cycle_barrier"},name:"Cycle Barrier"},"barrier/ditch":{icon:"maki-roadblock",geometry:["line","area"],tags:{barrier:"ditch"},name:"Trench",matchScore:0.25},"barrier/fence":{icon:"maki-fence",fields:["fence_type","height"],geometry:["line"],tags:{barrier:"fence"},name:"Fence",matchScore:0.25},"barrier/gate":{icon:"maki-barrier",fields:["access"],geometry:["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:"maki-wheelchair",fields:["kerb","tactile_paving"],geometry:["vertex","line"],tags:{barrier:"kerb"},name:"Kerb"},"barrier/kissing_gate":{icon:"maki-barrier",fields:["access"],geometry:["vertex"],tags:{barrier:"kissing_gate"},name:"Kissing Gate"},"barrier/lift_gate":{icon:"maki-roadblock",fields:["access"],geometry:["vertex","line"],tags:{barrier:"lift_gate"},name:"Lift Gate"},"barrier/retaining_wall":{fields:["height"],geometry:["line","area"],tags:{barrier:"retaining_wall"},name:"Retaining Wall"},"barrier/stile":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],tags:{barrier:"stile"},name:"Stile"},"barrier/toll_booth":{icon:"maki-roadblock",fields:["access","building_area"],geometry:["vertex","area"],tags:{barrier:"toll_booth"},name:"Toll Booth"},"barrier/wall":{icon:"maki-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:"maki-home",fields:["name","building","levels","height","address"],geometry:["point","area"],tags:{building:"*"},matchScore:0.6,terms:[],name:"Building"},"building/bunker":{fields:["name","address","levels","height"],geometry:["area"],tags:{building:"bunker"},matchScore:0.5,name:"Bunker",searchable:false},"building/entrance":{icon:"maki-entrance-alt1",geometry:["vertex"],tags:{building:"entrance"},name:"Entrance/Exit",searchable:false},"building/train_station":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["point","vertex","area"],tags:{building:"train_station"},matchScore:0.5,name:"Train Station",searchable:false},"building/apartments":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"apartments"},matchScore:0.5,name:"Apartments"},"building/barn":{icon:"maki-farm",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"barn"},matchScore:0.5,name:"Barn"},"building/boathouse":{icon:"maki-harbor",fields:["name","levels","height","address"],geometry:["area"],tags:{building:"boathouse"},matchScore:0.5,terms:[],name:"Boathouse"},"building/bungalow":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"bungalow"},terms:["home","detached"],matchScore:0.5,name:"Bungalow"},"building/cabin":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"cabin"},matchScore:0.5,name:"Cabin"},"building/cathedral":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"cathedral"},matchScore:0.5,name:"Cathedral Building"},"building/chapel":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"chapel"},matchScore:0.5,name:"Chapel Building"},"building/church":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"church"},matchScore:0.5,name:"Church Building"},"building/civic":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"civic"},matchScore:0.5,name:"Civic Building"},"building/college":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["university"],tags:{building:"college"},matchScore:0.5,name:"College Building"},"building/commercial":{icon:"maki-suitcase",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"commercial"},matchScore:0.5,name:"Commercial Building"},"building/construction":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"construction"},matchScore:0.5,name:"Building Under Construction"},"building/detached":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"detached"},terms:["home","single","family","residence","dwelling"],matchScore:0.5,name:"Detached House"},"building/dormitory":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"dormitory"},matchScore:0.5,name:"Dormitory"},"building/farm_auxiliary":{icon:"maki-farm",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"farm_auxiliary"},matchScore:0.5,name:"Farm Building"},"building/farm":{icon:"maki-farm",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"farm"},matchScore:0.5,name:"Farm House"},"building/garage":{icon:"fas-warehouse",fields:["name","capacity"],geometry:["area"],tags:{building:"garage"},matchScore:0.5,name:"Garage"},"building/garages":{icon:"fas-warehouse",fields:["name","capacity"],geometry:["area"],tags:{building:"garages"},matchScore:0.5,name:"Garages"},"building/grandstand":{icon:"maki-building",fields:["name","height"],geometry:["area"],tags:{building:"grandstand"},terms:["tribune","stand","stands","bleachers"],matchScore:0.5,name:"Grandstand"},"building/greenhouse":{icon:"maki-garden-center",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"greenhouse"},matchScore:0.5,name:"Greenhouse"},"building/hospital":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"hospital"},matchScore:0.5,name:"Hospital Building"},"building/hotel":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"hotel"},matchScore:0.5,name:"Hotel Building"},"building/house":{icon:"maki-home",fields:["name","address","levels","height"],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:"maki-industry",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"industrial"},matchScore:0.5,name:"Industrial Building"},"building/kindergarten":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["kindergarden","pre-school"],tags:{building:"kindergarten"},matchScore:0.5,name:"Preschool/Kindergarten Building"},"building/mosque":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"mosque"},matchScore:0.5,name:"Mosque Building"},"building/public":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"public"},matchScore:0.5,name:"Public Building"},"building/residential":{icon:"maki-residential-community",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"residential"},matchScore:0.5,name:"Residential Building"},"building/retail":{icon:"maki-commercial",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"retail"},matchScore:0.5,name:"Retail Building"},"building/roof":{icon:"maki-shelter",fields:["name","address"],geometry:["area"],tags:{building:"roof"},matchScore:0.5,name:"Roof"},"building/ruins":{icon:"temaki-ruins",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"ruins"},matchScore:0.5,name:"Building Ruins"},"building/school":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["academy","elementary school","middle school","high school"],tags:{building:"school"},matchScore:0.5,name:"School Building"},"building/semidetached_house":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"semidetached_house"},terms:["home","double","duplex","twin","family","residence","dwelling"],matchScore:0.5,name:"Semi-Detached House"},"building/service":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"service"},matchScore:0.5,name:"Service Building"},"building/shed":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"shed"},matchScore:0.5,name:"Shed"},"building/stable":{icon:"maki-horse-riding",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"stable"},matchScore:0.5,name:"Stable"},"building/stadium":{icon:"maki-stadium",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"stadium"},matchScore:0.5,name:"Stadium Building"},"building/static_caravan":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"static_caravan"},matchScore:0.5,name:"Static Mobile Home"},"building/temple":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"temple"},matchScore:0.5,name:"Temple Building"},"building/terrace":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"terrace"},terms:["home","terrace","brownstone","family","residence","dwelling"],matchScore:0.5,name:"Row Houses"},"building/transportation":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"transportation"},matchScore:0.5,name:"Transportation Building"},"building/university":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["college"],tags:{building:"university"},matchScore:0.5,name:"University Building"},"building/warehouse":{icon:"maki-warehouse",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"warehouse"},matchScore:0.5,name:"Warehouse"},"camp_site/camp_pitch":{icon:"maki-campsite",fields:["name","ref"],geometry:["point","area"],terms:["tent","rv"],tags:{camp_site:"camp_pitch"},name:"Camp Pitch"},club:{icon:"maki-heart",fields:["name","club","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{club:"*"},terms:["social"],name:"Club"},craft:{icon:"temaki-tools",fields:["name","craft","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"*"},terms:[],name:"Craft"},"craft/jeweler":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"basket_maker"},name:"Basket Maker"},"craft/beekeeper":{icon:"maki-farm",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"beekeeper"},name:"Beekeeper"},"craft/blacksmith":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"blacksmith"},name:"Blacksmith"},"craft/boatbuilder":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"boatbuilder"},matchScore:0.4,name:"Boat Builder"},"craft/bookbinder":{icon:"maki-library",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["book repair"],tags:{craft:"bookbinder"},name:"Bookbinder"},"craft/brewery":{icon:"temaki-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:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["woodworker"],tags:{craft:"carpenter"},name:"Carpenter"},"craft/carpet_layer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"carpet_layer"},name:"Carpet Layer"},"craft/caterer":{icon:"maki-restaurant",fields:["name","cuisine","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"caterer"},name:"Caterer"},"craft/chimney_sweeper":{icon:"temaki-chimney",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"chimney_sweeper"},name:"Chimney Sweeper"},"craft/clockmaker":{icon:"temaki-clock",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"clockmaker"},name:"Clockmaker"},"craft/confectionery":{icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["sweet","candy"],tags:{craft:"confectionery"},name:"Candy Maker"},"craft/distillery":{icon:"temaki-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:"maki-clothing-store",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["seamstress"],tags:{craft:"dressmaker"},name:"Dressmaker"},"craft/electrician":{icon:"temaki-power",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["power","wire"],tags:{craft:"electrician"},name:"Electrician"},"craft/electronics_repair":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"electronics_repair"},name:"Electronics Repair Shop"},"craft/gardener":{icon:"maki-garden-center",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["landscaper","grounds keeper"],tags:{craft:"gardener"},name:"Gardener"},"craft/glaziery":{icon:"temaki-window",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["glass","stained-glass","window"],tags:{craft:"glaziery"},name:"Glaziery"},"craft/handicraft":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"handicraft"},name:"Handicraft"},"craft/hvac":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["heat*","vent*","air conditioning"],tags:{craft:"hvac"},name:"HVAC"},"craft/insulator":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"insulation"},name:"Insulator"},"craft/key_cutter":{icon:"fas-key",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"key_cutter"},name:"Key Cutter"},"craft/metal_construction":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"metal_construction"},name:"Metal Construction"},"craft/painter":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"painter"},name:"Painter"},"craft/photographer":{icon:"maki-attraction",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"photographer"},name:"Photographer"},"craft/photographic_laboratory":{icon:"maki-attraction",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["film"],tags:{craft:"photographic_laboratory"},name:"Photographic Laboratory"},"craft/plasterer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"plasterer"},name:"Plasterer"},"craft/plumber":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["pipe"],tags:{craft:"plumber"},name:"Plumber"},"craft/pottery":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["ceramic"],tags:{craft:"pottery"},name:"Pottery"},"craft/rigger":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"rigger"},name:"Rigger"},"craft/roofer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"roofer"},name:"Roofer"},"craft/saddler":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"saddler"},name:"Saddler"},"craft/sailmaker":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"sailmaker"},name:"Sailmaker"},"craft/sawmill":{icon:"maki-logging",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["lumber"],tags:{craft:"sawmill"},name:"Sawmill"},"craft/scaffolder":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"scaffolder"},name:"Scaffolder"},"craft/sculptor":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"sculptor"},name:"Sculptor"},"craft/shoemaker":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["cobbler"],tags:{craft:"shoemaker"},name:"Shoemaker"},"craft/stonemason":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["masonry"],tags:{craft:"stonemason"},name:"Stonemason"},"craft/tiler":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"tiler"},name:"Tiler"},"craft/tinsmith":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"tinsmith"},name:"Tinsmith"},"craft/upholsterer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"upholsterer"},name:"Upholsterer"},"craft/watchmaker":{icon:"temaki-clock",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"watchmaker"},name:"Watchmaker"},"craft/window_construction":{icon:"temaki-window",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["glass"],tags:{craft:"window_construction"},name:"Window Construction"},"craft/winery":{icon:"maki-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:"fas-ambulance",fields:["name","operator","building_area","address"],geometry:["point","area"],terms:["EMS","EMT","rescue"],tags:{emergency:"ambulance_station"},name:"Ambulance Station"},"emergency/defibrillator":{icon:"maki-defibrillator",fields:["indoor","ref","operator"],geometry:["point","vertex"],terms:["AED"],tags:{emergency:"defibrillator"},name:"Defibrillator"},"emergency/fire_alarm":{icon:"fas-bell",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_alarm_box"},name:"Fire Alarm Call Box"},"emergency/fire_extinguisher":{icon:"fas-fire-extinguisher",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_extinguisher"},name:"Fire Extinguisher"},"emergency/fire_hydrant":{icon:"temaki-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/first_aid_kit":{icon:"fas-medkit",fields:["indoor","ref","operator"],geometry:["point","vertex"],terms:["bandage","first aid","med","med kit","medic*","medkit"],tags:{emergency:"first_aid_kit"},name:"First Aid Kit"},"emergency/life_ring":{icon:"fas-life-ring",fields:["ref","operator"],geometry:["point","vertex"],terms:["life buoy","kisby ring","kisbie ring","perry buoy"],tags:{emergency:"life_ring"},name:"Life Ring"},"emergency/lifeguard":{icon:"fas-life-ring",fields:["ref","operator","building_area","opening_hours"],geometry:["point","area"],terms:["CPR","rescue"],tags:{emergency:"lifeguard"},name:"Lifeguard"},"emergency/phone":{icon:"maki-emergency-phone",fields:["ref","operator","covered","indoor","booth"],geometry:["point","vertex"],tags:{emergency:"phone"},name:"Emergency Phone"},"emergency/siren":{icon:"fas-volume-up",fields:["siren/purpose","siren/type","ref","operator"],geometry:["point","vertex"],terms:["air raid","loud","noise","storm","tornado","warning"],tags:{emergency:"siren"},name:"Siren"},"emergency/water_tank":{icon:"maki-water",fields:["name","ref","operator"],geometry:["point","vertex"],terms:["water tank","cistern","reservoir"],tags:{emergency:"water_tank"},name:"Emergency Water Tank"},entrance:{icon:"maki-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:"iD-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:"iD-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:"iD-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:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"bunker",natural:"sand"},terms:["hazard","bunker"],reference:{key:"golf",value:"bunker"},name:"Sand Trap"},"golf/fairway":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"fairway",landuse:"grass"},reference:{key:"golf",value:"fairway"},name:"Fairway"},"golf/green":{icon:"maki-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:"maki-golf",fields:["name","ref_golf_hole","par","handicap"],geometry:["line"],tags:{golf:"hole"},name:"Golf Hole"},"golf/lateral_water_hazard_area":{icon:"maki-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:"maki-golf",fields:["name"],geometry:["line"],tags:{golf:"lateral_water_hazard"},name:"Lateral Water Hazard"},"golf/rough":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"rough",landuse:"grass"},reference:{key:"golf",value:"rough"},name:"Rough"},"golf/tee":{icon:"maki-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:"maki-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:"maki-golf",fields:["name"],geometry:["line"],tags:{golf:"water_hazard"},name:"Water Hazard"},healthcare:{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["terminal","illness"],tags:{healthcare:"hospice"},name:"Hospice"},"healthcare/laboratory":{icon:"maki-hospital",fields:["name","operator","website","ref","address","opening_hours"],geometry:["point","area"],terms:["medical_laboratory","medical_lab","blood_check"],tags:{healthcare:"laboratory"},name:"Medical Laboratory"},"healthcare/midwife":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"iD-highway-bridleway",geometry:["line"],tags:{highway:"bridleway"},terms:["bridleway","equestrian","horse","trail"],name:"Bridle Path"},"highway/bus_guideway":{icon:"iD-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:"iD-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:"temaki-pedestrian",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:"temaki-pedestrian",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:"iD-highway-cycleway",fields:["name","oneway","surface","lit","width","structure","access"],geometry:["line"],tags:{highway:"cycleway"},terms:["bike"],name:"Cycle Path"},"highway/elevator":{icon:"temaki-elevator",fields:["access_simple","opening_hours","maxweight","ref"],geometry:["vertex"],tags:{highway:"elevator"},terms:["lift"],name:"Elevator"},"highway/footway":{icon:"iD-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:"temaki-yield",fields:["direction_vertex"],geometry:["vertex"],tags:{highway:"give_way"},terms:["give way","yield","sign"],name:"Yield Sign"},"highway/living_street":{icon:"iD-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:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"mini_roundabout"},fields:["direction_clock"],name:"Mini-Roundabout"},"highway/motorway_junction":{icon:"temaki-junction",fields:["ref_highway_junction","name"],geometry:["vertex"],tags:{highway:"motorway_junction"},terms:["exit"],name:"Motorway Junction / Exit"},"highway/motorway_link":{icon:"iD-highway-motorway-link",fields:["name","ref_road_number","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"motorway_link"},addTags:{highway:"motorway_link",oneway:"yes"},removeTags:{highway:"motorway_link",oneway:"yes"},terms:["exit","ramp","road","street","on ramp","off ramp"],name:"Motorway Link"},"highway/motorway":{icon:"iD-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","road","street","thruway","turnpike"],name:"Motorway"},"highway/passing_place":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"passing_place"},terms:["turnout, pullout"],name:"Passing Place"},"highway/path":{icon:"iD-highway-path",fields:["name","surface","width","structure","access","incline","sac_scale","trail_visibility","mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale","ref"],geometry:["line"],terms:["hike","hiking","trackway","trail","walk"],tags:{highway:"path"},name:"Path"},"highway/pedestrian_area":{icon:"temaki-pedestrian",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:"iD-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:"iD-highway-primary-link",fields:["name","oneway","maxspeed","maxspeed/advisory","lanes","surface","maxheight","ref_road_number","cycleway","structure","access"],geometry:["line"],tags:{highway:"primary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Primary Link"},"highway/primary":{icon:"iD-highway-primary",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"primary"},terms:["road","street"],name:"Primary Road"},"highway/raceway":{icon:"iD-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:"iD-highway-residential",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],geometry:["line"],tags:{highway:"residential"},terms:["road","street"],name:"Residential Road"},"highway/rest_area":{icon:"maki-car",fields:["name"],geometry:["point","vertex","area"],tags:{highway:"rest_area"},terms:["rest stop"],name:"Rest Area"},"highway/road":{icon:"iD-highway-road",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"road"},terms:["road","street"],name:"Unknown Road"},"highway/secondary_link":{icon:"iD-highway-secondary-link",fields:["name","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"secondary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Secondary Link"},"highway/secondary":{icon:"iD-highway-secondary",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"secondary"},terms:["road","street"],name:"Secondary Road"},"highway/service":{icon:"iD-highway-service",fields:["name","service","oneway","maxspeed","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"service"},terms:["road","street"],name:"Service Road"},"highway/service/alley":{icon:"iD-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:"iD-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:"iD-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:"iD-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:"iD-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:"maki-car",fields:["name"],geometry:["point","vertex","area"],tags:{highway:"services"},terms:["services","travel plaza","service station"],name:"Service Area"},"highway/speed_camera":{icon:"maki-attraction",geometry:["point","vertex"],fields:["direction","ref"],tags:{highway:"speed_camera"},terms:[],name:"Speed Camera"},"highway/steps":{icon:"iD-highway-steps",fields:["surface","lit","width","incline_steps","handrail","step_count"],geometry:["line"],tags:{highway:"steps"},terms:["stairs","staircase"],name:"Steps"},"highway/stop":{icon:"temaki-stop",fields:["stop","direction_vertex"],geometry:["vertex"],tags:{highway:"stop"},terms:["stop","halt","sign"],name:"Stop Sign"},"highway/street_lamp":{icon:"temaki-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:"iD-highway-tertiary-link",fields:["name","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"tertiary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Tertiary Link"},"highway/tertiary":{icon:"iD-highway-tertiary",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"tertiary"},terms:["road","street"],name:"Tertiary Road"},"highway/track":{icon:"iD-highway-track",fields:["name","tracktype","surface","width","structure","access","incline","smoothness","mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale"],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:"temaki-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:"iD-highway-trunk-link",fields:["name","ref_road_number","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"trunk_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Trunk Link"},"highway/trunk":{icon:"iD-highway-trunk",fields:["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","toll","access"],geometry:["line"],tags:{highway:"trunk"},terms:["road","street"],name:"Trunk Road"},"highway/turning_circle":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"turning_circle"},terms:["cul-de-sac"],name:"Turning Circle"},"highway/turning_loop":{icon:"maki-circle",geometry:["vertex"],tags:{highway:"turning_loop"},terms:["cul-de-sac"],name:"Turning Loop (Island)"},"highway/unclassified":{icon:"iD-highway-unclassified",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],geometry:["line"],tags:{highway:"unclassified"},terms:["road","street"],name:"Minor/Unclassified Road"},historic:{icon:"temaki-ruins",fields:["historic","inscription"],geometry:["point","vertex","area"],tags:{historic:"*"},name:"Historic Site"},"historic/archaeological_site":{icon:"temaki-ruins",fields:["name","historic/civilization","inscription"],geometry:["point","vertex","area"],tags:{historic:"archaeological_site"},name:"Archaeological Site"},"historic/boundary_stone":{icon:"temaki-milestone",fields:["name","inscription"],geometry:["point","vertex"],tags:{historic:"boundary_stone"},name:"Boundary Stone"},"historic/castle":{icon:"maki-castle",fields:["name","castle_type","building_area","historic/civilization"],geometry:["point","area"],tags:{historic:"castle"},name:"Castle"},"historic/memorial":{icon:"maki-monument",fields:["name","memorial","inscription"],geometry:["point","vertex","area"],terms:["dedicatory","epitaph","remember","remembrance","memory","monument","stolperstein"],tags:{historic:"memorial"},name:"Memorial"},"historic/monument":{icon:"maki-monument",fields:["name","inscription"],geometry:["point","vertex","area"],tags:{historic:"monument"},name:"Monument"},"historic/ruins":{icon:"temaki-ruins",fields:["name","historic/civilization","inscription"],geometry:["point","vertex","area"],tags:{historic:"ruins"},name:"Ruins"},"historic/tomb":{icon:"maki-cemetery",fields:["name","tomb","building_area","inscription"],geometry:["point","area"],tags:{historic:"tomb"},name:"Tomb"},"historic/wayside_cross":{icon:"maki-religious-christian",fields:["name","inscription"],geometry:["point","vertex","area"],tags:{historic:"wayside_cross"},name:"Wayside Cross"},"historic/wayside_shrine":{icon:"maki-landmark",fields:["name","religion","denomination","inscription"],geometry:["point","vertex","area"],tags:{historic:"wayside_shrine"},name:"Wayside Shrine"},junction:{icon:"temaki-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:"maki-farm",fields:["name","operator","crop"],geometry:["point","area"],tags:{landuse:"farm"},terms:[],name:"Farmland",searchable:false},"landuse/allotments":{icon:"maki-garden-center",geometry:["area"],fields:["name"],tags:{landuse:"allotments"},terms:["allotment","garden"],name:"Community Garden"},"landuse/aquaculture":{icon:"maki-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:"maki-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:"maki-cemetery",fields:["name","religion","denomination"],geometry:["area"],tags:{landuse:"cemetery"},terms:[],name:"Cemetery"},"landuse/churchyard":{icon:"maki-religious-christian",fields:["name","religion","denomination"],geometry:["area"],tags:{landuse:"churchyard"},terms:[],name:"Churchyard"},"landuse/commercial":{icon:"maki-suitcase",fields:["name"],geometry:["area"],tags:{landuse:"commercial"},terms:[],matchScore:0.9,name:"Commercial Area"},"landuse/construction":{icon:"temaki-tools",fields:["name","construction","operator"],geometry:["area"],tags:{landuse:"construction"},terms:[],name:"Construction"},"landuse/farmland":{icon:"maki-farm",fields:["name","operator","crop","produce"],geometry:["area"],tags:{landuse:"farmland"},terms:["crop","grow","plant"],name:"Farmland"},"landuse/farmyard":{icon:"maki-farm",fields:["name","operator","crop"],geometry:["area"],tags:{landuse:"farmyard"},terms:["crop","grow","plant"],name:"Farmyard"},"landuse/forest":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle","produce"],geometry:["area"],tags:{landuse:"forest"},terms:["cut","forest","lumber","tree"],name:"Forest"},"landuse/garages":{icon:"fas-warehouse",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:"maki-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:"maki-harbor",fields:["name","operator"],geometry:["area"],terms:["boat"],tags:{landuse:"harbour"},name:"Harbor"},"landuse/industrial":{icon:"maki-industry",fields:["name","industrial"],geometry:["area"],tags:{landuse:"industrial"},terms:[],matchScore:0.9,name:"Industrial Area"},"landuse/industrial/scrap_yard":{icon:"maki-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:"maki-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:"maki-garden",geometry:["area"],fields:["name"],tags:{landuse:"meadow"},terms:[],name:"Meadow"},"landuse/military":{icon:"temaki-military",fields:["name"],geometry:["area"],tags:{landuse:"military"},terms:[],matchScore:0.9,name:"Military Area"},"landuse/military/airfield":{icon:"maki-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:"temaki-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:"temaki-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:"maki-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:"maki-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:"temaki-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:"maki-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:"temaki-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:"temaki-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:"temaki-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:"temaki-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:"maki-park-alt1",fields:["name","operator","trees"],geometry:["area"],tags:{landuse:"orchard"},terms:["fruit"],name:"Orchard"},"landuse/plant_nursery":{icon:"maki-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:"maki-rail",fields:["operator"],geometry:["area"],tags:{landuse:"railway"},terms:["rail","train","track"],name:"Railway Corridor"},"landuse/recreation_ground":{icon:"maki-pitch",geometry:["area"],fields:["name"],tags:{landuse:"recreation_ground"},terms:["playing fields"],name:"Recreation Ground"},"landuse/religious":{icon:"maki-place-of-worship",geometry:["area"],fields:["name","religion","denomination"],tags:{landuse:"religious"},terms:[],name:"Religious Area"},"landuse/residential":{icon:"maki-building",geometry:["area"],tags:{landuse:"residential"},terms:[],matchScore:0.9,name:"Residential Area"},"landuse/retail":{icon:"maki-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:"maki-pitch",fields:["name","leisure"],geometry:["point","vertex","area"],tags:{leisure:"*"},name:"Leisure"},"leisure/adult_gaming_centre":{icon:"temaki-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:"maki-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/beach_resort":{icon:"temaki-beach",fields:["name","address","fee"],geometry:["point","area"],tags:{leisure:"beach_resort"},name:"Beach Resort"},"leisure/bird_hide":{icon:"temaki-binoculars",fields:["building_area"],geometry:["point","area"],tags:{leisure:"bird_hide"},terms:["machan","ornithology"],name:"Bird Hide"},"leisure/bleachers":{geometry:["point","area"],tags:{leisure:"bleachers"},terms:["crowd","bench","sports","stand","stands","seat","seating"],name:"Bleachers"},"leisure/bowling_alley":{icon:"temaki-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:"temaki-pedestrian",geometry:["point","area"],fields:["name"],terms:["open space"],tags:{leisure:"common"},name:"Common"},"leisure/dance":{icon:"maki-music",fields:["name","operator","address","building_area","dance/style","opening_hours"],geometry:["point","area"],terms:["ballroom","jive","swing","tango","waltz"],tags:{leisure:"dance"},name:"Dance Hall"},"leisure/dancing_school":{icon:"maki-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:"maki-dog-park",geometry:["point","area"],fields:["name"],terms:[],tags:{leisure:"dog_park"},name:"Dog Park"},"leisure/firepit":{icon:"maki-fire-station",geometry:["point","area"],tags:{leisure:"firepit"},terms:["fireplace","campfire"],name:"Firepit"},"leisure/fitness_centre":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-garden",fields:["name","access_simple"],geometry:["point","vertex","area"],tags:{leisure:"garden"},name:"Garden"},"leisure/golf_course":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],geometry:["point","area"],terms:["links"],tags:{leisure:"golf_course"},name:"Golf Course"},"leisure/hackerspace":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-park",geometry:["point","area"],fields:["name"],tags:{leisure:"nature_reserve"},terms:["protected","wildlife"],name:"Nature Reserve"},"leisure/outdoor_seating":{icon:"maki-picnic-site",geometry:["point","area"],fields:["name","operator"],terms:["al fresco","beer garden","dining","cafe","restaurant","pub","bar","patio"],tags:{leisure:"outdoor_seating"},name:"Outdoor Seating Area"},"leisure/park":{icon:"maki-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:"maki-picnic-site",geometry:["point"],tags:{leisure:"picnic_table"},terms:["bench"],name:"Picnic Table"},"leisure/pitch":{icon:"maki-pitch",fields:["name","sport","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch"},terms:["field"],name:"Sport Pitch"},"leisure/pitch/american_football":{icon:"maki-america-football",fields:["name","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:"maki-baseball",fields:["name","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"baseball"},reference:{key:"sport",value:"baseball"},terms:[],name:"Baseball Diamond"},"leisure/pitch/basketball":{icon:"maki-basketball",fields:["name","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:"maki-basketball",fields:["name","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:"maki-pitch",fields:["name","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:"maki-pitch",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"bowls"},reference:{key:"sport",value:"bowls"},terms:[],name:"Bowling Green"},"leisure/pitch/cricket":{icon:"maki-cricket",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"cricket"},reference:{key:"sport",value:"cricket"},terms:[],name:"Cricket Field"},"leisure/pitch/equestrian":{icon:"maki-horse-riding",fields:["name","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:"maki-america-football",fields:["name","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:"maki-america-football",fields:["name","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:"maki-pitch",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"skateboard"},reference:{key:"sport",value:"skateboard"},terms:[],name:"Skate Park"},"leisure/pitch/soccer":{icon:"maki-soccer",fields:["name","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:"maki-tennis",fields:["name","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:"maki-tennis",fields:["name","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:"maki-basketball",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"volleyball"},reference:{key:"sport",value:"volleyball"},terms:[],name:"Volleyball Court"},"leisure/playground":{icon:"maki-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:"maki-lodging",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{leisure:"resort"},name:"Resort"},"leisure/running_track":{icon:"maki-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":{icon:"fas-thermometer-three-quarters",fields:["name","operator","address","opening_hours","access_simple","fee"],geometry:["point","area"],tags:{leisure:"sauna"},name:"Sauna"},"leisure/slipway":{icon:"temaki-beach",geometry:["point","line"],terms:["boat launch","boat ramp"],tags:{leisure:"slipway"},name:"Slipway"},"leisure/sports_centre":{icon:"maki-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:"maki-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:"maki-pitch",fields:["name","sport","address"],geometry:["point","area"],tags:{leisure:"stadium"},name:"Stadium"},"leisure/swimming_pool":{icon:"maki-swimming",fields:["name","access_simple","operator","address"],geometry:["point","area"],terms:["dive","water"],tags:{leisure:"swimming_pool"},name:"Swimming Pool"},"leisure/track":{icon:"iD-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:"maki-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:"temaki-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:"maki-triangle",geometry:["point","area"],fields:["operator","direction"],terms:["entrance","underground","mine","cave"],tags:{man_made:"adit"},name:"Adit"},"man_made/antenna":{icon:"temaki-antenna",fields:["height","communication_multi"],geometry:["point"],terms:["broadcast","cell phone","cell","communication","mobile phone","radio","television","transmission","tv"],tags:{man_made:"antenna"},name:"Antenna"},"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:"temaki-chimney",geometry:["point","area"],tags:{man_made:"chimney"},name:"Chimney"},"man_made/clearcut":{icon:"maki-logging",geometry:["area"],tags:{man_made:"clearcut"},terms:["cut","forest","lumber","tree","wood"],name:"Clearcut Forest"},"man_made/crane":{icon:"temaki-crane",fields:["operator","height","crane/type"],geometry:["point","line","vertex","area"],tags:{man_made:"crane"},name:"Crane"},"man_made/cutline":{icon:"maki-logging",geometry:["line"],tags:{man_made:"cutline"},name:"Cut line"},"man_made/flagpole":{icon:"maki-embassy",geometry:["point"],tags:{man_made:"flagpole"},name:"Flagpole"},"man_made/gasometer":{icon:"temaki-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:"maki-lighthouse",fields:["building_area"],geometry:["point","area"],tags:{man_made:"lighthouse"},name:"Lighthouse"},"man_made/mast":{icon:"temaki-antenna",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:"temaki-antenna",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:"temaki-tower",geometry:["point","area"],terms:["lookout tower","fire tower"],tags:{man_made:"tower","tower:type":"observation"},name:"Observation Tower"},"man_made/observatory":{geometry:["point","area"],terms:["astronomical","meteorological"],tags:{man_made:"observatory"},name:"Observatory"},"man_made/petroleum_well":{icon:"temaki-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":{icon:"iD-highway-footway",fields:["name","surface","lit","width","access"],geometry:["line","area"],terms:["dock","jetty"],tags:{man_made:"pier"},name:"Pier"},"man_made/pipeline":{icon:"iD-pipeline-line",fields:["location","operator","substance"],geometry:["line"],tags:{man_made:"pipeline"},name:"Pipeline"},"man_made/pumping_station":{icon:"maki-water",geometry:["point","area"],tags:{man_made:"pumping_station"},name:"Pumping Station"},"man_made/silo":{icon:"temaki-silo",fields:["building_area","crop"],geometry:["point","area"],terms:["grain","corn","wheat"],tags:{man_made:"silo"},name:"Silo"},"man_made/storage_tank":{icon:"temaki-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:"maki-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:"maki-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:"maki-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:"temaki-tower",fields:["tower/type","tower/construction","height"],geometry:["point","area"],tags:{man_made:"tower"},name:"Tower"},"man_made/wastewater_plant":{icon:"maki-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:"maki-water",fields:["operator"],geometry:["point","area"],tags:{man_made:"water_tower"},name:"Water Tower"},"man_made/water_well":{icon:"maki-water",fields:["operator"],geometry:["point","area"],tags:{man_made:"water_well"},name:"Water Well"},"man_made/water_works":{icon:"maki-water",fields:["name","operator","address"],geometry:["point","area"],tags:{man_made:"water_works"},name:"Water Works"},"man_made/watermill":{icon:"maki-buddhism",fields:["building_area"],geometry:["point","area"],terms:["water","wheel","mill"],tags:{man_made:"watermill"},name:"Watermill"},"man_made/windmill":{icon:"temaki-windmill",fields:["building_area"],geometry:["point","area"],terms:["wind","wheel","mill"],tags:{man_made:"windmill"},name:"Windmill"},"man_made/works":{icon:"maki-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:"maki-circle-stroked",fields:["manhole","operator","label","ref"],geometry:["point","vertex"],tags:{manhole:"*"},terms:["cover","hole","sewer","sewage","telecom"],name:"Manhole"},"manhole/drain":{icon:"maki-water",fields:["operator","ref"],geometry:["point","vertex"],tags:{manhole:"drain"},terms:["cover","drain","hole","rain","sewer","sewage","storm"],name:"Storm Drain"},"manhole/telecom":{icon:"maki-circle-stroked",fields:["operator","ref"],geometry:["point","vertex"],tags:{manhole:"telecom"},terms:["cover","phone","hole","telecom","telephone","bt"],name:"Telecom Manhole"},natural:{icon:"maki-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:"temaki-beach",geometry:["point","area"],fields:["name"],tags:{natural:"bay"},terms:[],name:"Bay"},"natural/beach":{icon:"temaki-beach",fields:["surface"],geometry:["point","area"],tags:{natural:"beach"},terms:["shore"],name:"Beach"},"natural/cave_entrance":{icon:"maki-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:"maki-triangle",fields:["name","height"],geometry:["point","vertex","line","area"],tags:{natural:"cliff"},terms:["crag","escarpment","rock face","scarp"],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/mud":{geometry:["area"],tags:{natural:"mud"},terms:["wetland"],name:"Mud"},"natural/peak":{icon:"maki-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/reef":{icon:"temaki-beach",geometry:["point","area"],tags:{natural:"reef"},terms:["barrier","coral","ocean","sand","shoal"],name:"Reef"},"natural/ridge":{geometry:["line"],tags:{natural:"ridge"},terms:["crest"],name:"Ridge"},"natural/saddle":{icon:"maki-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:"maki-water",fields:["name","intermittent"],geometry:["point","vertex"],tags:{natural:"spring"},terms:[],name:"Spring"},"natural/tree_row":{icon:"maki-park",fields:["leaf_type","leaf_cycle","denotation"],geometry:["line"],tags:{natural:"tree_row"},terms:[],name:"Tree row"},"natural/tree":{icon:"maki-park",fields:["leaf_type_singular","leaf_cycle_singular","denotation"],geometry:["point","vertex"],tags:{natural:"tree"},terms:[],name:"Tree"},"natural/volcano":{icon:"maki-volcano",fields:["name","elevation","volcano/status","volcano/type"],geometry:["point","vertex"],tags:{natural:"volcano"},terms:["mountain","crater"],name:"Volcano"},"natural/water":{icon:"maki-water",fields:["water"],geometry:["area"],tags:{natural:"water"},name:"Water"},"natural/water/lake":{icon:"maki-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:"maki-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:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{natural:"water",water:"reservoir"},reference:{key:"natural",value:"water"},name:"Reservoir"},"natural/wetland":{icon:"maki-wetland",fields:["wetland"],geometry:["point","area"],tags:{natural:"wetland"},terms:["bog","marsh","reedbed","swamp","tidalflat"],name:"Wetland"},"natural/wood":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle"],geometry:["point","area"],tags:{natural:"wood"},terms:["tree"],name:"Wood"},"noexit/yes":{icon:"maki-barrier",geometry:["vertex"],terms:["no exit","road end","dead end"],tags:{noexit:"yes"},reference:{key:"noexit",value:"*"},name:"No Exit"},office:{icon:"maki-suitcase",fields:["name","office","address","building_area","opening_hours","smoking"],geometry:["point","vertex","area"],tags:{office:"*"},terms:[],name:"Office"},"office/administrative":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"administrative"},terms:[],searchable:false,name:"Administrative Office"},"office/physician":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"physician"},searchable:false,name:"Physician"},"office/travel_agent":{icon:"maki-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:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"accountant"},terms:[],name:"Accountant Office"},"office/adoption_agency":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"adoption_agency"},terms:[],name:"Adoption Agency"},"office/advertising_agency":{icon:"maki-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:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"architect"},terms:[],name:"Architect Office"},"office/association":{icon:"maki-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:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"charity"},terms:["charitable organization"],name:"Charity Office"},"office/company":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours","smoking"],geometry:["point","area"],tags:{office:"company"},terms:[],name:"Corporate Office"},"office/coworking":{icon:"maki-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:"maki-school",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"educational_institution"},terms:[],name:"Educational Institution"},"office/employment_agency":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"employment_agency"},terms:["job"],name:"Employment Agency"},"office/energy_supplier":{icon:"maki-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:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"estate_agent"},terms:[],name:"Real Estate Office"},"office/financial":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"financial"},terms:[],name:"Financial Office"},"office/forestry":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"forestry"},terms:["forest","ranger"],name:"Forestry Office"},"office/foundation":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"foundation"},terms:[],name:"Foundation Office"},"office/government":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"insurance"},terms:[],name:"Insurance Office"},"office/it":{icon:"maki-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:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"lawyer"},terms:[],name:"Law Office"},"office/lawyer/notary":{icon:"maki-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:"maki-warehouse",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"moving_company"},terms:["relocation"],name:"Moving Company Office"},"office/newspaper":{icon:"maki-library",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"newspaper"},terms:[],name:"Newspaper Office"},"office/ngo":{icon:"maki-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:"maki-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:"maki-town-hall",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"political_party"},terms:[],name:"Political Party"},"office/private_investigator":{icon:"maki-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:"maki-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:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"research"},terms:[],name:"Research Office"},"office/surveyor":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"surveyor"},terms:[],name:"Surveyor Office"},"office/tax_advisor":{icon:"maki-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:"maki-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:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"therapist"},terms:["therapy"],name:"Therapist Office"},"office/water_utility":{icon:"maki-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:"maki-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:"maki-farm",geometry:["point","area"],fields:["name"],tags:{place:"farm"},name:"Farm",searchable:false},"place/city":{icon:"maki-city",fields:["name","population"],geometry:["point","area"],tags:{place:"city"},name:"City"},"place/hamlet":{icon:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"hamlet"},name:"Hamlet"},"place/island":{icon:"maki-mountain",geometry:["point","area"],fields:["name"],terms:["archipelago","atoll","bar","cay","isle","islet","key","reef"],tags:{place:"island"},name:"Island"},"place/islet":{icon:"maki-mountain",geometry:["point","area"],fields:["name"],terms:["archipelago","atoll","bar","cay","isle","islet","key","reef"],tags:{place:"islet"},name:"Islet"},"place/isolated_dwelling":{icon:"maki-home",geometry:["point","area"],fields:["name"],tags:{place:"isolated_dwelling"},name:"Isolated Dwelling"},"place/locality":{icon:"maki-triangle-stroked",geometry:["point","area"],fields:["name"],tags:{place:"locality"},name:"Locality"},"place/neighbourhood":{icon:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"neighbourhood"},terms:["neighbourhood"],name:"Neighborhood"},"place/plot":{icon:"maki-triangle-stroked",fields:["name"],geometry:["point","area"],tags:{place:"plot"},terms:["tract","land","lot","parcel"],name:"Plot"},"place/quarter":{icon:"maki-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:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"suburb"},terms:["boro","borough","quarter"],name:"Borough / Suburb"},"place/town":{icon:"maki-town",fields:["name","population"],geometry:["point","area"],tags:{place:"town"},name:"Town"},"place/village":{icon:"maki-village",fields:["name","population"],geometry:["point","area"],tags:{place:"village"},name:"Village"},"playground/balance_beam":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"balancebeam"},name:"Play Balance Beam"},"playground/basket_spinner":{icon:"maki-playground",geometry:["point"],terms:["basket rotator"],tags:{playground:"basketrotator"},name:"Basket Spinner"},"playground/basket_swing":{icon:"maki-playground",geometry:["point"],tags:{playground:"basketswing"},name:"Basket Swing"},"playground/climbing_frame":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"climbingframe"},name:"Climbing Frame"},"playground/cushion":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"cushion"},name:"Bouncy Cushion"},"playground/horizontal_bar":{icon:"maki-pitch",fields:["height"],geometry:["point"],terms:["high bar"],tags:{playground:"horizontal_bar"},name:"Play Horizontal Bar"},"playground/rocker":{icon:"maki-playground",geometry:["point"],tags:{playground:"springy"},name:"Spring Rider",terms:["spring rocker","springy rocker"]},"playground/roundabout":{icon:"maki-stadium",fields:["bench"],geometry:["point","area"],tags:{playground:"roundabout"},name:"Play Roundabout",terms:["merry-go-round"]},"playground/sandpit":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"sandpit"},name:"Sandpit"},"playground/seesaw":{icon:"maki-playground",geometry:["point"],tags:{playground:"seesaw"},name:"Seesaw"},"playground/slide":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"slide"},name:"Slide"},"playground/structure":{icon:"maki-pitch",geometry:["point","area"],tags:{playground:"structure"},name:"Play Structure"},"playground/swing":{icon:"maki-playground",fields:["playground/baby","wheelchair"],geometry:["point"],tags:{playground:"swing"},name:"Swing"},"playground/zipwire":{icon:"maki-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:"temaki-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:"temaki-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:"temaki-radiation",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:"temaki-wind_turbine",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:"iD-power-line",fields:["name","operator","voltage","ref"],geometry:["line"],tags:{power:"line"},name:"Power Line"},"power/minor_line":{icon:"iD-power-line",fields:["name","operator","voltage","ref"],geometry:["line"],tags:{power:"minor_line"},name:"Minor Power Line"},"power/plant":{icon:"maki-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:["point","vertex"],tags:{power:"pole"},name:"Power Pole"},"power/substation":{icon:"temaki-power",fields:["substation","operator","building","ref"],geometry:["point","area"],tags:{power:"substation"},name:"Substation"},"power/switch":{icon:"temaki-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:"temaki-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:"iD-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:"iD-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:"iD-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:"iD-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:"iD-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:"iD-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:"iD-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:"iD-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:"iD-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:"iD-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:"maki-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:"maki-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:"maki-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:"temaki-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:"temaki-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:"temaki-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:"maki-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:"temaki-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:"temaki-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:"maki-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:"maki-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:"maki-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:"maki-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:"temaki-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:"temaki-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:"temaki-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:"maki-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:"maki-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:"temaki-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:"temaki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"temaki-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:"temaki-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:"temaki-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:"maki-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:"temaki-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:"temaki-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:"maki-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:"maki-rail",geometry:["point","vertex"],tags:{railway:"halt"},terms:["break","interrupt","rest","wait","interruption"],name:"Train Station (Halt / Request)",searchable:false},"railway/platform":{icon:"iD-highway-footway",fields:["name","ref_platform","surface","lit","shelter"],geometry:["line","area"],tags:{railway:"platform"},name:"Train Stop / Platform",searchable:false},"railway/station":{icon:"maki-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:"temaki-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:"iD-railway-abandoned",fields:["name","structure","service_rail","usage_rail"],geometry:["line"],tags:{railway:"abandoned"},terms:[],name:"Abandoned Railway"},"railway/buffer_stop":{icon:"temaki-buffer_stop",geometry:["vertex"],tags:{railway:"buffer_stop"},terms:["stop","halt","buffer"],name:"Buffer Stop"},"railway/crossing":{icon:"maki-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:"maki-roadblock",geometry:["vertex"],tags:{railway:"derail"},terms:["derailer"],name:"Railway Derailer"},"railway/disused":{icon:"iD-railway-disused",fields:["structure","service_rail","usage_rail"],geometry:["line"],tags:{railway:"disused"},terms:[],name:"Disused Railway"},"railway/funicular":{icon:"iD-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:"maki-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:"iD-railway-light-rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"light_rail"},terms:["light rail","streetcar","trolley"],name:"Light Rail"},"railway/milestone":{icon:"temaki-milestone",geometry:["point","vertex"],fields:["railway/position"],tags:{railway:"milestone"},terms:["milestone","marker"],name:"Railway Milestone"},"railway/miniature":{icon:"iD-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:"iD-railway-monorail",fields:["name","structure","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"monorail"},terms:[],name:"Monorail"},"railway/narrow_gauge":{icon:"iD-railway-rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"narrow_gauge"},terms:["narrow gauge railway","narrow gauge railroad"],name:"Narrow Gauge Rail"},"railway/rail":{icon:"iD-railway-rail",fields:["name","structure","gauge","electrified","maxspeed","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"rail"},terms:[],name:"Rail"},"railway/signal":{icon:"temaki-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:"maki-entrance",geometry:["point","vertex"],fields:["name"],tags:{railway:"subway_entrance"},terms:["metro","transit"],name:"Subway Entrance"},"railway/subway":{icon:"iD-railway-subway",fields:["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"subway"},terms:["metro","transit"],name:"Subway"},"railway/switch":{icon:"temaki-junction",geometry:["vertex"],tags:{railway:"switch"},terms:["switch","points"],name:"Railway Switch"},"railway/train_wash":{icon:"maki-rail",geometry:["point","vertex","area"],fields:["operator","building_area"],tags:{railway:"wash"},terms:["wash","clean"],name:"Train Wash"},"railway/tram":{icon:"iD-railway-light-rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"tram"},terms:["light rail","streetcar","tram","trolley"],name:"Tram"},relation:{icon:"iD-relation",fields:["name","relation"],geometry:["relation"],tags:{},name:"Relation"},"route/ferry":{icon:"iD-ferry-line",geometry:["line"],fields:["name","operator","duration","access"],tags:{route:"ferry"},name:"Ferry Route"},shop:{icon:"maki-shop",fields:["name","shop","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"*"},terms:[],name:"Shop"},"shop/fishmonger":{icon:"maki-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:"maki-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:"maki-shop",fields:["name","address","building_area"],geometry:["point","area"],tags:{shop:"vacant"},name:"Vacant Shop",searchable:false},"shop/agrarian":{icon:"maki-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:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"antiques"},name:"Antiques Shop"},"shop/appliance":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery"},name:"Bakery"},"shop/bathroom_furnishing":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-lodging",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bed"},name:"Bedding/Mattress Store"},"shop/beverages":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beverages"},name:"Beverage Store"},"shop/bicycle":{icon:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["betting"],tags:{shop:"bookmaker"},name:"Bookmaker"},"shop/books":{icon:"maki-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:"maki-shop",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"boutique"},name:"Boutique"},"shop/butcher":{icon:"maki-slaughterhouse",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["meat"],tags:{shop:"butcher"},name:"Butcher"},"shop/candles":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"candles"},name:"Candle Shop"},"shop/car_parts":{icon:"maki-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:"maki-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:"maki-car",fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],terms:["auto"],tags:{shop:"car"},name:"Car Dealership"},"shop/carpet":{icon:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cheese"},name:"Cheese Store"},"shop/chemist":{icon:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chocolate"},name:"Chocolate Store"},"shop/clothes":{icon:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"coffee"},name:"Coffee Store"},"shop/computer":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"computer"},name:"Computer Store"},"shop/confectionery":{icon:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience"},name:"Convenience Store"},"shop/copyshop":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"copyshop"},name:"Copy Store"},"shop/cosmetics":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cosmetics"},name:"Cosmetics Store"},"shop/craft":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store"},name:"Department Store"},"shop/doityourself":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself"},name:"DIY Store"},"shop/dry_cleaning":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"fashion"},name:"Fashion Store"},"shop/florist":{icon:"maki-florist",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["flower"],tags:{shop:"florist"},name:"Florist"},"shop/frame":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["barber"],tags:{shop:"hairdresser"},name:"Hairdresser"},"shop/hardware":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hardware"},name:"Hardware Store"},"shop/health_food":{icon:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"herbalist"},name:"Herbalist"},"shop/hifi":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"kiosk"},name:"Kiosk"},"shop/kitchen":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"kitchen"},name:"Kitchen Design Store"},"shop/laundry":{icon:"maki-laundry",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"laundry"},name:"Laundry"},"shop/leather":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"leather"},name:"Leather Store"},"shop/locksmith":{icon:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"lottery"},name:"Lottery Shop"},"shop/mall":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["shopping"],tags:{shop:"mall"},name:"Mall"},"shop/massage":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"massage"},name:"Massage Shop"},"shop/medical_supply":{icon:"maki-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:"maki-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:"maki-bank",fields:["name","operator","address","building_area","opening_hours","currency_multi"],geometry:["point","area"],tags:{shop:"money_lender"},name:"Money Lender"},"shop/motorcycle_repair":{icon:"fas-motorcycle",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],terms:["auto","bike","garage","motorcycle","repair","service"],tags:{shop:"motorcycle_repair"},name:"Motorcycle Repair Shop"},"shop/motorcycle":{icon:"fas-motorcycle",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["bike"],tags:{shop:"motorcycle"},name:"Motorcycle Dealership"},"shop/music":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-water",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"paint"},name:"Paint Store"},"shop/pastry":{icon:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pawnbroker"},name:"Pawn Shop"},"shop/perfumery":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"perfumery"},name:"Perfume Store"},"shop/pet_grooming":{icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["dog"],tags:{shop:"pet_grooming"},name:"Pet Grooming Store"},"shop/pet":{icon:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pyrotechnics"},name:"Fireworks Store"},"shop/radiotechnics":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes"},name:"Shoe Store"},"shop/sports":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports"},name:"Sporting Goods Store"},"shop/stationery":{icon:"maki-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:"maki-shop",fields:["name","operator","address","building","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"storage_rental"},name:"Storage Rental"},"shop/supermarket":{icon:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tattoo"},name:"Tattoo Parlor"},"shop/tea":{icon:"maki-teahouse",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tea"},name:"Tea Store"},"shop/ticket":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"ticket"},name:"Ticket Seller"},"shop/tiles":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tiles"},name:"Tile Shop"},"shop/tobacco":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tobacco"},name:"Tobacco Shop"},"shop/toys":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys"},name:"Toy Store"},"shop/trade":{icon:"maki-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:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency"},name:"Travel Agency"},"shop/tyres":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres"},name:"Tire Store"},"shop/vacuum_cleaner":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"watches"},name:"Watches Shop"},"shop/water_sports":{icon:"maki-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:"maki-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:"maki-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:"temaki-window",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"window_blind"},name:"Window Blind Store"},"shop/wine":{icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"wine"},name:"Wine Shop"},tourism:{icon:"maki-attraction",fields:["name","tourism"],geometry:["point","vertex","area"],tags:{tourism:"*"},name:"Tourism"},"tourism/alpine_hut":{icon:"maki-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:"maki-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:"maki-aquarium",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["fish","sea","water"],tags:{tourism:"aquarium"},name:"Aquarium"},"tourism/artwork":{icon:"maki-art-gallery",fields:["name","artwork_type","artist"],geometry:["point","vertex","area"],tags:{tourism:"artwork"},terms:["mural","sculpture","statue"],name:"Artwork"},"tourism/attraction":{icon:"maki-star",fields:["name","operator","address"],geometry:["point","vertex","area"],tags:{tourism:"attraction"},name:"Tourist Attraction"},"tourism/camp_site":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-lodging",fields:["name","brand","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:"maki-information",fields:["information","operator","address","building_area"],geometry:["point","vertex","area"],tags:{tourism:"information"},name:"Information"},"tourism/information/board":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-picnic-site",fields:["name","operator","address","smoking"],geometry:["point","vertex","area"],terms:["camp"],tags:{tourism:"picnic_site"},name:"Picnic Site"},"tourism/theme_park":{icon:"maki-amusement-park",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{tourism:"theme_park"},name:"Theme Park"},"tourism/trail_riding_station":{icon:"maki-horse-riding",fields:["name","horse_stables","horse_riding","horse_dressage","address","phone","website","description"],geometry:["point","area"],tags:{tourism:"trail_riding_station"},name:"Trail Riding Station",matchScore:2},"tourism/viewpoint":{icon:"temaki-binoculars",geometry:["point","vertex"],fields:["direction"],tags:{tourism:"viewpoint"},name:"Viewpoint"},"tourism/wilderness_hut":{icon:"maki-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:"maki-zoo",fields:["name","operator","address","opening_hours"],geometry:["point","area"],terms:["animal"],tags:{tourism:"zoo"},name:"Zoo"},traffic_calming:{icon:"temaki-diamond",fields:["traffic_calming","direction_vertex"],geometry:["vertex","line"],tags:{traffic_calming:"*"},terms:["bump","hump","slow","speed"],name:"Traffic Calming"},"traffic_calming/bump":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["hump","speed","slow"],tags:{traffic_calming:"bump"},name:"Speed Bump"},"traffic_calming/chicane":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["driveway link","speed","slow"],tags:{traffic_calming:"chicane"},name:"Traffic Chicane"},"traffic_calming/choker":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["speed","slow"],tags:{traffic_calming:"choker"},name:"Traffic Choker"},"traffic_calming/cushion":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["bump","hump","speed","slow"],tags:{traffic_calming:"cushion"},name:"Speed Cushion"},"traffic_calming/dip":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["speed","slow"],tags:{traffic_calming:"dip"},name:"Dip"},"traffic_calming/hump":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["bump","speed","slow"],tags:{traffic_calming:"hump"},name:"Speed Hump"},"traffic_calming/island":{icon:"temaki-diamond",geometry:["vertex"],terms:["circle","roundabout","slow"],tags:{traffic_calming:"island"},name:"Traffic Island"},"traffic_calming/rumble_strip":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["audible lines","sleeper lines","growlers"],tags:{traffic_calming:"rumble_strip"},name:"Rumble Strip"},"traffic_calming/table":{icon:"temaki-diamond",fields:["surface"],geometry:["vertex"],tags:{traffic_calming:"table"},terms:["flat top","hump","speed","slow"],name:"Speed Table"},"type/multipolygon":{icon:"iD-multipolygon",geometry:["area","relation"],tags:{type:"multipolygon"},removeTags:{},name:"Multipolygon",searchable:false,matchScore:0.1},"type/boundary":{icon:"iD-boundary",fields:["name","boundary"],geometry:["relation"],tags:{type:"boundary"},name:"Boundary"},"type/boundary/administrative":{icon:"iD-boundary",fields:["name","admin_level"],geometry:["relation"],tags:{type:"boundary",boundary:"administrative"},reference:{key:"boundary",value:"administrative"},name:"Administrative Boundary"},"type/restriction":{icon:"iD-restriction",fields:["name","restriction","except"],geometry:["relation"],tags:{type:"restriction"},name:"Restriction"},"type/restriction/no_left_turn":{icon:"iD-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:"iD-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:"iD-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:"iD-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:"iD-restriction-only-left-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_left_turn"},name:"Only Left Turn"},"type/restriction/only_right_turn":{icon:"iD-restriction-only-right-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_right_turn"},name:"Only Right Turn"},"type/restriction/only_straight_on":{icon:"iD-restriction-only-straight-on",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_straight_on"},name:"Only Straight On"},"type/restriction/only_u_turn":{icon:"iD-restriction-only-u-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_u_turn"},name:"Only U-turn"},"type/route_master":{icon:"iD-route-master",fields:["name","route_master","ref","operator","network"],geometry:["relation"],tags:{type:"route_master"},name:"Route Master"},"type/route":{icon:"iD-route",fields:["name","route","ref_route","operator","network"],geometry:["relation"],tags:{type:"route"},name:"Route"},"type/route/bicycle":{icon:"iD-route-bicycle",fields:["name","ref_route","network_bicycle","cycle_network"],geometry:["relation"],tags:{type:"route",route:"bicycle"},name:"Cycle Route"},"type/route/bus":{icon:"iD-route-bus",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"bus"},name:"Bus Route"},"type/route/detour":{icon:"iD-route-detour",fields:["name","ref_route"],geometry:["relation"],tags:{type:"route",route:"detour"},name:"Detour Route"},"type/route/ferry":{icon:"iD-route-ferry",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"ferry"},name:"Ferry Route"},"type/route/foot":{icon:"iD-route-foot",fields:["name","ref_route","operator","network_foot"],geometry:["relation"],tags:{type:"route",route:"foot"},name:"Foot Route"},"type/route/hiking":{icon:"iD-route-foot",fields:["name","ref_route","operator","network_foot","description","distance"],geometry:["relation"],tags:{type:"route",route:"hiking"},name:"Hiking Route"},"type/route/horse":{icon:"iD-route-horse",fields:["name","ref_route","operator","network_horse","description","distance"],geometry:["relation"],tags:{type:"route",route:"horse"},name:"Riding Route"},"type/route/light_rail":{icon:"iD-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:"iD-route-pipeline",fields:["name","ref_route","operator"],geometry:["relation"],tags:{type:"route",route:"pipeline"},name:"Pipeline Route"},"type/route/piste":{icon:"iD-route-piste",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"piste"},name:"Piste/Ski Route"},"type/route/power":{icon:"iD-route-power",fields:["name","ref_route","operator"],geometry:["relation"],tags:{type:"route",route:"power"},name:"Power Route"},"type/route/road":{icon:"iD-route-road",fields:["name","ref_route","network_road"],geometry:["relation"],tags:{type:"route",route:"road"},name:"Road Route"},"type/route/subway":{icon:"iD-route-subway",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"subway"},name:"Subway Route"},"type/route/train":{icon:"iD-route-train",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"train"},name:"Train Route"},"type/route/tram":{icon:"iD-route-tram",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"tram"},name:"Tram Route"},"type/site":{icon:"iD-relation",fields:["name","site"],geometry:["relation"],tags:{type:"site"},name:"Site"},"type/waterway":{icon:"iD-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:"maki-harbor",fields:["name","operator"],geometry:["area","vertex","point"],tags:{waterway:"boatyard"},name:"Boatyard"},"waterway/canal":{icon:"iD-waterway-canal",fields:["name","width","intermittent"],geometry:["line"],tags:{waterway:"canal"},name:"Canal"},"waterway/dam":{icon:"maki-dam",geometry:["point","vertex","line","area"],fields:["name"],tags:{waterway:"dam"},name:"Dam"},"waterway/ditch":{icon:"iD-waterway-ditch",fields:["structure_waterway","intermittent"],geometry:["line"],tags:{waterway:"ditch"},name:"Ditch"},"waterway/dock":{icon:"maki-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:"iD-waterway-ditch",fields:["structure_waterway","intermittent"],geometry:["line"],tags:{waterway:"drain"},name:"Drain"},"waterway/fuel":{icon:"maki-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:"iD-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:"maki-water",geometry:["area"],tags:{waterway:"riverbank"},name:"Riverbank"},"waterway/sanitary_dump_station":{icon:"temaki-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:"iD-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:"iD-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:"maki-drinking-water",geometry:["area","vertex","point"],tags:{waterway:"water_point"},name:"Marine Drinking Water"},"waterway/waterfall":{icon:"maki-water",fields:["name","height","width","intermittent"],geometry:["vertex"],terms:["fall"],tags:{waterway:"waterfall"},name:"Waterfall"},"waterway/weir":{icon:"maki-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:"maki-theatre",geometry:["point","area"],fields:["name","address","building_area","opening_hours"],suggestion:true},"amenity/arts_centre/Дом культуры":{tags:{name:"Дом культуры",amenity:"arts_centre"},name:"Дом культуры",icon:"maki-theatre",geometry:["point","area"],fields:["name","address","building_area","opening_hours"],suggestion:true},"amenity/bank/ABANCA":{tags:{name:"ABANCA",amenity:"bank"},name:"ABANCA",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-bank",geometry:["point","area"],fields:["name","currency_multi","operator","address","building_area","opening_hours"],suggestion:true},"amenity/bureau_de_change/Change":{tags:{name:"Change",amenity:"bureau_de_change"},name:"Change",icon:"maki-bank",geometry:["point","area"],fields:["name","currency_multi","operator","address","building_area","opening_hours"],suggestion:true},"amenity/bureau_de_change/Travelex":{tags:{name:"Travelex",amenity:"bureau_de_change"},name:"Travelex",icon:"maki-bank",geometry:["point","area"],fields:["name","currency_multi","operator","address","building_area","opening_hours"],suggestion:true},"amenity/cafe/85度C":{tags:{name:"85度C",amenity:"cafe"},name:"85度C",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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":"Doutor",amenity:"cafe"},name:"ドトールコーヒーショップ",icon:"maki-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:"maki-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:"maki-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:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Avis":{tags:{name:"Avis",amenity:"car_rental"},name:"Avis",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Budget":{tags:{name:"Budget",amenity:"car_rental"},name:"Budget",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Enterprise":{tags:{name:"Enterprise",amenity:"car_rental"},name:"Enterprise",icon:"maki-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:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Europcar":{tags:{name:"Europcar",amenity:"car_rental"},name:"Europcar",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Hertz":{tags:{name:"Hertz",amenity:"car_rental"},name:"Hertz",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Localiza":{tags:{name:"Localiza",amenity:"car_rental"},name:"Localiza",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Sixt":{tags:{name:"Sixt",amenity:"car_rental"},name:"Sixt",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Thrifty":{tags:{name:"Thrifty",amenity:"car_rental"},name:"Thrifty",icon:"maki-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:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/オリックスレンタカー":{tags:{name:"オリックスレンタカー",amenity:"car_rental"},name:"オリックスレンタカー",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/トヨタレンタカー":{tags:{name:"トヨタレンタカー",amenity:"car_rental"},name:"トヨタレンタカー",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/トヨタレンタリース":{tags:{name:"トヨタレンタリース",amenity:"car_rental"},name:"トヨタレンタリース",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/ニッポンレンタカー":{tags:{name:"ニッポンレンタカー",amenity:"car_rental"},name:"ニッポンレンタカー",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_wash/Autolavaggio":{tags:{name:"Autolavaggio",amenity:"car_wash"},name:"Autolavaggio",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Автомийка":{tags:{name:"Автомийка",amenity:"car_wash"},name:"Автомийка",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-doctor",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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-doctor",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:"maki-doctor",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:"maki-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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-fast-food",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:"maki-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:"maki-fuel",geometry:["point","area"],fields:["name","brand","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:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ADNOC":{tags:{name:"ADNOC",amenity:"fuel"},name:"ADNOC",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ANP":{tags:{name:"ANP",amenity:"fuel"},name:"ANP",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ARAL":{tags:{name:"ARAL",amenity:"fuel"},name:"ARAL",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Aegean":{tags:{name:"Aegean",amenity:"fuel"},name:"Aegean",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Afriquia":{tags:{name:"Afriquia",amenity:"fuel"},name:"Afriquia",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Agip":{tags:{name:"Agip",amenity:"fuel"},name:"Agip",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Agrola":{tags:{name:"Agrola",amenity:"fuel"},name:"Agrola",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Alon":{tags:{name:"Alon",amenity:"fuel"},name:"Alon",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Alpet":{tags:{name:"Alpet",amenity:"fuel"},name:"Alpet",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Api":{tags:{name:"Api",amenity:"fuel"},name:"Api",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Aral":{tags:{name:"Aral",amenity:"fuel"},name:"Aral",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Arco":{tags:{name:"Arco",amenity:"fuel"},name:"Arco",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Avanti":{tags:{name:"Avanti",amenity:"fuel"},name:"Avanti",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Avia":{tags:{name:"Avia",amenity:"fuel"},name:"Avia",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/BEBECO":{tags:{name:"BEBECO",amenity:"fuel"},name:"BEBECO",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/BFT":{tags:{name:"BFT",amenity:"fuel"},name:"BFT",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/BHPetrol":{tags:{name:"BHPetrol",amenity:"fuel"},name:"BHPetrol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/BP":{tags:{name:"BP",amenity:"fuel"},name:"BP",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/BR":{tags:{name:"BR",amenity:"fuel"},name:"BR",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Bangchak":{tags:{name:"Bangchak",amenity:"fuel"},name:"Bangchak",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Benzina":{tags:{name:"Benzina",amenity:"fuel"},name:"Benzina",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Bharat Petroleum":{tags:{name:"Bharat Petroleum",amenity:"fuel"},name:"Bharat Petroleum",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Bliska":{tags:{name:"Bliska",amenity:"fuel"},name:"Bliska",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/CAMPSA":{tags:{name:"CAMPSA",amenity:"fuel"},name:"CAMPSA",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/CARREFOUR":{tags:{name:"CARREFOUR",amenity:"fuel"},name:"CARREFOUR",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/CEPSA":{tags:{name:"CEPSA",amenity:"fuel"},name:"CEPSA",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/CNG":{tags:{name:"CNG",amenity:"fuel"},name:"CNG",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Caltex":{tags:{name:"Caltex",amenity:"fuel"},name:"Caltex",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Campsa":{tags:{name:"Campsa",amenity:"fuel"},name:"Campsa",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","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:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Cenex":{tags:{name:"Cenex",amenity:"fuel"},name:"Cenex",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Cepsa":{tags:{name:"Cepsa",amenity:"fuel"},name:"Cepsa",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Ceypetco":{tags:{name:"Ceypetco",amenity:"fuel"},name:"Ceypetco",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Chevron":{tags:{name:"Chevron",amenity:"fuel"},name:"Chevron",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Citgo":{tags:{name:"Citgo",amenity:"fuel"},name:"Citgo",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Clark":{tags:{name:"Clark",amenity:"fuel"},name:"Clark",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Coles Express":{tags:{name:"Coles Express",amenity:"fuel"},name:"Coles Express",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Conoco":{tags:{name:"Conoco",amenity:"fuel"},name:"Conoco",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Copec":{tags:{name:"Copec",amenity:"fuel"},name:"Copec",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Copetrol":{tags:{name:"Copetrol",amenity:"fuel"},name:"Copetrol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Cosmo":{tags:{name:"Cosmo",amenity:"fuel"},name:"Cosmo",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Crodux":{tags:{name:"Crodux",amenity:"fuel"},name:"Crodux",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Delta":{tags:{name:"Delta",amenity:"fuel"},name:"Delta",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Diamond Shamrock":{tags:{name:"Diamond Shamrock",amenity:"fuel"},name:"Diamond Shamrock",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Drummed Fuel":{tags:{name:"Drummed Fuel",amenity:"fuel"},name:"Drummed Fuel",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/EKO":{tags:{name:"EKO",amenity:"fuel"},name:"EKO",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ENEOS":{tags:{name:"ENEOS",amenity:"fuel"},name:"ENEOS",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ENI":{tags:{name:"ENI",amenity:"fuel"},name:"ENI",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ERG":{tags:{name:"ERG",amenity:"fuel"},name:"ERG",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Elan":{tags:{name:"Elan",amenity:"fuel"},name:"Elan",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Eneos":{tags:{name:"Eneos",amenity:"fuel"},name:"Eneos",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Engen":{tags:{name:"Engen",amenity:"fuel"},name:"Engen",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Eni":{tags:{name:"Eni",amenity:"fuel"},name:"Eni",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Erg":{tags:{name:"Erg",amenity:"fuel"},name:"Erg",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Esso":{tags:{name:"Esso",amenity:"fuel"},name:"Esso",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Esso Express":{tags:{name:"Esso Express",amenity:"fuel"},name:"Esso Express",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/EuroOil":{tags:{name:"EuroOil",amenity:"fuel"},name:"EuroOil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Exxon":{tags:{name:"Exxon",amenity:"fuel"},name:"Exxon",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/F24":{tags:{name:"F24",amenity:"fuel"},name:"F24",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Firezone":{tags:{name:"Firezone",amenity:"fuel"},name:"Firezone",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Flying V":{tags:{name:"Flying V",amenity:"fuel"},name:"Flying V",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/GALP":{tags:{name:"GALP",amenity:"fuel"},name:"GALP",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Gazprom":{tags:{name:"Gazprom",amenity:"fuel"},name:"Gazprom",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/GetGo":{tags:{name:"GetGo",amenity:"fuel"},name:"GetGo",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Goil":{tags:{name:"Goil",amenity:"fuel"},name:"Goil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Gulf":{tags:{name:"Gulf",amenity:"fuel"},name:"Gulf",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","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:"maki-fuel",geometry:["point","area"],fields:["name","brand","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:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/HEM":{tags:{name:"HEM",amenity:"fuel"},name:"HEM",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/HP":{tags:{name:"HP",amenity:"fuel"},name:"HP",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","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:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Helios":{tags:{name:"Helios",amenity:"fuel"},name:"Helios",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Hess":{tags:{name:"Hess",amenity:"fuel"},name:"Hess",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Hindustan Petroleum":{tags:{name:"Hindustan Petroleum",amenity:"fuel"},name:"Hindustan Petroleum",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Holiday":{tags:{name:"Holiday",amenity:"fuel"},name:"Holiday",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Husky":{tags:{name:"Husky",amenity:"fuel"},name:"Husky",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/IES":{tags:{name:"IES",amenity:"fuel"},name:"IES",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/IP":{tags:{name:"IP",amenity:"fuel"},name:"IP",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","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:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Indian Oil":{tags:{name:"Indian Oil",amenity:"fuel"},name:"Indian Oil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Indipend.":{tags:{name:"Indipend.",amenity:"fuel"},name:"Indipend.",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Ingo":{tags:{name:"Ingo",amenity:"fuel"},name:"Ingo",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Ipiranga":{tags:{name:"Ipiranga",amenity:"fuel"},name:"Ipiranga",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Irving":{tags:{name:"Irving",amenity:"fuel"},name:"Irving",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/JA-SS":{tags:{name:"JA-SS",amenity:"fuel"},name:"JA-SS",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/JOMO":{tags:{name:"JOMO",amenity:"fuel"},name:"JOMO",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Jet":{tags:{name:"Jet",amenity:"fuel"},name:"Jet",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Jetti":{tags:{name:"Jetti",amenity:"fuel"},name:"Jetti",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Kangaroo":{tags:{name:"Kangaroo",amenity:"fuel"},name:"Kangaroo",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Kobil":{tags:{name:"Kobil",amenity:"fuel"},name:"Kobil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Kroger Fuel":{tags:{name:"Kroger Fuel",amenity:"fuel"},name:"Kroger Fuel",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Kum & Go":{tags:{name:"Kum & Go",amenity:"fuel"},name:"Kum & Go",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Kwik Trip":{tags:{name:"Kwik Trip",amenity:"fuel"},name:"Kwik Trip",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/LPG":{tags:{name:"LPG",amenity:"fuel"},name:"LPG",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/LPG Station":{tags:{name:"LPG Station",amenity:"fuel"},name:"LPG Station",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/LUKOIL":{tags:{name:"LUKOIL",amenity:"fuel"},name:"LUKOIL",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Liberty":{tags:{name:"Liberty",amenity:"fuel"},name:"Liberty",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Lotos":{tags:{name:"Lotos",amenity:"fuel"},name:"Lotos",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Lotos Optima":{tags:{name:"Lotos Optima",amenity:"fuel"},name:"Lotos Optima",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Love's":{tags:{name:"Love's",amenity:"fuel"},name:"Love's",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Lukoil":{tags:{name:"Lukoil",amenity:"fuel"},name:"Lukoil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/MEROIL":{tags:{name:"MEROIL",amenity:"fuel"},name:"MEROIL",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/MOL":{tags:{name:"MOL",amenity:"fuel"},name:"MOL",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/MRS":{tags:{name:"MRS",amenity:"fuel"},name:"MRS",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Marathon":{tags:{name:"Marathon",amenity:"fuel"},name:"Marathon",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Maverik":{tags:{name:"Maverik",amenity:"fuel"},name:"Maverik",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Maxol":{tags:{name:"Maxol",amenity:"fuel"},name:"Maxol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Metano":{tags:{name:"Metano",amenity:"fuel"},name:"Metano",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Migrol":{tags:{name:"Migrol",amenity:"fuel"},name:"Migrol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Minipump":{tags:{name:"Minipump",amenity:"fuel"},name:"Minipump",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Mobil":{tags:{name:"Mobil",amenity:"fuel"},name:"Mobil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Mobile":{tags:{name:"Mobile",amenity:"fuel"},name:"Mobile",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Mol":{tags:{name:"Mol",amenity:"fuel"},name:"Mol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Moya":{tags:{name:"Moya",amenity:"fuel"},name:"Moya",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Murphy USA":{tags:{name:"Murphy USA",amenity:"fuel"},name:"Murphy USA",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Neste":{tags:{name:"Neste",amenity:"fuel"},name:"Neste",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/OIL!":{tags:{name:"OIL!",amenity:"fuel"},name:"OIL!",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/OK":{tags:{name:"OK",amenity:"fuel"},name:"OK",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/OKQ8":{tags:{name:"OKQ8",amenity:"fuel"},name:"OKQ8",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/OMV":{tags:{name:"OMV",amenity:"fuel"},name:"OMV",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Oilibya":{tags:{name:"Oilibya",brand:"Oilibya","name:ar":"أويليبيا",amenity:"fuel"},name:"Oilibya",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Opet":{tags:{name:"Opet",amenity:"fuel"},name:"Opet",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Orlen":{tags:{name:"Orlen",amenity:"fuel"},name:"Orlen",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PETRONOR":{tags:{name:"PETRONOR",amenity:"fuel"},name:"PETRONOR",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PSO":{tags:{name:"PSO",amenity:"fuel"},name:"PSO",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","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:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PT":{tags:{name:"PT",amenity:"fuel"},name:"PT",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PTT":{tags:{name:"PTT",amenity:"fuel"},name:"PTT",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PV Oil":{tags:{name:"PV Oil",amenity:"fuel"},name:"PV Oil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pacific Pride":{tags:{name:"Pacific Pride",amenity:"fuel"},name:"Pacific Pride",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pecsa":{tags:{name:"Pecsa",amenity:"fuel"},name:"Pecsa",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pemex":{tags:{name:"Pemex",amenity:"fuel"},name:"Pemex",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pertamina":{tags:{name:"Pertamina",amenity:"fuel"},name:"Pertamina",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petro":{tags:{name:"Petro",amenity:"fuel"},name:"Petro",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petro-Canada":{tags:{name:"Petro-Canada",amenity:"fuel"},name:"Petro-Canada",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petrochina":{tags:{name:"Petrochina",amenity:"fuel"},name:"Petrochina",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petroecuador":{tags:{name:"Petroecuador",amenity:"fuel"},name:"Petroecuador",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petrol Ofisi":{tags:{name:"Petrol Ofisi",amenity:"fuel"},name:"Petrol Ofisi",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petrolimex":{tags:{name:"Petrolimex",amenity:"fuel"},name:"Petrolimex",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petrom":{tags:{name:"Petrom",amenity:"fuel"},name:"Petrom",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petron":{tags:{name:"Petron",amenity:"fuel"},name:"Petron",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petronas":{tags:{name:"Petronas",amenity:"fuel"},name:"Petronas",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petroperu":{tags:{name:"Petroperu",amenity:"fuel"},name:"Petroperu",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Phillips 66":{tags:{name:"Phillips 66",amenity:"fuel"},name:"Phillips 66",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Phoenix":{tags:{name:"Phoenix",amenity:"fuel"},name:"Phoenix",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pilot":{tags:{name:"Pilot",amenity:"fuel"},name:"Pilot",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pioneer":{tags:{name:"Pioneer",amenity:"fuel"},name:"Pioneer",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Posto":{tags:{name:"Posto",amenity:"fuel"},name:"Posto",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Posto Atem":{tags:{name:"Posto Atem",amenity:"fuel"},name:"Posto Atem",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Posto Ipiranga":{tags:{name:"Posto Ipiranga",amenity:"fuel"},name:"Posto Ipiranga",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Posto Shell":{tags:{name:"Posto Shell",amenity:"fuel"},name:"Posto Shell",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Primax":{tags:{name:"Primax",amenity:"fuel"},name:"Primax",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Prio":{tags:{name:"Prio",amenity:"fuel"},name:"Prio",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Puma":{tags:{name:"Puma",amenity:"fuel"},name:"Puma",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Q1":{tags:{name:"Q1",amenity:"fuel"},name:"Q1",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Q8":{tags:{name:"Q8",amenity:"fuel"},name:"Q8",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Q8 Easy":{tags:{name:"Q8 Easy",amenity:"fuel"},name:"Q8 Easy",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/QuikTrip":{tags:{name:"QuikTrip",amenity:"fuel"},name:"QuikTrip",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/REPSOL":{tags:{name:"REPSOL",amenity:"fuel"},name:"REPSOL",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/RaceTrac":{tags:{name:"RaceTrac",amenity:"fuel"},name:"RaceTrac",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Repsol":{tags:{name:"Repsol",amenity:"fuel"},name:"Repsol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Rompetrol":{tags:{name:"Rompetrol",amenity:"fuel"},name:"Rompetrol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Rubis":{tags:{name:"Rubis",amenity:"fuel"},name:"Rubis",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/SB Tank":{tags:{name:"SB Tank",amenity:"fuel"},name:"SB Tank",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/SPBU":{tags:{name:"SPBU",amenity:"fuel"},name:"SPBU",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sasol":{tags:{name:"Sasol",amenity:"fuel"},name:"Sasol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sea Oil":{tags:{name:"Sea Oil",amenity:"fuel"},name:"Sea Oil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sheetz":{tags:{name:"Sheetz",amenity:"fuel"},name:"Sheetz",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Shell":{tags:{name:"Shell",amenity:"fuel"},name:"Shell",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Shell Express":{tags:{name:"Shell Express",amenity:"fuel"},name:"Shell Express",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sinclair":{tags:{name:"Sinclair",amenity:"fuel"},name:"Sinclair",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sinopec":{tags:{name:"Sinopec",amenity:"fuel"},name:"Sinopec",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sinopec Fuel":{tags:{name:"Sinopec Fuel",amenity:"fuel"},name:"Sinopec Fuel",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Slovnaft":{tags:{name:"Slovnaft",amenity:"fuel"},name:"Slovnaft",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Socar":{tags:{name:"Socar",amenity:"fuel"},name:"Socar",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sokimex":{tags:{name:"Sokimex",amenity:"fuel"},name:"Sokimex",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Speedway":{tags:{name:"Speedway",amenity:"fuel"},name:"Speedway",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/St1":{tags:{name:"St1",amenity:"fuel"},name:"St1",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Star":{tags:{name:"Star",amenity:"fuel"},name:"Star",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Star Oil":{tags:{name:"Star Oil",amenity:"fuel"},name:"Star Oil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","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:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Statoil":{tags:{name:"Statoil",amenity:"fuel"},name:"Statoil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sunoco":{tags:{name:"Sunoco",amenity:"fuel"},name:"Sunoco",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Tamoil":{tags:{name:"Tamoil",amenity:"fuel"},name:"Tamoil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Tango":{tags:{name:"Tango",amenity:"fuel"},name:"Tango",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Teboil":{tags:{name:"Teboil",amenity:"fuel"},name:"Teboil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Tela":{tags:{name:"Tela",amenity:"fuel"},name:"Tela",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Terpel":{tags:{name:"Terpel",amenity:"fuel"},name:"Terpel",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Texaco":{tags:{name:"Texaco",amenity:"fuel"},name:"Texaco",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Tinq":{tags:{name:"Tinq",amenity:"fuel"},name:"Tinq",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Topaz":{tags:{name:"Topaz",amenity:"fuel"},name:"Topaz",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Total":{tags:{name:"Total",amenity:"fuel"},name:"Total",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Total Access":{tags:{name:"Total Access",amenity:"fuel"},name:"Total Access",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Total Erg":{tags:{name:"Total Erg",amenity:"fuel"},name:"Total Erg",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/TotalErg":{tags:{name:"TotalErg",amenity:"fuel"},name:"TotalErg",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Turkey Hill":{tags:{name:"Turkey Hill",amenity:"fuel"},name:"Turkey Hill",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Turmöl":{tags:{name:"Turmöl",amenity:"fuel"},name:"Turmöl",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Ultramar":{tags:{name:"Ultramar",amenity:"fuel"},name:"Ultramar",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/United":{tags:{name:"United",amenity:"fuel"},name:"United",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Uno":{tags:{name:"Uno",amenity:"fuel"},name:"Uno",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Uno-X":{tags:{name:"Uno-X",amenity:"fuel"},name:"Uno-X",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Valero":{tags:{name:"Valero",amenity:"fuel"},name:"Valero",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Vito":{tags:{name:"Vito",amenity:"fuel"},name:"Vito",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/WOG":{tags:{name:"WOG",amenity:"fuel"},name:"WOG",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Westfalen":{tags:{name:"Westfalen",amenity:"fuel"},name:"Westfalen",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Woolworths Petrol":{tags:{name:"Woolworths Petrol",amenity:"fuel"},name:"Woolworths Petrol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Z":{tags:{name:"Z",amenity:"fuel"},name:"Z",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/bft":{tags:{name:"bft",amenity:"fuel"},name:"bft",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/eni":{tags:{name:"eni",amenity:"fuel"},name:"eni",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ΕΚΟ":{tags:{name:"ΕΚΟ",amenity:"fuel"},name:"ΕΚΟ",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/АГЗС":{tags:{name:"АГЗС",amenity:"fuel"},name:"АГЗС",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/АЗС":{tags:{name:"АЗС",amenity:"fuel"},name:"АЗС",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Авіас":{tags:{name:"Авіас",amenity:"fuel"},name:"Авіас",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/БРСМ-Нафта":{tags:{name:"БРСМ-Нафта",amenity:"fuel"},name:"БРСМ-Нафта",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Башнефть":{tags:{name:"Башнефть",amenity:"fuel"},name:"Башнефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Белоруснефть":{tags:{name:"Белоруснефть",amenity:"fuel"},name:"Белоруснефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Газовая заправка":{tags:{name:"Газовая заправка",amenity:"fuel"},name:"Газовая заправка",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Газпромнефть":{tags:{name:"Газпромнефть",amenity:"fuel"},name:"Газпромнефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Гелиос":{tags:{name:"Гелиос",amenity:"fuel"},name:"Гелиос",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ЕКА":{tags:{name:"ЕКА",amenity:"fuel"},name:"ЕКА",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Заправка":{tags:{name:"Заправка",amenity:"fuel"},name:"Заправка",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/КазМунайГаз":{tags:{name:"КазМунайГаз",amenity:"fuel"},name:"КазМунайГаз",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Лукойл":{tags:{name:"Лукойл",amenity:"fuel"},name:"Лукойл",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Макпетрол":{tags:{name:"Макпетрол",amenity:"fuel"},name:"Макпетрол",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/НК Альянс":{tags:{name:"НК Альянс",amenity:"fuel"},name:"НК Альянс",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Нефтьмагистраль":{tags:{name:"Нефтьмагистраль",amenity:"fuel"},name:"Нефтьмагистраль",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ОККО":{tags:{name:"ОККО",amenity:"fuel"},name:"ОККО",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ОМВ":{tags:{name:"ОМВ",amenity:"fuel"},name:"ОМВ",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Октан":{tags:{name:"Октан",amenity:"fuel"},name:"Октан",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ПТК":{tags:{name:"ПТК",amenity:"fuel"},name:"ПТК",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Петрол":{tags:{name:"Петрол",amenity:"fuel"},name:"Петрол",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Пропан":{tags:{name:"Пропан",amenity:"fuel"},name:"Пропан",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Роснефть":{tags:{name:"Роснефть",amenity:"fuel"},name:"Роснефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Сибнефть":{tags:{name:"Сибнефть",amenity:"fuel"},name:"Сибнефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Сургутнефтегаз":{tags:{name:"Сургутнефтегаз",amenity:"fuel"},name:"Сургутнефтегаз",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ТНК":{tags:{name:"ТНК",amenity:"fuel"},name:"ТНК",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Татнефтепродукт":{tags:{name:"Татнефтепродукт",amenity:"fuel"},name:"Татнефтепродукт",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Татнефть":{tags:{name:"Татнефть",amenity:"fuel"},name:"Татнефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Укрнафта":{tags:{name:"Укрнафта",amenity:"fuel"},name:"Укрнафта",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/דור אלון":{tags:{name:"דור אלון",amenity:"fuel"},name:"דור אלון",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/דלק":{tags:{name:"דלק",amenity:"fuel"},name:"דלק",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/סונול":{tags:{name:"סונול",amenity:"fuel"},name:"סונול",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/פז":{tags:{name:"פז",amenity:"fuel"},name:"פז",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/محطة وقود":{tags:{name:"محطة وقود",amenity:"fuel"},name:"محطة وقود",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/محطه وقود":{tags:{name:"محطه وقود",amenity:"fuel"},name:"محطه وقود",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/پمپ بنزین":{tags:{name:"پمپ بنزین",amenity:"fuel"},name:"پمپ بنزین",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/پمپ گاز":{tags:{name:"پمپ گاز",amenity:"fuel"},name:"پمپ گاز",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/บางจาก":{tags:{name:"บางจาก",amenity:"fuel"},name:"บางจาก",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ป.ต.ท.":{tags:{name:"ป.ต.ท.",amenity:"fuel"},name:"ป.ต.ท.",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/เชลล์":{tags:{name:"เชลล์",amenity:"fuel"},name:"เชลล์",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/เอสโซ่":{tags:{name:"เอสโซ่",amenity:"fuel"},name:"เอสโซ่",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/エッソ":{tags:{name:"エッソ",amenity:"fuel"},name:"エッソ",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/エネオス":{tags:{name:"エネオス",amenity:"fuel"},name:"エネオス",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/コスモ石油":{tags:{name:"コスモ石油",amenity:"fuel"},name:"コスモ石油",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ゼネラル":{tags:{name:"ゼネラル",amenity:"fuel"},name:"ゼネラル",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/中国石化":{tags:{name:"中国石化",amenity:"fuel"},name:"中国石化",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/中国石化 Sinopec":{tags:{name:"中国石化 Sinopec",amenity:"fuel"},name:"中国石化 Sinopec",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/中国石油":{tags:{name:"中国石油",amenity:"fuel"},name:"中国石油",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/中油":{tags:{name:"中油",amenity:"fuel"},name:"中油",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/出光":{tags:{name:"出光","name:en":"Idemitsu",amenity:"fuel"},name:"出光",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/加油站":{tags:{name:"加油站",amenity:"fuel"},name:"加油站",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/台灣中油":{tags:{name:"台灣中油",amenity:"fuel"},name:"台灣中油",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/昭和シェル":{tags:{name:"昭和シェル",amenity:"fuel"},name:"昭和シェル",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","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:"maki-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:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Инфекционное отделение":{tags:{name:"Инфекционное отделение",healthcare:"hospital",amenity:"hospital"},name:"Инфекционное отделение",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Кожно-венерологический диспансер":{tags:{name:"Кожно-венерологический диспансер",healthcare:"hospital",amenity:"hospital"},name:"Кожно-венерологический диспансер",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Районная больница":{tags:{name:"Районная больница",healthcare:"hospital",amenity:"hospital"},name:"Районная больница",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Роддом":{tags:{name:"Роддом",healthcare:"hospital",amenity:"hospital"},name:"Роддом",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Родильный дом":{tags:{name:"Родильный дом",healthcare:"hospital",amenity:"hospital"},name:"Родильный дом",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Скорая помощь":{tags:{name:"Скорая помощь",healthcare:"hospital",amenity:"hospital"},name:"Скорая помощь",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/ЦРБ":{tags:{name:"ЦРБ",healthcare:"hospital",amenity:"hospital"},name:"ЦРБ",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Центральная районная больница":{tags:{name:"Центральная районная больница",healthcare:"hospital",amenity:"hospital"},name:"Центральная районная больница",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/โรงพยาบาลส่งเสริมสุขภาพตำบล":{tags:{name:"โรงพยาบาลส่งเสริมสุขภาพตำบล",healthcare:"hospital",amenity:"hospital"},name:"โรงพยาบาลส่งเสริมสุขภาพตำบล",icon:"maki-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:"maki-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:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Arche Noah":{tags:{name:"Arche Noah",amenity:"kindergarten"},name:"Arche Noah",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/CONAFE Preescolar":{tags:{name:"CONAFE Preescolar",amenity:"kindergarten"},name:"CONAFE Preescolar",icon:"maki-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:"maki-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:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Evangelischer Kindergarten":{tags:{name:"Evangelischer Kindergarten",amenity:"kindergarten"},name:"Evangelischer Kindergarten",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Federico Froebel":{tags:{name:"Federico Froebel",amenity:"kindergarten"},name:"Federico Froebel",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Gabriela Mistral":{tags:{name:"Gabriela Mistral",amenity:"kindergarten"},name:"Gabriela Mistral",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Jean Piaget":{tags:{name:"Jean Piaget",amenity:"kindergarten"},name:"Jean Piaget",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Katholischer Kindergarten":{tags:{name:"Katholischer Kindergarten",amenity:"kindergarten"},name:"Katholischer Kindergarten",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Kindergarten Regenbogen":{tags:{name:"Kindergarten Regenbogen",amenity:"kindergarten"},name:"Kindergarten Regenbogen",icon:"maki-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:"maki-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:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Maria Montessori":{tags:{name:"Maria Montessori",amenity:"kindergarten"},name:"Maria Montessori",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/PAUD":{tags:{name:"PAUD",amenity:"kindergarten"},name:"PAUD",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Pusteblume":{tags:{name:"Pusteblume",amenity:"kindergarten"},name:"Pusteblume",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Rosaura Zapata":{tags:{name:"Rosaura Zapata",amenity:"kindergarten"},name:"Rosaura Zapata",icon:"maki-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:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Spatzennest":{tags:{name:"Spatzennest",amenity:"kindergarten"},name:"Spatzennest",icon:"maki-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:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Villa Kunterbunt":{tags:{name:"Villa Kunterbunt",amenity:"kindergarten"},name:"Villa Kunterbunt",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Waldkindergarten":{tags:{name:"Waldkindergarten",amenity:"kindergarten"},name:"Waldkindergarten",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Waldorfkindergarten":{tags:{name:"Waldorfkindergarten",amenity:"kindergarten"},name:"Waldorfkindergarten",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Óvoda":{tags:{name:"Óvoda",amenity:"kindergarten"},name:"Óvoda",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детсад":{tags:{name:"Детсад",amenity:"kindergarten"},name:"Детсад",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад Солнышко":{tags:{name:"Детский сад Солнышко",amenity:"kindergarten"},name:"Детский сад Солнышко",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад № 1":{tags:{name:"Детский сад № 1",amenity:"kindergarten"},name:"Детский сад № 1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №1":{tags:{name:"Детский сад №1",amenity:"kindergarten"},name:"Детский сад №1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №10":{tags:{name:"Детский сад №10",amenity:"kindergarten"},name:"Детский сад №10",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №11":{tags:{name:"Детский сад №11",amenity:"kindergarten"},name:"Детский сад №11",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №12":{tags:{name:"Детский сад №12",amenity:"kindergarten"},name:"Детский сад №12",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №13":{tags:{name:"Детский сад №13",amenity:"kindergarten"},name:"Детский сад №13",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №14":{tags:{name:"Детский сад №14",amenity:"kindergarten"},name:"Детский сад №14",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №15":{tags:{name:"Детский сад №15",amenity:"kindergarten"},name:"Детский сад №15",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №16":{tags:{name:"Детский сад №16",amenity:"kindergarten"},name:"Детский сад №16",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №17":{tags:{name:"Детский сад №17",amenity:"kindergarten"},name:"Детский сад №17",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №18":{tags:{name:"Детский сад №18",amenity:"kindergarten"},name:"Детский сад №18",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №19":{tags:{name:"Детский сад №19",amenity:"kindergarten"},name:"Детский сад №19",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №2":{tags:{name:"Детский сад №2",amenity:"kindergarten"},name:"Детский сад №2",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №22":{tags:{name:"Детский сад №22",amenity:"kindergarten"},name:"Детский сад №22",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №24":{tags:{name:"Детский сад №24",amenity:"kindergarten"},name:"Детский сад №24",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №25":{tags:{name:"Детский сад №25",amenity:"kindergarten"},name:"Детский сад №25",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №27":{tags:{name:"Детский сад №27",amenity:"kindergarten"},name:"Детский сад №27",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №29":{tags:{name:"Детский сад №29",amenity:"kindergarten"},name:"Детский сад №29",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №3":{tags:{name:"Детский сад №3",amenity:"kindergarten"},name:"Детский сад №3",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №33":{tags:{name:"Детский сад №33",amenity:"kindergarten"},name:"Детский сад №33",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №4":{tags:{name:"Детский сад №4",amenity:"kindergarten"},name:"Детский сад №4",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №5":{tags:{name:"Детский сад №5",amenity:"kindergarten"},name:"Детский сад №5",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №6":{tags:{name:"Детский сад №6",amenity:"kindergarten"},name:"Детский сад №6",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №7":{tags:{name:"Детский сад №7",amenity:"kindergarten"},name:"Детский сад №7",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №8":{tags:{name:"Детский сад №8",amenity:"kindergarten"},name:"Детский сад №8",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №9":{tags:{name:"Детский сад №9",amenity:"kindergarten"},name:"Детский сад №9",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Дитячий садок":{tags:{name:"Дитячий садок",amenity:"kindergarten"},name:"Дитячий садок",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Солнышко":{tags:{name:"Солнышко",amenity:"kindergarten"},name:"Солнышко",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/საბავშვო ბაღი":{tags:{name:"საბავშვო ბაღი",amenity:"kindergarten"},name:"საბავშვო ბაღი",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/中央保育所":{tags:{name:"中央保育所",amenity:"kindergarten"},name:"中央保育所",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/library/Biblioteca Comunale":{tags:{name:"Biblioteca Comunale",amenity:"library"},name:"Biblioteca Comunale",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/CEM":{tags:{name:"CEM",amenity:"school"},name:"CEM",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Cuauhtemoc":{tags:{name:"Cuauhtemoc",amenity:"school"},name:"Cuauhtemoc",icon:"maki-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:"maki-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:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/EPP":{tags:{name:"EPP",amenity:"school"},name:"EPP",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Kumon":{tags:{name:"Kumon",amenity:"school"},name:"Kumon",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Pestalozzischule":{tags:{name:"Pestalozzischule",amenity:"school"},name:"Pestalozzischule",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/SD":{tags:{name:"SD",amenity:"school"},name:"SD",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/SDN":{tags:{name:"SDN",amenity:"school"},name:"SDN",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Schillerschule":{tags:{name:"Schillerschule",amenity:"school"},name:"Schillerschule",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Volkshochschule":{tags:{name:"Volkshochschule",amenity:"school"},name:"Volkshochschule",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Volksschule":{tags:{name:"Volksschule",amenity:"school"},name:"Volksschule",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Școală":{tags:{name:"Școală",amenity:"school"},name:"Școală",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Вечерняя школа":{tags:{name:"Вечерняя школа",amenity:"school"},name:"Вечерняя школа",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Гимназия №1":{tags:{name:"Гимназия №1",amenity:"school"},name:"Гимназия №1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Средняя школа №1":{tags:{name:"Средняя школа №1",amenity:"school"},name:"Средняя школа №1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Средняя школа №2":{tags:{name:"Средняя школа №2",amenity:"school"},name:"Средняя школа №2",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Средняя школа №3":{tags:{name:"Средняя школа №3",amenity:"school"},name:"Средняя школа №3",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа № 1":{tags:{name:"Школа № 1",amenity:"school"},name:"Школа № 1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа № 2":{tags:{name:"Школа № 2",amenity:"school"},name:"Школа № 2",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа № 3":{tags:{name:"Школа № 3",amenity:"school"},name:"Школа № 3",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа № 4":{tags:{name:"Школа № 4",amenity:"school"},name:"Школа № 4",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа № 5":{tags:{name:"Школа № 5",amenity:"school"},name:"Школа № 5",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №1":{tags:{name:"Школа №1",amenity:"school"},name:"Школа №1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №10":{tags:{name:"Школа №10",amenity:"school"},name:"Школа №10",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №11":{tags:{name:"Школа №11",amenity:"school"},name:"Школа №11",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №12":{tags:{name:"Школа №12",amenity:"school"},name:"Школа №12",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №13":{tags:{name:"Школа №13",amenity:"school"},name:"Школа №13",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №14":{tags:{name:"Школа №14",amenity:"school"},name:"Школа №14",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №15":{tags:{name:"Школа №15",amenity:"school"},name:"Школа №15",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №16":{tags:{name:"Школа №16",amenity:"school"},name:"Школа №16",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №17":{tags:{name:"Школа №17",amenity:"school"},name:"Школа №17",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №18":{tags:{name:"Школа №18",amenity:"school"},name:"Школа №18",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №19":{tags:{name:"Школа №19",amenity:"school"},name:"Школа №19",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №2":{tags:{name:"Школа №2",amenity:"school"},name:"Школа №2",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №20":{tags:{name:"Школа №20",amenity:"school"},name:"Школа №20",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №21":{tags:{name:"Школа №21",amenity:"school"},name:"Школа №21",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №22":{tags:{name:"Школа №22",amenity:"school"},name:"Школа №22",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №23":{tags:{name:"Школа №23",amenity:"school"},name:"Школа №23",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №24":{tags:{name:"Школа №24",amenity:"school"},name:"Школа №24",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №25":{tags:{name:"Школа №25",amenity:"school"},name:"Школа №25",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №26":{tags:{name:"Школа №26",amenity:"school"},name:"Школа №26",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №27":{tags:{name:"Школа №27",amenity:"school"},name:"Школа №27",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №28":{tags:{name:"Школа №28",amenity:"school"},name:"Школа №28",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №3":{tags:{name:"Школа №3",amenity:"school"},name:"Школа №3",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №31":{tags:{name:"Школа №31",amenity:"school"},name:"Школа №31",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №35":{tags:{name:"Школа №35",amenity:"school"},name:"Школа №35",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №4":{tags:{name:"Школа №4",amenity:"school"},name:"Школа №4",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №5":{tags:{name:"Школа №5",amenity:"school"},name:"Школа №5",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №6":{tags:{name:"Школа №6",amenity:"school"},name:"Школа №6",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №7":{tags:{name:"Школа №7",amenity:"school"},name:"Школа №7",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №8":{tags:{name:"Школа №8",amenity:"school"},name:"Школа №8",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №9":{tags:{name:"Школа №9",amenity:"school"},name:"Школа №9",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/مدرسة":{tags:{name:"مدرسة",amenity:"school"},name:"مدرسة",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/مدرسه":{tags:{name:"مدرسه",amenity:"school"},name:"مدرسه",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/市立南中学校":{tags:{name:"市立南中学校",amenity:"school"},name:"市立南中学校",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/市立南小学校":{tags:{name:"市立南小学校",amenity:"school"},name:"市立南小学校",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/市立東中学校":{tags:{name:"市立東中学校",amenity:"school"},name:"市立東中学校",icon:"maki-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:"temaki-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:"temaki-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:"temaki-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:"maki-theatre",geometry:["point","area"],fields:["name","operator","address","building_area"],suggestion:true},"amenity/theatre/Amphitheater":{tags:{name:"Amphitheater",amenity:"theatre"},name:"Amphitheater",icon:"maki-theatre",geometry:["point","area"],fields:["name","operator","address","building_area"],suggestion:true},"amenity/theatre/Amphitheatre":{tags:{name:"Amphitheatre",amenity:"theatre"},name:"Amphitheatre",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/ДЮСШ":{tags:{name:"ДЮСШ",leisure:"sports_centre"},name:"ДЮСШ",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Ледовый дворец":{tags:{name:"Ледовый дворец",leisure:"sports_centre"},name:"Ледовый дворец",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/体育館":{tags:{name:"体育館",leisure:"sports_centre"},name:"体育館",icon:"maki-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:"maki-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:"maki-swimming",geometry:["point","area"],fields:["name","access_simple","operator","address"],suggestion:true},"leisure/swimming_pool/プール":{tags:{name:"プール",leisure:"swimming_pool"},name:"プール",icon:"maki-swimming",geometry:["point","area"],fields:["name","access_simple","operator","address"],suggestion:true},"leisure/swimming_pool/游泳池":{tags:{name:"游泳池",leisure:"swimming_pool"},name:"游泳池",icon:"maki-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:"temaki-windmill",geometry:["point","area"],fields:["building_area"],suggestion:true},"shop/alcohol/Alko":{tags:{name:"Alko",shop:"alcohol"},name:"Alko",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Булочная":{tags:{name:"Булочная",shop:"bakery"},name:"Булочная",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Горячий хлеб":{tags:{name:"Горячий хлеб",shop:"bakery"},name:"Горячий хлеб",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Каравай":{tags:{name:"Каравай",shop:"bakery"},name:"Каравай",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Кулиничи":{tags:{name:"Кулиничи",shop:"bakery"},name:"Кулиничи",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Кулиничі":{tags:{name:"Кулиничі",shop:"bakery"},name:"Кулиничі",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Свежий хлеб":{tags:{name:"Свежий хлеб",shop:"bakery"},name:"Свежий хлеб",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Хлеб":{tags:{name:"Хлеб",shop:"bakery"},name:"Хлеб",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/مخبز":{tags:{name:"مخبز",shop:"bakery"},name:"مخبز",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/مخبزة":{tags:{name:"مخبزة",shop:"bakery"},name:"مخبزة",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نان لواش":{tags:{name:"نان لواش",shop:"bakery"},name:"نان لواش",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نانوایی":{tags:{name:"نانوایی",shop:"bakery"},name:"نانوایی",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نانوایی بربری":{tags:{name:"نانوایی بربری",shop:"bakery"},name:"نانوایی بربری",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نانوایی سنگک":{tags:{name:"نانوایی سنگک",shop:"bakery"},name:"نانوایی سنگک",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نانوایی سنگکی":{tags:{name:"نانوایی سنگکی",shop:"bakery"},name:"نانوایی سنگکی",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نانوایی لواش":{tags:{name:"نانوایی لواش",shop:"bakery"},name:"نانوایی لواش",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/茶湯會":{tags:{name:"茶湯會",shop:"beverages"},name:"茶湯會",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bookmaker/ΟΠΑΠ":{tags:{name:"ΟΠΑΠ",shop:"bookmaker"},name:"ΟΠΑΠ",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Ариант":{tags:{name:"Ариант",shop:"butcher"},name:"Ариант",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Великолукский мясокомбинат":{tags:{name:"Великолукский мясокомбинат",shop:"butcher"},name:"Великолукский мясокомбинат",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Мясная лавка":{tags:{name:"Мясная лавка",shop:"butcher"},name:"Мясная лавка",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Мясницкий ряд":{tags:{name:"Мясницкий ряд",shop:"butcher"},name:"Мясницкий ряд",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Мясной":{tags:{name:"Мясной",shop:"butcher"},name:"Мясной",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Мясо":{tags:{name:"Мясо",shop:"butcher"},name:"Мясо",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Наша Ряба":{tags:{name:"Наша Ряба",shop:"butcher"},name:"Наша Ряба",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Свежее мясо":{tags:{name:"Свежее мясо",shop:"butcher"},name:"Свежее мясо",icon:"maki-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:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/BMW":{tags:{name:"BMW",shop:"car"},name:"BMW",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Chevrolet":{tags:{name:"Chevrolet",shop:"car"},name:"Chevrolet",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Citroën":{tags:{name:"Citroën",shop:"car"},name:"Citroën",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Dacia":{tags:{name:"Dacia",shop:"car"},name:"Dacia",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Fiat":{tags:{name:"Fiat",shop:"car"},name:"Fiat",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Ford":{tags:{name:"Ford",shop:"car"},name:"Ford",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Honda":{tags:{name:"Honda",shop:"car"},name:"Honda",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Hyundai":{tags:{name:"Hyundai",shop:"car"},name:"Hyundai",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Isuzu":{tags:{name:"Isuzu",shop:"car"},name:"Isuzu",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Kia":{tags:{name:"Kia",shop:"car"},name:"Kia",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Land Rover":{tags:{name:"Land Rover",shop:"car"},name:"Land Rover",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Lexus":{tags:{name:"Lexus",shop:"car"},name:"Lexus",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Mazda":{tags:{name:"Mazda",shop:"car"},name:"Mazda",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Mercedes-Benz":{tags:{name:"Mercedes-Benz",shop:"car"},name:"Mercedes-Benz",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Mitsubishi":{tags:{name:"Mitsubishi",shop:"car"},name:"Mitsubishi",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Mitsubishi Motors":{tags:{name:"Mitsubishi Motors",shop:"car"},name:"Mitsubishi Motors",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/NISSAN":{tags:{name:"NISSAN",shop:"car"},name:"NISSAN",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Nissan":{tags:{name:"Nissan",shop:"car"},name:"Nissan",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Opel":{tags:{name:"Opel",shop:"car"},name:"Opel",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Peugeot":{tags:{name:"Peugeot",shop:"car"},name:"Peugeot",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Porsche":{tags:{name:"Porsche",shop:"car"},name:"Porsche",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Renault":{tags:{name:"Renault",shop:"car"},name:"Renault",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Seat":{tags:{name:"Seat",shop:"car"},name:"Seat",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Skoda":{tags:{name:"Skoda",shop:"car"},name:"Skoda",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Subaru":{tags:{name:"Subaru",shop:"car"},name:"Subaru",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Suzuki":{tags:{name:"Suzuki",shop:"car"},name:"Suzuki",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Toyota":{tags:{name:"Toyota",shop:"car"},name:"Toyota",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Volkswagen":{tags:{name:"Volkswagen",shop:"car"},name:"Volkswagen",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Volvo":{tags:{name:"Volvo",shop:"car"},name:"Volvo",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Бытовая химия":{tags:{name:"Бытовая химия",shop:"chemist"},name:"Бытовая химия",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Магнит Косметик":{tags:{name:"Магнит Косметик",shop:"chemist"},name:"Магнит Косметик",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Мила":{tags:{name:"Мила",shop:"chemist"},name:"Мила",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Остров чистоты":{tags:{name:"Остров чистоты",shop:"chemist"},name:"Остров чистоты",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Рубль Бум":{tags:{name:"Рубль Бум",shop:"chemist"},name:"Рубль Бум",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Улыбка радуги":{tags:{name:"Улыбка радуги",shop:"chemist"},name:"Улыбка радуги",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/屈臣氏":{tags:{name:"屈臣氏",shop:"chemist"},name:"屈臣氏",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/康是美":{tags:{name:"康是美",shop:"chemist"},name:"康是美",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/computer/ДНС":{tags:{name:"ДНС",shop:"computer"},name:"ДНС",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Августина":{tags:{name:"Августина",shop:"convenience"},name:"Августина",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Авоська":{tags:{name:"Авоська",shop:"convenience"},name:"Авоська",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Агрокомплекс":{tags:{name:"Агрокомплекс",shop:"convenience"},name:"Агрокомплекс",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Альянс":{tags:{name:"Альянс",shop:"convenience"},name:"Альянс",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Апельсин":{tags:{name:"Апельсин",shop:"convenience"},name:"Апельсин",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ассорти":{tags:{name:"Ассорти",shop:"convenience"},name:"Ассорти",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Белорусские продукты":{tags:{name:"Белорусские продукты",shop:"convenience"},name:"Белорусские продукты",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Берёзка":{tags:{name:"Берёзка",shop:"convenience"},name:"Берёзка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Везунчик":{tags:{name:"Везунчик",shop:"convenience"},name:"Везунчик",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Весна":{tags:{name:"Весна",shop:"convenience"},name:"Весна",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ветеран":{tags:{name:"Ветеран",shop:"convenience"},name:"Ветеран",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Визит":{tags:{name:"Визит",shop:"convenience"},name:"Визит",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Виктория":{tags:{name:"Виктория",shop:"convenience"},name:"Виктория",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ВкусВилл":{tags:{name:"ВкусВилл",shop:"convenience"},name:"ВкусВилл",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Гастроном":{tags:{name:"Гастроном",shop:"convenience"},name:"Гастроном",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Гермес":{tags:{name:"Гермес",shop:"convenience"},name:"Гермес",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Гурман":{tags:{name:"Гурман",shop:"convenience"},name:"Гурман",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Домашний":{tags:{name:"Домашний",shop:"convenience"},name:"Домашний",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Елена":{tags:{name:"Елена",shop:"convenience"},name:"Елена",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ермолино":{tags:{name:"Ермолино",shop:"convenience"},name:"Ермолино",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Калинка":{tags:{name:"Калинка",shop:"convenience"},name:"Калинка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Кировский":{tags:{name:"Кировский",shop:"convenience"},name:"Кировский",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Колобок":{tags:{name:"Колобок",shop:"convenience"},name:"Колобок",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Колосок":{tags:{name:"Колосок",shop:"convenience"},name:"Колосок",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Копеечка":{tags:{name:"Копеечка",shop:"convenience"},name:"Копеечка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Копейка":{tags:{name:"Копейка",shop:"convenience"},name:"Копейка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Корзинка":{tags:{name:"Корзинка",shop:"convenience"},name:"Корзинка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Крамниця":{tags:{name:"Крамниця",shop:"convenience"},name:"Крамниця",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Кристалл":{tags:{name:"Кристалл",shop:"convenience"},name:"Кристалл",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Кулинария":{tags:{name:"Кулинария",shop:"convenience"},name:"Кулинария",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Купец":{tags:{name:"Купец",shop:"convenience"},name:"Купец",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ласточка":{tags:{name:"Ласточка",shop:"convenience"},name:"Ласточка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Лидер":{tags:{name:"Лидер",shop:"convenience"},name:"Лидер",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Любимый":{tags:{name:"Любимый",shop:"convenience"},name:"Любимый",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Люкс":{tags:{name:"Люкс",shop:"convenience"},name:"Люкс",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Магазин при АЗС":{tags:{name:"Магазин при АЗС",shop:"convenience"},name:"Магазин при АЗС",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Мария-Ра":{tags:{name:"Мария-Ра",shop:"convenience"},name:"Мария-Ра",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Маяк":{tags:{name:"Маяк",shop:"convenience"},name:"Маяк",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Меркурий":{tags:{name:"Меркурий",shop:"convenience"},name:"Меркурий",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Мечта":{tags:{name:"Мечта",shop:"convenience"},name:"Мечта",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Минимаркет":{tags:{name:"Минимаркет",shop:"convenience"},name:"Минимаркет",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Мираж":{tags:{name:"Мираж",shop:"convenience"},name:"Мираж",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Надежда":{tags:{name:"Надежда",shop:"convenience"},name:"Надежда",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ника":{tags:{name:"Ника",shop:"convenience"},name:"Ника",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Оазис":{tags:{name:"Оазис",shop:"convenience"},name:"Оазис",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Олимп":{tags:{name:"Олимп",shop:"convenience"},name:"Олимп",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Подсолнух":{tags:{name:"Подсолнух",shop:"convenience"},name:"Подсолнух",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Престиж":{tags:{name:"Престиж",shop:"convenience"},name:"Престиж",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Продукти":{tags:{name:"Продукти",shop:"convenience"},name:"Продукти",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Продуктовый":{tags:{name:"Продуктовый",shop:"convenience"},name:"Продуктовый",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Продуктовый магазин":{tags:{name:"Продуктовый магазин",shop:"convenience"},name:"Продуктовый магазин",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Продукты":{tags:{name:"Продукты",shop:"convenience"},name:"Продукты",icon:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Радуга":{tags:{name:"Радуга",shop:"convenience"},name:"Радуга",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Родны кут":{tags:{name:"Родны кут",shop:"convenience"},name:"Родны кут",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ромашка":{tags:{name:"Ромашка",shop:"convenience"},name:"Ромашка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Русь":{tags:{name:"Русь",shop:"convenience"},name:"Русь",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Светлана":{tags:{name:"Светлана",shop:"convenience"},name:"Светлана",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Смак":{tags:{name:"Смак",shop:"convenience"},name:"Смак",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Солнечный":{tags:{name:"Солнечный",shop:"convenience"},name:"Солнечный",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Татьяна":{tags:{name:"Татьяна",shop:"convenience"},name:"Татьяна",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Тройка":{tags:{name:"Тройка",shop:"convenience"},name:"Тройка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/У Палыча":{tags:{name:"У Палыча",shop:"convenience"},name:"У Палыча",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Универсам":{tags:{name:"Универсам",shop:"convenience"},name:"Универсам",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Фортуна":{tags:{name:"Фортуна",shop:"convenience"},name:"Фортуна",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Хороший":{tags:{name:"Хороший",shop:"convenience"},name:"Хороший",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Центральный":{tags:{name:"Центральный",shop:"convenience"},name:"Центральный",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Чайка":{tags:{name:"Чайка",shop:"convenience"},name:"Чайка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Шанс":{tags:{name:"Шанс",shop:"convenience"},name:"Шанс",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Эконом":{tags:{name:"Эконом",shop:"convenience"},name:"Эконом",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Юбилейный":{tags:{name:"Юбилейный",shop:"convenience"},name:"Юбилейный",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Юлия":{tags:{name:"Юлия",shop:"convenience"},name:"Юлия",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/продукты":{tags:{name:"продукты",shop:"convenience"},name:"продукты",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/მარკეტი":{tags:{name:"მარკეტი",shop:"convenience"},name:"მარკეტი",icon:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/スリーエフ":{tags:{name:"スリーエフ",shop:"convenience"},name:"スリーエフ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/セイコーマート":{tags:{name:"セイコーマート",shop:"convenience"},name:"セイコーマート",icon:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/セーブオン":{tags:{name:"セーブオン",shop:"convenience"},name:"セーブオン",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/デイリーヤマザキ":{tags:{name:"デイリーヤマザキ",shop:"convenience"},name:"デイリーヤマザキ",icon:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ポプラ":{tags:{name:"ポプラ",shop:"convenience"},name:"ポプラ",icon:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ヤマザキショップ":{tags:{name:"ヤマザキショップ",shop:"convenience"},name:"ヤマザキショップ",icon:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/全家":{tags:{name:"全家",shop:"convenience"},name:"全家",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/全家便利商店":{tags:{name:"全家便利商店",shop:"convenience"},name:"全家便利商店",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/萊爾富":{tags:{name:"萊爾富",shop:"convenience"},name:"萊爾富",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/세븐일레븐":{tags:{name:"세븐일레븐",shop:"convenience"},name:"세븐일레븐",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Л'Этуаль":{tags:{name:"Л'Этуаль",shop:"cosmetics"},name:"Л'Этуаль",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Магнит косметик":{tags:{name:"Магнит косметик",shop:"cosmetics"},name:"Магнит косметик",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Магнит-Косметик":{tags:{name:"Магнит-Косметик",shop:"cosmetics"},name:"Магнит-Косметик",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Подружка":{tags:{name:"Подружка",shop:"cosmetics"},name:"Подружка",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Леруа Мерлен":{tags:{name:"Леруа Мерлен",shop:"doityourself"},name:"Леруа Мерлен",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Мастер":{tags:{name:"Мастер",shop:"doityourself"},name:"Мастер",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Строитель":{tags:{name:"Строитель",shop:"doityourself"},name:"Строитель",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Стройматериалы":{tags:{name:"Стройматериалы",shop:"doityourself"},name:"Стройматериалы",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/カインズホーム":{tags:{name:"カインズホーム",shop:"doityourself"},name:"カインズホーム",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/コメリ":{tags:{name:"コメリ",shop:"doityourself"},name:"コメリ",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/コーナン":{tags:{name:"コーナン",shop:"doityourself"},name:"コーナン",icon:"temaki-tools",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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/М.Видео":{tags:{name:"М.Видео",shop:"electronics"},name:"М.Видео",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Фокстрот":{tags:{name:"Фокстрот",shop:"electronics"},name:"Фокстрот",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Эксперт":{tags:{name:"Эксперт",shop:"electronics"},name:"Эксперт",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Эльдорадо":{tags:{name:"Эльдорадо",shop:"electronics"},name:"Эльдорадо",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/エディオン":{tags:{name:"エディオン",shop:"electronics"},name:"エディオン",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/ケーズデンキ":{tags:{name:"ケーズデンキ",shop:"electronics"},name:"ケーズデンキ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/コジマ":{tags:{name:"コジマ",shop:"electronics"},name:"コジマ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/ヤマダ電機":{tags:{name:"ヤマダ電機",shop:"electronics"},name:"ヤマダ電機",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/全國電子":{tags:{name:"全國電子",shop:"electronics"},name:"全國電子",icon:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/fabric/Ткани":{tags:{name:"Ткани",shop:"fabric"},name:"Ткани",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Квіти":{tags:{name:"Квіти",shop:"florist"},name:"Квіти",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Цветочный магазин":{tags:{name:"Цветочный магазин",shop:"florist"},name:"Цветочный магазин",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Цветы":{tags:{name:"Цветы",shop:"florist"},name:"Цветы",icon:"maki-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:"maki-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:"maki-cemetery",geometry:["point","area"],fields:["name","operator","address","building_area","religion","denomination"],suggestion:true},"shop/funeral_directors/Ритуальные услуги":{tags:{name:"Ритуальные услуги",shop:"funeral_directors"},name:"Ритуальные услуги",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Меблі":{tags:{name:"Меблі",shop:"furniture"},name:"Меблі",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/ニトリ":{tags:{name:"ニトリ",shop:"furniture"},name:"ニトリ",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-gift",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/gift/Подарки":{tags:{name:"Подарки",shop:"gift"},name:"Подарки",icon:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/greengrocer/Овощи и фрукты":{tags:{name:"Овощи и фрукты",shop:"greengrocer"},name:"Овощи и фрукты",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Локон":{tags:{name:"Локон",shop:"hairdresser"},name:"Локон",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Парикмахерская":{tags:{name:"Парикмахерская",shop:"hairdresser"},name:"Парикмахерская",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Перукарня":{tags:{name:"Перукарня",shop:"hairdresser"},name:"Перукарня",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Салон красоты":{tags:{name:"Салон красоты",shop:"hairdresser"},name:"Салон красоты",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Стиль":{tags:{name:"Стиль",shop:"hairdresser"},name:"Стиль",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Шарм":{tags:{name:"Шарм",shop:"hairdresser"},name:"Шарм",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/حلاق":{tags:{name:"حلاق",shop:"hairdresser"},name:"حلاق",icon:"maki-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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",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:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Промтовары":{tags:{name:"Промтовары",shop:"hardware"},name:"Промтовары",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Сантехника":{tags:{name:"Сантехника",shop:"hardware"},name:"Сантехника",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Товары для дома":{tags:{name:"Товары для дома",shop:"hardware"},name:"Товары для дома",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Хозтовары":{tags:{name:"Хозтовары",shop:"hardware"},name:"Хозтовары",icon:"temaki-tools",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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Адамас":{tags:{name:"Адамас",shop:"jewelry"},name:"Адамас",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Золото":{tags:{name:"Золото",shop:"jewelry"},name:"Золото",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/kiosk/Белсоюзпечать":{tags:{name:"Белсоюзпечать",shop:"kiosk"},name:"Белсоюзпечать",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/kiosk/Киоск":{tags:{name:"Киоск",shop:"kiosk"},name:"Киоск",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-laundry",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/laundry/コインランドリー":{tags:{name:"コインランドリー",shop:"laundry"},name:"コインランドリー",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mall/Торговый центр":{tags:{name:"Торговый центр",shop:"mall"},name:"Торговый центр",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"fas-motorcycle",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:"fas-motorcycle",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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Витебскоблсоюзпечать":{tags:{name:"Витебскоблсоюзпечать",shop:"newsagent"},name:"Витебскоблсоюзпечать",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Первая полоса":{tags:{name:"Первая полоса",shop:"newsagent"},name:"Первая полоса",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Печать":{tags:{name:"Печать",shop:"newsagent"},name:"Печать",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Роспечать":{tags:{name:"Роспечать",shop:"newsagent"},name:"Роспечать",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Союзпечать":{tags:{name:"Союзпечать",shop:"newsagent"},name:"Союзпечать",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/แว่นท็อปเจริญ":{tags:{name:"แว่นท็อปเจริญ",shop:"optician"},name:"แว่นท็อปเจริญ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/メガネスーパー":{tags:{name:"メガネスーパー",shop:"optician"},name:"メガネスーパー",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/眼鏡市場":{tags:{name:"眼鏡市場",shop:"optician"},name:"眼鏡市場",icon:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/outdoor/Рыболов":{tags:{name:"Рыболов",shop:"outdoor"},name:"Рыболов",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Ремонт обуви":{tags:{name:"Ремонт обуви",shop:"shoes"},name:"Ремонт обуви",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/ЦентрОбувь":{tags:{name:"ЦентрОбувь",shop:"shoes"},name:"ЦентрОбувь",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Юничел":{tags:{name:"Юничел",shop:"shoes"},name:"Юничел",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/東京靴流通センター":{tags:{name:"東京靴流通センター",shop:"shoes"},name:"東京靴流通センター",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Спортмастер":{tags:{name:"Спортмастер",shop:"sports"},name:"Спортмастер",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Спорттовары":{tags:{name:"Спорттовары",shop:"sports"},name:"Спорттовары",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Канцтовары":{tags:{name:"Канцтовары",shop:"stationery"},name:"Канцтовары",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/ΑΒ Βασιλόπουλος":{tags:{name:"ΑΒ Βασιλόπουλος",shop:"supermarket"},name:"ΑΒ Βασιλόπουλος",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Γαλαξίας":{tags:{name:"Γαλαξίας",shop:"supermarket"},name:"Γαλαξίας",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Μασούτης":{tags:{name:"Μασούτης",shop:"supermarket"},name:"Μασούτης",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Σκλαβενίτης":{tags:{name:"Σκλαβενίτης",shop:"supermarket"},name:"Σκλαβενίτης",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/АТБ":{tags:{name:"АТБ",shop:"supermarket"},name:"АТБ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Абсолют":{tags:{name:"Абсолют",shop:"supermarket"},name:"Абсолют",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Азбука Вкуса":{tags:{name:"Азбука Вкуса",shop:"supermarket"},name:"Азбука Вкуса",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Атак":{tags:{name:"Атак",shop:"supermarket"},name:"Атак",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Ашан":{tags:{name:"Ашан",shop:"supermarket"},name:"Ашан",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Верный":{tags:{name:"Верный",shop:"supermarket"},name:"Верный",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Вопак":{tags:{name:"Вопак",shop:"supermarket"},name:"Вопак",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Гроздь":{tags:{name:"Гроздь",shop:"supermarket"},name:"Гроздь",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Десяточка":{tags:{name:"Десяточка",shop:"supermarket"},name:"Десяточка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Дикси":{tags:{name:"Дикси",shop:"supermarket"},name:"Дикси",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Евроопт":{tags:{name:"Евроопт",shop:"supermarket"},name:"Евроопт",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Карусель":{tags:{name:"Карусель",shop:"supermarket"},name:"Карусель",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Квартал":{tags:{name:"Квартал",shop:"supermarket"},name:"Квартал",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Командор":{tags:{name:"Командор",shop:"supermarket"},name:"Командор",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Красный Яр":{tags:{name:"Красный Яр",shop:"supermarket"},name:"Красный Яр",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Лента":{tags:{name:"Лента",shop:"supermarket"},name:"Лента",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Магнит":{tags:{name:"Магнит",shop:"supermarket"},name:"Магнит",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Магнолия":{tags:{name:"Магнолия",shop:"supermarket"},name:"Магнолия",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Монетка":{tags:{name:"Монетка",shop:"supermarket"},name:"Монетка",icon:"maki-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:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Перекресток":{tags:{name:"Перекресток",shop:"supermarket"},name:"Перекресток",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Покупочка":{tags:{name:"Покупочка",shop:"supermarket"},name:"Покупочка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Полушка":{tags:{name:"Полушка",shop:"supermarket"},name:"Полушка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Пятёрочка":{tags:{name:"Пятёрочка",shop:"supermarket"},name:"Пятёрочка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Радеж":{tags:{name:"Радеж",shop:"supermarket"},name:"Радеж",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Рукавичка":{tags:{name:"Рукавичка",shop:"supermarket"},name:"Рукавичка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Светофор":{tags:{name:"Светофор",shop:"supermarket"},name:"Светофор",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Седьмой континент":{tags:{name:"Седьмой континент",shop:"supermarket"},name:"Седьмой континент",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Семейный":{tags:{name:"Семейный",shop:"supermarket"},name:"Семейный",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Семья":{tags:{name:"Семья",shop:"supermarket"},name:"Семья",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Супермаркет":{tags:{name:"Супермаркет",shop:"supermarket"},name:"Супермаркет",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Сільпо":{tags:{name:"Сільпо",shop:"supermarket"},name:"Сільпо",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Таврія‑В":{tags:{name:"Таврія‑В",shop:"supermarket"},name:"Таврія‑В",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Фора":{tags:{name:"Фора",shop:"supermarket"},name:"Фора",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Фуршет":{tags:{name:"Фуршет",shop:"supermarket"},name:"Фуршет",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Хүнсний дэлгүүр":{tags:{name:"Хүнсний дэлгүүр",shop:"supermarket"},name:"Хүнсний дэлгүүр",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Эдельвейс":{tags:{name:"Эдельвейс",shop:"supermarket"},name:"Эдельвейс",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/хүнсний дэлгүүр":{tags:{name:"хүнсний дэлгүүр",shop:"supermarket"},name:"хүнсний дэлгүүр",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/بقالة":{tags:{name:"بقالة",shop:"supermarket"},name:"بقالة",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/سوپر مارکت":{tags:{name:"سوپر مارکت",shop:"supermarket"},name:"سوپر مارکت",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/سوپرمارکت":{tags:{name:"سوپرمارکت",shop:"supermarket"},name:"سوپرمارکت",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/いなげや":{tags:{name:"いなげや",shop:"supermarket"},name:"いなげや",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/まいばすけっと":{tags:{name:"まいばすけっと",shop:"supermarket"},name:"まいばすけっと",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/イオン":{tags:{name:"イオン",shop:"supermarket"},name:"イオン",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/イトーヨーカドー":{tags:{name:"イトーヨーカドー",shop:"supermarket"},name:"イトーヨーカドー",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/カスミ":{tags:{name:"カスミ",shop:"supermarket"},name:"カスミ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/マックスバリュ":{tags:{name:"マックスバリュ",shop:"supermarket"},name:"マックスバリュ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/マルエツ":{tags:{name:"マルエツ",shop:"supermarket"},name:"マルエツ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/ライフ":{tags:{name:"ライフ",shop:"supermarket"},name:"ライフ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/全聯":{tags:{name:"全聯",shop:"supermarket"},name:"全聯",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/全聯福利中心":{tags:{name:"全聯福利中心",shop:"supermarket"},name:"全聯福利中心",icon:"maki-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:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/業務スーパー":{tags:{name:"業務スーパー",shop:"supermarket"},name:"業務スーパー",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/美廉社":{tags:{name:"美廉社",shop:"supermarket"},name:"美廉社",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/西友":{tags:{name:"西友",shop:"supermarket"},name:"西友",icon:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/ticket/Касса":{tags:{name:"Касса",shop:"ticket"},name:"Касса",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/ticket/Проездные билеты":{tags:{name:"Проездные билеты",shop:"ticket"},name:"Проездные билеты",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tobacco/Табакерка":{tags:{name:"Табакерка",shop:"tobacco"},name:"Табакерка",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/Детский мир":{tags:{name:"Детский мир",shop:"toys"},name:"Детский мир",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/Игрушки":{tags:{name:"Игрушки",shop:"toys"},name:"Игрушки",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tyres/Вулканизация":{tags:{name:"Вулканизация",shop:"tyres"},name:"Вулканизация",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video/ゲオ":{tags:{name:"ゲオ",shop:"video"},name:"ゲオ",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Maibaum":{tags:{name:"Maibaum",tourism:"attraction"},name:"Maibaum",icon:"maki-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:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Moai":{tags:{name:"Moai",tourism:"attraction"},name:"Moai",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/OWŚ":{tags:{name:"OWŚ",tourism:"attraction"},name:"OWŚ",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Sommerrodelbahn":{tags:{name:"Sommerrodelbahn",tourism:"attraction"},name:"Sommerrodelbahn",icon:"maki-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:"maki-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:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Кладбище еврейское":{tags:{name:"Кладбище еврейское",tourism:"attraction"},name:"Кладбище еврейское",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Колесо обозрения":{tags:{name:"Колесо обозрения",tourism:"attraction"},name:"Колесо обозрения",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Приусадебный парк":{tags:{name:"Приусадебный парк",tourism:"attraction"},name:"Приусадебный парк",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Усадьба":{tags:{name:"Усадьба",tourism:"attraction"},name:"Усадьба",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Хозяйственный двор":{tags:{name:"Хозяйственный двор",tourism:"attraction"},name:"Хозяйственный двор",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Часовня":{tags:{name:"Часовня",tourism:"attraction"},name:"Часовня",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/дольмен":{tags:{name:"дольмен",tourism:"attraction"},name:"дольмен",icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-lodging",geometry:["point","area"],fields:["name","brand","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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-museum",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours"],suggestion:true},"tourism/museum/Краеведческий музей":{tags:{name:"Краеведческий музей",tourism:"museum"},name:"Краеведческий музей",icon:"maki-museum",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours"],suggestion:true},"tourism/museum/Музей":{tags:{name:"Музей",tourism:"museum"},name:"Музей",icon:"maki-museum",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours"],suggestion:true}};
23660 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"]};
23662 var categories = {"category-barrier":{icon:"maki-roadblock",geometry:"line",name:"Barrier Features",members:["barrier/fence","barrier/wall","barrier/ditch","barrier/gate","barrier/hedge","barrier/kerb","barrier"]},"category-building":{icon:"maki-building",geometry:"area",name:"Building Features",members:["building","building/house","building/apartments","building/retail","building/commercial","building/industrial","building/residential"]},"category-golf":{icon:"maki-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:"maki-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:"maki-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:"maki-natural",geometry:"line",name:"Natural Features",members:["natural/coastline","natural/tree_row"]},"category-natural-point":{icon:"maki-natural",geometry:"point",name:"Natural Features",members:["natural/peak","natural/cliff","natural/beach","natural/cave_entrance"]},"category-path":{icon:"iD-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:"iD-category-rail",geometry:"line",name:"Rail Features",members:["railway/rail","railway/subway","railway/tram","railway/monorail","railway/disused","railway/abandoned"]},"category-restriction":{icon:"iD-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/only_u_turn","type/restriction"]},"category-road":{icon:"iD-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:"iD-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:"maki-water",geometry:"area",name:"Water Features",members:["natural/water/lake","natural/water/pond","natural/water/reservoir","natural/water"]},"category-water-line":{icon:"iD-category-water",geometry:"line",name:"Water Features",members:["waterway/river","waterway/stream","waterway/canal","waterway/ditch","waterway/drain"]}};
23664 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",minValue:1,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",minValue:0,label:"Capacity (per hour)",placeholder:"500, 2500, 5000..."},"aerialway/duration":{key:"aerialway:duration",type:"number",minValue:0,label:"Duration (minutes)",placeholder:"1, 2, 3..."},"aerialway/heating":{key:"aerialway:heating",type:"check",label:"Heated"},"aerialway/occupancy":{key:"aerialway:occupancy",type:"number",minValue:0,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"},booth:{key:"booth",type:"combo",label:"Booth",caseSensitive:true},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",minValue:1,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",minValue:0,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",minValue:0,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"]},distance:{key:"distance",type:"text",label:"Total Distance"},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"},faces:{key:"faces",type:"number",minValue:0,label:"Faces"},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",minValue:0,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",minValue:0,label:"Hoops",placeholder:"1, 2, 4..."},horse_dressage:{key:"sport",type:"check",label:"Dressage Riding",strings:{options:{"undefined":"No",equestrian:"Yes"}},reference:{key:"sport",value:"equestrian"}},horse_riding:{key:"leisure",type:"check",label:"Horseback Riding",strings:{options:{"undefined":"No",horse_riding:"Yes"}},reference:{key:"leisure",value:"horse_riding"}},horse_scale:{key:"horse_scale",type:"combo",label:"Horseback Riding Difficulty",placeholder:"Difficult, Dangerous...",strings:{options:{common:"Easy: No problems or difficulties. (default)",demanding:"Use with caution: Uneven way, occasional difficult passages.",difficult:"Difficult: Way narrow and exposed. May contain obstacles to step over and narrow passages.",critical:"Borderline: Passable only for experienced riders and horses. Major obstacles. Bridges should be examined carefully.",dangerous:"Dangerous: Passable only for very experienced riders and horses and only in good weather. Dismount.",impossible:"Impassable: Way or bridge not passable for horses. Too narrow, insuffient support, obstacles like ladders. Danger of life."}}},horse_stables:{key:"amenity",type:"check",label:"Riding Stable",strings:{options:{"undefined":"No",stables:"Yes"}},reference:{key:"amenity",value:"stables"}},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"},industrial:{key:"industrial",type:"combo",label:"Type"},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",minValue:0,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",minValue:0,label:"Length (Meters)"},level:{key:"level",type:"combo",label:"Level",universal:true},levels:{key:"building:levels",type:"number",minValue:0,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..."},"maxspeed/advisory":{key:"maxspeed:advisory",type:"maxspeed",label:"Advisory 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",minValue:1,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",minValue:1,label:"Phases",placeholder:"1, 2, 3..."},phone:{key:"phone",type:"tel",icon:"maki-telephone",universal:true,label:"Telephone",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",minValue:0,label:"Maximum Age"},"playground/min_age":{key:"min_age",type:"number",minValue:0,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:"iD-restrictions",reference:{rtype:"restriction"},label:"Turn Restrictions"},rooms:{key:"rooms",type:"number",minValue:0,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"},"siren/purpose":{key:"siren:purpose",type:"combo",label:"Purpose"},"siren/type":{key:"siren:type",type:"combo",label:"Type",strings:{options:{pneumatic:"Pneumatic",electronic:"Electronic",other:"Other"}}},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",minValue:0,label:"Stars"},start_date:{key:"start_date",type:"text",universal:true,label:"Start Date"},step_count:{key:"step_count",type:"number",minValue:0,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"},usage_rail:{key:"usage",type:"combo",label:"Usage Type",strings:{options:{main:"Main",branch:"Branch",industrial:"Industrial",military:"Military",test:"Test",tourism:"Tourism"}}},vending:{key:"vending",type:"semiCombo",label:"Types 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:"maki-wheelchair",universal:true,label:"Wheelchair Access"},wholesale:{key:"wholesale",type:"typeCombo",label:"Wholesale"},width:{key:"width",type:"number",minValue:0,label:"Width (Meters)"},wikipedia:{key:"wikipedia",keys:["wikipedia","wikidata"],type:"wikipedia",icon:"wikipedia",universal:true,label:"Wikipedia"},windings:{key:"windings",type:"number",minValue:1,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"}}}};
23666 var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
23668 function createCommonjsModule(fn, module) {
23669 return module = { exports: {} }, fn(module, module.exports), module.exports;
23672 var quickselect = createCommonjsModule(function (module, exports) {
23673 (function (global, factory) {
23674 module.exports = factory();
23675 }(commonjsGlobal, (function () {
23676 function quickselect(arr, k, left, right, compare) {
23677 quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
23680 function quickselectStep(arr, k, left, right, compare) {
23682 while (right > left) {
23683 if (right - left > 600) {
23684 var n = right - left + 1;
23685 var m = k - left + 1;
23686 var z = Math.log(n);
23687 var s = 0.5 * Math.exp(2 * z / 3);
23688 var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
23689 var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
23690 var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
23691 quickselectStep(arr, k, newLeft, newRight, compare);
23698 swap(arr, left, k);
23699 if (compare(arr[right], t) > 0) swap(arr, left, right);
23705 while (compare(arr[i], t) < 0) i++;
23706 while (compare(arr[j], t) > 0) j--;
23709 if (compare(arr[left], t) === 0) swap(arr, left, j);
23712 swap(arr, j, right);
23715 if (j <= k) left = j + 1;
23716 if (k <= j) right = j - 1;
23720 function swap(arr, i, j) {
23726 function defaultCompare(a, b) {
23727 return a < b ? -1 : a > b ? 1 : 0;
23730 return quickselect;
23735 var rbush_1 = rbush;
23736 var default_1 = rbush;
23740 function rbush(maxEntries, format) {
23741 if (!(this instanceof rbush)) return new rbush(maxEntries, format);
23743 // max entries in a node is 9 by default; min node fill is 40% for best performance
23744 this._maxEntries = Math.max(4, maxEntries || 9);
23745 this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
23748 this._initFormat(format);
23754 rbush.prototype = {
23757 return this._all(this.data, []);
23760 search: function (bbox) {
23762 var node = this.data,
23764 toBBox = this.toBBox;
23766 if (!intersects$1(bbox, node)) return result;
23768 var nodesToSearch = [],
23769 i, len, child, childBBox;
23772 for (i = 0, len = node.children.length; i < len; i++) {
23774 child = node.children[i];
23775 childBBox = node.leaf ? toBBox(child) : child;
23777 if (intersects$1(bbox, childBBox)) {
23778 if (node.leaf) result.push(child);
23779 else if (contains$2(bbox, childBBox)) this._all(child, result);
23780 else nodesToSearch.push(child);
23783 node = nodesToSearch.pop();
23789 collides: function (bbox) {
23791 var node = this.data,
23792 toBBox = this.toBBox;
23794 if (!intersects$1(bbox, node)) return false;
23796 var nodesToSearch = [],
23797 i, len, child, childBBox;
23800 for (i = 0, len = node.children.length; i < len; i++) {
23802 child = node.children[i];
23803 childBBox = node.leaf ? toBBox(child) : child;
23805 if (intersects$1(bbox, childBBox)) {
23806 if (node.leaf || contains$2(bbox, childBBox)) return true;
23807 nodesToSearch.push(child);
23810 node = nodesToSearch.pop();
23816 load: function (data) {
23817 if (!(data && data.length)) return this;
23819 if (data.length < this._minEntries) {
23820 for (var i = 0, len = data.length; i < len; i++) {
23821 this.insert(data[i]);
23826 // recursively build the tree with the given data from scratch using OMT algorithm
23827 var node = this._build(data.slice(), 0, data.length - 1, 0);
23829 if (!this.data.children.length) {
23830 // save as is if tree is empty
23833 } else if (this.data.height === node.height) {
23834 // split root if trees have the same height
23835 this._splitRoot(this.data, node);
23838 if (this.data.height < node.height) {
23839 // swap trees if inserted one is bigger
23840 var tmpNode = this.data;
23845 // insert the small tree into the large tree at appropriate level
23846 this._insert(node, this.data.height - node.height - 1, true);
23852 insert: function (item) {
23853 if (item) this._insert(item, this.data.height - 1);
23857 clear: function () {
23858 this.data = createNode([]);
23862 remove: function (item, equalsFn) {
23863 if (!item) return this;
23865 var node = this.data,
23866 bbox = this.toBBox(item),
23869 i, parent, index, goingUp;
23871 // depth-first iterative tree traversal
23872 while (node || path.length) {
23874 if (!node) { // go up
23876 parent = path[path.length - 1];
23881 if (node.leaf) { // check current node
23882 index = findItem(item, node.children, equalsFn);
23884 if (index !== -1) {
23885 // item found, remove the item and condense tree upwards
23886 node.children.splice(index, 1);
23888 this._condense(path);
23893 if (!goingUp && !node.leaf && contains$2(node, bbox)) { // go down
23898 node = node.children[0];
23900 } else if (parent) { // go right
23902 node = parent.children[i];
23905 } else node = null; // nothing found
23911 toBBox: function (item) { return item; },
23913 compareMinX: compareNodeMinX,
23914 compareMinY: compareNodeMinY,
23916 toJSON: function () { return this.data; },
23918 fromJSON: function (data) {
23923 _all: function (node, result) {
23924 var nodesToSearch = [];
23926 if (node.leaf) result.push.apply(result, node.children);
23927 else nodesToSearch.push.apply(nodesToSearch, node.children);
23929 node = nodesToSearch.pop();
23934 _build: function (items, left, right, height) {
23936 var N = right - left + 1,
23937 M = this._maxEntries,
23941 // reached leaf level; return leaf
23942 node = createNode(items.slice(left, right + 1));
23943 calcBBox(node, this.toBBox);
23948 // target height of the bulk-loaded tree
23949 height = Math.ceil(Math.log(N) / Math.log(M));
23951 // target number of root entries to maximize storage utilization
23952 M = Math.ceil(N / Math.pow(M, height - 1));
23955 node = createNode([]);
23957 node.height = height;
23959 // split the items into M mostly square tiles
23961 var N2 = Math.ceil(N / M),
23962 N1 = N2 * Math.ceil(Math.sqrt(M)),
23963 i, j, right2, right3;
23965 multiSelect(items, left, right, N1, this.compareMinX);
23967 for (i = left; i <= right; i += N1) {
23969 right2 = Math.min(i + N1 - 1, right);
23971 multiSelect(items, i, right2, N2, this.compareMinY);
23973 for (j = i; j <= right2; j += N2) {
23975 right3 = Math.min(j + N2 - 1, right2);
23977 // pack each entry recursively
23978 node.children.push(this._build(items, j, right3, height - 1));
23982 calcBBox(node, this.toBBox);
23987 _chooseSubtree: function (bbox, node, level, path) {
23989 var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
23994 if (node.leaf || path.length - 1 === level) break;
23996 minArea = minEnlargement = Infinity;
23998 for (i = 0, len = node.children.length; i < len; i++) {
23999 child = node.children[i];
24000 area = bboxArea(child);
24001 enlargement = enlargedArea(bbox, child) - area;
24003 // choose entry with the least area enlargement
24004 if (enlargement < minEnlargement) {
24005 minEnlargement = enlargement;
24006 minArea = area < minArea ? area : minArea;
24007 targetNode = child;
24009 } else if (enlargement === minEnlargement) {
24010 // otherwise choose one with the smallest area
24011 if (area < minArea) {
24013 targetNode = child;
24018 node = targetNode || node.children[0];
24024 _insert: function (item, level, isNode) {
24026 var toBBox = this.toBBox,
24027 bbox = isNode ? item : toBBox(item),
24030 // find the best node for accommodating the item, saving all nodes along the path too
24031 var node = this._chooseSubtree(bbox, this.data, level, insertPath);
24033 // put the item into the node
24034 node.children.push(item);
24035 extend$1(node, bbox);
24037 // split on node overflow; propagate upwards if necessary
24038 while (level >= 0) {
24039 if (insertPath[level].children.length > this._maxEntries) {
24040 this._split(insertPath, level);
24045 // adjust bboxes along the insertion path
24046 this._adjustParentBBoxes(bbox, insertPath, level);
24049 // split overflowed node into two
24050 _split: function (insertPath, level) {
24052 var node = insertPath[level],
24053 M = node.children.length,
24054 m = this._minEntries;
24056 this._chooseSplitAxis(node, m, M);
24058 var splitIndex = this._chooseSplitIndex(node, m, M);
24060 var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
24061 newNode.height = node.height;
24062 newNode.leaf = node.leaf;
24064 calcBBox(node, this.toBBox);
24065 calcBBox(newNode, this.toBBox);
24067 if (level) insertPath[level - 1].children.push(newNode);
24068 else this._splitRoot(node, newNode);
24071 _splitRoot: function (node, newNode) {
24073 this.data = createNode([node, newNode]);
24074 this.data.height = node.height + 1;
24075 this.data.leaf = false;
24076 calcBBox(this.data, this.toBBox);
24079 _chooseSplitIndex: function (node, m, M) {
24081 var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
24083 minOverlap = minArea = Infinity;
24085 for (i = m; i <= M - m; i++) {
24086 bbox1 = distBBox(node, 0, i, this.toBBox);
24087 bbox2 = distBBox(node, i, M, this.toBBox);
24089 overlap = intersectionArea(bbox1, bbox2);
24090 area = bboxArea(bbox1) + bboxArea(bbox2);
24092 // choose distribution with minimum overlap
24093 if (overlap < minOverlap) {
24094 minOverlap = overlap;
24097 minArea = area < minArea ? area : minArea;
24099 } else if (overlap === minOverlap) {
24100 // otherwise choose distribution with minimum area
24101 if (area < minArea) {
24111 // sorts node children by the best axis for split
24112 _chooseSplitAxis: function (node, m, M) {
24114 var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
24115 compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
24116 xMargin = this._allDistMargin(node, m, M, compareMinX),
24117 yMargin = this._allDistMargin(node, m, M, compareMinY);
24119 // if total distributions margin value is minimal for x, sort by minX,
24120 // otherwise it's already sorted by minY
24121 if (xMargin < yMargin) node.children.sort(compareMinX);
24124 // total margin of all possible split distributions where each node is at least m full
24125 _allDistMargin: function (node, m, M, compare) {
24127 node.children.sort(compare);
24129 var toBBox = this.toBBox,
24130 leftBBox = distBBox(node, 0, m, toBBox),
24131 rightBBox = distBBox(node, M - m, M, toBBox),
24132 margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
24135 for (i = m; i < M - m; i++) {
24136 child = node.children[i];
24137 extend$1(leftBBox, node.leaf ? toBBox(child) : child);
24138 margin += bboxMargin(leftBBox);
24141 for (i = M - m - 1; i >= m; i--) {
24142 child = node.children[i];
24143 extend$1(rightBBox, node.leaf ? toBBox(child) : child);
24144 margin += bboxMargin(rightBBox);
24150 _adjustParentBBoxes: function (bbox, path, level) {
24151 // adjust bboxes along the given tree path
24152 for (var i = level; i >= 0; i--) {
24153 extend$1(path[i], bbox);
24157 _condense: function (path) {
24158 // go through the path, removing empty nodes and updating bboxes
24159 for (var i = path.length - 1, siblings; i >= 0; i--) {
24160 if (path[i].children.length === 0) {
24162 siblings = path[i - 1].children;
24163 siblings.splice(siblings.indexOf(path[i]), 1);
24165 } else this.clear();
24167 } else calcBBox(path[i], this.toBBox);
24171 _initFormat: function (format) {
24172 // data format (minX, minY, maxX, maxY accessors)
24174 // uses eval-type function compilation instead of just accepting a toBBox function
24175 // because the algorithms are very sensitive to sorting functions performance,
24176 // so they should be dead simple and without inner calls
24178 var compareArr = ['return a', ' - b', ';'];
24180 this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
24181 this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
24183 this.toBBox = new Function('a',
24184 'return {minX: a' + format[0] +
24185 ', minY: a' + format[1] +
24186 ', maxX: a' + format[2] +
24187 ', maxY: a' + format[3] + '};');
24191 function findItem(item, items, equalsFn) {
24192 if (!equalsFn) return items.indexOf(item);
24194 for (var i = 0; i < items.length; i++) {
24195 if (equalsFn(item, items[i])) return i;
24200 // calculate node's bbox from bboxes of its children
24201 function calcBBox(node, toBBox) {
24202 distBBox(node, 0, node.children.length, toBBox, node);
24205 // min bounding rectangle of node children from k to p-1
24206 function distBBox(node, k, p, toBBox, destNode) {
24207 if (!destNode) destNode = createNode(null);
24208 destNode.minX = Infinity;
24209 destNode.minY = Infinity;
24210 destNode.maxX = -Infinity;
24211 destNode.maxY = -Infinity;
24213 for (var i = k, child; i < p; i++) {
24214 child = node.children[i];
24215 extend$1(destNode, node.leaf ? toBBox(child) : child);
24221 function extend$1(a, b) {
24222 a.minX = Math.min(a.minX, b.minX);
24223 a.minY = Math.min(a.minY, b.minY);
24224 a.maxX = Math.max(a.maxX, b.maxX);
24225 a.maxY = Math.max(a.maxY, b.maxY);
24229 function compareNodeMinX(a, b) { return a.minX - b.minX; }
24230 function compareNodeMinY(a, b) { return a.minY - b.minY; }
24232 function bboxArea(a) { return (a.maxX - a.minX) * (a.maxY - a.minY); }
24233 function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
24235 function enlargedArea(a, b) {
24236 return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
24237 (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
24240 function intersectionArea(a, b) {
24241 var minX = Math.max(a.minX, b.minX),
24242 minY = Math.max(a.minY, b.minY),
24243 maxX = Math.min(a.maxX, b.maxX),
24244 maxY = Math.min(a.maxY, b.maxY);
24246 return Math.max(0, maxX - minX) *
24247 Math.max(0, maxY - minY);
24250 function contains$2(a, b) {
24251 return a.minX <= b.minX &&
24252 a.minY <= b.minY &&
24253 b.maxX <= a.maxX &&
24257 function intersects$1(a, b) {
24258 return b.minX <= a.maxX &&
24259 b.minY <= a.maxY &&
24260 b.maxX >= a.minX &&
24264 function createNode(children) {
24266 children: children,
24276 // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
24277 // combines selection algorithm with binary divide & conquer approach
24279 function multiSelect(arr, left, right, n, compare) {
24280 var stack = [left, right],
24283 while (stack.length) {
24284 right = stack.pop();
24285 left = stack.pop();
24287 if (right - left <= n) continue;
24289 mid = left + Math.ceil((right - left) / n / 2) * n;
24290 quickselect(arr, mid, left, right, compare);
24292 stack.push(left, mid, mid, right);
24295 rbush_1.default = default_1;
24297 var lineclip_1 = lineclip;
24299 lineclip.polyline = lineclip;
24300 lineclip.polygon = polygonclip;
24303 // Cohen-Sutherland line clippign algorithm, adapted to efficiently
24304 // handle polylines rather than just segments
24306 function lineclip(points, bbox, result) {
24308 var len = points.length,
24309 codeA = bitCode(points[0], bbox),
24311 i, a, b, codeB, lastCode;
24313 if (!result) result = [];
24315 for (i = 1; i < len; i++) {
24318 codeB = lastCode = bitCode(b, bbox);
24322 if (!(codeA | codeB)) { // accept
24325 if (codeB !== lastCode) { // segment went outside
24328 if (i < len - 1) { // start a new line
24332 } else if (i === len - 1) {
24337 } else if (codeA & codeB) { // trivial reject
24340 } else if (codeA) { // a outside, intersect with clip edge
24341 a = intersect$1(a, b, codeA, bbox);
24342 codeA = bitCode(a, bbox);
24344 } else { // b outside
24345 b = intersect$1(a, b, codeB, bbox);
24346 codeB = bitCode(b, bbox);
24353 if (part.length) result.push(part);
24358 // Sutherland-Hodgeman polygon clipping algorithm
24360 function polygonclip(points, bbox) {
24362 var result, edge, prev, prevInside, i, p, inside;
24364 // clip against each side of the clip rectangle
24365 for (edge = 1; edge <= 8; edge *= 2) {
24367 prev = points[points.length - 1];
24368 prevInside = !(bitCode(prev, bbox) & edge);
24370 for (i = 0; i < points.length; i++) {
24372 inside = !(bitCode(p, bbox) & edge);
24374 // if segment goes through the clip window, add an intersection
24375 if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
24377 if (inside) result.push(p); // add a point if it's inside
24380 prevInside = inside;
24385 if (!points.length) break;
24391 // intersect a segment against one of the 4 lines that make up the bbox
24393 function intersect$1(a, b, edge, bbox) {
24394 return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
24395 edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
24396 edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
24397 edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
24401 // bit code reflects the point position relative to the bbox:
24404 // top 1001 1000 1010
24405 // mid 0001 0000 0010
24406 // bottom 0101 0100 0110
24408 function bitCode(p, bbox) {
24411 if (p[0] < bbox[0]) code |= 1; // left
24412 else if (p[0] > bbox[2]) code |= 2; // right
24414 if (p[1] < bbox[1]) code |= 4; // bottom
24415 else if (p[1] > bbox[3]) code |= 8; // top
24420 var whichPolygon_1 = whichPolygon;
24422 function whichPolygon(data) {
24424 for (var i = 0; i < data.features.length; i++) {
24425 var feature = data.features[i];
24426 var coords = feature.geometry.coordinates;
24428 if (feature.geometry.type === 'Polygon') {
24429 bboxes.push(treeItem(coords, feature.properties));
24431 } else if (feature.geometry.type === 'MultiPolygon') {
24432 for (var j = 0; j < coords.length; j++) {
24433 bboxes.push(treeItem(coords[j], feature.properties));
24438 var tree = rbush_1().load(bboxes);
24440 function query(p, multi) {
24442 result = tree.search({
24448 for (var i = 0; i < result.length; i++) {
24449 if (insidePolygon(result[i].coords, p)) {
24451 output.push(result[i].props);
24453 return result[i].props;
24456 return multi && output.length ? output : null;
24460 query.bbox = function queryBBox(bbox) {
24462 var result = tree.search({
24468 for (var i = 0; i < result.length; i++) {
24469 if (polygonIntersectsBBox(result[i].coords, bbox)) {
24470 output.push(result[i].props);
24479 function polygonIntersectsBBox(polygon, bbox) {
24481 (bbox[0] + bbox[2]) / 2,
24482 (bbox[1] + bbox[3]) / 2
24484 if (insidePolygon(polygon, bboxCenter)) return true;
24485 for (var i = 0; i < polygon.length; i++) {
24486 if (lineclip_1(polygon[i], bbox).length > 0) return true;
24491 // ray casting algorithm for detecting if point is in polygon
24492 function insidePolygon(rings, p) {
24493 var inside = false;
24494 for (var i = 0, len = rings.length; i < len; i++) {
24495 var ring = rings[i];
24496 for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {
24497 if (rayIntersect(p, ring[j], ring[k])) inside = !inside;
24503 function rayIntersect(p, p1, p2) {
24504 return ((p1[1] > p[1]) !== (p2[1] > p[1])) && (p[0] < (p2[0] - p1[0]) * (p[1] - p1[1]) / (p2[1] - p1[1]) + p1[0]);
24507 function treeItem(coords, props) {
24517 for (var i = 0; i < coords[0].length; i++) {
24518 var p = coords[0][i];
24519 item.minX = Math.min(item.minX, p[0]);
24520 item.minY = Math.min(item.minY, p[1]);
24521 item.maxX = Math.max(item.maxX, p[0]);
24522 item.maxY = Math.max(item.maxY, p[1]);
24527 var features$4 = values$1(features$2).map(function(feature) {
24528 // workaround for which-polygon
24529 // only supports `properties`, not `id`
24530 // https://github.com/mapbox/which-polygon/pull/6
24531 feature.properties = {
24533 area: d3_geoArea(feature) // also precompute areas
24541 features: features$2,
24542 resources: resources,
24543 query: whichPolygon_1({
24544 type: 'FeatureCollection',
24545 features: features$4
24548 imagery: dataImagery,
24551 defaults: defaults,
24552 categories: categories,
24557 function osmEntity$$1(attrs) {
24558 // For prototypal inheritance.
24559 if (this instanceof osmEntity$$1) return;
24561 // Create the appropriate subtype.
24562 if (attrs && attrs.type) {
24563 return osmEntity$$1[attrs.type].apply(this, arguments);
24564 } else if (attrs && attrs.id) {
24565 return osmEntity$$1[osmEntity$$1.id.type(attrs.id)].apply(this, arguments);
24568 // Initialize a generic Entity (used only in tests).
24569 return (new osmEntity$$1()).initialize(arguments);
24573 osmEntity$$1.id = function(type) {
24574 return osmEntity$$1.id.fromOSM(type, osmEntity$$1.id.next[type]--);
24578 osmEntity$$1.id.next = {
24579 changeset: -1, node: -1, way: -1, relation: -1
24583 osmEntity$$1.id.fromOSM = function(type, id) {
24584 return type[0] + id;
24588 osmEntity$$1.id.toOSM = function(id) {
24589 return id.slice(1);
24593 osmEntity$$1.id.type = function(id) {
24594 return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
24598 // A function suitable for use as the second argument to d3.selection#data().
24599 osmEntity$$1.key = function(entity) {
24600 return entity.id + 'v' + (entity.v || 0);
24604 osmEntity$$1.prototype = {
24609 initialize: function(sources) {
24610 for (var i = 0; i < sources.length; ++i) {
24611 var source = sources[i];
24612 for (var prop in source) {
24613 if (Object.prototype.hasOwnProperty.call(source, prop)) {
24614 if (source[prop] === undefined) {
24617 this[prop] = source[prop];
24623 if (!this.id && this.type) {
24624 this.id = osmEntity$$1.id(this.type);
24626 if (!this.hasOwnProperty('visible')) {
24627 this.visible = true;
24634 copy: function(resolver, copies) {
24635 if (copies[this.id])
24636 return copies[this.id];
24638 var copy = osmEntity$$1(this, {id: undefined, user: undefined, version: undefined});
24639 copies[this.id] = copy;
24645 osmId: function() {
24646 return osmEntity$$1.id.toOSM(this.id);
24650 isNew: function() {
24651 return this.osmId() < 0;
24655 update: function(attrs) {
24656 return osmEntity$$1(this, attrs, {v: 1 + (this.v || 0)});
24660 mergeTags: function(tags) {
24661 var merged = clone(this.tags), changed = false;
24662 for (var k in tags) {
24663 var t1 = merged[k],
24668 } else if (t1 !== t2) {
24670 merged[k] = union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
24673 return changed ? this.update({tags: merged}) : this;
24677 intersects: function(extent, resolver) {
24678 return this.extent(resolver).intersects(extent);
24682 isUsed: function(resolver) {
24683 return without(Object.keys(this.tags), 'area').length > 0 ||
24684 resolver.parentRelations(this).length > 0;
24688 hasInterestingTags: function() {
24689 return keys$1(this.tags).some(osmIsInterestingTag);
24693 isHighwayIntersection: function() {
24697 isDegenerate: function() {
24701 deprecatedTags: function() {
24702 var tags = toPairs(this.tags);
24703 var deprecated = {};
24705 dataDeprecated.forEach(function(d) {
24706 var match = toPairs(d.old)[0];
24707 tags.forEach(function(t) {
24708 if (t[0] === match[0] &&
24709 (t[1] === match[1] || match[1] === '*')) {
24710 deprecated[t[0]] = t[1];
24719 function geoExtent$$1(min, max) {
24720 if (!(this instanceof geoExtent$$1)) {
24721 return new geoExtent$$1(min, max);
24722 } else if (min instanceof geoExtent$$1) {
24724 } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
24728 this[0] = min || [ Infinity, Infinity];
24729 this[1] = max || min || [-Infinity, -Infinity];
24734 geoExtent$$1.prototype = new Array(2);
24736 assignIn(geoExtent$$1.prototype, {
24738 equals: function (obj) {
24739 return this[0][0] === obj[0][0] &&
24740 this[0][1] === obj[0][1] &&
24741 this[1][0] === obj[1][0] &&
24742 this[1][1] === obj[1][1];
24746 extend: function(obj) {
24747 if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24748 return geoExtent$$1(
24749 [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
24750 [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
24755 _extend: function(extent) {
24756 this[0][0] = Math.min(extent[0][0], this[0][0]);
24757 this[0][1] = Math.min(extent[0][1], this[0][1]);
24758 this[1][0] = Math.max(extent[1][0], this[1][0]);
24759 this[1][1] = Math.max(extent[1][1], this[1][1]);
24764 return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
24768 center: function() {
24769 return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
24773 rectangle: function() {
24774 return [this[0][0], this[0][1], this[1][0], this[1][1]];
24779 return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
24783 polygon: function() {
24785 [this[0][0], this[0][1]],
24786 [this[0][0], this[1][1]],
24787 [this[1][0], this[1][1]],
24788 [this[1][0], this[0][1]],
24789 [this[0][0], this[0][1]]
24794 contains: function(obj) {
24795 if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24796 return obj[0][0] >= this[0][0] &&
24797 obj[0][1] >= this[0][1] &&
24798 obj[1][0] <= this[1][0] &&
24799 obj[1][1] <= this[1][1];
24803 intersects: function(obj) {
24804 if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24805 return obj[0][0] <= this[1][0] &&
24806 obj[0][1] <= this[1][1] &&
24807 obj[1][0] >= this[0][0] &&
24808 obj[1][1] >= this[0][1];
24812 intersection: function(obj) {
24813 if (!this.intersects(obj)) return new geoExtent$$1();
24814 return new geoExtent$$1(
24815 [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
24816 [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
24821 percentContainedIn: function(obj) {
24822 if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24823 var a1 = this.intersection(obj).area();
24824 var a2 = this.area();
24826 if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
24834 padByMeters: function(meters) {
24835 var dLat = geoMetersToLat(meters);
24836 var dLon = geoMetersToLon(meters, this.center()[1]);
24837 return geoExtent$$1(
24838 [this[0][0] - dLon, this[0][1] - dLat],
24839 [this[1][0] + dLon, this[1][1] + dLat]
24844 toParam: function() {
24845 return this.rectangle().join(',');
24851 var TAU = 2 * Math.PI;
24852 var EQUATORIAL_RADIUS = 6356752.314245179;
24853 var POLAR_RADIUS = 6378137.0;
24856 function geoLatToMeters(dLat) {
24857 return dLat * (TAU * POLAR_RADIUS / 360);
24861 function geoLonToMeters(dLon, atLat) {
24862 return Math.abs(atLat) >= 90 ? 0 :
24863 dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
24867 function geoMetersToLat(m) {
24868 return m / (TAU * POLAR_RADIUS / 360);
24872 function geoMetersToLon(m, atLat) {
24873 return Math.abs(atLat) >= 90 ? 0 :
24874 m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
24878 function geoMetersToOffset(meters, tileSize) {
24879 tileSize = tileSize || 256;
24881 meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
24882 -meters[1] * tileSize / (TAU * POLAR_RADIUS)
24887 function geoOffsetToMeters(offset, tileSize) {
24888 tileSize = tileSize || 256;
24890 offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
24891 -offset[1] * TAU * POLAR_RADIUS / tileSize
24896 // Equirectangular approximation of spherical distances on Earth
24897 function geoSphericalDistance(a, b) {
24898 var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
24899 var y = geoLatToMeters(a[1] - b[1]);
24900 return Math.sqrt((x * x) + (y * y));
24905 function geoScaleToZoom(k, tileSize) {
24906 tileSize = tileSize || 256;
24907 var log2ts = Math.log(tileSize) * Math.LOG2E;
24908 return Math.log(k * TAU) / Math.LN2 - log2ts;
24913 function geoZoomToScale(z, tileSize) {
24914 tileSize = tileSize || 256;
24915 return tileSize * Math.pow(2, z) / TAU;
24919 * A specialized version of `_.every` for arrays without support for
24920 * iteratee shorthands.
24923 * @param {Array} [array] The array to iterate over.
24924 * @param {Function} predicate The function invoked per iteration.
24925 * @returns {boolean} Returns `true` if all elements pass the predicate check,
24928 function arrayEvery(array, predicate) {
24930 length = array == null ? 0 : array.length;
24932 while (++index < length) {
24933 if (!predicate(array[index], index, array)) {
24941 * The base implementation of `_.every` without support for iteratee shorthands.
24944 * @param {Array|Object} collection The collection to iterate over.
24945 * @param {Function} predicate The function invoked per iteration.
24946 * @returns {boolean} Returns `true` if all elements pass the predicate check,
24949 function baseEvery(collection, predicate) {
24951 baseEach(collection, function(value, index, collection) {
24952 result = !!predicate(value, index, collection);
24959 * Checks if `predicate` returns truthy for **all** elements of `collection`.
24960 * Iteration is stopped once `predicate` returns falsey. The predicate is
24961 * invoked with three arguments: (value, index|key, collection).
24963 * **Note:** This method returns `true` for
24964 * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
24965 * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
24966 * elements of empty collections.
24971 * @category Collection
24972 * @param {Array|Object} collection The collection to iterate over.
24973 * @param {Function} [predicate=_.identity] The function invoked per iteration.
24974 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
24975 * @returns {boolean} Returns `true` if all elements pass the predicate check,
24979 * _.every([true, 1, null, 'yes'], Boolean);
24983 * { 'user': 'barney', 'age': 36, 'active': false },
24984 * { 'user': 'fred', 'age': 40, 'active': false }
24987 * // The `_.matches` iteratee shorthand.
24988 * _.every(users, { 'user': 'barney', 'active': false });
24991 * // The `_.matchesProperty` iteratee shorthand.
24992 * _.every(users, ['active', false]);
24995 * // The `_.property` iteratee shorthand.
24996 * _.every(users, 'active');
24999 function every(collection, predicate, guard) {
25000 var func = isArray(collection) ? arrayEvery : baseEvery;
25001 if (guard && isIterateeCall(collection, predicate, guard)) {
25002 predicate = undefined;
25004 return func(collection, baseIteratee(predicate, 3));
25008 * The base implementation of `_.some` without support for iteratee shorthands.
25011 * @param {Array|Object} collection The collection to iterate over.
25012 * @param {Function} predicate The function invoked per iteration.
25013 * @returns {boolean} Returns `true` if any element passes the predicate check,
25016 function baseSome(collection, predicate) {
25019 baseEach(collection, function(value, index, collection) {
25020 result = predicate(value, index, collection);
25027 * Checks if `predicate` returns truthy for **any** element of `collection`.
25028 * Iteration is stopped once `predicate` returns truthy. The predicate is
25029 * invoked with three arguments: (value, index|key, collection).
25034 * @category Collection
25035 * @param {Array|Object} collection The collection to iterate over.
25036 * @param {Function} [predicate=_.identity] The function invoked per iteration.
25037 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
25038 * @returns {boolean} Returns `true` if any element passes the predicate check,
25042 * _.some([null, 0, 'yes', false], Boolean);
25046 * { 'user': 'barney', 'active': true },
25047 * { 'user': 'fred', 'active': false }
25050 * // The `_.matches` iteratee shorthand.
25051 * _.some(users, { 'user': 'barney', 'active': false });
25054 * // The `_.matchesProperty` iteratee shorthand.
25055 * _.some(users, ['active', false]);
25058 * // The `_.property` iteratee shorthand.
25059 * _.some(users, 'active');
25062 function some(collection, predicate, guard) {
25063 var func = isArray(collection) ? arraySome : baseSome;
25064 if (guard && isIterateeCall(collection, predicate, guard)) {
25065 predicate = undefined;
25067 return func(collection, baseIteratee(predicate, 3));
25071 function geoVecEqual(a, b, epsilon) {
25073 return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
25075 return (a[0] === b[0]) && (a[1] === b[1]);
25080 function geoVecAdd(a, b) {
25081 return [ a[0] + b[0], a[1] + b[1] ];
25084 // vector subtraction
25085 function geoVecSubtract(a, b) {
25086 return [ a[0] - b[0], a[1] - b[1] ];
25090 function geoVecScale(a, mag) {
25091 return [ a[0] * mag, a[1] * mag ];
25094 // vector rounding (was: geoRoundCoordinates)
25095 function geoVecFloor(a) {
25096 return [ Math.floor(a[0]), Math.floor(a[1]) ];
25099 // linear interpolation
25100 function geoVecInterp(a, b, t) {
25102 a[0] + (b[0] - a[0]) * t,
25103 a[1] + (b[1] - a[1]) * t
25107 // http://jsperf.com/id-dist-optimization
25108 function geoVecLength(a, b) {
25109 var x = a[0] - b[0];
25110 var y = a[1] - b[1];
25111 return Math.sqrt((x * x) + (y * y));
25114 // Return the counterclockwise angle in the range (-pi, pi)
25115 // between the positive X axis and the line intersecting a and b.
25116 function geoVecAngle(a, b) {
25117 return Math.atan2(b[1] - a[1], b[0] - a[0]);
25121 function geoVecDot(a, b, origin) {
25122 origin = origin || [0, 0];
25123 return (a[0] - origin[0]) * (b[0] - origin[0]) +
25124 (a[1] - origin[1]) * (b[1] - origin[1]);
25127 // 2D cross product of OA and OB vectors, returns magnitude of Z vector
25128 // Returns a positive value, if OAB makes a counter-clockwise turn,
25129 // negative for clockwise turn, and zero if the points are collinear.
25130 function geoVecCross(a, b, origin) {
25131 origin = origin || [0, 0];
25132 return (a[0] - origin[0]) * (b[1] - origin[1]) -
25133 (a[1] - origin[1]) * (b[0] - origin[0]);
25136 // Return the counterclockwise angle in the range (-pi, pi)
25137 // between the positive X axis and the line intersecting a and b.
25138 function geoAngle(a, b, projection) {
25139 return geoVecAngle(projection(a.loc), projection(b.loc));
25142 function geoEdgeEqual(a, b) {
25143 return (a[0] === b[0] && a[1] === b[1]) ||
25144 (a[0] === b[1] && a[1] === b[0]);
25147 // Rotate all points counterclockwise around a pivot point by given angle
25148 function geoRotate(points, angle, around) {
25149 return points.map(function(point) {
25150 var radial = geoVecSubtract(point, around);
25152 radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
25153 radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
25159 // Choose the edge with the minimal distance from `point` to its orthogonal
25160 // projection onto that edge, if such a projection exists, or the distance to
25161 // the closest vertex on that edge. Returns an object with the `index` of the
25162 // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
25163 function geoChooseEdge(nodes, point, projection, activeID) {
25164 var dist = geoVecLength;
25165 var points = nodes.map(function(n) { return projection(n.loc); });
25166 var ids = nodes.map(function(n) { return n.id; });
25167 var min = Infinity;
25171 for (var i = 0; i < points.length - 1; i++) {
25172 if (ids[i] === activeID || ids[i + 1] === activeID) continue;
25175 var s = geoVecSubtract(points[i + 1], o);
25176 var v = geoVecSubtract(point, o);
25177 var proj = geoVecDot(v, s) / geoVecDot(s, s);
25182 } else if (proj > 1) {
25185 p = [o[0] + proj * s[0], o[1] + proj * s[1]];
25188 var d = dist(p, point);
25192 loc = projection.invert(p);
25196 if (idx !== undefined) {
25197 return { index: idx, distance: min, loc: loc };
25204 // Test active (dragged or drawing) segments against inactive segments
25205 // This is used to test e.g. multipolygon rings that cross
25206 // `activeNodes` is the ring containing the activeID being dragged.
25207 // `inactiveNodes` is the other ring to test against
25208 function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
25210 var inactives = [];
25211 var j, k, n1, n2, segment;
25213 // gather active segments (only segments in activeNodes that contain the activeID)
25214 for (j = 0; j < activeNodes.length - 1; j++) {
25215 n1 = activeNodes[j];
25216 n2 = activeNodes[j+1];
25217 segment = [n1.loc, n2.loc];
25218 if (n1.id === activeID || n2.id === activeID) {
25219 actives.push(segment);
25223 // gather inactive segments
25224 for (j = 0; j < inactiveNodes.length - 1; j++) {
25225 n1 = inactiveNodes[j];
25226 n2 = inactiveNodes[j+1];
25227 segment = [n1.loc, n2.loc];
25228 inactives.push(segment);
25232 for (j = 0; j < actives.length; j++) {
25233 for (k = 0; k < inactives.length; k++) {
25234 var p = actives[j];
25235 var q = inactives[k];
25236 var hit = geoLineIntersection(p, q);
25247 // Test active (dragged or drawing) segments against inactive segments
25248 // This is used to test whether a way intersects with itself.
25249 function geoHasSelfIntersections(nodes, activeID) {
25251 var inactives = [];
25254 // group active and passive segments along the nodes
25255 for (j = 0; j < nodes.length - 1; j++) {
25257 var n2 = nodes[j+1];
25258 var segment = [n1.loc, n2.loc];
25259 if (n1.id === activeID || n2.id === activeID) {
25260 actives.push(segment);
25262 inactives.push(segment);
25267 for (j = 0; j < actives.length; j++) {
25268 for (k = 0; k < inactives.length; k++) {
25269 var p = actives[j];
25270 var q = inactives[k];
25271 // skip if segments share an endpoint
25272 if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
25273 geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
25277 var hit = geoLineIntersection(p, q);
25279 var epsilon = 1e-8;
25280 // skip if the hit is at the segment's endpoint
25281 if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
25282 geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
25295 // Return the intersection point of 2 line segments.
25296 // From https://github.com/pgkelley4/line-segments-intersect
25297 // This uses the vector cross product approach described below:
25298 // http://stackoverflow.com/a/565282/786339
25299 function geoLineIntersection(a, b) {
25300 var p = [a[0][0], a[0][1]];
25301 var p2 = [a[1][0], a[1][1]];
25302 var q = [b[0][0], b[0][1]];
25303 var q2 = [b[1][0], b[1][1]];
25304 var r = geoVecSubtract(p2, p);
25305 var s = geoVecSubtract(q2, q);
25306 var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
25307 var denominator = geoVecCross(r, s);
25309 if (uNumerator && denominator) {
25310 var u = uNumerator / denominator;
25311 var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
25313 if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
25314 return geoVecInterp(p, p2, t);
25322 function geoPathIntersections(path1, path2) {
25323 var intersections = [];
25324 for (var i = 0; i < path1.length - 1; i++) {
25325 for (var j = 0; j < path2.length - 1; j++) {
25326 var a = [ path1[i], path1[i+1] ];
25327 var b = [ path2[j], path2[j+1] ];
25328 var hit = geoLineIntersection(a, b);
25330 intersections.push(hit);
25334 return intersections;
25337 function geoPathHasIntersections(path1, path2) {
25338 for (var i = 0; i < path1.length - 1; i++) {
25339 for (var j = 0; j < path2.length - 1; j++) {
25340 var a = [ path1[i], path1[i+1] ];
25341 var b = [ path2[j], path2[j+1] ];
25342 var hit = geoLineIntersection(a, b);
25352 // Return whether point is contained in polygon.
25354 // `point` should be a 2-item array of coordinates.
25355 // `polygon` should be an array of 2-item arrays of coordinates.
25357 // From https://github.com/substack/point-in-polygon.
25358 // ray-casting algorithm based on
25359 // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
25361 function geoPointInPolygon(point, polygon) {
25364 var inside = false;
25366 for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
25367 var xi = polygon[i][0];
25368 var yi = polygon[i][1];
25369 var xj = polygon[j][0];
25370 var yj = polygon[j][1];
25372 var intersect = ((yi > y) !== (yj > y)) &&
25373 (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
25374 if (intersect) inside = !inside;
25381 function geoPolygonContainsPolygon(outer, inner) {
25382 return every(inner, function(point) {
25383 return geoPointInPolygon(point, outer);
25388 function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
25389 function testPoints(outer, inner) {
25390 return some(inner, function(point) {
25391 return geoPointInPolygon(point, outer);
25395 return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
25399 function geoPathLength(path) {
25401 for (var i = 0; i < path.length - 1; i++) {
25402 length += geoVecLength(path[i], path[i + 1]);
25408 // If the given point is at the edge of the padded viewport,
25409 // return a vector that will nudge the viewport in that direction
25410 function geoViewportEdge(point, dimensions) {
25411 var pad = [80, 20, 50, 20]; // top, right, bottom, left
25415 if (point[0] > dimensions[0] - pad[1])
25417 if (point[0] < pad[3])
25419 if (point[1] > dimensions[1] - pad[2])
25421 if (point[1] < pad[0])
25432 Bypasses features of D3's default projection stream pipeline that are unnecessary:
25433 * Antimeridian clipping
25434 * Spherical rotation
25437 function geoRawMercator() {
25438 var project = mercatorRaw;
25439 var k = 512 / Math.PI; // scale
25441 var y = 0; // translate
25442 var clipExtent = [[0, 0], [0, 0]];
25445 function projection$$1(point) {
25446 point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
25447 return [point[0] * k + x, y - point[1] * k];
25451 projection$$1.invert = function(point) {
25452 point = project.invert((point[0] - x) / k, (y - point[1]) / k);
25453 return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
25457 projection$$1.scale = function(_) {
25458 if (!arguments.length) return k;
25460 return projection$$1;
25464 projection$$1.translate = function(_) {
25465 if (!arguments.length) return [x, y];
25468 return projection$$1;
25472 projection$$1.clipExtent = function(_) {
25473 if (!arguments.length) return clipExtent;
25475 return projection$$1;
25479 projection$$1.transform = function(obj) {
25480 if (!arguments.length) return identity$7.translate(x, y).scale(k);
25484 return projection$$1;
25488 projection$$1.stream = d3_geoTransform({
25489 point: function(x, y) {
25490 var vec = projection$$1([x, y]);
25491 this.stream.point(vec[0], vec[1]);
25496 return projection$$1;
25499 function osmChangeset() {
25500 if (!(this instanceof osmChangeset)) {
25501 return (new osmChangeset()).initialize(arguments);
25502 } else if (arguments.length) {
25503 this.initialize(arguments);
25508 osmEntity$$1.changeset = osmChangeset;
25510 osmChangeset.prototype = Object.create(osmEntity$$1.prototype);
25512 assignIn(osmChangeset.prototype, {
25517 extent: function() {
25518 return new geoExtent$$1();
25522 geometry: function() {
25523 return 'changeset';
25527 asJXON: function() {
25531 tag: map$3(this.tags, function(value, key) {
25532 return { '@k': key, '@v': value };
25542 // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
25543 // XML. Returns a string.
25544 osmChangeJXON: function(changes) {
25545 var changeset_id = this.id;
25547 function nest(x, order) {
25549 for (var i = 0; i < x.length; i++) {
25550 var tagName = Object.keys(x[i])[0];
25551 if (!groups[tagName]) groups[tagName] = [];
25552 groups[tagName].push(x[i][tagName]);
25555 order.forEach(function(o) {
25556 if (groups[o]) ordered[o] = groups[o];
25562 // sort relations in a changeset by dependencies
25563 function sort(changes) {
25565 // find a referenced relation in the current changeset
25566 function resolve(item) {
25567 return find$1(relations, function(relation) {
25568 return item.keyAttributes.type === 'relation'
25569 && item.keyAttributes.ref === relation['@id'];
25573 // a new item is an item that has not been already processed
25574 function isNew(item) {
25575 return !sorted[ item['@id'] ] && !find$1(processing, function(proc) {
25576 return proc['@id'] === item['@id'];
25580 var processing = [],
25582 relations = changes.relation;
25584 if (!relations) return changes;
25586 for (var i = 0; i < relations.length; i++) {
25587 var relation = relations[i];
25589 // skip relation if already sorted
25590 if (!sorted[relation['@id']]) {
25591 processing.push(relation);
25594 while (processing.length > 0) {
25595 var next = processing[0],
25596 deps = filter(compact(next.member.map(resolve)), isNew);
25597 if (deps.length === 0) {
25598 sorted[next['@id']] = next;
25599 processing.shift();
25601 processing = deps.concat(processing);
25606 changes.relation = values$1(sorted);
25610 function rep(entity) {
25611 return entity.asJXON(changeset_id);
25617 '@generator': 'iD',
25618 'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
25619 'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
25620 'delete': assignIn(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
25626 asGeoJSON: function() {
25633 * Creates a duplicate-free version of an array, using
25634 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
25635 * for equality comparisons, in which only the first occurrence of each element
25636 * is kept. The order of result values is determined by the order they occur
25643 * @param {Array} array The array to inspect.
25644 * @returns {Array} Returns the new duplicate free array.
25647 * _.uniq([2, 1, 2]);
25650 function uniq(array) {
25651 return (array && array.length) ? baseUniq(array) : [];
25654 function osmNode() {
25655 if (!(this instanceof osmNode)) {
25656 return (new osmNode()).initialize(arguments);
25657 } else if (arguments.length) {
25658 this.initialize(arguments);
25662 osmEntity$$1.node = osmNode;
25664 osmNode.prototype = Object.create(osmEntity$$1.prototype);
25666 assignIn(osmNode.prototype, {
25671 extent: function() {
25672 return new geoExtent$$1(this.loc);
25676 geometry: function(graph) {
25677 return graph.transient(this, 'geometry', function() {
25678 return graph.isPoi(this) ? 'point' : 'vertex';
25683 move: function(loc) {
25684 return this.update({loc: loc});
25688 isDegenerate: function() {
25690 Array.isArray(this.loc) && this.loc.length === 2 &&
25691 this.loc[0] >= -180 && this.loc[0] <= 180 &&
25692 this.loc[1] >= -90 && this.loc[1] <= 90
25697 // Inspect tags and geometry to determine which direction(s) this node/vertex points
25698 directions: function(resolver, projection) {
25702 // which tag to use?
25703 if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
25704 // all-way stop tag on a highway intersection
25707 // generic direction tag
25708 val = (this.tags.direction || '').toLowerCase();
25710 // better suffix-style direction tag
25711 var re = /:direction$/i;
25712 var keys = Object.keys(this.tags);
25713 for (i = 0; i < keys.length; i++) {
25714 if (re.test(keys[i])) {
25715 val = this.tags[keys[i]].toLowerCase();
25721 if (val === '') return [];
25725 northnortheast: 22, nne: 22,
25726 northeast: 45, ne: 45,
25727 eastnortheast: 67, ene: 67,
25729 eastsoutheast: 112, ese: 112,
25730 southeast: 135, se: 135,
25731 southsoutheast: 157, sse: 157,
25732 south: 180, s: 180,
25733 southsouthwest: 202, ssw: 202,
25734 southwest: 225, sw: 225,
25735 westsouthwest: 247, wsw: 247,
25737 westnorthwest: 292, wnw: 292,
25738 northwest: 315, nw: 315,
25739 northnorthwest: 337, nnw: 337
25743 var values = val.split(';');
25746 values.forEach(function(v) {
25747 // swap cardinal for numeric directions
25748 if (cardinal[v] !== undefined) {
25752 // numeric direction - just add to results
25753 if (v !== '' && !isNaN(+v)) {
25758 // string direction - inspect parent ways
25760 (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
25762 (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
25764 if (!lookForward && !lookBackward) return;
25767 resolver.parentWays(this).forEach(function(parent) {
25768 var nodes = parent.nodes;
25769 for (i = 0; i < nodes.length; i++) {
25770 if (nodes[i] === this.id) { // match current entity
25771 if (lookForward && i > 0) {
25772 nodeIds[nodes[i - 1]] = true; // look back to prev node
25774 if (lookBackward && i < nodes.length - 1) {
25775 nodeIds[nodes[i + 1]] = true; // look ahead to next node
25781 Object.keys(nodeIds).forEach(function(nodeId) {
25782 // +90 because geoAngle returns angle from X axis, not Y (north)
25784 (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
25790 return uniq(results);
25794 isEndpoint: function(resolver) {
25795 return resolver.transient(this, 'isEndpoint', function() {
25797 return resolver.parentWays(this).filter(function(parent) {
25798 return !parent.isClosed() && !!parent.affix(id);
25804 isConnected: function(resolver) {
25805 return resolver.transient(this, 'isConnected', function() {
25806 var parents = resolver.parentWays(this);
25808 function isLine(entity) {
25809 return entity.geometry(resolver) === 'line' &&
25810 entity.hasInterestingTags();
25813 // vertex is connected to multiple parent lines
25814 if (parents.length > 1 && some(parents, isLine)) {
25817 } else if (parents.length === 1) {
25818 var way = parents[0],
25819 nodes = way.nodes.slice();
25820 if (way.isClosed()) { nodes.pop(); } // ignore connecting node if closed
25822 // return true if vertex appears multiple times (way is self intersecting)
25823 return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
25831 isIntersection: function(resolver) {
25832 return resolver.transient(this, 'isIntersection', function() {
25833 return resolver.parentWays(this).filter(function(parent) {
25834 return (parent.tags.highway ||
25835 parent.tags.waterway ||
25836 parent.tags.railway ||
25837 parent.tags.aeroway) &&
25838 parent.geometry(resolver) === 'line';
25844 isHighwayIntersection: function(resolver) {
25845 return resolver.transient(this, 'isHighwayIntersection', function() {
25846 return resolver.parentWays(this).filter(function(parent) {
25847 return parent.tags.highway && parent.geometry(resolver) === 'line';
25853 isOnAddressLine: function(resolver) {
25854 return resolver.transient(this, 'isOnAddressLine', function() {
25855 return resolver.parentWays(this).filter(function(parent) {
25856 return parent.tags.hasOwnProperty('addr:interpolation') &&
25857 parent.geometry(resolver) === 'line';
25863 asJXON: function(changeset_id) {
25866 '@id': this.osmId(),
25867 '@lon': this.loc[0],
25868 '@lat': this.loc[1],
25869 '@version': (this.version || 0),
25870 tag: map$3(this.tags, function(v, k) {
25871 return { keyAttributes: { k: k, v: v } };
25875 if (changeset_id) r.node['@changeset'] = changeset_id;
25880 asGeoJSON: function() {
25883 coordinates: this.loc
25888 /** Error message constants. */
25889 var FUNC_ERROR_TEXT$1 = 'Expected a function';
25892 * Creates a function that negates the result of the predicate `func`. The
25893 * `func` predicate is invoked with the `this` binding and arguments of the
25894 * created function.
25899 * @category Function
25900 * @param {Function} predicate The predicate to negate.
25901 * @returns {Function} Returns the new negated function.
25904 * function isEven(n) {
25905 * return n % 2 == 0;
25908 * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
25911 function negate(predicate) {
25912 if (typeof predicate != 'function') {
25913 throw new TypeError(FUNC_ERROR_TEXT$1);
25915 return function() {
25916 var args = arguments;
25917 switch (args.length) {
25918 case 0: return !predicate.call(this);
25919 case 1: return !predicate.call(this, args[0]);
25920 case 2: return !predicate.call(this, args[0], args[1]);
25921 case 3: return !predicate.call(this, args[0], args[1], args[2]);
25923 return !predicate.apply(this, args);
25928 * The opposite of `_.filter`; this method returns the elements of `collection`
25929 * that `predicate` does **not** return truthy for.
25934 * @category Collection
25935 * @param {Array|Object} collection The collection to iterate over.
25936 * @param {Function} [predicate=_.identity] The function invoked per iteration.
25937 * @returns {Array} Returns the new filtered array.
25942 * { 'user': 'barney', 'age': 36, 'active': false },
25943 * { 'user': 'fred', 'age': 40, 'active': true }
25946 * _.reject(users, function(o) { return !o.active; });
25947 * // => objects for ['fred']
25949 * // The `_.matches` iteratee shorthand.
25950 * _.reject(users, { 'age': 40, 'active': true });
25951 * // => objects for ['barney']
25953 * // The `_.matchesProperty` iteratee shorthand.
25954 * _.reject(users, ['active', false]);
25955 * // => objects for ['fred']
25957 * // The `_.property` iteratee shorthand.
25958 * _.reject(users, 'active');
25959 * // => objects for ['barney']
25961 function reject(collection, predicate) {
25962 var func = isArray(collection) ? arrayFilter : baseFilter;
25963 return func(collection, negate(baseIteratee(predicate, 3)));
25967 * An alternative to `_.reduce`; this method transforms `object` to a new
25968 * `accumulator` object which is the result of running each of its own
25969 * enumerable string keyed properties thru `iteratee`, with each invocation
25970 * potentially mutating the `accumulator` object. If `accumulator` is not
25971 * provided, a new object with the same `[[Prototype]]` will be used. The
25972 * iteratee is invoked with four arguments: (accumulator, value, key, object).
25973 * Iteratee functions may exit iteration early by explicitly returning `false`.
25979 * @param {Object} object The object to iterate over.
25980 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
25981 * @param {*} [accumulator] The custom accumulator value.
25982 * @returns {*} Returns the accumulated value.
25985 * _.transform([2, 3, 4], function(result, n) {
25986 * result.push(n *= n);
25987 * return n % 2 == 0;
25991 * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
25992 * (result[value] || (result[value] = [])).push(key);
25994 * // => { '1': ['a', 'c'], '2': ['b'] }
25996 function transform$1(object, iteratee, accumulator) {
25997 var isArr = isArray(object),
25998 isArrLike = isArr || isBuffer(object) || isTypedArray(object);
26000 iteratee = baseIteratee(iteratee, 4);
26001 if (accumulator == null) {
26002 var Ctor = object && object.constructor;
26004 accumulator = isArr ? new Ctor : [];
26006 else if (isObject(object)) {
26007 accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
26013 (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
26014 return iteratee(accumulator, value, index, object);
26016 return accumulator;
26020 Order the nodes of a way in reverse order and reverse any direction dependent tags
26021 other than `oneway`. (We assume that correcting a backwards oneway is the primary
26022 reason for reversing a way.)
26024 The following transforms are performed:
26027 *:right=* ⟺ *:left=*
26028 *:forward=* ⟺ *:backward=*
26029 direction=up ⟺ direction=down
26030 incline=up ⟺ incline=down
26034 role=forward ⟺ role=backward
26035 role=north ⟺ role=south
26036 role=east ⟺ role=west
26038 In addition, numeric-valued `incline` tags are negated.
26040 The JOSM implementation was used as a guide, but transformations that were of unclear benefit
26041 or adjusted tags that don't seem to be used in practice were omitted.
26043 Also, each node on the way is examined for its own tags and the following transformations are performed
26044 in order to ensure associated nodes (eg a Stop Sign) is also reversed
26047 *direction=forward ⟺ *direction=backward
26048 *direction=left ⟺ *direction=right
26049 *:forward=* ⟺ *:backward=*
26050 *:left=* ⟺ *:right=*
26053 http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
26054 http://wiki.openstreetmap.org/wiki/Key:direction#Steps
26055 http://wiki.openstreetmap.org/wiki/Key:incline
26056 http://wiki.openstreetmap.org/wiki/Route#Members
26057 http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
26058 http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
26059 http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
26061 function actionReverse(wayId, options) {
26062 var replacements = [
26063 [/:right$/, ':left'], [/:left$/, ':right'],
26064 [/:forward$/, ':backward'], [/:backward$/, ':forward']
26066 numeric = /^([+\-]?)(?=[\d.])/,
26068 forward: 'backward',
26069 backward: 'forward',
26077 function reverseKey(key) {
26078 for (var i = 0; i < replacements.length; ++i) {
26079 var replacement = replacements[i];
26080 if (replacement[0].test(key)) {
26081 return key.replace(replacement[0], replacement[1]);
26088 function reverseValue(key, value) {
26089 if (key === 'incline' && numeric.test(value)) {
26090 return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
26091 } else if (key === 'incline' || key === 'direction') {
26092 return {up: 'down', down: 'up'}[value] || value;
26093 } else if (options && options.reverseOneway && key === 'oneway') {
26094 return {yes: '-1', '1': '-1', '-1': 'yes'}[value] || value;
26096 return {left: 'right', right: 'left'}[value] || value;
26101 function reverseDirectionTags(node) {
26102 // Update the direction based tags as appropriate then return an updated node
26103 return node.update({tags: transform$1(node.tags, function(acc, tagValue, tagKey) {
26104 // See if this is a direction tag and reverse (or use existing value if not recognised)
26105 var re = /direction$/;
26106 if (re.test(tagKey)) {
26107 acc[tagKey] = {forward: 'backward', backward: 'forward', left: 'right', right: 'left'}[tagValue] || tagValue;
26109 // Use the reverseKey method to cater for situations such as traffic_sign:forward=stop
26110 // This will pass through other tags unchanged
26111 acc[reverseKey(tagKey)] = tagValue;
26118 function reverseTagsOnNodes(graph, nodeIds) {
26119 // Reverse the direction of appropriate tags attached to the nodes (#3076)
26121 // Get each node from the graph
26122 .map(function(nodeId) { return graph.entity(nodeId);})
26123 // Check tags on the node, if there aren't any, we can skip
26124 .filter(function(existingNode) { return existingNode.tags !== undefined;})
26125 // Get a new version of each node with the appropriate tags reversed
26126 .map(function(existingNode) { return reverseDirectionTags(existingNode);})
26127 // Chain together consecutive updates to the graph for each updated node and return
26128 .reduce(function (accGraph, value) { return accGraph.replace(value); }, graph);
26132 return function(graph) {
26133 var way = graph.entity(wayId),
26134 nodes = way.nodes.slice().reverse(),
26135 tags = {}, key, role;
26137 for (key in way.tags) {
26138 tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
26141 graph.parentRelations(way).forEach(function(relation) {
26142 relation.members.forEach(function(member, index) {
26143 if (member.id === way.id && (role = roleReversals[member.role])) {
26144 relation = relation.updateMember({role: role}, index);
26145 graph = graph.replace(relation);
26150 // Reverse any associated directions on nodes on the way and then replace
26151 // the way itself with the reversed node ids and updated way tags
26152 return reverseTagsOnNodes(graph, nodes).replace(way.update({nodes: nodes, tags: tags}));
26156 /** `Object#toString` result references. */
26157 var numberTag$4 = '[object Number]';
26160 * Checks if `value` is classified as a `Number` primitive or object.
26162 * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
26163 * classified as numbers, use the `_.isFinite` method.
26169 * @param {*} value The value to check.
26170 * @returns {boolean} Returns `true` if `value` is a number, else `false`.
26176 * _.isNumber(Number.MIN_VALUE);
26179 * _.isNumber(Infinity);
26185 function isNumber(value) {
26186 return typeof value == 'number' ||
26187 (isObjectLike(value) && baseGetTag(value) == numberTag$4);
26190 /** `Object#toString` result references. */
26191 var stringTag$4 = '[object String]';
26194 * Checks if `value` is classified as a `String` primitive or object.
26200 * @param {*} value The value to check.
26201 * @returns {boolean} Returns `true` if `value` is a string, else `false`.
26204 * _.isString('abc');
26210 function isString(value) {
26211 return typeof value == 'string' ||
26212 (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag$4);
26216 * Checks if `value` is `NaN`.
26218 * **Note:** This method is based on
26219 * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
26220 * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
26221 * `undefined` and other non-number values.
26227 * @param {*} value The value to check.
26228 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
26234 * _.isNaN(new Number(NaN));
26237 * isNaN(undefined);
26240 * _.isNaN(undefined);
26243 function isNaN$1(value) {
26244 // An `NaN` primitive is the only value that is not equal to itself.
26245 // Perform the `toStringTag` check first to avoid errors with some
26246 // ActiveX objects in IE.
26247 return isNumber(value) && value != +value;
26250 function osmLanes(entity) {
26251 if (entity.type !== 'way') return null;
26252 if (!entity.tags.highway) return null;
26254 var tags = entity.tags;
26255 var isOneWay = entity.isOneWay();
26256 var laneCount = getLaneCount(tags, isOneWay);
26257 var maxspeed = parseMaxspeed(tags);
26259 var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
26260 var forward = laneDirections.forward;
26261 var backward = laneDirections.backward;
26262 var bothways = laneDirections.bothways;
26264 // parse the piped string 'x|y|z' format
26265 var turnLanes = {};
26266 turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
26267 turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
26268 turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
26270 var maxspeedLanes = {};
26271 maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
26272 maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
26273 maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
26276 psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
26277 psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
26278 psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
26281 busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
26282 busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
26283 busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
26285 var taxiLanes = {};
26286 taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
26287 taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
26288 taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
26291 hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
26292 hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
26293 hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
26296 hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
26297 hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
26298 hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
26300 var bicyclewayLanes = {};
26301 bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
26302 bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
26303 bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
26311 // map forward/backward/unspecified of each lane type to lanesObj
26312 mapToLanesObj(lanesObj, turnLanes, 'turnLane');
26313 mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
26314 mapToLanesObj(lanesObj, psvLanes, 'psv');
26315 mapToLanesObj(lanesObj, busLanes, 'bus');
26316 mapToLanesObj(lanesObj, taxiLanes, 'taxi');
26317 mapToLanesObj(lanesObj, hovLanes, 'hov');
26318 mapToLanesObj(lanesObj, hgvLanes, 'hgv');
26319 mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
26326 backward: backward,
26327 bothways: bothways,
26328 turnLanes: turnLanes,
26329 maxspeed: maxspeed,
26330 maxspeedLanes: maxspeedLanes,
26331 psvLanes: psvLanes,
26332 busLanes: busLanes,
26333 taxiLanes: taxiLanes,
26334 hovLanes: hovLanes,
26335 hgvLanes: hgvLanes,
26336 bicyclewayLanes: bicyclewayLanes
26343 function getLaneCount(tags, isOneWay) {
26346 count = parseInt(tags.lanes, 10);
26353 switch (tags.highway) {
26356 count = isOneWay ? 2 : 4;
26359 count = isOneWay ? 1 : 2;
26367 function parseMaxspeed(tags) {
26368 var maxspeed = tags.maxspeed;
26369 if (isNumber(maxspeed)) return maxspeed;
26370 if (isString(maxspeed)) {
26371 maxspeed = maxspeed.match(/^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/g);
26372 if (!maxspeed) return;
26373 return parseInt(maxspeed, 10);
26378 function parseLaneDirections(tags, isOneWay, laneCount) {
26379 var forward = parseInt(tags['lanes:forward'], 10);
26380 var backward = parseInt(tags['lanes:backward'], 10);
26381 var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
26383 if (parseInt(tags.oneway, 10) === -1) {
26386 backward = laneCount;
26388 else if (isOneWay) {
26389 forward = laneCount;
26393 else if (isNaN$1(forward) && isNaN$1(backward)) {
26394 backward = Math.floor((laneCount - bothways) / 2);
26395 forward = laneCount - bothways - backward;
26397 else if (isNaN$1(forward)) {
26398 if (backward > laneCount - bothways) {
26399 backward = laneCount - bothways;
26401 forward = laneCount - bothways - backward;
26403 else if (isNaN$1(backward)) {
26404 if (forward > laneCount - bothways) {
26405 forward = laneCount - bothways;
26407 backward = laneCount - bothways - forward;
26411 backward: backward,
26417 function parseTurnLanes(tag){
26420 var validValues = [
26421 'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
26422 'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
26425 return tag.split('|')
26426 .map(function (s) {
26427 if (s === '') s = 'none';
26428 return s.split(';')
26429 .map(function (d) {
26430 return validValues.indexOf(d) === -1 ? 'unknown': d;
26436 function parseMaxspeedLanes(tag, maxspeed) {
26439 return tag.split('|')
26440 .map(function (s) {
26441 if (s === 'none') return s;
26442 var m = parseInt(s, 10);
26443 if (s === '' || m === maxspeed) return null;
26444 return isNaN$1(m) ? 'unknown': m;
26449 function parseMiscLanes(tag) {
26452 var validValues = [
26453 'yes', 'no', 'designated'
26456 return tag.split('|')
26457 .map(function (s) {
26458 if (s === '') s = 'no';
26459 return validValues.indexOf(s) === -1 ? 'unknown': s;
26464 function parseBicycleWay(tag) {
26467 var validValues = [
26468 'yes', 'no', 'designated', 'lane'
26471 return tag.split('|')
26472 .map(function (s) {
26473 if (s === '') s = 'no';
26474 return validValues.indexOf(s) === -1 ? 'unknown': s;
26479 function mapToLanesObj(lanesObj, data, key) {
26480 if (data.forward) data.forward.forEach(function(l, i) {
26481 if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
26482 lanesObj.forward[i][key] = l;
26484 if (data.backward) data.backward.forEach(function(l, i) {
26485 if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
26486 lanesObj.backward[i][key] = l;
26488 if (data.unspecified) data.unspecified.forEach(function(l, i) {
26489 if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
26490 lanesObj.unspecified[i][key] = l;
26494 /** Used to compose bitmasks for cloning. */
26495 var CLONE_DEEP_FLAG$2 = 1,
26496 CLONE_SYMBOLS_FLAG$3 = 4;
26499 * This method is like `_.clone` except that it recursively clones `value`.
26505 * @param {*} value The value to recursively clone.
26506 * @returns {*} Returns the deep cloned value.
26510 * var objects = [{ 'a': 1 }, { 'b': 2 }];
26512 * var deep = _.cloneDeep(objects);
26513 * console.log(deep[0] === objects[0]);
26516 function cloneDeep(value) {
26517 return baseClone(value, CLONE_DEEP_FLAG$2 | CLONE_SYMBOLS_FLAG$3);
26521 * Gets the timestamp of the number of milliseconds that have elapsed since
26522 * the Unix epoch (1 January 1970 00:00:00 UTC).
26528 * @returns {number} Returns the timestamp.
26531 * _.defer(function(stamp) {
26532 * console.log(_.now() - stamp);
26534 * // => Logs the number of milliseconds it took for the deferred invocation.
26536 var now$1 = function() {
26537 return root$2.Date.now();
26540 /** Error message constants. */
26541 var FUNC_ERROR_TEXT$2 = 'Expected a function';
26543 /* Built-in method references for those with the same name as other `lodash` methods. */
26544 var nativeMax$2 = Math.max,
26545 nativeMin = Math.min;
26548 * Creates a debounced function that delays invoking `func` until after `wait`
26549 * milliseconds have elapsed since the last time the debounced function was
26550 * invoked. The debounced function comes with a `cancel` method to cancel
26551 * delayed `func` invocations and a `flush` method to immediately invoke them.
26552 * Provide `options` to indicate whether `func` should be invoked on the
26553 * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
26554 * with the last arguments provided to the debounced function. Subsequent
26555 * calls to the debounced function return the result of the last `func`
26558 * **Note:** If `leading` and `trailing` options are `true`, `func` is
26559 * invoked on the trailing edge of the timeout only if the debounced function
26560 * is invoked more than once during the `wait` timeout.
26562 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
26563 * until to the next tick, similar to `setTimeout` with a timeout of `0`.
26565 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
26566 * for details over the differences between `_.debounce` and `_.throttle`.
26571 * @category Function
26572 * @param {Function} func The function to debounce.
26573 * @param {number} [wait=0] The number of milliseconds to delay.
26574 * @param {Object} [options={}] The options object.
26575 * @param {boolean} [options.leading=false]
26576 * Specify invoking on the leading edge of the timeout.
26577 * @param {number} [options.maxWait]
26578 * The maximum time `func` is allowed to be delayed before it's invoked.
26579 * @param {boolean} [options.trailing=true]
26580 * Specify invoking on the trailing edge of the timeout.
26581 * @returns {Function} Returns the new debounced function.
26584 * // Avoid costly calculations while the window size is in flux.
26585 * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
26587 * // Invoke `sendMail` when clicked, debouncing subsequent calls.
26588 * jQuery(element).on('click', _.debounce(sendMail, 300, {
26590 * 'trailing': false
26593 * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
26594 * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
26595 * var source = new EventSource('/stream');
26596 * jQuery(source).on('message', debounced);
26598 * // Cancel the trailing debounced invocation.
26599 * jQuery(window).on('popstate', debounced.cancel);
26601 function debounce(func, wait, options) {
26608 lastInvokeTime = 0,
26613 if (typeof func != 'function') {
26614 throw new TypeError(FUNC_ERROR_TEXT$2);
26616 wait = toNumber(wait) || 0;
26617 if (isObject(options)) {
26618 leading = !!options.leading;
26619 maxing = 'maxWait' in options;
26620 maxWait = maxing ? nativeMax$2(toNumber(options.maxWait) || 0, wait) : maxWait;
26621 trailing = 'trailing' in options ? !!options.trailing : trailing;
26624 function invokeFunc(time) {
26625 var args = lastArgs,
26626 thisArg = lastThis;
26628 lastArgs = lastThis = undefined;
26629 lastInvokeTime = time;
26630 result = func.apply(thisArg, args);
26634 function leadingEdge(time) {
26635 // Reset any `maxWait` timer.
26636 lastInvokeTime = time;
26637 // Start the timer for the trailing edge.
26638 timerId = setTimeout(timerExpired, wait);
26639 // Invoke the leading edge.
26640 return leading ? invokeFunc(time) : result;
26643 function remainingWait(time) {
26644 var timeSinceLastCall = time - lastCallTime,
26645 timeSinceLastInvoke = time - lastInvokeTime,
26646 timeWaiting = wait - timeSinceLastCall;
26649 ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
26653 function shouldInvoke(time) {
26654 var timeSinceLastCall = time - lastCallTime,
26655 timeSinceLastInvoke = time - lastInvokeTime;
26657 // Either this is the first call, activity has stopped and we're at the
26658 // trailing edge, the system time has gone backwards and we're treating
26659 // it as the trailing edge, or we've hit the `maxWait` limit.
26660 return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
26661 (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
26664 function timerExpired() {
26665 var time = now$1();
26666 if (shouldInvoke(time)) {
26667 return trailingEdge(time);
26669 // Restart the timer.
26670 timerId = setTimeout(timerExpired, remainingWait(time));
26673 function trailingEdge(time) {
26674 timerId = undefined;
26676 // Only invoke if we have `lastArgs` which means `func` has been
26677 // debounced at least once.
26678 if (trailing && lastArgs) {
26679 return invokeFunc(time);
26681 lastArgs = lastThis = undefined;
26685 function cancel() {
26686 if (timerId !== undefined) {
26687 clearTimeout(timerId);
26689 lastInvokeTime = 0;
26690 lastArgs = lastCallTime = lastThis = timerId = undefined;
26694 return timerId === undefined ? result : trailingEdge(now$1());
26697 function debounced() {
26698 var time = now$1(),
26699 isInvoking = shouldInvoke(time);
26701 lastArgs = arguments;
26703 lastCallTime = time;
26706 if (timerId === undefined) {
26707 return leadingEdge(lastCallTime);
26710 // Handle invocations in a tight loop.
26711 timerId = setTimeout(timerExpired, wait);
26712 return invokeFunc(lastCallTime);
26715 if (timerId === undefined) {
26716 timerId = setTimeout(timerExpired, wait);
26720 debounced.cancel = cancel;
26721 debounced.flush = flush;
26726 * Casts `value` to `identity` if it's not a function.
26729 * @param {*} value The value to inspect.
26730 * @returns {Function} Returns cast function.
26732 function castFunction(value) {
26733 return typeof value == 'function' ? value : identity$8;
26737 * Iterates over elements of `collection` and invokes `iteratee` for each element.
26738 * The iteratee is invoked with three arguments: (value, index|key, collection).
26739 * Iteratee functions may exit iteration early by explicitly returning `false`.
26741 * **Note:** As with other "Collections" methods, objects with a "length"
26742 * property are iterated like arrays. To avoid this behavior use `_.forIn`
26743 * or `_.forOwn` for object iteration.
26749 * @category Collection
26750 * @param {Array|Object} collection The collection to iterate over.
26751 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26752 * @returns {Array|Object} Returns `collection`.
26753 * @see _.forEachRight
26756 * _.forEach([1, 2], function(value) {
26757 * console.log(value);
26759 * // => Logs `1` then `2`.
26761 * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
26762 * console.log(key);
26764 * // => Logs 'a' then 'b' (iteration order is not guaranteed).
26766 function forEach(collection, iteratee) {
26767 var func = isArray(collection) ? arrayEach : baseEach;
26768 return func(collection, castFunction(iteratee));
26772 * Iterates over own enumerable string keyed properties of an object and
26773 * invokes `iteratee` for each property. The iteratee is invoked with three
26774 * arguments: (value, key, object). Iteratee functions may exit iteration
26775 * early by explicitly returning `false`.
26781 * @param {Object} object The object to iterate over.
26782 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26783 * @returns {Object} Returns `object`.
26784 * @see _.forOwnRight
26792 * Foo.prototype.c = 3;
26794 * _.forOwn(new Foo, function(value, key) {
26795 * console.log(key);
26797 * // => Logs 'a' then 'b' (iteration order is not guaranteed).
26799 function forOwn(object, iteratee) {
26800 return object && baseForOwn(object, castFunction(iteratee));
26803 var translations = Object.create(null);
26805 var currentLocale = 'en';
26806 var textDirection = 'ltr';
26808 function setLocale(_) {
26809 if (translations[_] !== undefined) {
26811 } else if (translations[_.split('-')[0]]) {
26812 currentLocale = _.split('-')[0];
26816 function addTranslation(id, value) {
26817 translations[id] = value;
26821 * Given a string identifier, try to find that string in the current
26822 * language, and return it. This function will be called recursively
26823 * with locale `en` if a string can not be found in the requested language.
26825 * @param {string} s string identifier
26826 * @param {object?} o object of token replacements and default string
26827 * @param {string?} loc locale to use
26828 * @returns {string?} locale string
26830 function t(s, o, loc) {
26831 loc = loc || currentLocale;
26835 .map(function (s) { return s.replace('<TX_DOT>', '.'); })
26838 var rep = translations[loc];
26840 while (rep !== undefined && path.length) {
26841 rep = rep[path.pop()];
26844 if (rep !== undefined) {
26847 rep = rep.replace('{' + k + '}', o[k]);
26853 if (loc !== 'en') {
26854 return t(s, o, 'en');
26857 if (o && 'default' in o) {
26861 var missing = 'Missing ' + loc + ' translation: ' + s;
26862 if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
26868 * Given string 'ltr' or 'rtl', save that setting
26870 * @param {string} dir ltr or rtl
26873 function setTextDirection(dir) {
26874 textDirection = dir;
26877 /** Used to compose bitmasks for cloning. */
26878 var CLONE_DEEP_FLAG$3 = 1,
26879 CLONE_SYMBOLS_FLAG$4 = 4;
26882 * This method is like `_.cloneWith` except that it recursively clones `value`.
26888 * @param {*} value The value to recursively clone.
26889 * @param {Function} [customizer] The function to customize cloning.
26890 * @returns {*} Returns the deep cloned value.
26894 * function customizer(value) {
26895 * if (_.isElement(value)) {
26896 * return value.cloneNode(true);
26900 * var el = _.cloneDeepWith(document.body, customizer);
26902 * console.log(el === document.body);
26904 * console.log(el.nodeName);
26906 * console.log(el.childNodes.length);
26909 function cloneDeepWith(value, customizer) {
26910 customizer = typeof customizer == 'function' ? customizer : undefined;
26911 return baseClone(value, CLONE_DEEP_FLAG$3 | CLONE_SYMBOLS_FLAG$4, customizer);
26915 * Creates an array of `array` values not included in the other given arrays
26916 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
26917 * for equality comparisons. The order and references of result values are
26918 * determined by the first array.
26920 * **Note:** Unlike `_.pullAll`, this method returns a new array.
26926 * @param {Array} array The array to inspect.
26927 * @param {...Array} [values] The values to exclude.
26928 * @returns {Array} Returns the new array of filtered values.
26929 * @see _.without, _.xor
26932 * _.difference([2, 1], [2, 3]);
26935 var difference = baseRest(function(array, values) {
26936 return isArrayLikeObject(array)
26937 ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
26941 /** `Object#toString` result references. */
26942 var mapTag$7 = '[object Map]',
26943 setTag$7 = '[object Set]';
26945 /** Used for built-in method references. */
26946 var objectProto$h = Object.prototype;
26948 /** Used to check objects for own properties. */
26949 var hasOwnProperty$e = objectProto$h.hasOwnProperty;
26952 * Checks if `value` is an empty object, collection, map, or set.
26954 * Objects are considered empty if they have no own enumerable string keyed
26957 * Array-like values such as `arguments` objects, arrays, buffers, strings, or
26958 * jQuery-like collections are considered empty if they have a `length` of `0`.
26959 * Similarly, maps and sets are considered empty if they have a `size` of `0`.
26965 * @param {*} value The value to check.
26966 * @returns {boolean} Returns `true` if `value` is empty, else `false`.
26978 * _.isEmpty([1, 2, 3]);
26981 * _.isEmpty({ 'a': 1 });
26984 function isEmpty(value) {
26985 if (value == null) {
26988 if (isArrayLike(value) &&
26989 (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
26990 isBuffer(value) || isTypedArray(value) || isArguments(value))) {
26991 return !value.length;
26993 var tag = getTag$1(value);
26994 if (tag == mapTag$7 || tag == setTag$7) {
26995 return !value.size;
26997 if (isPrototype(value)) {
26998 return !baseKeys(value).length;
27000 for (var key in value) {
27001 if (hasOwnProperty$e.call(value, key)) {
27010 function utilDetect(force) {
27011 if (detected && !force) return detected;
27014 var ua = navigator.userAgent,
27017 m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i); // Edge
27019 detected.browser = m[1];
27020 detected.version = m[2];
27022 if (!detected.browser) {
27023 m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i); // IE11
27025 detected.browser = 'msie';
27026 detected.version = m[1];
27029 if (!detected.browser) {
27030 m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i); // Opera 15+
27032 detected.browser = 'Opera';
27033 detected.version = m[2];
27036 if (!detected.browser) {
27037 m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
27039 detected.browser = m[1];
27040 detected.version = m[2];
27041 m = ua.match(/version\/([\.\d]+)/i);
27042 if (m !== null) detected.version = m[1];
27045 if (!detected.browser) {
27046 detected.browser = navigator.appName;
27047 detected.version = navigator.appVersion;
27050 // keep major.minor version only..
27051 detected.version = detected.version.split(/\W/).slice(0,2).join('.');
27053 if (detected.browser.toLowerCase() === 'msie') {
27054 detected.ie = true;
27055 detected.browser = 'Internet Explorer';
27056 detected.support = parseFloat(detected.version) >= 11;
27058 detected.ie = false;
27059 detected.support = true;
27062 // Added due to incomplete svg style support. See #715
27063 detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
27065 detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
27066 detected.language = detected.locale.split('-')[0];
27068 // Search `navigator.languages` for a better locale.. Prefer the first language,
27069 // unless the second language is a culture-specific version of the first one, see #3842
27070 if (navigator.languages && navigator.languages.length > 0) {
27071 var code0 = navigator.languages[0],
27072 parts0 = code0.split('-');
27074 detected.locale = code0;
27075 detected.language = parts0[0];
27077 if (navigator.languages.length > 1 && parts0.length === 1) {
27078 var code1 = navigator.languages[1],
27079 parts1 = code1.split('-');
27081 if (parts1[0] === parts0[0]) {
27082 detected.locale = code1;
27087 // Loaded locale is stored in currentLocale
27088 // return that instead (except in the situation where 'en' might override 'en-US')
27089 var loadedLocale = currentLocale || 'en';
27090 if (loadedLocale !== 'en') {
27091 detected.locale = loadedLocale;
27092 detected.language = detected.locale.split('-')[0];
27095 // detect text direction
27096 var q = utilStringQs(window.location.hash.substring(1));
27097 var lang = dataLocales[detected.locale];
27098 if ((lang && lang.rtl) || (q.rtl === 'true')) {
27099 detected.textDirection = 'rtl';
27101 detected.textDirection = 'ltr';
27103 setTextDirection(detected.textDirection);
27106 var loc = window.top.location;
27107 var origin = loc.origin;
27108 if (!origin) { // for unpatched IE11
27109 origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
27112 detected.host = origin + loc.pathname;
27114 detected.filedrop = (window.FileReader && 'ondrop' in window);
27116 detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
27118 detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
27121 return navigator.userAgent.indexOf(x) !== -1;
27125 detected.os = 'win';
27126 detected.platform = 'Windows';
27128 else if (nav('Mac')) {
27129 detected.os = 'mac';
27130 detected.platform = 'Macintosh';
27132 else if (nav('X11') || nav('Linux')) {
27133 detected.os = 'linux';
27134 detected.platform = 'Linux';
27137 detected.os = 'win';
27138 detected.platform = 'Unknown';
27144 var remove$1 = removeDiacritics;
27146 var replacementList = [
27155 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",
27161 chars: "\u00C6\u01FC\u01E2",
27170 chars: "\uA738\uA73A",
27176 chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
27179 chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
27182 chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
27188 chars: "\u01F1\u01C4",
27191 chars: "\u01F2\u01C5",
27194 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",
27197 chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
27200 chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
27203 chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
27206 chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
27209 chars: "\u24BF\uFF2A\u0134\u0248\u0237",
27212 chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
27215 chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
27224 chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
27227 chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
27236 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",
27251 chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
27254 chars: "\u24C6\uFF31\uA756\uA758\u024A",
27257 chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
27260 chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
27263 chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
27272 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",
27275 chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
27281 chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
27284 chars: "\u24CD\uFF38\u1E8A\u1E8C",
27287 chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
27290 chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
27293 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",
27299 chars: "\u00E6\u01FD\u01E3",
27308 chars: "\uA739\uA73B",
27314 chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
27317 chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
27320 chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
27326 chars: "\u01F3\u01C6",
27329 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",
27332 chars: "\u24D5\uFF46\u1E1F\u0192",
27350 chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
27353 chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
27359 chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
27362 chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
27365 chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
27368 chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
27374 chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
27377 chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
27383 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",
27398 chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
27401 chars: "\u24E0\uFF51\u024B\uA757\uA759",
27404 chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
27407 chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
27413 chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
27422 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",
27425 chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
27431 chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
27434 chars: "\u24E7\uFF58\u1E8B\u1E8D",
27437 chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
27440 chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
27444 var diacriticsMap = {};
27445 for (var i = 0; i < replacementList.length; i += 1) {
27446 var chars = replacementList[i].chars;
27447 for (var j = 0; j < chars.length; j += 1) {
27448 diacriticsMap[chars[j]] = replacementList[i].base;
27452 function removeDiacritics(str) {
27453 return str.replace(/[^\u0000-\u007e]/g, function(c) {
27454 return diacriticsMap[c] || c;
27458 // see https://github.com/openstreetmap/iD/pull/3707
27459 // https://gist.github.com/mapmeld/556b09ddec07a2044c76e1ef45f01c60
27462 // madda above alef
27463 1570: { initial: 'آ', isolated: 'ﺁ', medial: 'ﺁ', final: 'ﺂ' },
27465 // hamza above and below alef
27466 1571: { initial: 'أ', isolated: 'ﺃ', medial: '', final: 'ﺄ' },
27468 1573: { initial: 'إ', isolated: 'ﺇ', medial: '', final: 'ﺈ' },
27470 1575: { initial: 'ا', isolated: 'ا', medial: '', final: 'ﺎ' },
27471 1576: { initial: 'ﺑ', isolated: 'ﺏ', medial: 'ﺒ', final: 'ﺐ' },
27474 1577: { initial: '', isolated: 'ة', medial: '', final: 'ﺔ' },
27476 1578: { initial: 'ﺗ', isolated: 'ﺕ', medial: 'ﺘ', final: 'ﺖ' },
27477 1579: { initial: 'ﺛ', isolated: 'ﺙ', medial: 'ﺜ', final: 'ﺚ' },
27478 1580: { initial: 'ﺟ', isolated: 'ﺝ', medial: 'ﺠ', final: 'ﺞ' },
27479 1581: { initial: 'ﺣ', isolated: 'ﺡ', medial: 'ﺤ', final: 'ﺢ' },
27480 1582: { initial: 'ﺧ', isolated: 'ﺥ', medial: 'ﺨ', final: 'ﺦ' },
27481 1583: { initial: 'ﺩ', isolated: 'ﺩ', medial: '', final: 'ﺪ' },
27482 1584: { initial: 'ﺫ', isolated: 'ﺫ', medial: '', final: 'ﺬ' },
27483 1585: { initial: 'ﺭ', isolated: 'ﺭ', medial: '', final: 'ﺮ' },
27484 1586: { initial: 'ﺯ', isolated: 'ﺯ', medial: '', final: 'ﺰ' },
27485 1688: { initial: 'ﮊ', isolated: 'ﮊ', medial: '', final: 'ﮋ' },
27486 1587: { initial: 'ﺳ', isolated: 'ﺱ', medial: 'ﺴ', final: 'ﺲ' },
27487 1588: { initial: 'ﺷ', isolated: 'ﺵ', medial: 'ﺸ', final: 'ﺶ' },
27488 1589: { initial: 'ﺻ', isolated: 'ﺹ', medial: 'ﺼ', final: 'ﺺ' },
27489 1590: { initial: 'ﺿ', isolated: 'ﺽ', medial: 'ﻀ', final: 'ﺾ' },
27490 1591: { initial: 'ﻃ', isolated: 'ﻁ', medial: 'ﻄ', final: 'ﻂ' },
27491 1592: { initial: 'ﻇ', isolated: 'ﻅ', medial: 'ﻈ', final: 'ﻆ' },
27492 1593: { initial: 'ﻋ', isolated: 'ﻉ', medial: 'ﻌ', final: 'ﻊ' },
27493 1594: { initial: 'ﻏ', isolated: 'ﻍ', medial: 'ﻐ', final: 'ﻎ' },
27495 // 1595 ػ - may be very rare
27497 1601: { initial: 'ﻓ', isolated: 'ﻑ', medial: 'ﻔ', final: 'ﻒ' },
27498 1602: { initial: 'ﻗ', isolated: 'ﻕ', medial: 'ﻘ', final: 'ﻖ' },
27499 1604: { initial: 'ﻟ', isolated: 'ﻝ', medial: 'ﻠ', final: 'ﻞ' },
27500 1605: { initial: 'ﻣ', isolated: 'ﻡ', medial: 'ﻤ', final: 'ﻢ' },
27501 1606: { initial: 'ﻧ', isolated: 'ﻥ', medial: 'ﻨ', final: 'ﻦ' },
27502 1607: { initial: 'ﻫ', isolated: 'ﻩ', medial: 'ﻬ', final: 'ﻪ' },
27503 1608: { initial: 'ﻭ', isolated: 'ﻭ', medial: '', final: 'ﻮ' },
27506 1609: { initial: 'ﯨ', isolated: 'ﻯ', medial: 'ﯩ', final: 'ﻰ' },
27508 1610: { initial: 'ﻳ', isolated: 'ﻱ', medial: 'ﻴ', final: 'ﻲ' },
27510 // short vowel sounds / tashkil markings
27512 1662: { initial: 'ﭘ', isolated: 'ﭖ', medial: 'ﭙ', final: 'ﭗ' },
27514 1670: { initial: 'ﭼ', isolated: 'ﭺ', medial: 'ﭽ', final: 'ﭻ' },
27515 1603: { initial: 'ﻛ', isolated: 'ﻙ', medial: 'ﻜ', final: 'ﻚ' },
27516 1705: { initial: 'ﻛ', isolated: 'ﮎ', medial: 'ﻜ', final: 'ﮏ' },
27517 1711: { initial: 'ﮔ', isolated: 'ﮒ', medial: 'ﮕ', final: 'ﮓ' },
27518 1740: { initial: 'ﻳ', isolated: 'ﻯ', medial: 'ﻴ', final: 'ﻰ' },
27519 5000: { initial: 'ﻻ', isolated: 'ﻻ', medial: '', final: 'ﻼ' }
27522 var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
27524 function fixRTLTextForSvg(inputText) {
27525 var context = true;
27527 var rtlBuffer = [];
27528 var arabicRegex = /[\u0600-\u06FF]/g;
27529 var arabicTashkil = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/;
27530 var thaanaVowel = /[\u07A6-\u07B0]/;
27531 var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
27533 if (!arabicRegex.test(inputText)) {
27534 // Hebrew or Thaana RTL script
27535 for (var n = 0; n < inputText.length; n++) {
27536 var c = inputText[n];
27537 if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
27538 rtlBuffer[rtlBuffer.length - 1] += c;
27539 } else if (rtlRegex.test(c)) {
27541 } else if (c === ' ' && rtlBuffer.length) {
27542 // whitespace within RTL text
27543 rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
27545 // non-RTL character
27546 ret += rtlBuffer.reverse().join('') + c;
27551 for (var i = 0, l = inputText.length; i < l; i++) {
27552 var code = inputText[i].charCodeAt(0);
27553 var nextCode = inputText[i + 1] ? inputText[i + 1].charCodeAt(0) : 0;
27555 if (!chars$1[code]) {
27556 if (code === 32 && rtlBuffer.length) {
27558 rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
27559 } else if (arabicTashkil.test(inputText[i]) && rtlBuffer.length) {
27561 rtlBuffer[rtlBuffer.length - 1] += inputText[i];
27563 // non-RTL character
27564 ret += rtlBuffer.reverse().join('') + inputText[i];
27570 if (i === l - 1 || nextCode === 32) {
27571 rtlBuffer.push(chars$1[code].isolated);
27573 // special case for لا
27574 if (code === 1604 && nextCode === 1575) {
27575 rtlBuffer.push(chars$1[5000].initial);
27580 rtlBuffer.push(chars$1[code].initial);
27583 if (i === l - 1 || nextCode === 32){
27584 rtlBuffer.push(chars$1[code].final);
27586 // special case for ﻼ
27587 if (code === 1604 && nextCode === 1575){
27588 rtlBuffer.push(chars$1[5000].final);
27593 if (chars$1[code].medial === ''){
27594 rtlBuffer.push(chars$1[code].final);
27596 rtlBuffer.push(chars$1[code].medial);
27600 context = (chars$1[code].medial === '') || nextCode === 32;
27603 ret += rtlBuffer.reverse().join('');
27607 function utilTagText(entity) {
27608 return map$3(entity.tags, function(v, k) {
27609 return k + '=' + v;
27614 function utilEntitySelector(ids) {
27615 return ids.length ? '.' + ids.join(',.') : 'nothing';
27619 function utilEntityOrMemberSelector(ids, graph) {
27620 var s = utilEntitySelector(ids);
27622 ids.forEach(function(id) {
27623 var entity = graph.hasEntity(id);
27624 if (entity && entity.type === 'relation') {
27625 entity.members.forEach(function(member) {
27626 s += ',.' + member.id;
27635 function utilGetAllNodes(ids, graph) {
27638 ids.forEach(getNodes);
27641 function getNodes(id) {
27642 if (seen[id]) return;
27645 var entity = graph.hasEntity(id);
27646 if (!entity) return;
27648 if (entity.type === 'node') {
27649 nodes.push(entity);
27650 } else if (entity.type === 'way') {
27651 entity.nodes.forEach(getNodes);
27653 entity.members.map(function(member) { return member.id; }).forEach(getNodes);
27659 function utilDisplayName(entity) {
27660 var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0],
27661 name = entity.tags[localizedNameKey] || entity.tags.name || '',
27662 network = entity.tags.cycle_network || entity.tags.network;
27664 if (!name && entity.tags.ref) {
27665 name = entity.tags.ref;
27667 name = network + ' ' + name;
27675 function utilDisplayNameForPath(entity) {
27676 var name = utilDisplayName(entity);
27677 var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
27679 if (!isFirefox && name && rtlRegex.test(name)) {
27680 name = fixRTLTextForSvg(name);
27687 function utilDisplayType(id) {
27689 n: t('inspector.node'),
27690 w: t('inspector.way'),
27691 r: t('inspector.relation')
27696 function utilStringQs(str) {
27697 return str.split('&').reduce(function(obj, pair){
27698 var parts = pair.split('=');
27699 if (parts.length === 2) {
27700 obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
27707 function utilQsString(obj, noencode) {
27708 function softEncode(s) {
27709 // encode everything except special characters used in certain hash parameters:
27710 // "/" in map states, ":", ",", {" and "}" in background
27711 return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
27713 return Object.keys(obj).sort().map(function(key) {
27714 return encodeURIComponent(key) + '=' + (
27715 noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
27720 function utilPrefixDOMProperty(property) {
27721 var prefixes = ['webkit', 'ms', 'moz', 'o'],
27723 n = prefixes.length,
27729 property = property.substr(0, 1).toUpperCase() + property.substr(1);
27732 if (prefixes[i] + property in s)
27733 return prefixes[i] + property;
27739 function utilPrefixCSSProperty(property) {
27740 var prefixes = ['webkit', 'ms', 'Moz', 'O'],
27742 n = prefixes.length,
27743 s = document.body.style;
27745 if (property.toLowerCase() in s)
27746 return property.toLowerCase();
27749 if (prefixes[i] + property in s)
27750 return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
27756 var transformProperty;
27757 function utilSetTransform(el, x, y, scale) {
27758 var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform'),
27759 translate = utilDetect().opera ?
27760 'translate(' + x + 'px,' + y + 'px)' :
27761 'translate3d(' + x + 'px,' + y + 'px,0)';
27762 return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
27766 // Calculates Levenshtein distance between two strings
27767 // see: https://en.wikipedia.org/wiki/Levenshtein_distance
27768 // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
27769 function utilEditDistance(a, b) {
27770 a = remove$1(a.toLowerCase());
27771 b = remove$1(b.toLowerCase());
27772 if (a.length === 0) return b.length;
27773 if (b.length === 0) return a.length;
27775 for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
27776 for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
27777 for (i = 1; i <= b.length; i++) {
27778 for (j = 1; j <= a.length; j++) {
27779 if (b.charAt(i-1) === a.charAt(j-1)) {
27780 matrix[i][j] = matrix[i-1][j-1];
27782 matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
27783 Math.min(matrix[i][j-1] + 1, // insertion
27784 matrix[i-1][j] + 1)); // deletion
27788 return matrix[b.length][a.length];
27792 // a d3.mouse-alike which
27793 // 1. Only works on HTML elements, not SVG
27794 // 2. Does not cause style recalculation
27795 function utilFastMouse(container) {
27796 var rect = container.getBoundingClientRect(),
27797 rectLeft = rect.left,
27798 rectTop = rect.top,
27799 clientLeft = +container.clientLeft,
27800 clientTop = +container.clientTop;
27801 if (textDirection === 'rtl') {
27804 return function(e) {
27806 e.clientX - rectLeft - clientLeft,
27807 e.clientY - rectTop - clientTop];
27812 /* eslint-disable no-proto */
27813 var utilGetPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
27814 /* eslint-enable no-proto */
27817 function utilAsyncMap(inputs, func, callback) {
27818 var remaining = inputs.length,
27822 inputs.forEach(function(d, i) {
27823 func(d, function done(err, data) {
27827 if (!remaining) callback(errors, results);
27833 // wraps an index to an interval [0..length-1]
27834 function utilWrap(index, length) {
27836 index += Math.ceil(-index/length)*length;
27837 return index % length;
27842 * a replacement for functor
27844 * @param {*} value any value
27845 * @returns {Function} a function that returns that value or the value if it's a function
27847 function utilFunctor(value) {
27848 if (typeof value === 'function') return value;
27849 return function() {
27855 function utilNoAuto(selection) {
27856 var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
27859 .attr('autocomplete', 'off')
27860 .attr('autocorrect', 'off')
27861 .attr('autocapitalize', 'off')
27862 .attr('spellcheck', isText ? 'true' : 'false');
27865 // note the function should be of low priority
27866 // and should not be returning a value.
27867 function utilCallWhenIdle(func, timeout) {
27868 return function() {
27869 var args = arguments;
27871 window.requestIdleCallback(function() {
27872 func.apply(that, args);
27873 }, {timeout: timeout});
27877 function utilCleanTags(tags) {
27879 for (var k in tags) {
27882 if (v !== undefined) {
27883 out[k] = cleanValue(k, v);
27890 function cleanValue(k, v) {
27891 function keepSpaces(k) {
27892 return /_hours|_times|:conditional$/.test(k);
27896 return /^(description|note|fixme)$/.test(k);
27899 if (skip(k)) return v;
27903 .map(function(s) { return s.trim(); })
27904 .join(keepSpaces(k) ? '; ' : ';');
27906 // The code below is not intended to validate websites and emails.
27907 // It is only intended to prevent obvious copy-paste errors. (#2323)
27908 // clean website- and email-like tags
27909 if (k.indexOf('website') !== -1 ||
27910 k.indexOf('email') !== -1 ||
27911 cleaned.indexOf('http') === 0) {
27913 .replace(/[\u200B-\u200F\uFEFF]/g, ''); // strip LRM and other zero width chars
27921 // Like selection.property('value', ...), but avoids no-op value sets,
27922 // which can result in layout/repaint thrashing in some situations.
27923 function utilGetSetValue(selection, value) {
27924 function d3_selection_value(value) {
27925 function valueNull() {
27929 function valueConstant() {
27930 if (this.value !== value) {
27931 this.value = value;
27935 function valueFunction() {
27936 var x = value.apply(this, arguments);
27939 } else if (this.value !== x) {
27944 return value == null
27945 ? valueNull : (typeof value === 'function'
27946 ? valueFunction : valueConstant);
27949 if (arguments.length === 1) {
27950 return selection.property('value');
27953 return selection.each(d3_selection_value(value));
27956 function utilIdleWorker(tasks, processor, callback) {
27957 var results = [], result;
27958 for (var i = 0; i < tasks.length; i++) {
27959 result = processor(tasks[i]);
27960 if (result) results.push(result);
27964 // var processed = [];
27965 // var currentPos = 0;
27966 // var totalTasks = tasks.length;
27968 // function worker(deadline) {
27969 // while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
27970 // var result = processor(tasks[currentPos]);
27972 // // if falsy dont add to the processed list
27973 // if (result) processed.push(result);
27977 // // more tasks are left, we might need more idleCallbacks
27978 // if (currentPos < totalTasks) {
27979 // return window.requestIdleCallback(function(deadline) {worker(deadline);});
27982 // // tasks are completed
27983 // return callback(processed);
27986 // window.requestIdleCallback(function(deadline) {worker(deadline);});
27990 window.requestIdleCallback =
27991 window.requestIdleCallback ||
27993 var start = Date.now();
27994 return setTimeout(function() {
27997 timeRemaining: function() {
27998 return Math.max(0, 50 - (Date.now() - start));
28004 window.cancelIdleCallback =
28005 window.cancelIdleCallback ||
28010 // Copies a variable number of methods from source to target.
28011 function utilRebind(target, source) {
28012 var i = 1, n = arguments.length, method;
28014 target[method = arguments[i]] = d3_rebind(target, source, source[method]);
28019 // Method is assumed to be a standard D3 getter-setter:
28020 // If passed with no arguments, gets the value.
28021 // If passed with arguments, sets the value and returns the target.
28022 function d3_rebind(target, source, method) {
28023 return function() {
28024 var value = method.apply(source, arguments);
28025 return value === source ? target : value;
28029 // A per-domain session mutex backed by a cookie and dead man's
28030 // switch. If the session crashes, the mutex will auto-release
28031 // after 5 seconds.
28033 // This accepts a string and returns an object that complies with utilSessionMutexType
28034 function utilSessionMutex(name) {
28039 var expires = new Date();
28040 expires.setSeconds(expires.getSeconds() + 5);
28041 document.cookie = name + '=1; expires=' + expires.toUTCString();
28044 mutex.lock = function () {
28045 if (intervalID) return true;
28046 var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
28047 if (cookie) return false;
28049 intervalID = window.setInterval(renew, 4000);
28053 mutex.unlock = function () {
28054 if (!intervalID) return;
28055 document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
28056 clearInterval(intervalID);
28060 mutex.locked = function () {
28061 return !!intervalID;
28067 function utilSuggestNames(preset, suggestions) {
28068 preset = preset.id.split('/', 2);
28072 return function(value, callback) {
28074 if (value && value.length > 2) {
28075 if (suggestions[k] && suggestions[k][v]) {
28076 for (var sugg in suggestions[k][v]) {
28077 var dist = utilEditDistance(value, sugg.substring(0, value.length));
28087 result.sort(function(a, b) {
28088 return a.dist - b.dist;
28091 result = result.slice(0,3);
28096 function utilTriggerEvent(target, type) {
28097 target.each(function() {
28098 var evt = document.createEvent('HTMLEvents');
28099 evt.initEvent(type, true, true);
28100 this.dispatchEvent(evt);
28104 function validationDeprecatedTag() {
28106 var validation = function(changes) {
28108 for (var i = 0; i < changes.created.length; i++) {
28109 var change = changes.created[i],
28110 deprecatedTags = change.deprecatedTags();
28112 if (!isEmpty(deprecatedTags)) {
28113 var tags = utilTagText({ tags: deprecatedTags });
28115 id: 'deprecated_tags',
28116 message: t('validations.deprecated_tags', { tags: tags }),
28129 function validationDisconnectedHighway() {
28131 function isDisconnectedHighway(entity, graph) {
28132 if (!entity.tags.highway) return false;
28133 if (entity.geometry(graph) !== 'line') return false;
28135 return graph.childNodes(entity)
28136 .every(function(vertex) {
28137 var parents = graph.parentWays(vertex);
28138 if (parents.length === 1) { // standalone vertex
28140 } else { // shared vertex
28141 return !vertex.tags.entrance &&
28142 parents.filter(function(parent) {
28143 return parent.tags.highway && parent !== entity;
28150 var validation = function(changes, graph) {
28152 for (var i = 0; i < changes.created.length; i++) {
28153 var entity = changes.created[i];
28155 if (isDisconnectedHighway(entity, graph)) {
28157 id: 'disconnected_highway',
28158 message: t('validations.disconnected_highway'),
28159 tooltip: t('validations.disconnected_highway_tooltip'),
28172 function validationManyDeletions() {
28173 var threshold = 100;
28175 var validation = function(changes, graph) {
28177 var nodes=0, ways=0, areas=0, relations=0;
28179 changes.deleted.forEach(function(c) {
28180 if (c.type === 'node') {nodes++;}
28181 else if (c.type === 'way' && c.geometry(graph) === 'line') {ways++;}
28182 else if (c.type === 'way' && c.geometry(graph) === 'area') {areas++;}
28183 else if (c.type === 'relation') {relations++;}
28185 if (changes.deleted.length > threshold) {
28187 id: 'many_deletions',
28188 message: t('validations.many_deletions',
28189 { n: changes.deleted.length, p: nodes, l: ways, a:areas, r: relations })
28200 function validationMissingTag() {
28202 // Slightly stricter check than Entity#isUsed (#3091)
28203 function hasTags(entity, graph) {
28204 return without(Object.keys(entity.tags), 'area', 'name').length > 0 ||
28205 graph.parentRelations(entity).length > 0;
28208 var validation = function(changes, graph) {
28209 var types = ['point', 'line', 'area', 'relation'],
28212 for (var i = 0; i < changes.created.length; i++) {
28213 var change = changes.created[i],
28214 geometry = change.geometry(graph);
28216 if (types.indexOf(geometry) !== -1 && !hasTags(change, graph)) {
28219 message: t('validations.untagged_' + geometry),
28220 tooltip: t('validations.untagged_' + geometry + '_tooltip'),
28233 function validationOldMultipolygon() {
28235 return function validation(changes, graph) {
28237 for (var i = 0; i < changes.created.length; i++) {
28238 var entity = changes.created[i];
28239 var parent = osmIsSimpleMultipolygonOuterMember(entity, graph);
28242 id: 'old_multipolygon',
28243 message: t('validations.old_multipolygon'),
28244 tooltip: t('validations.old_multipolygon_tooltip'),
28253 // https://github.com/openstreetmap/josm/blob/mirror/src/org/
28254 // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
28255 function validationTagSuggestsArea() {
28257 function tagSuggestsArea(tags) {
28258 if (isEmpty(tags)) return false;
28260 var presence = ['landuse', 'amenities', 'tourism', 'shop'];
28261 for (var i = 0; i < presence.length; i++) {
28262 if (tags[presence[i]] !== undefined) {
28263 return presence[i] + '=' + tags[presence[i]];
28267 if (tags.building && tags.building === 'yes') return 'building=yes';
28271 var validation = function(changes, graph) {
28273 for (var i = 0; i < changes.created.length; i++) {
28274 var change = changes.created[i],
28275 geometry = change.geometry(graph),
28276 suggestion = (geometry === 'line' ? tagSuggestsArea(change.tags) : undefined);
28280 id: 'tag_suggests_area',
28281 message: t('validations.tag_suggests_area', { tag: suggestion }),
28296 var Validations = /*#__PURE__*/Object.freeze({
28297 validationDeprecatedTag: validationDeprecatedTag,
28298 validationDisconnectedHighway: validationDisconnectedHighway,
28299 validationManyDeletions: validationManyDeletions,
28300 validationMissingTag: validationMissingTag,
28301 validationOldMultipolygon: validationOldMultipolygon,
28302 validationTagSuggestsArea: validationTagSuggestsArea
28306 * Performs a deep comparison between two values to determine if they are
28309 * **Note:** This method supports comparing arrays, array buffers, booleans,
28310 * date objects, error objects, maps, numbers, `Object` objects, regexes,
28311 * sets, strings, symbols, and typed arrays. `Object` objects are compared
28312 * by their own, not inherited, enumerable properties. Functions and DOM
28313 * nodes are compared by strict equality, i.e. `===`.
28319 * @param {*} value The value to compare.
28320 * @param {*} other The other value to compare.
28321 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
28324 * var object = { 'a': 1 };
28325 * var other = { 'a': 1 };
28327 * _.isEqual(object, other);
28330 * object === other;
28333 function isEqual(value, other) {
28334 return baseIsEqual(value, other);
28338 iD.Difference represents the difference between two graphs.
28339 It knows how to calculate the set of entities that were
28340 created, modified, or deleted, and also contains the logic
28341 for recursively extending a difference to the complete set
28342 of entities that will require a redraw, taking into account
28343 child and parent relationships.
28345 function coreDifference(base, head) {
28349 var i, k, h, b, keys;
28351 function changed(h, b) {
28352 if (h === b) return false;
28353 if (!h || !b) return true;
28355 if (h.loc || b.loc) {
28356 if (!h.loc && b.loc || h.loc && !b.loc ||
28357 h.loc[0] !== b.loc[0] || h.loc[1] !== b.loc[1]) return true;
28359 if (h.nodes || b.nodes) {
28360 if (!isEqual(h.nodes, b.nodes)) return true;
28362 if (h.members || b.members) {
28363 if (!isEqual(h.members, b.members)) return true;
28365 return !isEqual(h.tags, b.tags);
28369 keys = Object.keys(head.entities);
28370 for (i = 0; i < keys.length; i++) {
28372 h = head.entities[k];
28373 b = base.entities[k];
28374 if (changed(h, b)) {
28375 _changes[k] = {base: b, head: h};
28380 keys = Object.keys(base.entities);
28381 for (i = 0; i < keys.length; i++) {
28383 h = head.entities[k];
28384 b = base.entities[k];
28385 if (!_changes[k] && changed(h, b)) {
28386 _changes[k] = {base: b, head: h};
28392 function addParents(parents, result) {
28393 for (var i = 0; i < parents.length; i++) {
28394 var parent = parents[i];
28396 if (parent.id in result)
28399 result[parent.id] = parent;
28400 addParents(head.parentRelations(parent), result);
28405 _diff.length = function length() {
28410 _diff.changes = function changes() {
28415 _diff.extantIDs = function extantIDs() {
28417 forEach(_changes, function(change, id) {
28418 if (change.head) result.push(id);
28424 _diff.modified = function modified() {
28426 forEach(_changes, function(change) {
28427 if (change.base && change.head) result.push(change.head);
28433 _diff.created = function created() {
28435 forEach(_changes, function(change) {
28436 if (!change.base && change.head) result.push(change.head);
28442 _diff.deleted = function deleted() {
28444 forEach(_changes, function(change) {
28445 if (change.base && !change.head) result.push(change.base);
28451 _diff.summary = function summary() {
28454 function addEntity(entity, graph, changeType) {
28455 relevant[entity.id] = {
28458 changeType: changeType
28462 function addParents(entity) {
28463 var parents = head.parentWays(entity);
28464 for (var j = parents.length - 1; j >= 0; j--) {
28465 var parent = parents[j];
28466 if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
28470 var keys = Object.keys(_changes);
28471 for (var i = 0; i < keys.length; i++) {
28472 var change = _changes[keys[i]];
28474 if (change.head && change.head.geometry(head) !== 'vertex') {
28475 addEntity(change.head, head, change.base ? 'modified' : 'created');
28477 } else if (change.base && change.base.geometry(base) !== 'vertex') {
28478 addEntity(change.base, base, 'deleted');
28480 } else if (change.base && change.head) { // modified vertex
28481 var moved = !isEqual(change.base.loc, change.head.loc);
28482 var retagged = !isEqual(change.base.tags, change.head.tags);
28485 addParents(change.head);
28488 if (retagged || (moved && change.head.hasInterestingTags())) {
28489 addEntity(change.head, head, 'modified');
28492 } else if (change.head && change.head.hasInterestingTags()) { // created vertex
28493 addEntity(change.head, head, 'created');
28495 } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
28496 addEntity(change.base, base, 'deleted');
28500 return values$1(relevant);
28504 _diff.complete = function complete(extent) {
28508 for (id in _changes) {
28509 change = _changes[id];
28511 var h = change.head;
28512 var b = change.base;
28513 var entity = h || b;
28516 (!h || !h.intersects(extent, head)) &&
28517 (!b || !b.intersects(extent, base)))
28522 if (entity.type === 'way') {
28523 var nh = h ? h.nodes : [];
28524 var nb = b ? b.nodes : [];
28527 diff = difference(nh, nb);
28528 for (i = 0; i < diff.length; i++) {
28529 result[diff[i]] = head.hasEntity(diff[i]);
28532 diff = difference(nb, nh);
28533 for (i = 0; i < diff.length; i++) {
28534 result[diff[i]] = head.hasEntity(diff[i]);
28538 addParents(head.parentWays(entity), result);
28539 addParents(head.parentRelations(entity), result);
28549 /** Used for built-in method references. */
28550 var objectProto$i = Object.prototype;
28552 /** Used to check objects for own properties. */
28553 var hasOwnProperty$f = objectProto$i.hasOwnProperty;
28556 * Assigns own enumerable string keyed properties of source objects to the
28557 * destination object. Source objects are applied from left to right.
28558 * Subsequent sources overwrite property assignments of previous sources.
28560 * **Note:** This method mutates `object` and is loosely based on
28561 * [`Object.assign`](https://mdn.io/Object/assign).
28567 * @param {Object} object The destination object.
28568 * @param {...Object} [sources] The source objects.
28569 * @returns {Object} Returns `object`.
28581 * Foo.prototype.b = 2;
28582 * Bar.prototype.d = 4;
28584 * _.assign({ 'a': 0 }, new Foo, new Bar);
28585 * // => { 'a': 1, 'c': 3 }
28587 var assign = createAssigner(function(object, source) {
28588 if (isPrototype(source) || isArrayLike(source)) {
28589 copyObject(source, keys$1(source), object);
28592 for (var key in source) {
28593 if (hasOwnProperty$f.call(source, key)) {
28594 assignValue(object, key, source[key]);
28599 /* Built-in method references for those with the same name as other `lodash` methods. */
28600 var nativeMax$3 = Math.max;
28603 * Checks if `value` is in `collection`. If `collection` is a string, it's
28604 * checked for a substring of `value`, otherwise
28605 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
28606 * is used for equality comparisons. If `fromIndex` is negative, it's used as
28607 * the offset from the end of `collection`.
28612 * @category Collection
28613 * @param {Array|Object|string} collection The collection to inspect.
28614 * @param {*} value The value to search for.
28615 * @param {number} [fromIndex=0] The index to search from.
28616 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
28617 * @returns {boolean} Returns `true` if `value` is found, else `false`.
28620 * _.includes([1, 2, 3], 1);
28623 * _.includes([1, 2, 3], 1, 2);
28626 * _.includes({ 'a': 1, 'b': 2 }, 1);
28629 * _.includes('abcd', 'bc');
28632 function includes(collection, value, fromIndex, guard) {
28633 collection = isArrayLike(collection) ? collection : values$1(collection);
28634 fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
28636 var length = collection.length;
28637 if (fromIndex < 0) {
28638 fromIndex = nativeMax$3(length + fromIndex, 0);
28640 return isString(collection)
28641 ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
28642 : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
28645 function coreGraph$$1(other, mutable) {
28646 if (!(this instanceof coreGraph$$1)) return new coreGraph$$1(other, mutable);
28648 if (other instanceof coreGraph$$1) {
28649 var base = other.base();
28650 this.entities = assign(Object.create(base.entities), other.entities);
28651 this._parentWays = assign(Object.create(base.parentWays), other._parentWays);
28652 this._parentRels = assign(Object.create(base.parentRels), other._parentRels);
28655 this.entities = Object.create({});
28656 this._parentWays = Object.create({});
28657 this._parentRels = Object.create({});
28658 this.rebase(other || [], [this]);
28661 this.transients = {};
28662 this._childNodes = {};
28663 this.frozen = !mutable;
28667 coreGraph$$1.prototype = {
28669 hasEntity: function(id) {
28670 return this.entities[id];
28674 entity: function(id) {
28675 var entity = this.entities[id];
28677 //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
28679 entity = this.entities.__proto__[id]; // eslint-disable-line no-proto
28683 throw new Error('entity ' + id + ' not found');
28689 transient: function(entity, key, fn) {
28690 var id = entity.id,
28691 transients = this.transients[id] ||
28692 (this.transients[id] = {});
28694 if (transients[key] !== undefined) {
28695 return transients[key];
28698 transients[key] = fn.call(entity);
28700 return transients[key];
28704 parentWays: function(entity) {
28705 var parents = this._parentWays[entity.id],
28709 for (var i = 0; i < parents.length; i++) {
28710 result.push(this.entity(parents[i]));
28717 isPoi: function(entity) {
28718 var parentWays = this._parentWays[entity.id];
28719 return !parentWays || parentWays.length === 0;
28723 isShared: function(entity) {
28724 var parentWays = this._parentWays[entity.id];
28725 return parentWays && parentWays.length > 1;
28729 parentRelations: function(entity) {
28730 var parents = this._parentRels[entity.id],
28734 for (var i = 0; i < parents.length; i++) {
28735 result.push(this.entity(parents[i]));
28742 childNodes: function(entity) {
28743 if (this._childNodes[entity.id]) return this._childNodes[entity.id];
28744 if (!entity.nodes) return [];
28747 for (var i = 0; i < entity.nodes.length; i++) {
28748 nodes[i] = this.entity(entity.nodes[i]);
28751 this._childNodes[entity.id] = nodes;
28752 return this._childNodes[entity.id];
28758 'entities': utilGetPrototypeOf(this.entities),
28759 'parentWays': utilGetPrototypeOf(this._parentWays),
28760 'parentRels': utilGetPrototypeOf(this._parentRels)
28765 // Unlike other graph methods, rebase mutates in place. This is because it
28766 // is used only during the history operation that merges newly downloaded
28767 // data into each state. To external consumers, it should appear as if the
28768 // graph always contained the newly downloaded data.
28769 rebase: function(entities, stack, force) {
28770 var base = this.base(),
28773 for (i = 0; i < entities.length; i++) {
28774 var entity = entities[i];
28776 if (!entity.visible || (!force && base.entities[entity.id]))
28779 // Merging data into the base graph
28780 base.entities[entity.id] = entity;
28781 this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
28783 // Restore provisionally-deleted nodes that are discovered to have an extant parent
28784 if (entity.type === 'way') {
28785 for (j = 0; j < entity.nodes.length; j++) {
28786 id = entity.nodes[j];
28787 for (k = 1; k < stack.length; k++) {
28788 var ents = stack[k].entities;
28789 if (ents.hasOwnProperty(id) && ents[id] === undefined) {
28797 for (i = 0; i < stack.length; i++) {
28798 stack[i]._updateRebased();
28803 _updateRebased: function() {
28804 var base = this.base(),
28805 i, k, child, id, keys;
28807 keys = Object.keys(this._parentWays);
28808 for (i = 0; i < keys.length; i++) {
28810 if (base.parentWays[child]) {
28811 for (k = 0; k < base.parentWays[child].length; k++) {
28812 id = base.parentWays[child][k];
28813 if (!this.entities.hasOwnProperty(id) && !includes(this._parentWays[child], id)) {
28814 this._parentWays[child].push(id);
28820 keys = Object.keys(this._parentRels);
28821 for (i = 0; i < keys.length; i++) {
28823 if (base.parentRels[child]) {
28824 for (k = 0; k < base.parentRels[child].length; k++) {
28825 id = base.parentRels[child][k];
28826 if (!this.entities.hasOwnProperty(id) && !includes(this._parentRels[child], id)) {
28827 this._parentRels[child].push(id);
28833 this.transients = {};
28835 // this._childNodes is not updated, under the assumption that
28836 // ways are always downloaded with their child nodes.
28840 // Updates calculated properties (parentWays, parentRels) for the specified change
28841 _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
28843 parentWays = parentWays || this._parentWays;
28844 parentRels = parentRels || this._parentRels;
28846 var type = entity && entity.type || oldentity && oldentity.type,
28847 removed, added, ways, rels, i;
28850 if (type === 'way') {
28852 // Update parentWays
28853 if (oldentity && entity) {
28854 removed = difference(oldentity.nodes, entity.nodes);
28855 added = difference(entity.nodes, oldentity.nodes);
28856 } else if (oldentity) {
28857 removed = oldentity.nodes;
28859 } else if (entity) {
28861 added = entity.nodes;
28863 for (i = 0; i < removed.length; i++) {
28864 parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
28866 for (i = 0; i < added.length; i++) {
28867 ways = without(parentWays[added[i]], entity.id);
28868 ways.push(entity.id);
28869 parentWays[added[i]] = ways;
28872 } else if (type === 'relation') {
28874 // Update parentRels
28875 if (oldentity && entity) {
28876 removed = difference(oldentity.members, entity.members);
28877 added = difference(entity.members, oldentity);
28878 } else if (oldentity) {
28879 removed = oldentity.members;
28881 } else if (entity) {
28883 added = entity.members;
28885 for (i = 0; i < removed.length; i++) {
28886 parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
28888 for (i = 0; i < added.length; i++) {
28889 rels = without(parentRels[added[i].id], entity.id);
28890 rels.push(entity.id);
28891 parentRels[added[i].id] = rels;
28897 replace: function(entity) {
28898 if (this.entities[entity.id] === entity)
28901 return this.update(function() {
28902 this._updateCalculated(this.entities[entity.id], entity);
28903 this.entities[entity.id] = entity;
28908 remove: function(entity) {
28909 return this.update(function() {
28910 this._updateCalculated(entity, undefined);
28911 this.entities[entity.id] = undefined;
28916 revert: function(id) {
28917 var baseEntity = this.base().entities[id],
28918 headEntity = this.entities[id];
28920 if (headEntity === baseEntity)
28923 return this.update(function() {
28924 this._updateCalculated(headEntity, baseEntity);
28925 delete this.entities[id];
28930 update: function() {
28931 var graph = this.frozen ? coreGraph$$1(this, true) : this;
28933 for (var i = 0; i < arguments.length; i++) {
28934 arguments[i].call(graph, graph);
28937 if (this.frozen) graph.frozen = true;
28943 // Obliterates any existing entities
28944 load: function(entities) {
28945 var base = this.base();
28946 this.entities = Object.create(base.entities);
28948 for (var i in entities) {
28949 this.entities[i] = entities[i];
28950 this._updateCalculated(base.entities[i], this.entities[i]);
28957 function coreTree(head) {
28958 var rtree = rbush_1(),
28963 function entityBBox(entity) {
28964 var bbox = entity.extent(head).bbox();
28965 bbox.id = entity.id;
28966 bboxes[entity.id] = bbox;
28971 function updateParents(entity, insertions, memo) {
28972 head.parentWays(entity).forEach(function(way) {
28973 if (bboxes[way.id]) {
28974 rtree.remove(bboxes[way.id]);
28975 insertions[way.id] = way;
28977 updateParents(way, insertions, memo);
28980 head.parentRelations(entity).forEach(function(relation) {
28981 if (memo[entity.id]) return;
28982 memo[entity.id] = true;
28983 if (bboxes[relation.id]) {
28984 rtree.remove(bboxes[relation.id]);
28985 insertions[relation.id] = relation;
28987 updateParents(relation, insertions, memo);
28992 tree.rebase = function(entities, force) {
28993 var insertions = {};
28995 for (var i = 0; i < entities.length; i++) {
28996 var entity = entities[i];
28998 if (!entity.visible)
29001 if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
29004 } else if (bboxes[entity.id]) {
29005 rtree.remove(bboxes[entity.id]);
29009 insertions[entity.id] = entity;
29010 updateParents(entity, insertions, {});
29013 rtree.load(map$3(insertions, entityBBox));
29019 tree.intersects = function(extent, graph) {
29020 if (graph !== head) {
29021 var diff = coreDifference(head, graph),
29026 diff.deleted().forEach(function(entity) {
29027 rtree.remove(bboxes[entity.id]);
29028 delete bboxes[entity.id];
29031 diff.modified().forEach(function(entity) {
29032 rtree.remove(bboxes[entity.id]);
29033 insertions[entity.id] = entity;
29034 updateParents(entity, insertions, {});
29037 diff.created().forEach(function(entity) {
29038 insertions[entity.id] = entity;
29041 rtree.load(map$3(insertions, entityBBox));
29044 return rtree.search(extent.bbox()).map(function(bbox) {
29045 return head.entity(bbox.id);
29054 * This code is licensed under the MIT license.
29056 * Copyright © 2013, iD authors.
29058 * Portions copyright © 2011, Keith Cirkel
29059 * See https://github.com/keithamus/jwerty
29062 function d3keybinding(namespace$$1) {
29066 function testBindings(isCapturing) {
29067 var didMatch = false,
29070 // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
29071 // so we don't strictly match on the shift key, but we prioritize
29072 // shifted bindings first, and fallback to unshifted only if no match.
29073 // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
29075 // priority match shifted bindings first
29076 for (i = 0; i < bindings.length; i++) {
29077 binding = bindings[i];
29078 if (!binding.event.modifiers.shiftKey) continue; // no shift
29079 if (!!binding.capture !== isCapturing) continue;
29080 if (matches(binding, true)) {
29081 binding.callback();
29086 // then unshifted bindings
29087 if (didMatch) return;
29088 for (i = 0; i < bindings.length; i++) {
29089 binding = bindings[i];
29090 if (binding.event.modifiers.shiftKey) continue; // shift
29091 if (!!binding.capture !== isCapturing) continue;
29092 if (matches(binding, false)) {
29093 binding.callback();
29098 function matches(binding, testShift) {
29099 var event$$1 = event;
29100 var isMatch = false;
29101 var tryKeyCode = true;
29103 // Prefer a match on `KeyboardEvent.key`
29104 if (event$$1.key !== undefined) {
29105 tryKeyCode = (event$$1.key.charCodeAt(0) > 255); // outside ISO-Latin-1
29108 if (binding.event.key === undefined) {
29110 } else if (Array.isArray(binding.event.key)) {
29111 if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$$1.key.toLowerCase()) === -1)
29114 if (event$$1.key.toLowerCase() !== binding.event.key.toLowerCase())
29119 // Fallback match on `KeyboardEvent.keyCode`, can happen if:
29120 // - browser doesn't support `KeyboardEvent.key`
29121 // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
29122 if (!isMatch && tryKeyCode) {
29123 isMatch = (event$$1.keyCode === binding.event.keyCode);
29126 if (!isMatch) return false;
29128 // test modifier keys
29129 if (!(event$$1.ctrlKey && event$$1.altKey)) { // if both are set, assume AltGr and skip it - #4096
29130 if (event$$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
29131 if (event$$1.altKey !== binding.event.modifiers.altKey) return false;
29133 if (event$$1.metaKey !== binding.event.modifiers.metaKey) return false;
29134 if (testShift && event$$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
29141 function capture() {
29142 testBindings(true);
29146 function bubble() {
29147 var tagName = select(event.target).node().tagName;
29148 if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
29151 testBindings(false);
29155 function keybinding(selection$$1) {
29156 selection$$1 = selection$$1 || select(document);
29157 selection$$1.on('keydown.capture' + namespace$$1, capture, true);
29158 selection$$1.on('keydown.bubble' + namespace$$1, bubble, false);
29163 keybinding.off = function(selection$$1) {
29165 selection$$1 = selection$$1 || select(document);
29166 selection$$1.on('keydown.capture' + namespace$$1, null);
29167 selection$$1.on('keydown.bubble' + namespace$$1, null);
29172 keybinding.on = function(codes, callback, capture) {
29173 var arr = [].concat(codes);
29174 for (var i = 0; i < arr.length; i++) {
29178 key: undefined, // preferred
29179 keyCode: 0, // fallback
29191 code = code.toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
29193 for (var j = 0; j < code.length; j++) {
29194 // Normalise matching errors
29195 if (code[j] === '++') code[j] = '+';
29197 if (code[j] in d3keybinding.modifierCodes) {
29198 binding.event.modifiers[d3keybinding.modifierProperties[d3keybinding.modifierCodes[code[j]]]] = true;
29200 binding.event.key = d3keybinding.keys[code[j]] || code[j];
29201 if (code[j] in d3keybinding.keyCodes) {
29202 binding.event.keyCode = d3keybinding.keyCodes[code[j]];
29207 bindings.push(binding);
29217 d3keybinding.modifierCodes = {
29219 '⇧': 16, shift: 16,
29220 // CTRL key, on Mac: ⌃
29222 // ALT key, on Mac: ⌥ (Alt)
29223 '⌥': 18, alt: 18, option: 18,
29224 // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
29225 '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
29228 d3keybinding.modifierProperties = {
29235 d3keybinding.keys = {
29236 // Backspace key, on Mac: ⌫ (Backspace)
29237 '⌫': 'Backspace', backspace: 'Backspace',
29238 // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29239 '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
29241 '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
29243 'pause': 'Pause', 'pause-break': 'Pause',
29244 // Caps Lock key, ⇪
29245 '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
29246 // Escape key, on Mac: ⎋, on Windows: Esc
29247 '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
29249 space: [' ', 'Spacebar'],
29250 // Page-Up key, or pgup, on Mac: ↖
29251 '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
29252 // Page-Down key, or pgdown, on Mac: ↘
29253 '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
29254 // END key, on Mac: ⇟
29255 '⇟': 'End', end: 'End',
29256 // HOME key, on Mac: ⇞
29257 '⇞': 'Home', home: 'Home',
29258 // Insert key, or ins
29259 ins: 'Insert', insert: 'Insert',
29260 // Delete key, on Mac: ⌦ (Delete)
29261 '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
29262 // Left Arrow Key, or ←
29263 '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
29264 // Up Arrow Key, or ↑
29265 '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
29266 // Right Arrow Key, or →
29267 '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
29268 // Up Arrow Key, or ↓
29269 '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
29270 // odities, stuff for backward compatibility (browsers and code):
29271 // Num-Multiply, or *
29272 '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
29274 '+': ['+', 'Add'], 'plus': ['+', 'Add'],
29275 // Num-Subtract, or -
29276 '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
29283 // Period, or ., or full-stop
29284 period: '.', 'full-stop': '.',
29285 // Slash, or /, or forward-slash
29286 slash: '/', 'forward-slash': '/',
29287 // Tick, or `, or back-quote
29288 tick: '`', 'back-quote': '`',
29289 // Open bracket, or [
29290 'open-bracket': '[',
29291 // Back slash, or \
29292 'back-slash': '\\',
29293 // Close backet, or ]
29294 'close-bracket': ']',
29295 // Apostrophe, or Quote, or '
29296 quote: '\'', apostrophe: '\'',
29336 d3keybinding.keyCodes = {
29337 // Backspace key, on Mac: ⌫ (Backspace)
29338 '⌫': 8, backspace: 8,
29339 // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29340 '⇥': 9, '⇆': 9, tab: 9,
29342 '↩': 13, 'return': 13, enter: 13, '⌅': 13,
29344 'pause': 19, 'pause-break': 19,
29345 // Caps Lock key, ⇪
29346 '⇪': 20, caps: 20, 'caps-lock': 20,
29347 // Escape key, on Mac: ⎋, on Windows: Esc
29348 '⎋': 27, escape: 27, esc: 27,
29351 // Page-Up key, or pgup, on Mac: ↖
29352 '↖': 33, pgup: 33, 'page-up': 33,
29353 // Page-Down key, or pgdown, on Mac: ↘
29354 '↘': 34, pgdown: 34, 'page-down': 34,
29355 // END key, on Mac: ⇟
29357 // HOME key, on Mac: ⇞
29359 // Insert key, or ins
29360 ins: 45, insert: 45,
29361 // Delete key, on Mac: ⌦ (Delete)
29362 '⌦': 46, del: 46, 'delete': 46,
29363 // Left Arrow Key, or ←
29364 '←': 37, left: 37, 'arrow-left': 37,
29365 // Up Arrow Key, or ↑
29366 '↑': 38, up: 38, 'arrow-up': 38,
29367 // Right Arrow Key, or →
29368 '→': 39, right: 39, 'arrow-right': 39,
29369 // Up Arrow Key, or ↓
29370 '↓': 40, down: 40, 'arrow-down': 40,
29371 // odities, printing characters that come out wrong:
29374 // Num-Multiply, or *
29375 '*': 106, star: 106, asterisk: 106, multiply: 106,
29377 '+': 107, 'plus': 107,
29378 // Num-Subtract, or -
29379 '-': 109, subtract: 109,
29385 ';': 186, semicolon: 186,
29387 '=': 187, 'equals': 187,
29389 ',': 188, comma: 188,
29390 // Dash / Underscore key
29392 // Period, or ., or full-stop
29393 '.': 190, period: 190, 'full-stop': 190,
29394 // Slash, or /, or forward-slash
29395 '/': 191, slash: 191, 'forward-slash': 191,
29396 // Tick, or `, or back-quote
29397 '`': 192, tick: 192, 'back-quote': 192,
29398 // Open bracket, or [
29399 '[': 219, 'open-bracket': 219,
29400 // Back slash, or \
29401 '\\': 220, 'back-slash': 220,
29402 // Close backet, or ]
29403 ']': 221, 'close-bracket': 221,
29404 // Apostrophe, or Quote, or '
29405 '\'': 222, quote: 222, apostrophe: 222
29409 var i$1 = 95, n = 0;
29410 while (++i$1 < 106) {
29411 d3keybinding.keyCodes['num-' + n] = i$1;
29417 while (++i$1 < 58) {
29418 d3keybinding.keyCodes[n] = i$1;
29424 while (++i$1 < 136) {
29425 d3keybinding.keyCodes['f' + n] = i$1;
29431 while (++i$1 < 91) {
29432 d3keybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
29435 function tooltip() {
29436 var tooltip = function(selection$$1) {
29437 selection$$1.each(setup);
29439 animation = utilFunctor(false),
29440 html = utilFunctor(false),
29441 title = function() {
29442 var title = this.getAttribute('data-original-title');
29446 title = this.getAttribute('title');
29447 this.removeAttribute('title');
29448 this.setAttribute('data-original-title', title);
29452 over = 'mouseenter.tooltip',
29453 out = 'mouseleave.tooltip',
29454 placement = utilFunctor('top');
29457 tooltip.title = function(_) {
29458 if (arguments.length) {
29459 title = utilFunctor(_);
29467 tooltip.html = function(_) {
29468 if (arguments.length) {
29469 html = utilFunctor(_);
29477 tooltip.placement = function(_) {
29478 if (arguments.length) {
29479 placement = utilFunctor(_);
29487 tooltip.show = function(selection$$1) {
29488 selection$$1.each(show);
29492 tooltip.hide = function(selection$$1) {
29493 selection$$1.each(hide);
29497 tooltip.toggle = function(selection$$1) {
29498 selection$$1.each(toggle);
29502 tooltip.destroy = function(selection$$1) {
29506 .attr('title', function() {
29507 return this.getAttribute('data-original-title') || this.getAttribute('title');
29509 .attr('data-original-title', null)
29510 .selectAll('.tooltip')
29516 var root = select(this),
29517 animate = animation.apply(this, arguments),
29518 tip = root.selectAll('.tooltip').data([0]);
29520 var enter = tip.enter()
29522 .attr('class', 'tooltip');
29526 .attr('class', 'tooltip-arrow');
29530 .attr('class', 'tooltip-inner');
29536 tip.classed('fade', true);
29539 var place = placement.apply(this, arguments);
29540 tip.classed(place, true);
29542 root.on(over, show);
29543 root.on(out, hide);
29548 var root = select(this),
29549 content = title.apply(this, arguments),
29550 tip = root.selectAll('.tooltip')
29551 .classed('in', true),
29552 markup = html.apply(this, arguments);
29554 tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
29555 var place = placement.apply(this, arguments),
29556 outer = getPosition(root.node()),
29557 inner = getPosition(tip.node()),
29562 pos = {x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h};
29565 pos = {x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2};
29568 pos = {x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2};
29571 pos = {x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h};
29576 tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
29578 tip.style('left', null).style('top', null);
29581 this.tooltipVisible = true;
29586 select(this).selectAll('.tooltip')
29587 .classed('in', false);
29589 this.tooltipVisible = false;
29593 function toggle() {
29594 if (this.tooltipVisible) {
29595 hide.apply(this, arguments);
29597 show.apply(this, arguments);
29605 function getPosition(node) {
29606 var mode = select(node).style('position');
29607 if (mode === 'absolute' || mode === 'static') {
29609 x: node.offsetLeft,
29611 w: node.offsetWidth,
29612 h: node.offsetHeight
29618 w: node.offsetWidth,
29619 h: node.offsetHeight
29624 function behaviorEdit(context) {
29628 .minzoom(context.minEditableZoom());
29632 edit.off = function() {
29642 The hover behavior adds the `.hover` class on mouseover to all elements to which
29643 the identical datum is bound, and removes it on mouseout.
29645 The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
29646 representation may consist of several elements scattered throughout the DOM hierarchy.
29647 Only one of these elements can have the :hover pseudo-class, but all of them will
29648 have the .hover class.
29650 function behaviorHover(context) {
29651 var dispatch$$1 = dispatch('hover');
29652 var _selection = select(null);
29659 function keydown() {
29660 if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29661 _selection.selectAll('.hover')
29662 .classed('hover-suppressed', true)
29663 .classed('hover', false);
29666 .classed('hover-disabled', true);
29668 dispatch$$1.call('hover', this, null);
29674 if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29675 _selection.selectAll('.hover-suppressed')
29676 .classed('hover-suppressed', false)
29677 .classed('hover', true);
29680 .classed('hover-disabled', false);
29682 dispatch$$1.call('hover', this, _target ? _target.id : null);
29687 var hover = function(selection$$1) {
29688 _selection = selection$$1;
29692 .on('mouseover.hover', mouseover)
29693 .on('mouseout.hover', mouseout)
29694 .on('mousedown.hover', mousedown);
29697 .on('keydown.hover', keydown)
29698 .on('keyup.hover', keyup);
29701 function mouseover() {
29702 if (_buttonDown) return;
29703 var target = event.target;
29704 enter(target ? target.__data__ : null);
29708 function mouseout() {
29709 if (_buttonDown) return;
29710 var target = event.relatedTarget;
29711 enter(target ? target.__data__ : null);
29715 function mousedown() {
29716 _buttonDown = true;
29718 .on('mouseup.hover', mouseup, true);
29722 function mouseup() {
29723 _buttonDown = false;
29725 .on('mouseup.hover', null, true);
29729 function enter(datum) {
29730 if (datum === _target) return;
29733 _selection.selectAll('.hover')
29734 .classed('hover', false);
29735 _selection.selectAll('.hover-suppressed')
29736 .classed('hover-suppressed', false);
29739 if (datum instanceof osmEntity$$1) {
29742 entity = datum && datum.properties && datum.properties.entity;
29745 if (entity && entity.id !== _newId) {
29746 // If drawing a way, don't hover on a node that was just placed. #3974
29747 var mode = context.mode() && context.mode().id;
29748 if ((mode === 'draw-line' || mode === 'draw-area') && !_newId && entity.type === 'node') {
29749 _newId = entity.id;
29753 var selector$$1 = '.' + entity.id;
29755 if (entity.type === 'relation') {
29756 entity.members.forEach(function(member) {
29757 selector$$1 += ', .' + member.id;
29761 var suppressed = _altDisables && event && event.altKey;
29763 _selection.selectAll(selector$$1)
29764 .classed(suppressed ? 'hover-suppressed' : 'hover', true);
29766 dispatch$$1.call('hover', this, !suppressed && entity.id);
29769 dispatch$$1.call('hover', this, null);
29776 hover.off = function(selection$$1) {
29777 selection$$1.selectAll('.hover')
29778 .classed('hover', false);
29779 selection$$1.selectAll('.hover-suppressed')
29780 .classed('hover-suppressed', false);
29782 .classed('hover-disabled', false);
29785 .on('mouseover.hover', null)
29786 .on('mouseout.hover', null)
29787 .on('mousedown.hover', null);
29790 .on('keydown.hover', null)
29791 .on('keyup.hover', null);
29795 hover.altDisables = function(_) {
29796 if (!arguments.length) return _altDisables;
29802 return utilRebind(hover, dispatch$$1, 'on');
29805 function refresh(selection, node) {
29806 var cr = node.getBoundingClientRect();
29807 var prop = [cr.width, cr.height];
29808 selection.property('__dimensions__', prop);
29812 function utilGetDimensions(selection, force) {
29813 if (!selection || selection.empty()) {
29816 var node = selection.node(),
29817 cached = selection.property('__dimensions__');
29818 return (!cached || force) ? refresh(selection, node) : cached;
29822 function utilSetDimensions(selection, dimensions) {
29823 if (!selection || selection.empty()) {
29826 var node = selection.node();
29827 if (dimensions === null) {
29828 refresh(selection, node);
29832 .property('__dimensions__', [dimensions[0], dimensions[1]])
29833 .attr('width', dimensions[0])
29834 .attr('height', dimensions[1]);
29837 function behaviorTail() {
29841 tooltipSize = [0, 0],
29842 selectionSize = [0, 0];
29845 function tail(selection$$1) {
29849 .on('resize.tail', function() { selectionSize = utilGetDimensions(selection$$1); });
29851 container = select(document.body)
29853 .style('display', 'none')
29854 .attr('class', 'tail tooltip-inner');
29856 container.append('div')
29860 .on('mousemove.tail', mousemove)
29861 .on('mouseenter.tail', mouseenter)
29862 .on('mouseleave.tail', mouseleave);
29865 .on('mousemove.tail', mousemove);
29867 tooltipSize = utilGetDimensions(container);
29868 selectionSize = utilGetDimensions(selection$$1);
29872 container.style('display', 'block');
29873 tooltipSize = utilGetDimensions(container);
29877 function mousemove() {
29878 if (container.style('display') === 'none') show();
29879 var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
29880 -tooltipSize[0] - xmargin : xmargin;
29881 container.classed('left', xoffset > 0);
29882 utilSetTransform(container, event.clientX + xoffset, event.clientY);
29886 function mouseleave() {
29887 if (event.relatedTarget !== container.node()) {
29888 container.style('display', 'none');
29893 function mouseenter() {
29894 if (event.relatedTarget !== container.node()) {
29901 tail.off = function(selection$$1) {
29905 .on('mousemove.tail', null)
29909 .on('mousemove.tail', null)
29910 .on('mouseenter.tail', null)
29911 .on('mouseleave.tail', null);
29914 .on('resize.tail', null);
29918 tail.text = function(_) {
29919 if (!arguments.length) return text;
29928 var _usedTails = {};
29929 var _disableSpace = false;
29930 var _lastSpace = null;
29933 function behaviorDraw(context) {
29934 var dispatch$$1 = dispatch(
29935 'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
29938 var keybinding = d3keybinding('draw');
29940 var hover = behaviorHover(context).altDisables(true)
29941 .on('hover', context.ui().sidebar.hover);
29942 var tail = behaviorTail();
29943 var edit = behaviorEdit(context);
29945 var closeTolerance = 4;
29946 var tolerance = 12;
29947 var _mouseLeave = false;
29948 var _lastMouse = null;
29952 // - `mode/drag_node.js` `datum()`
29954 if (event.altKey) return {};
29957 if (event.type === 'keydown') {
29958 element = _lastMouse && _lastMouse.target;
29960 element = event.target;
29963 // When drawing, snap only to touch targets..
29964 // (this excludes area fills and active drawing elements)
29965 var d = element.__data__;
29966 return (d && d.properties && d.properties.target) ? d : {};
29970 function mousedown() {
29972 function point$$1() {
29973 var p = context.container().node();
29974 return touchId !== null ? d3_touches(p).filter(function(p) {
29975 return p.identifier === touchId;
29979 var element = select(this);
29980 var touchId = event.touches ? event.changedTouches[0].identifier : null;
29981 var t1 = +new Date();
29982 var p1 = point$$1();
29984 element.on('mousemove.draw', null);
29986 select(window).on('mouseup.draw', function() {
29987 var t2 = +new Date();
29988 var p2 = point$$1();
29989 var dist = geoVecLength(p1, p2);
29991 element.on('mousemove.draw', mousemove);
29992 select(window).on('mouseup.draw', null);
29994 if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
29995 // Prevent a quick second click
29996 select(window).on('click.draw-block', function() {
29997 event.stopPropagation();
30000 context.map().dblclickEnable(false);
30002 window.setTimeout(function() {
30003 context.map().dblclickEnable(true);
30004 select(window).on('click.draw-block', null);
30013 function mousemove() {
30014 _lastMouse = event;
30015 dispatch$$1.call('move', this, datum());
30019 function mouseenter() {
30020 _mouseLeave = false;
30024 function mouseleave() {
30025 _mouseLeave = true;
30030 // - `mode/drag_node.js` `doMode()`
30031 // - `behavior/draw.js` `click()`
30032 // - `behavior/draw_way.js` `move()`
30035 var target = d && d.properties && d.properties.entity;
30037 if (target && target.type === 'node') { // Snap to a node
30038 dispatch$$1.call('clickNode', this, target, d);
30041 } else if (target && target.type === 'way') { // Snap to a way
30042 var choice = geoChooseEdge(
30043 context.childNodes(target), context.mouse(), context.projection, context.activeID()
30046 var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
30047 dispatch$$1.call('clickWay', this, choice.loc, edge, d);
30052 dispatch$$1.call('click', this, context.map().mouseCoordinates(), d);
30057 event.preventDefault();
30058 event.stopPropagation();
30060 var currSpace = context.mouse();
30061 if (_disableSpace && _lastSpace) {
30062 var dist = geoVecLength(_lastSpace, currSpace);
30063 if (dist > tolerance) {
30064 _disableSpace = false;
30068 if (_disableSpace || _mouseLeave || !_lastMouse) return;
30070 // user must move mouse or release space bar to allow another click
30071 _lastSpace = currSpace;
30072 _disableSpace = true;
30074 select(window).on('keyup.space-block', function() {
30075 event.preventDefault();
30076 event.stopPropagation();
30077 _disableSpace = false;
30078 select(window).on('keyup.space-block', null);
30085 function backspace() {
30086 event.preventDefault();
30087 dispatch$$1.call('undo');
30092 event.preventDefault();
30093 dispatch$$1.call('cancel');
30098 event.preventDefault();
30099 dispatch$$1.call('finish');
30103 function draw(selection$$1) {
30104 context.install(hover);
30105 context.install(edit);
30107 if (!context.inIntro() && !_usedTails[tail.text()]) {
30108 context.install(tail);
30112 .on('⌫', backspace)
30116 .on('space', space)
30117 .on('⌥space', space);
30120 .on('mouseenter.draw', mouseenter)
30121 .on('mouseleave.draw', mouseleave)
30122 .on('mousedown.draw', mousedown)
30123 .on('mousemove.draw', mousemove);
30132 draw.off = function(selection$$1) {
30133 context.ui().sidebar.hover.cancel();
30134 context.uninstall(hover);
30135 context.uninstall(edit);
30137 if (!context.inIntro() && !_usedTails[tail.text()]) {
30138 context.uninstall(tail);
30139 _usedTails[tail.text()] = true;
30143 .on('mouseenter.draw', null)
30144 .on('mouseleave.draw', null)
30145 .on('mousedown.draw', null)
30146 .on('mousemove.draw', null);
30149 .on('mouseup.draw', null);
30150 // note: keyup.space-block, click.draw-block should remain
30153 .call(keybinding.off);
30157 draw.tail = function(_) {
30163 return utilRebind(draw, dispatch$$1, 'on');
30166 function modeAddArea$$1(context) {
30170 title: t('modes.add_area.title'),
30171 description: t('modes.add_area.description'),
30175 var behavior = behaviorAddWay(context)
30176 .tail(t('modes.add_area.tail'))
30177 .on('start', start)
30178 .on('startFromWay', startFromWay)
30179 .on('startFromNode', startFromNode),
30180 defaultTags = { area: 'yes' };
30183 function actionClose(wayId) {
30184 return function (graph) {
30185 return graph.replace(graph.entity(wayId).close());
30190 function start(loc) {
30191 var startGraph = context.graph(),
30192 node = osmNode({ loc: loc }),
30193 way = osmWay({ tags: defaultTags });
30196 actionAddEntity(node),
30197 actionAddEntity(way),
30198 actionAddVertex(way.id, node.id),
30199 actionClose(way.id)
30202 context.enter(modeDrawArea(context, way.id, startGraph));
30206 function startFromWay(loc, edge) {
30207 var startGraph = context.graph(),
30208 node = osmNode({ loc: loc }),
30209 way = osmWay({ tags: defaultTags });
30212 actionAddEntity(node),
30213 actionAddEntity(way),
30214 actionAddVertex(way.id, node.id),
30215 actionClose(way.id),
30216 actionAddMidpoint({ loc: loc, edge: edge }, node)
30219 context.enter(modeDrawArea(context, way.id, startGraph));
30223 function startFromNode(node) {
30224 var startGraph = context.graph(),
30225 way = osmWay({ tags: defaultTags });
30228 actionAddEntity(way),
30229 actionAddVertex(way.id, node.id),
30230 actionClose(way.id)
30233 context.enter(modeDrawArea(context, way.id, startGraph));
30237 mode.enter = function() {
30238 context.install(behavior);
30242 mode.exit = function() {
30243 context.uninstall(behavior);
30250 function modeAddLine$$1(context) {
30254 title: t('modes.add_line.title'),
30255 description: t('modes.add_line.description'),
30259 var behavior = behaviorAddWay(context)
30260 .tail(t('modes.add_line.tail'))
30261 .on('start', start)
30262 .on('startFromWay', startFromWay)
30263 .on('startFromNode', startFromNode);
30266 function start(loc) {
30267 var startGraph = context.graph(),
30268 node = osmNode({ loc: loc }),
30272 actionAddEntity(node),
30273 actionAddEntity(way),
30274 actionAddVertex(way.id, node.id)
30277 context.enter(modeDrawLine(context, way.id, startGraph));
30281 function startFromWay(loc, edge) {
30282 var startGraph = context.graph(),
30283 node = osmNode({ loc: loc }),
30287 actionAddEntity(node),
30288 actionAddEntity(way),
30289 actionAddVertex(way.id, node.id),
30290 actionAddMidpoint({ loc: loc, edge: edge }, node)
30293 context.enter(modeDrawLine(context, way.id, startGraph));
30297 function startFromNode(node) {
30298 var startGraph = context.graph(),
30302 actionAddEntity(way),
30303 actionAddVertex(way.id, node.id)
30306 context.enter(modeDrawLine(context, way.id, startGraph));
30310 mode.enter = function() {
30311 context.install(behavior);
30315 mode.exit = function() {
30316 context.uninstall(behavior);
30322 function modeAddPoint$$1(context) {
30326 title: t('modes.add_point.title'),
30327 description: t('modes.add_point.description'),
30331 var behavior = behaviorDraw(context)
30332 .tail(t('modes.add_point.tail'))
30334 .on('clickWay', addWay)
30335 .on('clickNode', addNode)
30336 .on('cancel', cancel)
30337 .on('finish', cancel);
30340 function add(loc) {
30341 var node = osmNode({ loc: loc });
30344 actionAddEntity(node),
30345 t('operations.add.annotation.point')
30349 modeSelect(context, [node.id]).newFeature(true)
30354 function addWay(loc) {
30359 function addNode(node) {
30364 function cancel() {
30365 context.enter(modeBrowse(context));
30369 mode.enter = function() {
30370 context.install(behavior);
30374 mode.exit = function() {
30375 context.uninstall(behavior);
30382 function modeDragNode$$1(context) {
30387 var hover = behaviorHover(context).altDisables(true)
30388 .on('hover', context.ui().sidebar.hover);
30389 var edit = behaviorEdit(context);
30391 var _nudgeInterval;
30392 var _restoreSelectedIDs = [];
30393 var _wasMidpoint = false;
30394 var _isCancelled = false;
30400 function startNudge(entity, nudge) {
30401 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
30402 _nudgeInterval = window.setInterval(function() {
30403 context.pan(nudge);
30404 doMove(entity, nudge);
30409 function stopNudge() {
30410 if (_nudgeInterval) {
30411 window.clearInterval(_nudgeInterval);
30412 _nudgeInterval = null;
30417 function moveAnnotation(entity) {
30418 return t('operations.move.annotation.' + entity.geometry(context.graph()));
30422 function connectAnnotation(entity) {
30423 return t('operations.connect.annotation.' + entity.geometry(context.graph()));
30427 function origin(entity) {
30428 return context.projection(entity.loc);
30432 function keydown() {
30433 if (event.keyCode === d3keybinding.modifierCodes.alt) {
30434 if (context.surface().classed('nope')) {
30436 .classed('nope-suppressed', true);
30439 .classed('nope', false)
30440 .classed('nope-disabled', true);
30446 if (event.keyCode === d3keybinding.modifierCodes.alt) {
30447 if (context.surface().classed('nope-suppressed')) {
30449 .classed('nope', true);
30452 .classed('nope-suppressed', false)
30453 .classed('nope-disabled', false);
30458 function start(entity) {
30459 _wasMidpoint = entity.type === 'midpoint';
30460 var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
30461 _isCancelled = event.sourceEvent.shiftKey || hasHidden;
30464 if (_isCancelled) {
30468 .text(t('modes.drag_node.connected_to_hidden'))();
30470 return drag.cancel();
30473 if (_wasMidpoint) {
30474 var midpoint = entity;
30475 entity = osmNode();
30476 context.perform(actionAddMidpoint(midpoint, entity));
30477 entity = context.entity(entity.id); // get post-action entity
30479 var vertex = context.surface().selectAll('.' + entity.id);
30480 drag.target(vertex.node(), entity);
30483 context.perform(actionNoop());
30486 _activeEntity = entity;
30487 _startLoc = entity.loc;
30489 context.surface().selectAll('.' + _activeEntity.id)
30490 .classed('active', true);
30492 context.enter(mode);
30497 // - `behavior/draw.js` `datum()`
30499 var event$$1 = event && event.sourceEvent;
30500 if (!event$$1 || event$$1.altKey) {
30503 // When dragging, snap only to touch targets..
30504 // (this excludes area fills and active drawing elements)
30505 var d = event$$1.target.__data__;
30506 return (d && d.properties && d.properties.target) ? d : {};
30511 function doMove(entity, nudge) {
30512 nudge = nudge || [0, 0];
30514 var currPoint = (event && event.point) || context.projection(_lastLoc);
30515 var currMouse = geoVecSubtract(currPoint, nudge);
30516 var loc = context.projection.invert(currMouse);
30518 if (!_nudgeInterval) { // If not nudging at the edge of the viewport, try to snap..
30520 // - `mode/drag_node.js` `doMode()`
30521 // - `behavior/draw.js` `click()`
30522 // - `behavior/draw_way.js` `move()`
30524 var target = d && d.properties && d.properties.entity;
30525 var targetLoc = target && target.loc;
30526 var targetNodes = d && d.properties && d.properties.nodes;
30529 if (targetLoc) { // snap to node/vertex - a point target with `.loc`
30532 } else if (targetNodes) { // snap to way - a line target with `.nodes`
30533 edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
30541 actionMoveNode(entity.id, loc),
30542 moveAnnotation(entity)
30545 // Below here: validations
30546 var isInvalid = false;
30548 // Check if this connection to `target` could cause relations to break..
30550 isInvalid = hasRelationConflict(entity, target, edge, context.graph());
30553 // Check if this drag causes the geometry to break..
30555 isInvalid = hasInvalidGeometry(entity, context.graph());
30559 var nope = context.surface().classed('nope');
30560 if (isInvalid === 'relation' || isInvalid === 'restriction') {
30561 if (!nope) { // about to nope - show hint
30564 .text(t('operations.connect.' + isInvalid,
30565 { relation: context.presets().item('type/restriction').name() }
30569 if (nope) { // about to un-nope, remove hint
30577 var nopeDisabled = context.surface().classed('nope-disabled');
30578 if (nopeDisabled) {
30580 .classed('nope', false)
30581 .classed('nope-suppressed', isInvalid);
30584 .classed('nope', isInvalid)
30585 .classed('nope-suppressed', false);
30592 // Uses `actionConnect.disabled()` to know whether this connection is ok..
30593 function hasRelationConflict(entity, target, edge, graph) {
30594 var testGraph = graph.update(); // copy
30596 // if snapping to way - add midpoint there and consider that the target..
30598 var midpoint = osmNode();
30599 var action = actionAddMidpoint({
30601 edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
30604 testGraph = action(testGraph);
30608 // can we connect to it?
30609 var ids = [entity.id, target.id];
30610 return actionConnect(ids).disabled(testGraph);
30614 function hasInvalidGeometry(entity, graph) {
30615 var parents = graph.parentWays(entity);
30618 for (i = 0; i < parents.length; i++) {
30619 var parent = parents[i];
30621 var activeIndex = null; // which multipolygon ring contains node being dragged
30623 // test any parent multipolygons for valid geometry
30624 var relations = graph.parentRelations(parent);
30625 for (j = 0; j < relations.length; j++) {
30626 if (!relations[j].isMultipolygon()) continue;
30628 var rings = osmJoinWays(relations[j].members, graph);
30630 // find active ring and test it for self intersections
30631 for (k = 0; k < rings.length; k++) {
30632 nodes = rings[k].nodes;
30633 if (find$1(nodes, function(n) { return n.id === entity.id; })) {
30635 if (geoHasSelfIntersections(nodes, entity.id)) {
30639 rings[k].coords = nodes.map(function(n) { return n.loc; });
30642 // test active ring for intersections with other rings in the multipolygon
30643 for (k = 0; k < rings.length; k++) {
30644 if (k === activeIndex) continue;
30646 // make sure active ring doesnt cross passive rings
30647 if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
30654 // If we still haven't tested this node's parent way for self-intersections.
30655 // (because it's not a member of a multipolygon), test it now.
30656 if (activeIndex === null) {
30657 nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
30658 if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
30669 function move(entity) {
30670 if (_isCancelled) return;
30671 event.sourceEvent.stopPropagation();
30673 context.surface().classed('nope-disabled', event.sourceEvent.altKey);
30675 _lastLoc = context.projection.invert(event.point);
30678 var nudge = geoViewportEdge(event.point, context.map().dimensions());
30680 startNudge(entity, nudge);
30687 function end(entity) {
30688 if (_isCancelled) return;
30691 var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
30692 var target = d && d.properties && d.properties.entity; // entity to snap to
30694 if (nope) { // bounce back
30696 _actionBounceBack(entity.id, _startLoc)
30699 } else if (target && target.type === 'way') {
30700 var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
30702 actionAddMidpoint({
30704 edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
30706 connectAnnotation(target)
30709 } else if (target && target.type === 'node') {
30711 actionConnect([target.id, entity.id]),
30712 connectAnnotation(target)
30715 } else if (_wasMidpoint) {
30718 t('operations.add.annotation.vertex')
30724 moveAnnotation(entity)
30728 var reselection = _restoreSelectedIDs.filter(function(id) {
30729 return context.graph().hasEntity(id);
30732 if (reselection.length) {
30733 context.enter(modeSelect(context, reselection));
30735 context.enter(modeBrowse(context));
30740 function _actionBounceBack(nodeID, toLoc) {
30741 var moveNode = actionMoveNode(nodeID, toLoc);
30742 var action = function(graph, t$$1) {
30743 // last time through, pop off the bounceback perform.
30744 // it will then overwrite the initial perform with a moveNode that does nothing
30745 if (t$$1 === 1) context.pop();
30746 return moveNode(graph, t$$1);
30748 action.transitionable = true;
30753 function cancel() {
30755 context.enter(modeBrowse(context));
30759 var drag = behaviorDrag()
30760 .selector('.layer-points-targets .target')
30761 .surface(select('#map').node())
30763 .on('start', start)
30768 mode.enter = function() {
30769 context.install(hover);
30770 context.install(edit);
30773 .on('keydown.drawWay', keydown)
30774 .on('keyup.drawWay', keyup);
30777 .on('undone.drag-node', cancel);
30781 mode.exit = function() {
30782 context.ui().sidebar.hover.cancel();
30783 context.uninstall(hover);
30784 context.uninstall(edit);
30787 .on('keydown.hover', null)
30788 .on('keyup.hover', null);
30791 .on('undone.drag-node', null);
30794 .on('drawn.drag-node', null);
30796 _activeEntity = null;
30799 .classed('nope', false)
30800 .classed('nope-suppressed', false)
30801 .classed('nope-disabled', false)
30802 .selectAll('.active')
30803 .classed('active', false);
30809 mode.selectedIDs = function() {
30810 if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
30816 mode.activeID = function() {
30817 if (!arguments.length) return _activeEntity && _activeEntity.id;
30823 mode.restoreSelectedIDs = function(_) {
30824 if (!arguments.length) return _restoreSelectedIDs;
30825 _restoreSelectedIDs = _;
30830 mode.behavior = drag;
30836 function modeBrowse(context) {
30840 title: t('modes.browse.title'),
30841 description: t('modes.browse.description')
30845 behaviorPaste(context),
30846 behaviorHover(context).on('hover', context.ui().sidebar.hover),
30847 behaviorSelect(context),
30848 behaviorLasso(context),
30849 modeDragNode$$1(context).behavior
30853 mode.enter = function() {
30854 behaviors.forEach(function(behavior) {
30855 context.install(behavior);
30858 // Get focus on the body.
30859 if (document.activeElement && document.activeElement.blur) {
30860 document.activeElement.blur();
30864 context.ui().sidebar.show(sidebar);
30866 context.ui().sidebar.select(null);
30871 mode.exit = function() {
30872 context.ui().sidebar.hover.cancel();
30873 behaviors.forEach(function(behavior) {
30874 context.uninstall(behavior);
30878 context.ui().sidebar.hide();
30883 mode.sidebar = function(_) {
30884 if (!arguments.length) return sidebar;
30893 function modeDrawArea(context, wayId, startGraph) {
30902 mode.enter = function() {
30903 var way = context.entity(wayId);
30905 behavior = behaviorDrawWay(context, wayId, undefined, mode, startGraph)
30906 .tail(t('modes.draw_area.tail'));
30908 var addNode = behavior.addNode;
30910 behavior.addNode = function(node, d) {
30911 var length = way.nodes.length;
30912 var penultimate = length > 2 ? way.nodes[length - 2] : null;
30914 if (node.id === way.first() || node.id === penultimate) {
30921 context.install(behavior);
30925 mode.exit = function() {
30926 context.uninstall(behavior);
30930 mode.selectedIDs = function() {
30935 mode.activeID = function() {
30936 return (behavior && behavior.activeID()) || [];
30943 function modeDrawLine(context, wayId, startGraph, affix) {
30952 mode.enter = function() {
30953 var way = context.entity(wayId);
30954 var index = (affix === 'prefix') ? 0 : undefined;
30955 var headId = (affix === 'prefix') ? way.first() : way.last();
30957 behavior = behaviorDrawWay(context, wayId, index, mode, startGraph)
30958 .tail(t('modes.draw_line.tail'));
30960 var addNode = behavior.addNode;
30961 behavior.addNode = function(node, d) {
30962 if (node.id === headId) {
30969 context.install(behavior);
30973 mode.exit = function() {
30974 context.uninstall(behavior);
30978 mode.selectedIDs = function() {
30983 mode.activeID = function() {
30984 return (behavior && behavior.activeID()) || [];
30990 function operationCircularize(selectedIDs, context) {
30991 var entityId = selectedIDs[0],
30992 entity = context.entity(entityId),
30993 extent = entity.extent(context.graph()),
30994 geometry = context.geometry(entityId),
30995 action = actionCircularize(entityId, context.projection);
30998 var operation = function() {
30999 context.perform(action, operation.annotation());
31003 operation.available = function() {
31004 return selectedIDs.length === 1 &&
31005 entity.type === 'way' &&
31006 uniq(entity.nodes).length > 1;
31010 operation.disabled = function() {
31012 if (extent.percentContainedIn(context.extent()) < 0.8) {
31013 reason = 'too_large';
31014 } else if (context.hasHiddenConnections(entityId)) {
31015 reason = 'connected_to_hidden';
31017 return action.disabled(context.graph()) || reason;
31021 operation.tooltip = function() {
31022 var disable = operation.disabled();
31024 t('operations.circularize.' + disable) :
31025 t('operations.circularize.description.' + geometry);
31029 operation.annotation = function() {
31030 return t('operations.circularize.annotation.' + geometry);
31034 operation.id = 'circularize';
31035 operation.keys = [t('operations.circularize.key')];
31036 operation.title = t('operations.circularize.title');
31037 operation.behavior = behaviorOperation(context).which(operation);
31042 function operationContinue(selectedIDs, context) {
31043 var graph = context.graph(),
31044 entities = selectedIDs.map(function(id) { return graph.entity(id); }),
31045 geometries = assignIn({ line: [], vertex: [] },
31046 groupBy(entities, function(entity) { return entity.geometry(graph); })),
31047 vertex = geometries.vertex[0];
31050 function candidateWays() {
31051 return graph.parentWays(vertex).filter(function(parent) {
31052 return parent.geometry(graph) === 'line' &&
31053 !parent.isClosed() &&
31054 parent.affix(vertex.id) &&
31055 (geometries.line.length === 0 || geometries.line[0] === parent);
31060 var operation = function() {
31061 var candidate = candidateWays()[0];
31063 modeDrawLine(context, candidate.id, context.graph(), candidate.affix(vertex.id))
31068 operation.available = function() {
31069 return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
31070 !context.features().hasHiddenConnections(vertex, context.graph());
31074 operation.disabled = function() {
31075 var candidates = candidateWays();
31076 if (candidates.length === 0)
31077 return 'not_eligible';
31078 if (candidates.length > 1)
31083 operation.tooltip = function() {
31084 var disable = operation.disabled();
31086 t('operations.continue.' + disable) :
31087 t('operations.continue.description');
31091 operation.annotation = function() {
31092 return t('operations.continue.annotation.line');
31096 operation.id = 'continue';
31097 operation.keys = [t('operations.continue.key')];
31098 operation.title = t('operations.continue.title');
31099 operation.behavior = behaviorOperation(context).which(operation);
31104 function operationDelete(selectedIDs, context) {
31105 var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
31106 action = actionDeleteMultiple(selectedIDs),
31107 extent = selectedIDs.reduce(function(extent, id) {
31108 return extent.extend(context.entity(id).extent(context.graph()));
31109 }, geoExtent$$1());
31112 var operation = function() {
31113 var nextSelectedID;
31114 var nextSelectedLoc;
31116 if (selectedIDs.length === 1) {
31117 var id = selectedIDs[0],
31118 entity = context.entity(id),
31119 geometry = context.geometry(id),
31120 parents = context.graph().parentWays(entity),
31121 parent = parents[0];
31123 // Select the next closest node in the way.
31124 if (geometry === 'vertex') {
31125 var nodes = parent.nodes,
31126 i = nodes.indexOf(id);
31130 } else if (i === nodes.length - 1) {
31133 var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
31134 b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
31135 i = a < b ? i - 1 : i + 1;
31138 nextSelectedID = nodes[i];
31139 nextSelectedLoc = context.entity(nextSelectedID).loc;
31143 context.perform(action, operation.annotation());
31145 if (nextSelectedID && nextSelectedLoc) {
31146 if (context.hasEntity(nextSelectedID)) {
31147 context.enter(modeSelect(context, [nextSelectedID]).follow(true));
31149 context.map().centerEase(nextSelectedLoc);
31150 context.enter(modeBrowse(context));
31153 context.enter(modeBrowse(context));
31159 operation.available = function() {
31164 operation.disabled = function() {
31166 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31167 reason = 'too_large';
31168 } else if (some(selectedIDs, context.hasHiddenConnections)) {
31169 reason = 'connected_to_hidden';
31170 } else if (some(selectedIDs, protectedMember)) {
31171 reason = 'part_of_relation';
31172 } else if (some(selectedIDs, incompleteRelation)) {
31173 reason = 'incomplete_relation';
31177 function incompleteRelation(id) {
31178 var entity = context.entity(id);
31179 return entity.type === 'relation' && !entity.isComplete(context.graph());
31182 function protectedMember(id) {
31183 var entity = context.entity(id);
31184 if (entity.type !== 'way') return false;
31186 var parents = context.graph().parentRelations(entity);
31187 for (var i = 0; i < parents.length; i++) {
31188 var parent = parents[i],
31189 type = parent.tags.type,
31190 role = parent.memberById(id).role || 'outer';
31191 if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
31201 operation.tooltip = function() {
31202 var disable = operation.disabled();
31204 t('operations.delete.' + disable + '.' + multi) :
31205 t('operations.delete.description' + '.' + multi);
31209 operation.annotation = function() {
31210 return selectedIDs.length === 1 ?
31211 t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
31212 t('operations.delete.annotation.multiple', { n: selectedIDs.length });
31216 operation.id = 'delete';
31217 operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
31218 operation.title = t('operations.delete.title');
31219 operation.behavior = behaviorOperation(context).which(operation);
31224 function operationDisconnect(selectedIDs, context) {
31225 var vertices = filter(selectedIDs, function(entityId) {
31226 return context.geometry(entityId) === 'vertex';
31229 var entityId = vertices[0],
31230 action = actionDisconnect(entityId);
31232 if (selectedIDs.length > 1) {
31233 action.limitWays(without(selectedIDs, entityId));
31237 var operation = function() {
31238 context.perform(action, operation.annotation());
31242 operation.available = function() {
31243 return vertices.length === 1;
31247 operation.disabled = function() {
31249 if (some(selectedIDs, context.hasHiddenConnections)) {
31250 reason = 'connected_to_hidden';
31252 return action.disabled(context.graph()) || reason;
31256 operation.tooltip = function() {
31257 var disable = operation.disabled();
31259 t('operations.disconnect.' + disable) :
31260 t('operations.disconnect.description');
31264 operation.annotation = function() {
31265 return t('operations.disconnect.annotation');
31269 operation.id = 'disconnect';
31270 operation.keys = [t('operations.disconnect.key')];
31271 operation.title = t('operations.disconnect.title');
31272 operation.behavior = behaviorOperation(context).which(operation);
31277 function operationMerge(selectedIDs, context) {
31279 function updatePresetTags(newGraph, ids) {
31281 var newEntity = newGraph.hasEntity(id);
31283 if (!newEntity) return;
31284 var newPreset = context.presets().match(newEntity, newGraph);
31285 context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
31289 var join = actionJoin(selectedIDs);
31290 var merge = actionMerge(selectedIDs);
31291 var mergePolygon = actionMergePolygon(selectedIDs);
31292 var mergeNodes = actionMergeNodes(selectedIDs);
31295 var operation = function() {
31299 if (!join.disabled(context.graph())) {
31300 doUpdateTags = false;
31302 } else if (!merge.disabled(context.graph())) {
31303 doUpdateTags = true;
31305 } else if (!mergePolygon.disabled(context.graph())) {
31306 doUpdateTags = false;
31307 action = mergePolygon;
31309 doUpdateTags = true;
31310 action = mergeNodes;
31313 context.perform(action, operation.annotation());
31315 var ids = selectedIDs.filter(function(id) {
31316 var entity = context.hasEntity(id);
31317 return entity && entity.type !== 'node';
31320 // if we merged tags, rematch preset to update tags if necessary (#3851)
31321 if (doUpdateTags) {
31322 updatePresetTags(context.graph(), ids);
31325 context.enter(modeSelect(context, ids));
31329 operation.available = function() {
31330 return selectedIDs.length >= 2;
31334 operation.disabled = function() {
31335 return join.disabled(context.graph()) &&
31336 merge.disabled(context.graph()) &&
31337 mergePolygon.disabled(context.graph()) &&
31338 mergeNodes.disabled(context.graph());
31342 operation.tooltip = function() {
31343 var j = join.disabled(context.graph()); // 'not_eligible', 'not_adjacent', 'restriction', 'conflicting_tags'
31344 var m = merge.disabled(context.graph()); // 'not_eligible'
31345 var p = mergePolygon.disabled(context.graph()); // 'not_eligible', 'incomplete_relation'
31346 var n = mergeNodes.disabled(context.graph()); // 'not_eligible', 'relation', 'restriction'
31348 // disabled for one of various reasons
31349 if (j && m && p && n) {
31350 if (j === 'restriction' || n === 'restriction') {
31351 return t('operations.merge.restriction',
31352 { relation: context.presets().item('type/restriction').name() });
31354 } else if (p === 'incomplete_relation') {
31355 return t('operations.merge.incomplete_relation');
31357 } else if (n === 'relation') {
31358 return t('operations.merge.relation');
31361 return t('operations.merge.' + j);
31365 return t('operations.merge.description');
31370 operation.annotation = function() {
31371 return t('operations.merge.annotation', { n: selectedIDs.length });
31375 operation.id = 'merge';
31376 operation.keys = [t('operations.merge.key')];
31377 operation.title = t('operations.merge.title');
31378 operation.behavior = behaviorOperation(context).which(operation);
31383 function operationMove(selectedIDs, context) {
31384 var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
31385 var extent = selectedIDs.reduce(function(extent, id) {
31386 return extent.extend(context.entity(id).extent(context.graph()));
31387 }, geoExtent$$1());
31390 var operation = function() {
31391 context.enter(modeMove$$1(context, selectedIDs));
31395 operation.available = function() {
31396 return selectedIDs.length > 1 ||
31397 context.entity(selectedIDs[0]).type !== 'node';
31401 operation.disabled = function() {
31403 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31404 reason = 'too_large';
31405 } else if (some(selectedIDs, context.hasHiddenConnections)) {
31406 reason = 'connected_to_hidden';
31407 } else if (some(selectedIDs, incompleteRelation)) {
31408 reason = 'incomplete_relation';
31412 function incompleteRelation(id) {
31413 var entity = context.entity(id);
31414 return entity.type === 'relation' && !entity.isComplete(context.graph());
31419 operation.tooltip = function() {
31420 var disable = operation.disabled();
31422 t('operations.move.' + disable + '.' + multi) :
31423 t('operations.move.description.' + multi);
31427 operation.annotation = function() {
31428 return selectedIDs.length === 1 ?
31429 t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
31430 t('operations.move.annotation.multiple');
31434 operation.id = 'move';
31435 operation.keys = [t('operations.move.key')];
31436 operation.title = t('operations.move.title');
31437 operation.behavior = behaviorOperation(context).which(operation);
31442 function operationOrthogonalize(selectedIDs, context) {
31443 var entityId = selectedIDs[0],
31444 entity = context.entity(entityId),
31445 extent = entity.extent(context.graph()),
31446 geometry = context.geometry(entityId),
31447 action = actionOrthogonalize(entityId, context.projection);
31450 var operation = function() {
31451 context.perform(action, operation.annotation());
31455 operation.available = function() {
31456 return selectedIDs.length === 1 &&
31457 entity.type === 'way' &&
31458 entity.isClosed() &&
31459 uniq(entity.nodes).length > 2;
31463 operation.disabled = function() {
31465 if (extent.percentContainedIn(context.extent()) < 0.8) {
31466 reason = 'too_large';
31467 } else if (context.hasHiddenConnections(entityId)) {
31468 reason = 'connected_to_hidden';
31470 return action.disabled(context.graph()) || reason;
31474 operation.tooltip = function() {
31475 var disable = operation.disabled();
31477 t('operations.orthogonalize.' + disable) :
31478 t('operations.orthogonalize.description.' + geometry);
31482 operation.annotation = function() {
31483 return t('operations.orthogonalize.annotation.' + geometry);
31487 operation.id = 'orthogonalize';
31488 operation.keys = [t('operations.orthogonalize.key')];
31489 operation.title = t('operations.orthogonalize.title');
31490 operation.behavior = behaviorOperation(context).which(operation);
31496 * This method is like `_.uniq` except that it accepts `iteratee` which is
31497 * invoked for each element in `array` to generate the criterion by which
31498 * uniqueness is computed. The order of result values is determined by the
31499 * order they occur in the array. The iteratee is invoked with one argument:
31506 * @param {Array} array The array to inspect.
31507 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
31508 * @returns {Array} Returns the new duplicate free array.
31511 * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
31514 * // The `_.property` iteratee shorthand.
31515 * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
31516 * // => [{ 'x': 1 }, { 'x': 2 }]
31518 function uniqBy(array, iteratee) {
31519 return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
31522 function operationReflectShort(selectedIDs, context) {
31523 return operationReflect(selectedIDs, context, 'short');
31527 function operationReflectLong(selectedIDs, context) {
31528 return operationReflect(selectedIDs, context, 'long');
31532 function operationReflect(selectedIDs, context, axis) {
31533 axis = axis || 'long';
31534 var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
31535 extent = selectedIDs.reduce(function(extent, id) {
31536 return extent.extend(context.entity(id).extent(context.graph()));
31537 }, geoExtent$$1());
31540 var operation = function() {
31541 var action = actionReflect(selectedIDs, context.projection)
31542 .useLongAxis(Boolean(axis === 'long'));
31543 context.perform(action, operation.annotation());
31547 operation.available = function() {
31548 var nodes = utilGetAllNodes(selectedIDs, context.graph());
31549 return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
31553 operation.disabled = function() {
31555 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31556 reason = 'too_large';
31557 } else if (some(selectedIDs, context.hasHiddenConnections)) {
31558 reason = 'connected_to_hidden';
31559 } else if (some(selectedIDs, incompleteRelation)) {
31560 reason = 'incomplete_relation';
31564 function incompleteRelation(id) {
31565 var entity = context.entity(id);
31566 return entity.type === 'relation' && !entity.isComplete(context.graph());
31571 operation.tooltip = function() {
31572 var disable = operation.disabled();
31574 t('operations.reflect.' + disable + '.' + multi) :
31575 t('operations.reflect.description.' + axis + '.' + multi);
31579 operation.annotation = function() {
31580 return t('operations.reflect.annotation.' + axis + '.' + multi);
31584 operation.id = 'reflect-' + axis;
31585 operation.keys = [t('operations.reflect.key.' + axis)];
31586 operation.title = t('operations.reflect.title.' + axis);
31587 operation.behavior = behaviorOperation(context).which(operation);
31592 function operationReverse(selectedIDs, context) {
31593 var entityId = selectedIDs[0];
31595 var operation = function() {
31596 context.perform(actionReverse(entityId), operation.annotation());
31600 operation.available = function() {
31601 return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
31605 operation.disabled = function() {
31610 operation.tooltip = function() {
31611 return t('operations.reverse.description');
31615 operation.annotation = function() {
31616 return t('operations.reverse.annotation');
31620 operation.id = 'reverse';
31621 operation.keys = [t('operations.reverse.key')];
31622 operation.title = t('operations.reverse.title');
31623 operation.behavior = behaviorOperation(context).which(operation);
31628 function operationRotate(selectedIDs, context) {
31629 var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
31630 extent = selectedIDs.reduce(function(extent, id) {
31631 return extent.extend(context.entity(id).extent(context.graph()));
31632 }, geoExtent$$1());
31635 var operation = function() {
31636 context.enter(modeRotate$$1(context, selectedIDs));
31640 operation.available = function() {
31641 var nodes = utilGetAllNodes(selectedIDs, context.graph());
31642 return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
31646 operation.disabled = function() {
31648 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
31649 reason = 'too_large';
31650 } else if (some(selectedIDs, context.hasHiddenConnections)) {
31651 reason = 'connected_to_hidden';
31652 } else if (some(selectedIDs, incompleteRelation)) {
31653 reason = 'incomplete_relation';
31657 function incompleteRelation(id) {
31658 var entity = context.entity(id);
31659 return entity.type === 'relation' && !entity.isComplete(context.graph());
31664 operation.tooltip = function() {
31665 var disable = operation.disabled();
31667 t('operations.rotate.' + disable + '.' + multi) :
31668 t('operations.rotate.description.' + multi);
31672 operation.annotation = function() {
31673 return selectedIDs.length === 1 ?
31674 t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
31675 t('operations.rotate.annotation.multiple');
31679 operation.id = 'rotate';
31680 operation.keys = [t('operations.rotate.key')];
31681 operation.title = t('operations.rotate.title');
31682 operation.behavior = behaviorOperation(context).which(operation);
31687 function operationSplit(selectedIDs, context) {
31688 var vertices = filter(selectedIDs, function(entityId) {
31689 return context.geometry(entityId) === 'vertex';
31692 var entityId = vertices[0],
31693 action = actionSplit(entityId),
31696 if (vertices.length === 1) {
31697 if (selectedIDs.length > 1) {
31698 action.limitWays(without(selectedIDs, entityId));
31700 ways = action.ways(context.graph());
31704 var operation = function() {
31705 var difference = context.perform(action, operation.annotation());
31706 context.enter(modeSelect(context, difference.extantIDs()));
31710 operation.available = function() {
31711 return vertices.length === 1;
31715 operation.disabled = function() {
31717 if (some(selectedIDs, context.hasHiddenConnections)) {
31718 reason = 'connected_to_hidden';
31720 return action.disabled(context.graph()) || reason;
31724 operation.tooltip = function() {
31725 var disable = operation.disabled();
31727 return t('operations.split.' + disable);
31729 if (ways.length === 1) {
31730 return t('operations.split.description.' + context.geometry(ways[0].id));
31732 return t('operations.split.description.multiple');
31737 operation.annotation = function() {
31738 return ways.length === 1 ?
31739 t('operations.split.annotation.' + context.geometry(ways[0].id)) :
31740 t('operations.split.annotation.multiple', { n: ways.length });
31744 operation.id = 'split';
31745 operation.keys = [t('operations.split.key')];
31746 operation.title = t('operations.split.title');
31747 operation.behavior = behaviorOperation(context).which(operation);
31752 function operationStraighten(selectedIDs, context) {
31753 var entityId = selectedIDs[0],
31754 action = actionStraighten(entityId, context.projection);
31757 function operation() {
31758 context.perform(action, operation.annotation());
31762 operation.available = function() {
31763 var entity = context.entity(entityId);
31764 return selectedIDs.length === 1 &&
31765 entity.type === 'way' &&
31766 !entity.isClosed() &&
31767 uniq(entity.nodes).length > 2;
31771 operation.disabled = function() {
31773 if (context.hasHiddenConnections(entityId)) {
31774 reason = 'connected_to_hidden';
31776 return action.disabled(context.graph()) || reason;
31780 operation.tooltip = function() {
31781 var disable = operation.disabled();
31783 t('operations.straighten.' + disable) :
31784 t('operations.straighten.description');
31788 operation.annotation = function() {
31789 return t('operations.straighten.annotation');
31793 operation.id = 'straighten';
31794 operation.keys = [t('operations.straighten.key')];
31795 operation.title = t('operations.straighten.title');
31796 operation.behavior = behaviorOperation(context).which(operation);
31803 var Operations = /*#__PURE__*/Object.freeze({
31804 operationCircularize: operationCircularize,
31805 operationContinue: operationContinue,
31806 operationDelete: operationDelete,
31807 operationDisconnect: operationDisconnect,
31808 operationMerge: operationMerge,
31809 operationMove: operationMove,
31810 operationOrthogonalize: operationOrthogonalize,
31811 operationReflectShort: operationReflectShort,
31812 operationReflectLong: operationReflectLong,
31813 operationReverse: operationReverse,
31814 operationRotate: operationRotate,
31815 operationSplit: operationSplit,
31816 operationStraighten: operationStraighten
31819 function modeMove$$1(context, entityIDs, baseGraph) {
31825 var keybinding = d3keybinding('move');
31827 behaviorEdit(context),
31828 operationCircularize(entityIDs, context).behavior,
31829 operationDelete(entityIDs, context).behavior,
31830 operationOrthogonalize(entityIDs, context).behavior,
31831 operationReflectLong(entityIDs, context).behavior,
31832 operationReflectShort(entityIDs, context).behavior,
31833 operationRotate(entityIDs, context).behavior
31835 var annotation = entityIDs.length === 1 ?
31836 t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
31837 t('operations.move.annotation.multiple');
31842 var _nudgeInterval;
31845 function doMove(nudge) {
31846 nudge = nudge || [0, 0];
31849 if (_prevGraph !== context.graph()) {
31851 _origin = context.map().mouseCoordinates();
31852 fn = context.perform;
31854 fn = context.overwrite;
31857 var currMouse = context.mouse();
31858 var origMouse = context.projection(_origin);
31859 var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
31861 fn(actionMove(entityIDs, delta, context.projection, _cache), annotation);
31862 _prevGraph = context.graph();
31866 function startNudge(nudge) {
31867 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
31868 _nudgeInterval = window.setInterval(function() {
31869 context.pan(nudge);
31875 function stopNudge() {
31876 if (_nudgeInterval) {
31877 window.clearInterval(_nudgeInterval);
31878 _nudgeInterval = null;
31885 var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
31894 function finish() {
31895 event.stopPropagation();
31896 context.enter(modeSelect(context, entityIDs));
31901 function cancel() {
31903 while (context.graph() !== baseGraph) context.pop();
31904 context.enter(modeBrowse(context));
31907 context.enter(modeSelect(context, entityIDs));
31913 function undone() {
31914 context.enter(modeBrowse(context));
31918 mode.enter = function() {
31919 _origin = context.map().mouseCoordinates();
31923 behaviors.forEach(function(behavior) {
31924 context.install(behavior);
31928 .on('mousemove.move', move)
31929 .on('click.move', finish);
31932 .on('undone.move', undone);
31943 mode.exit = function() {
31946 behaviors.forEach(function(behavior) {
31947 context.uninstall(behavior);
31951 .on('mousemove.move', null)
31952 .on('click.move', null);
31955 .on('undone.move', null);
31961 mode.selectedIDs = function() {
31962 if (!arguments.length) return entityIDs;
31971 function modeRotate$$1(context, entityIDs) {
31977 var keybinding = d3keybinding('rotate');
31979 behaviorEdit(context),
31980 operationCircularize(entityIDs, context).behavior,
31981 operationDelete(entityIDs, context).behavior,
31982 operationMove(entityIDs, context).behavior,
31983 operationOrthogonalize(entityIDs, context).behavior,
31984 operationReflectLong(entityIDs, context).behavior,
31985 operationReflectShort(entityIDs, context).behavior
31987 var annotation = entityIDs.length === 1 ?
31988 t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
31989 t('operations.rotate.annotation.multiple');
31993 var _prevTransform;
31997 function doRotate() {
31999 if (context.graph() !== _prevGraph) {
32000 fn = context.perform;
32002 fn = context.replace;
32005 // projection changed, recalculate _pivot
32006 var projection = context.projection;
32007 var currTransform = projection.transform();
32008 if (!_prevTransform ||
32009 currTransform.k !== _prevTransform.k ||
32010 currTransform.x !== _prevTransform.x ||
32011 currTransform.y !== _prevTransform.y) {
32013 var nodes = utilGetAllNodes(entityIDs, context.graph());
32014 var points = nodes.map(function(n) { return projection(n.loc); });
32016 if (points.length === 1) { // degenerate case
32017 _pivot = points[0];
32018 } else if (points.length === 2) {
32019 _pivot = geoVecInterp(points[0], points[1], 0.5);
32021 _pivot = d3_polygonCentroid(d3_polygonHull(points));
32023 _prevAngle = undefined;
32027 var currMouse = context.mouse();
32028 var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
32030 if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
32031 var delta = currAngle - _prevAngle;
32033 fn(actionRotate(entityIDs, _pivot, delta, projection), annotation);
32035 _prevTransform = currTransform;
32036 _prevAngle = currAngle;
32037 _prevGraph = context.graph();
32041 function finish() {
32042 event.stopPropagation();
32043 context.enter(modeSelect(context, entityIDs));
32047 function cancel() {
32049 context.enter(modeSelect(context, entityIDs));
32053 function undone() {
32054 context.enter(modeBrowse(context));
32058 mode.enter = function() {
32059 behaviors.forEach(function(behavior) {
32060 context.install(behavior);
32064 .on('mousemove.rotate', doRotate)
32065 .on('click.rotate', finish);
32068 .on('undone.rotate', undone);
32079 mode.exit = function() {
32080 behaviors.forEach(function(behavior) {
32081 context.uninstall(behavior);
32085 .on('mousemove.rotate', null)
32086 .on('click.rotate', null);
32089 .on('undone.rotate', null);
32095 mode.selectedIDs = function() {
32096 if (!arguments.length) return entityIDs;
32106 * A specialized version of `_.reduce` for arrays without support for
32107 * iteratee shorthands.
32110 * @param {Array} [array] The array to iterate over.
32111 * @param {Function} iteratee The function invoked per iteration.
32112 * @param {*} [accumulator] The initial value.
32113 * @param {boolean} [initAccum] Specify using the first element of `array` as
32114 * the initial value.
32115 * @returns {*} Returns the accumulated value.
32117 function arrayReduce(array, iteratee, accumulator, initAccum) {
32119 length = array == null ? 0 : array.length;
32121 if (initAccum && length) {
32122 accumulator = array[++index];
32124 while (++index < length) {
32125 accumulator = iteratee(accumulator, array[index], index, array);
32127 return accumulator;
32131 * The base implementation of `_.reduce` and `_.reduceRight`, without support
32132 * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
32135 * @param {Array|Object} collection The collection to iterate over.
32136 * @param {Function} iteratee The function invoked per iteration.
32137 * @param {*} accumulator The initial value.
32138 * @param {boolean} initAccum Specify using the first or last element of
32139 * `collection` as the initial value.
32140 * @param {Function} eachFunc The function to iterate over `collection`.
32141 * @returns {*} Returns the accumulated value.
32143 function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
32144 eachFunc(collection, function(value, index, collection) {
32145 accumulator = initAccum
32146 ? (initAccum = false, value)
32147 : iteratee(accumulator, value, index, collection);
32149 return accumulator;
32153 * Reduces `collection` to a value which is the accumulated result of running
32154 * each element in `collection` thru `iteratee`, where each successive
32155 * invocation is supplied the return value of the previous. If `accumulator`
32156 * is not given, the first element of `collection` is used as the initial
32157 * value. The iteratee is invoked with four arguments:
32158 * (accumulator, value, index|key, collection).
32160 * Many lodash methods are guarded to work as iteratees for methods like
32161 * `_.reduce`, `_.reduceRight`, and `_.transform`.
32163 * The guarded methods are:
32164 * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
32170 * @category Collection
32171 * @param {Array|Object} collection The collection to iterate over.
32172 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
32173 * @param {*} [accumulator] The initial value.
32174 * @returns {*} Returns the accumulated value.
32175 * @see _.reduceRight
32178 * _.reduce([1, 2], function(sum, n) {
32183 * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
32184 * (result[value] || (result[value] = [])).push(key);
32187 * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
32189 function reduce(collection, iteratee, accumulator) {
32190 var func = isArray(collection) ? arrayReduce : baseReduce,
32191 initAccum = arguments.length < 3;
32193 return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
32196 function d3geoTile() {
32197 var _size = [960, 500];
32199 var _scaleExtent = [0, 20];
32200 var _translate = [_size[0] / 2, _size[1] / 2];
32201 var _zoomDelta = 0;
32204 function bound(val) {
32205 return Math.min(_scaleExtent[1], Math.max(_scaleExtent[0], val));
32209 var z = Math.max(Math.log(_scale) / Math.LN2 - 8, 0);
32210 var z0 = bound(Math.round(z + _zoomDelta));
32211 var k = Math.pow(2, z - z0 + 8);
32213 (_translate[0] - _scale / 2) / k,
32214 (_translate[1] - _scale / 2) / k
32218 Math.max(0, Math.floor(-origin[0]) - _margin),
32219 Math.max(0, Math.ceil(_size[0] / k - origin[0]) + _margin)
32222 Math.max(0, Math.floor(-origin[1]) - _margin),
32223 Math.max(0, Math.ceil(_size[1] / k - origin[1]) + _margin)
32227 for (var i = 0; i < rows.length; i++) {
32229 for (var j = 0; j < cols.length; j++) {
32232 if (i >= _margin && i <= rows.length - _margin &&
32233 j >= _margin && j <= cols.length - _margin) {
32234 tiles.unshift([x, y, z0]); // tiles in view at beginning
32236 tiles.push([x, y, z0]); // tiles in margin at the end
32241 tiles.translate = origin;
32247 tile.scaleExtent = function(val) {
32248 if (!arguments.length) return _scaleExtent;
32249 _scaleExtent = val;
32253 tile.size = function(val) {
32254 if (!arguments.length) return _size;
32259 tile.scale = function(val) {
32260 if (!arguments.length) return _scale;
32265 tile.translate = function(val) {
32266 if (!arguments.length) return _translate;
32271 tile.zoomDelta = function(val) {
32272 if (!arguments.length) return _zoomDelta;
32277 // number to extend the rows/columns beyond those covering the viewport
32278 tile.margin = function(val) {
32279 if (!arguments.length) return _margin;
32287 function svgAreas$$1(projection, context) {
32288 // Patterns only work in Firefox when set directly on element.
32289 // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
32292 cemetery: 'cemetery',
32293 construction: 'construction',
32295 farmland: 'farmland',
32296 grave_yard: 'cemetery',
32298 military: 'construction',
32299 orchard: 'orchard',
32302 wetland: 'wetland',
32305 var patternKeys = ['landuse', 'natural', 'amenity'];
32308 function setPattern(d) {
32309 for (var i = 0; i < patternKeys.length; i++) {
32310 if (d.tags.building && d.tags.building !== 'no') continue;
32312 if (patterns.hasOwnProperty(d.tags[patternKeys[i]])) {
32313 this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[d.tags[patternKeys[i]]] + '")';
32317 this.style.fill = this.style.stroke = '';
32321 function drawTargets(selection, graph, entities, filter) {
32322 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
32323 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
32324 var getPath = svgPath(projection).geojson;
32325 var activeID = context.activeID();
32327 // The targets and nopes will be MultiLineString sub-segments of the ways
32328 var data = { targets: [], nopes: [] };
32330 entities.forEach(function(way) {
32331 var features = svgSegmentWay(way, graph, activeID);
32332 data.targets.push.apply(data.targets, features.passive);
32333 data.nopes.push.apply(data.nopes, features.active);
32337 // Targets allow hover and vertex snapping
32338 var targetData = data.targets.filter(getPath);
32339 var targets = selection.selectAll('.area.target-allowed')
32340 .filter(function(d) { return filter(d.properties.entity); })
32341 .data(targetData, function key(d) { return d.id; });
32351 .attr('d', getPath)
32352 .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
32356 var nopeData = data.nopes.filter(getPath);
32357 var nopes = selection.selectAll('.area.target-nope')
32358 .filter(function(d) { return filter(d.properties.entity); })
32359 .data(nopeData, function key(d) { return d.id; });
32369 .attr('d', getPath)
32370 .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
32374 function drawAreas(selection, graph, entities, filter) {
32375 var path = svgPath(projection, graph, true),
32379 for (var i = 0; i < entities.length; i++) {
32380 var entity = entities[i];
32381 if (entity.geometry(graph) !== 'area') continue;
32383 multipolygon = osmIsSimpleMultipolygonOuterMember(entity, graph);
32384 if (multipolygon) {
32385 areas[multipolygon.id] = {
32386 entity: multipolygon.mergeTags(entity.tags),
32387 area: Math.abs(entity.area(graph))
32389 } else if (!areas[entity.id]) {
32390 areas[entity.id] = {
32392 area: Math.abs(entity.area(graph))
32397 areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
32398 areas.sort(function areaSort(a, b) { return b.area - a.area; });
32399 areas = map$3(areas, 'entity');
32401 var strokes = areas.filter(function(area) {
32402 return area.type === 'way';
32412 var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath')
32414 .data(data.clip, osmEntity$$1.key);
32419 var clipPathsEnter = clipPaths.enter()
32420 .append('clipPath')
32421 .attr('class', 'clipPath')
32422 .attr('id', function(entity) { return entity.id + '-clippath'; });
32427 clipPaths.merge(clipPathsEnter)
32432 var layer = selection.selectAll('.layer-areas .layer-areas-areas');
32434 var areagroup = layer
32435 .selectAll('g.areagroup')
32436 .data(['fill', 'shadow', 'stroke']);
32438 areagroup = areagroup.enter()
32440 .attr('class', function(d) { return 'areagroup area-' + d; })
32443 var paths = areagroup
32446 .data(function(layer) { return data[layer]; }, osmEntity$$1.key);
32451 var fills = selection.selectAll('.area-fill path.area').nodes();
32453 var bisect = bisector(function(node) {
32454 return -node.__data__.area(graph);
32457 function sortedByArea(entity) {
32458 if (this._parent.__data__ === 'fill') {
32459 return fills[bisect(fills, -entity.area(graph))];
32463 paths = paths.enter()
32464 .insert('path', sortedByArea)
32466 .each(function(entity) {
32467 var layer = this.parentNode.__data__;
32469 this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
32471 if (layer === 'fill') {
32472 this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
32473 setPattern.apply(this, arguments);
32476 .call(svgTagClasses())
32481 selection.selectAll('.layer-areas .layer-areas-targets')
32482 .call(drawTargets, graph, data.stroke, filter);
32488 function svgDebug$$1(projection, context) {
32490 function multipolygons(imagery) {
32491 return imagery.map(function(data$$1) {
32493 type: 'MultiPolygon',
32494 coordinates: [ data$$1.polygon ]
32499 function drawDebug(selection$$1) {
32500 var showsTile = context.getDebug('tile');
32501 var showsCollision = context.getDebug('collision');
32502 var showsImagery = context.getDebug('imagery');
32503 var showsCommunity = context.getDebug('community');
32504 var showsImperial = context.getDebug('imperial');
32505 var showsDriveLeft = context.getDebug('driveLeft');
32506 var showsTouchTargets = context.getDebug('target');
32508 var debugData = [];
32510 debugData.push({ class: 'red', label: 'tile' });
32512 if (showsCollision) {
32513 debugData.push({ class: 'yellow', label: 'collision' });
32515 if (showsImagery) {
32516 debugData.push({ class: 'orange', label: 'imagery' });
32518 if (showsCommunity) {
32519 debugData.push({ class: 'blue', label: 'community' });
32521 if (showsImperial) {
32522 debugData.push({ class: 'cyan', label: 'imperial' });
32524 if (showsDriveLeft) {
32525 debugData.push({ class: 'green', label: 'driveLeft' });
32527 if (showsTouchTargets) {
32528 debugData.push({ class: 'pink', label: 'touchTargets' });
32532 var legend = select('#content')
32533 .selectAll('.debug-legend')
32534 .data(debugData.length ? [0] : []);
32539 legend = legend.enter()
32541 .attr('class', 'fillD debug-legend')
32545 var legendItems = legend.selectAll('.debug-legend-item')
32546 .data(debugData, function(d) { return d.label; });
32551 legendItems.enter()
32553 .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
32554 .text(function(d) { return d.label; });
32557 var layer = selection$$1.selectAll('.layer-debug')
32558 .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft ? [0] : []);
32563 layer = layer.enter()
32565 .attr('class', 'layer-debug')
32569 var extent = context.map().extent();
32570 var dataImagery = data.imagery || [];
32571 var availableImagery = showsImagery && multipolygons(dataImagery.filter(function(source) {
32572 if (!source.polygon) return false;
32573 return source.polygon.some(function(polygon) {
32574 return geoPolygonIntersectsPolygon(polygon, extent, true);
32578 var imagery = layer.selectAll('path.debug-imagery')
32579 .data(showsImagery ? availableImagery : []);
32586 .attr('class', 'debug-imagery debug orange');
32589 var community = layer.selectAll('path.debug-community')
32590 .data(showsCommunity ? values$1(data.community.features) : []);
32597 .attr('class', 'debug-community debug blue');
32600 var imperial = layer
32601 .selectAll('path.debug-imperial')
32602 .data(showsImperial ? [dataImperial] : []);
32609 .attr('class', 'debug-imperial debug cyan');
32612 var driveLeft = layer
32613 .selectAll('path.debug-drive-left')
32614 .data(showsDriveLeft ? [dataDriveLeft] : []);
32621 .attr('class', 'debug-drive-left debug green');
32625 layer.selectAll('path')
32626 .attr('d', svgPath(projection).geojson);
32630 // This looks strange because `enabled` methods on other layers are
32631 // chainable getter/setters, and this one is just a getter.
32632 drawDebug.enabled = function() {
32633 if (!arguments.length) {
32634 return context.getDebug('tile') ||
32635 context.getDebug('collision') ||
32636 context.getDebug('imagery') ||
32637 context.getDebug('imperial') ||
32638 context.getDebug('driveLeft') ||
32639 context.getDebug('target');
32650 A standalone SVG element that contains only a `defs` sub-element. To be
32651 used once globally, since defs IDs must be unique within a document.
32653 function svgDefs(context) {
32655 function drawDefs(selection$$1) {
32656 var defs = selection$$1.append('defs');
32661 .attr('id', 'oneway-marker')
32662 .attr('viewBox', '0 0 10 5')
32665 .attr('markerWidth', 2)
32666 .attr('markerHeight', 2)
32667 .attr('markerUnits', 'strokeWidth')
32668 .attr('orient', 'auto')
32670 .attr('class', 'oneway-marker-path')
32671 .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')
32672 .attr('stroke', 'none')
32673 .attr('fill', '#000')
32674 .attr('opacity', '0.75');
32678 .attr('id', 'viewfield-marker')
32679 .attr('viewBox', '0 0 16 16')
32682 .attr('markerWidth', 4)
32683 .attr('markerHeight', 4)
32684 .attr('markerUnits', 'strokeWidth')
32685 .attr('orient', 'auto')
32687 .attr('class', 'viewfield-marker-path')
32688 .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')
32689 .attr('fill', '#333')
32690 .attr('fill-opacity', '0.75')
32691 .attr('stroke', '#fff')
32692 .attr('stroke-width', '0.5px')
32693 .attr('stroke-opacity', '0.75');
32697 .attr('id', 'viewfield-marker-wireframe')
32698 .attr('viewBox', '0 0 16 16')
32701 .attr('markerWidth', 4)
32702 .attr('markerHeight', 4)
32703 .attr('markerUnits', 'strokeWidth')
32704 .attr('orient', 'auto')
32706 .attr('class', 'viewfield-marker-path')
32707 .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')
32708 .attr('fill', 'none')
32709 .attr('stroke', '#fff')
32710 .attr('stroke-width', '0.5px')
32711 .attr('stroke-opacity', '0.75');
32714 var patterns = defs.selectAll('pattern')
32716 // pattern name, pattern image name
32717 ['wetland', 'wetland'],
32718 ['construction', 'construction'],
32719 ['cemetery', 'cemetery'],
32720 ['orchard', 'orchard'],
32721 ['farmland', 'farmland'],
32728 .attr('id', function (d) { return 'pattern-' + d[0]; })
32730 .attr('height', 32)
32731 .attr('patternUnits', 'userSpaceOnUse');
32738 .attr('height', 32)
32739 .attr('class', function (d) { return 'pattern-color-' + d[0]; });
32746 .attr('height', 32)
32747 .attr('xlink:href', function (d) {
32748 return context.imagePath('pattern/' + d[1] + '.png');
32752 defs.selectAll('clipPath')
32753 .data([12, 18, 20, 32, 45])
32755 .append('clipPath')
32756 .attr('id', function (d) { return 'clip-square-' + d; })
32760 .attr('width', function (d) { return d; })
32761 .attr('height', function (d) { return d; });
32763 // add symbol spritesheets
32765 .call(drawDefs.addSprites, [
32766 'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'community-sprite'
32771 drawDefs.addSprites = function(selection$$1, ids) {
32772 var spritesheets = selection$$1.selectAll('.spritesheet');
32773 var currData = spritesheets.data();
32774 var data = uniq(currData.concat(ids));
32780 .attr('class', function(d) { return 'spritesheet spritesheet-' + d; })
32781 .each(function(d) {
32782 var url = context.imagePath(d + '.svg');
32783 var node = select(this).node();
32785 .mimeType('image/svg+xml')
32786 .response(function(xhr) { return xhr.responseXML; })
32787 .get(function(err, svg) {
32790 select(svg.documentElement).attr('id', d).node()
32801 * Checks if `value` is `undefined`.
32807 * @param {*} value The value to check.
32808 * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
32811 * _.isUndefined(void 0);
32814 * _.isUndefined(null);
32817 function isUndefined(value) {
32818 return value === undefined;
32821 //[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]
32822 //[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
32823 //[5] Name ::= NameStartChar (NameChar)*
32824 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
32825 var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
32826 var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
32827 //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
32828 //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(',')
32830 //S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
32831 //S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
32832 var S_TAG = 0;//tag name offerring
32833 var S_ATTR = 1;//attr name offerring
32834 var S_ATTR_SPACE=2;//attr name end and space offer
32835 var S_EQ = 3;//=space?
32836 var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
32837 var S_ATTR_END = 5;//attr value end and no space(quot end)
32838 var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
32839 var S_TAG_CLOSE = 7;//closed el<el />
32841 function XMLReader(){
32845 XMLReader.prototype = {
32846 parse:function(source,defaultNSMap,entityMap){
32847 var domBuilder = this.domBuilder;
32848 domBuilder.startDocument();
32849 _copy(defaultNSMap ,defaultNSMap = {});
32850 parse(source,defaultNSMap,entityMap,
32851 domBuilder,this.errorHandler);
32852 domBuilder.endDocument();
32855 function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
32856 function fixedFromCharCode(code) {
32857 // String.prototype.fromCharCode does not supports
32858 // > 2 bytes unicode chars directly
32859 if (code > 0xffff) {
32861 var surrogate1 = 0xd800 + (code >> 10)
32862 , surrogate2 = 0xdc00 + (code & 0x3ff);
32864 return String.fromCharCode(surrogate1, surrogate2);
32866 return String.fromCharCode(code);
32869 function entityReplacer(a){
32870 var k = a.slice(1,-1);
32871 if(k in entityMap){
32872 return entityMap[k];
32873 }else if(k.charAt(0) === '#'){
32874 return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
32876 errorHandler.error('entity not found:'+a);
32880 function appendText(end){//has some bugs
32882 var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
32883 locator&&position(start);
32884 domBuilder.characters(xt,0,end-start);
32888 function position(p,m){
32889 while(p>=lineEnd && (m = linePattern.exec(source))){
32890 lineStart = m.index;
32891 lineEnd = lineStart + m[0].length;
32892 locator.lineNumber++;
32893 //console.log('line++:',locator,startPos,endPos)
32895 locator.columnNumber = p-lineStart+1;
32899 var linePattern = /.*(?:\r\n?|\n)|.*$/g;
32900 var locator = domBuilder.locator;
32902 var parseStack = [{currentNSMap:defaultNSMapCopy}];
32907 var tagStart = source.indexOf('<',start);
32909 if(!source.substr(start).match(/^\s*$/)){
32910 var doc = domBuilder.doc;
32911 var text = doc.createTextNode(source.substr(start));
32912 doc.appendChild(text);
32913 domBuilder.currentElement = text;
32917 if(tagStart>start){
32918 appendText(tagStart);
32920 switch(source.charAt(tagStart+1)){
32922 var end = source.indexOf('>',tagStart+3);
32923 var tagName = source.substring(tagStart+2,end);
32924 var config = parseStack.pop();
32927 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
32928 //console.error('#@@@@@@'+tagName)
32929 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
32930 end = tagStart+1+tagName.length;
32931 }else if(tagName.match(/\s</)){
32932 tagName = tagName.replace(/[\s<].*/,'');
32933 errorHandler.error("end tag name: "+tagName+' maybe not complete');
32934 end = tagStart+1+tagName.length;
32936 //console.error(parseStack.length,parseStack)
32937 //console.error(config);
32938 var localNSMap = config.localNSMap;
32939 var endMatch = config.tagName == tagName;
32940 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
32941 if(endIgnoreCaseMach){
32942 domBuilder.endElement(config.uri,config.localName,tagName);
32944 for(var prefix in localNSMap){
32945 domBuilder.endPrefixMapping(prefix) ;
32949 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
32952 parseStack.push(config);
32958 case '?':// <?...?>
32959 locator&&position(tagStart);
32960 end = parseInstruction(source,tagStart,domBuilder);
32962 case '!':// <!doctype,<![CDATA,<!--
32963 locator&&position(tagStart);
32964 end = parseDCC(source,tagStart,domBuilder,errorHandler);
32967 locator&&position(tagStart);
32968 var el = new ElementAttributes();
32969 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
32971 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
32972 var len = el.length;
32975 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
32977 if(!entityMap.nbsp){
32978 errorHandler.warning('unclosed xml attribute');
32981 if(locator && len){
32982 var locator2 = copyLocator(locator,{});
32983 //try{//attribute position fixed
32984 for(var i = 0;i<len;i++){
32986 position(a.offset);
32987 a.locator = copyLocator(locator,{});
32989 //}catch(e){console.error('@@@@@'+e)}
32990 domBuilder.locator = locator2;
32991 if(appendElement(el,domBuilder,currentNSMap)){
32992 parseStack.push(el);
32994 domBuilder.locator = locator;
32996 if(appendElement(el,domBuilder,currentNSMap)){
32997 parseStack.push(el);
33003 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
33004 end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
33010 errorHandler.error('element parse error: '+e);
33011 //errorHandler.error('element parse error: '+e);
33018 //TODO: 这里有可能sax回退,有位置错误风险
33019 appendText(Math.max(tagStart,start)+1);
33023 function copyLocator(f,t){
33024 t.lineNumber = f.lineNumber;
33025 t.columnNumber = f.columnNumber;
33030 * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
33031 * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
33033 function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
33037 var s = S_TAG;//status
33039 var c = source.charAt(p);
33042 if(s === S_ATTR){//attrName
33043 attrName = source.slice(start,p);
33045 }else if(s === S_ATTR_SPACE){
33048 //fatalError: equal must after attrName or space after attrName
33049 throw new Error('attribute equal must after attrName');
33054 if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
33057 errorHandler.warning('attribute value must after "="');
33058 attrName = source.slice(start,p);
33061 p = source.indexOf(c,start);
33063 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
33064 el.add(attrName,value,start-1);
33067 //fatalError: no end quot match
33068 throw new Error('attribute value no end \''+c+'\' match');
33070 }else if(s == S_ATTR_NOQUOT_VALUE){
33071 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
33072 //console.log(attrName,value,start,p)
33073 el.add(attrName,value,start);
33075 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
33079 //fatalError: no equal before
33080 throw new Error('attribute value must after "="');
33086 el.setTagName(source.slice(start,p));
33092 case S_ATTR_NOQUOT_VALUE:
33098 throw new Error("attribute invalid close char('/')")
33101 case ''://end document
33102 //throw new Error('unexpected end of input')
33103 errorHandler.error('unexpected end of input');
33105 el.setTagName(source.slice(start,p));
33111 el.setTagName(source.slice(start,p));
33116 case S_ATTR_NOQUOT_VALUE://Compatible state
33118 value = source.slice(start,p);
33119 if(value.slice(-1) === '/'){
33121 value = value.slice(0,-1);
33124 if(s === S_ATTR_SPACE){
33127 if(s == S_ATTR_NOQUOT_VALUE){
33128 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
33129 el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
33131 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
33132 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
33134 el.add(value,value,start);
33138 throw new Error('attribute value missed!!');
33140 // console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
33142 /*xml space '\x20' | #x9 | #xD | #xA; */
33146 if(c<= ' '){//space
33149 el.setTagName(source.slice(start,p));//tagName
33153 attrName = source.slice(start,p);
33156 case S_ATTR_NOQUOT_VALUE:
33157 var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
33158 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
33159 el.add(attrName,value,start);
33163 //case S_TAG_SPACE:
33165 //case S_ATTR_SPACE:
33167 //case S_TAG_CLOSE:
33171 //S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
33172 //S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
33174 //case S_TAG:void();break;
33175 //case S_ATTR:void();break;
33176 //case S_ATTR_NOQUOT_VALUE:void();break;
33178 var tagName = el.tagName;
33179 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
33180 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
33182 el.add(attrName,attrName,start);
33187 errorHandler.warning('attribute space is required"'+attrName+'"!!');
33193 s = S_ATTR_NOQUOT_VALUE;
33197 throw new Error("elements closed character '/' and '>' must be connected to");
33200 }//end outer switch
33201 //console.log('p++',p)
33206 * @return true if has new namespace define
33208 function appendElement(el,domBuilder,currentNSMap){
33209 var tagName = el.tagName;
33210 var localNSMap = null;
33211 //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
33215 var qName = a.qName;
33216 var value = a.value;
33217 var nsp = qName.indexOf(':');
33219 var prefix = a.prefix = qName.slice(0,nsp);
33220 var localName = qName.slice(nsp+1);
33221 var nsPrefix = prefix === 'xmlns' && localName;
33225 nsPrefix = qName === 'xmlns' && '';
33227 //can not set prefix,because prefix !== ''
33228 a.localName = localName ;
33229 //prefix == null for no ns prefix attribute
33230 if(nsPrefix !== false){//hack!!
33231 if(localNSMap == null){
33233 //console.log(currentNSMap,0)
33234 _copy(currentNSMap,currentNSMap={});
33235 //console.log(currentNSMap,1)
33237 currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
33238 a.uri = 'http://www.w3.org/2000/xmlns/';
33239 domBuilder.startPrefixMapping(nsPrefix, value);
33245 var prefix = a.prefix;
33246 if(prefix){//no prefix attribute has no namespace
33247 if(prefix === 'xml'){
33248 a.uri = 'http://www.w3.org/XML/1998/namespace';
33249 }if(prefix !== 'xmlns'){
33250 a.uri = currentNSMap[prefix || ''];
33252 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
33256 var nsp = tagName.indexOf(':');
33258 prefix = el.prefix = tagName.slice(0,nsp);
33259 localName = el.localName = tagName.slice(nsp+1);
33261 prefix = null;//important!!
33262 localName = el.localName = tagName;
33264 //no prefix element has default namespace
33265 var ns = el.uri = currentNSMap[prefix || ''];
33266 domBuilder.startElement(ns,localName,tagName,el);
33267 //endPrefixMapping and startPrefixMapping have not any help for dom builder
33268 //localNSMap = null
33270 domBuilder.endElement(ns,localName,tagName);
33272 for(prefix in localNSMap){
33273 domBuilder.endPrefixMapping(prefix);
33277 el.currentNSMap = currentNSMap;
33278 el.localNSMap = localNSMap;
33279 //parseStack.push(el);
33283 function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
33284 if(/^(?:script|textarea)$/i.test(tagName)){
33285 var elEndStart = source.indexOf('</'+tagName+'>',elStartEnd);
33286 var text = source.substring(elStartEnd+1,elEndStart);
33287 if(/[&<]/.test(text)){
33288 if(/^script$/i.test(tagName)){
33289 //if(!/\]\]>/.test(text)){
33290 //lexHandler.startCDATA();
33291 domBuilder.characters(text,0,text.length);
33292 //lexHandler.endCDATA();
33295 }//}else{//text area
33296 text = text.replace(/&#?\w+;/g,entityReplacer);
33297 domBuilder.characters(text,0,text.length);
33303 return elStartEnd+1;
33305 function fixSelfClosed(source,elStartEnd,tagName,closeMap){
33306 //if(tagName in closeMap){
33307 var pos = closeMap[tagName];
33309 //console.log(tagName)
33310 pos = source.lastIndexOf('</'+tagName+'>');
33311 if(pos<elStartEnd){//忘记闭合
33312 pos = source.lastIndexOf('</'+tagName);
33314 closeMap[tagName] =pos;
33316 return pos<elStartEnd;
33319 function _copy(source,target){
33320 for(var n in source){target[n] = source[n];}
33322 function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
33323 var next= source.charAt(start+2);
33326 if(source.charAt(start + 3) === '-'){
33327 var end = source.indexOf('-->',start+4);
33328 //append comment source.substring(4,end)//<!--
33330 domBuilder.comment(source,start+4,end-start-4);
33333 errorHandler.error("Unclosed comment");
33341 if(source.substr(start+3,6) == 'CDATA['){
33342 var end = source.indexOf(']]>',start+9);
33343 domBuilder.startCDATA();
33344 domBuilder.characters(source,start+9,end-start-9);
33345 domBuilder.endCDATA();
33349 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId)
33350 var matchs = split(source,start);
33351 var len = matchs.length;
33352 if(len>1 && /!doctype/i.test(matchs[0][0])){
33353 var name = matchs[1][0];
33354 var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
33355 var sysid = len>4 && matchs[4][0];
33356 var lastMatch = matchs[len-1];
33357 domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
33358 sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
33359 domBuilder.endDTD();
33361 return lastMatch.index+lastMatch[0].length
33369 function parseInstruction(source,start,domBuilder){
33370 var end = source.indexOf('?>',start);
33372 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
33374 var len = match[0].length;
33375 domBuilder.processingInstruction(match[1], match[2]) ;
33387 function ElementAttributes(source){
33390 ElementAttributes.prototype = {
33391 setTagName:function(tagName){
33392 if(!tagNamePattern.test(tagName)){
33393 throw new Error('invalid tagName:'+tagName)
33395 this.tagName = tagName;
33397 add:function(qName,value,offset){
33398 if(!tagNamePattern.test(qName)){
33399 throw new Error('invalid attribute:'+qName)
33401 this[this.length++] = {qName:qName,value:value,offset:offset};
33404 getLocalName:function(i){return this[i].localName},
33405 getLocator:function(i){return this[i].locator},
33406 getQName:function(i){return this[i].qName},
33407 getURI:function(i){return this[i].uri},
33408 getValue:function(i){return this[i].value}
33409 // ,getIndex:function(uri, localName)){
33416 // getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
33417 // getType:function(uri,localName){}
33418 // getType:function(i){},
33424 function _set_proto_(thiz,parent){
33425 thiz.__proto__ = parent;
33428 if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
33429 _set_proto_ = function(thiz,parent){
33430 function p(){} p.prototype = parent;
33432 for(parent in thiz){
33433 p[parent] = thiz[parent];
33439 function split(source,start){
33442 var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
33443 reg.lastIndex = start;
33444 reg.exec(source);//skip <
33445 while(match = reg.exec(source)){
33447 if(match[1])return buf;
33451 var XMLReader_1 = XMLReader;
33454 XMLReader: XMLReader_1
33459 * Object DOMException
33460 * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
33461 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
33464 function copy$1(src,dest){
33470 ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
33471 ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
33473 function _extends(Class,Super){
33474 var pt = Class.prototype;
33476 var ppt = Object.create(Super.prototype);
33477 pt.__proto__ = ppt;
33479 if(!(pt instanceof Super)){
33480 function t(){} t.prototype = Super.prototype;
33483 Class.prototype = pt = t;
33485 if(pt.constructor != Class){
33486 if(typeof Class != 'function'){
33487 console.error("unknow Class:"+Class);
33489 pt.constructor = Class;
33492 var htmlns = 'http://www.w3.org/1999/xhtml' ;
33495 var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1;
33496 var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2;
33497 var TEXT_NODE = NodeType.TEXT_NODE = 3;
33498 var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4;
33499 var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5;
33500 var ENTITY_NODE = NodeType.ENTITY_NODE = 6;
33501 var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
33502 var COMMENT_NODE = NodeType.COMMENT_NODE = 8;
33503 var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9;
33504 var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10;
33505 var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11;
33506 var NOTATION_NODE = NodeType.NOTATION_NODE = 12;
33509 var ExceptionCode = {};
33510 var ExceptionMessage = {};
33511 var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]="Index size error"),1);
33512 var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]="DOMString size error"),2);
33513 var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]="Hierarchy request error"),3);
33514 var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]="Wrong document"),4);
33515 var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]="Invalid character"),5);
33516 var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]="No data allowed"),6);
33517 var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
33518 var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]="Not found"),8);
33519 var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]="Not supported"),9);
33520 var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]="Attribute in use"),10);
33522 var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = ((ExceptionMessage[11]="Invalid state"),11);
33523 var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12]="Syntax error"),12);
33524 var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = ((ExceptionMessage[13]="Invalid modification"),13);
33525 var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = ((ExceptionMessage[14]="Invalid namespace"),14);
33526 var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = ((ExceptionMessage[15]="Invalid access"),15);
33529 function DOMException(code, message) {
33530 if(message instanceof Error){
33531 var error = message;
33534 Error.call(this, ExceptionMessage[code]);
33535 this.message = ExceptionMessage[code];
33536 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
33539 if(message) this.message = this.message + ": " + message;
33541 }DOMException.prototype = Error.prototype;
33542 copy$1(ExceptionCode,DOMException);
33544 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
33545 * 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.
33546 * The items in the NodeList are accessible via an integral index, starting from 0.
33548 function NodeList() {
33549 }NodeList.prototype = {
33551 * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
33556 * 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.
33558 * @param index unsigned long
33559 * Index into the collection.
33561 * The node at the indexth position in the NodeList, or null if that is not a valid index.
33563 item: function(index) {
33564 return this[index] || null;
33566 toString:function(isHTML,nodeFilter){
33567 for(var buf = [], i = 0;i<this.length;i++){
33568 serializeToString(this[i],buf,isHTML,nodeFilter);
33570 return buf.join('');
33573 function LiveNodeList(node,refresh){
33575 this._refresh = refresh;
33576 _updateLiveList(this);
33578 function _updateLiveList(list){
33579 var inc = list._node._inc || list._node.ownerDocument._inc;
33580 if(list._inc != inc){
33581 var ls = list._refresh(list._node);
33582 //console.log(ls.length)
33583 __set__(list,'length',ls.length);
33588 LiveNodeList.prototype.item = function(i){
33589 _updateLiveList(this);
33593 _extends(LiveNodeList,NodeList);
33596 * 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.
33597 * NamedNodeMap objects in the DOM are live.
33598 * used for attributes or DocumentType entities
33600 function NamedNodeMap() {
33602 function _findNodeIndex(list,node){
33603 var i = list.length;
33605 if(list[i] === node){return i}
33609 function _addNamedNode(el,list,newAttr,oldAttr){
33611 list[_findNodeIndex(list,oldAttr)] = newAttr;
33613 list[list.length++] = newAttr;
33616 newAttr.ownerElement = el;
33617 var doc = el.ownerDocument;
33619 oldAttr && _onRemoveAttribute(doc,el,oldAttr);
33620 _onAddAttribute(doc,el,newAttr);
33624 function _removeNamedNode(el,list,attr){
33625 //console.log('remove attr:'+attr)
33626 var i = _findNodeIndex(list,attr);
33628 var lastIndex = list.length-1;
33629 while(i<lastIndex){
33630 list[i] = list[++i];
33632 list.length = lastIndex;
33634 var doc = el.ownerDocument;
33636 _onRemoveAttribute(doc,el,attr);
33637 attr.ownerElement = null;
33641 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
33644 NamedNodeMap.prototype = {
33646 item:NodeList.prototype.item,
33647 getNamedItem: function(key) {
33648 // if(key.indexOf(':')>0 || key == 'xmlns'){
33652 var i = this.length;
33654 var attr = this[i];
33655 //console.log(attr.nodeName,key)
33656 if(attr.nodeName == key){
33661 setNamedItem: function(attr) {
33662 var el = attr.ownerElement;
33663 if(el && el!=this._ownerElement){
33664 throw new DOMException(INUSE_ATTRIBUTE_ERR);
33666 var oldAttr = this.getNamedItem(attr.nodeName);
33667 _addNamedNode(this._ownerElement,this,attr,oldAttr);
33671 setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
33672 var el = attr.ownerElement, oldAttr;
33673 if(el && el!=this._ownerElement){
33674 throw new DOMException(INUSE_ATTRIBUTE_ERR);
33676 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
33677 _addNamedNode(this._ownerElement,this,attr,oldAttr);
33682 removeNamedItem: function(key) {
33683 var attr = this.getNamedItem(key);
33684 _removeNamedNode(this._ownerElement,this,attr);
33688 },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
33691 removeNamedItemNS:function(namespaceURI,localName){
33692 var attr = this.getNamedItemNS(namespaceURI,localName);
33693 _removeNamedNode(this._ownerElement,this,attr);
33696 getNamedItemNS: function(namespaceURI, localName) {
33697 var i = this.length;
33699 var node = this[i];
33700 if(node.localName == localName && node.namespaceURI == namespaceURI){
33708 * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
33710 function DOMImplementation(/* Object */ features) {
33711 this._features = {};
33713 for (var feature in features) {
33714 this._features = features[feature];
33718 DOMImplementation.prototype = {
33719 hasFeature: function(/* string */ feature, /* string */ version) {
33720 var versions = this._features[feature.toLowerCase()];
33721 if (versions && (!version || version in versions)) {
33727 // Introduced in DOM Level 2:
33728 createDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
33729 var doc = new Document();
33730 doc.implementation = this;
33731 doc.childNodes = new NodeList();
33732 doc.doctype = doctype;
33734 doc.appendChild(doctype);
33737 var root = doc.createElementNS(namespaceURI,qualifiedName);
33738 doc.appendChild(root);
33742 // Introduced in DOM Level 2:
33743 createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
33744 var node = new DocumentType();
33745 node.name = qualifiedName;
33746 node.nodeName = qualifiedName;
33747 node.publicId = publicId;
33748 node.systemId = systemId;
33749 // Introduced in DOM Level 2:
33750 //readonly attribute DOMString internalSubset;
33753 // readonly attribute NamedNodeMap entities;
33754 // readonly attribute NamedNodeMap notations;
33761 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
33764 function Node$2() {
33766 Node$2.prototype = {
33769 previousSibling : null,
33770 nextSibling : null,
33774 ownerDocument : null,
33776 namespaceURI : null,
33779 // Modified in DOM Level 2:
33780 insertBefore:function(newChild, refChild){//raises
33781 return _insertBefore(this,newChild,refChild);
33783 replaceChild:function(newChild, oldChild){//raises
33784 this.insertBefore(newChild,oldChild);
33786 this.removeChild(oldChild);
33789 removeChild:function(oldChild){
33790 return _removeChild(this,oldChild);
33792 appendChild:function(newChild){
33793 return this.insertBefore(newChild,null);
33795 hasChildNodes:function(){
33796 return this.firstChild != null;
33798 cloneNode:function(deep){
33799 return cloneNode(this.ownerDocument||this,this,deep);
33801 // Modified in DOM Level 2:
33802 normalize:function(){
33803 var child = this.firstChild;
33805 var next = child.nextSibling;
33806 if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
33807 this.removeChild(next);
33808 child.appendData(next.data);
33815 // Introduced in DOM Level 2:
33816 isSupported:function(feature, version){
33817 return this.ownerDocument.implementation.hasFeature(feature,version);
33819 // Introduced in DOM Level 2:
33820 hasAttributes:function(){
33821 return this.attributes.length>0;
33823 lookupPrefix:function(namespaceURI){
33826 var map = el._nsMap;
33830 if(map[n] == namespaceURI){
33835 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
33839 // Introduced in DOM Level 3:
33840 lookupNamespaceURI:function(prefix){
33843 var map = el._nsMap;
33847 return map[prefix] ;
33850 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
33854 // Introduced in DOM Level 3:
33855 isDefaultNamespace:function(namespaceURI){
33856 var prefix = this.lookupPrefix(namespaceURI);
33857 return prefix == null;
33862 function _xmlEncoder(c){
33863 return c == '<' && '<' ||
33864 c == '>' && '>' ||
33865 c == '&' && '&' ||
33866 c == '"' && '"' ||
33867 '&#'+c.charCodeAt()+';'
33871 copy$1(NodeType,Node$2);
33872 copy$1(NodeType,Node$2.prototype);
33875 * @param callback return true for continue,false for break
33876 * @return boolean true: break visit;
33878 function _visitNode(node,callback){
33879 if(callback(node)){
33882 if(node = node.firstChild){
33884 if(_visitNode(node,callback)){return true}
33885 }while(node=node.nextSibling)
33891 function Document(){
33893 function _onAddAttribute(doc,el,newAttr){
33895 var ns = newAttr.namespaceURI ;
33896 if(ns == 'http://www.w3.org/2000/xmlns/'){
33898 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
33901 function _onRemoveAttribute(doc,el,newAttr,remove){
33903 var ns = newAttr.namespaceURI ;
33904 if(ns == 'http://www.w3.org/2000/xmlns/'){
33906 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
33909 function _onUpdateChild(doc,el,newChild){
33910 if(doc && doc._inc){
33912 //update childNodes
33913 var cs = el.childNodes;
33915 cs[cs.length++] = newChild;
33918 var child = el.firstChild;
33922 child =child.nextSibling;
33933 * writeable properties:
33934 * nodeValue,Attr:value,CharacterData:data
33937 function _removeChild(parentNode,child){
33938 var previous = child.previousSibling;
33939 var next = child.nextSibling;
33941 previous.nextSibling = next;
33943 parentNode.firstChild = next;
33946 next.previousSibling = previous;
33948 parentNode.lastChild = previous;
33950 _onUpdateChild(parentNode.ownerDocument,parentNode);
33954 * preformance key(refChild == null)
33956 function _insertBefore(parentNode,newChild,nextChild){
33957 var cp = newChild.parentNode;
33959 cp.removeChild(newChild);//remove and update
33961 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
33962 var newFirst = newChild.firstChild;
33963 if (newFirst == null) {
33966 var newLast = newChild.lastChild;
33968 newFirst = newLast = newChild;
33970 var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
33972 newFirst.previousSibling = pre;
33973 newLast.nextSibling = nextChild;
33977 pre.nextSibling = newFirst;
33979 parentNode.firstChild = newFirst;
33981 if(nextChild == null){
33982 parentNode.lastChild = newLast;
33984 nextChild.previousSibling = newLast;
33987 newFirst.parentNode = parentNode;
33988 }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
33989 _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
33990 //console.log(parentNode.lastChild.nextSibling == null)
33991 if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
33992 newChild.firstChild = newChild.lastChild = null;
33996 function _appendSingleChild(parentNode,newChild){
33997 var cp = newChild.parentNode;
33999 var pre = parentNode.lastChild;
34000 cp.removeChild(newChild);//remove and update
34001 var pre = parentNode.lastChild;
34003 var pre = parentNode.lastChild;
34004 newChild.parentNode = parentNode;
34005 newChild.previousSibling = pre;
34006 newChild.nextSibling = null;
34008 pre.nextSibling = newChild;
34010 parentNode.firstChild = newChild;
34012 parentNode.lastChild = newChild;
34013 _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
34015 //console.log("__aa",parentNode.lastChild.nextSibling == null)
34017 Document.prototype = {
34018 //implementation : null,
34019 nodeName : '#document',
34020 nodeType : DOCUMENT_NODE,
34022 documentElement : null,
34025 insertBefore : function(newChild, refChild){//raises
34026 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
34027 var child = newChild.firstChild;
34029 var next = child.nextSibling;
34030 this.insertBefore(child,refChild);
34035 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
34036 this.documentElement = newChild;
34039 return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
34041 removeChild : function(oldChild){
34042 if(this.documentElement == oldChild){
34043 this.documentElement = null;
34045 return _removeChild(this,oldChild);
34047 // Introduced in DOM Level 2:
34048 importNode : function(importedNode,deep){
34049 return importNode(this,importedNode,deep);
34051 // Introduced in DOM Level 2:
34052 getElementById : function(id){
34054 _visitNode(this.documentElement,function(node){
34055 if(node.nodeType == ELEMENT_NODE){
34056 if(node.getAttribute('id') == id){
34065 //document factory method:
34066 createElement : function(tagName){
34067 var node = new Element();
34068 node.ownerDocument = this;
34069 node.nodeName = tagName;
34070 node.tagName = tagName;
34071 node.childNodes = new NodeList();
34072 var attrs = node.attributes = new NamedNodeMap();
34073 attrs._ownerElement = node;
34076 createDocumentFragment : function(){
34077 var node = new DocumentFragment();
34078 node.ownerDocument = this;
34079 node.childNodes = new NodeList();
34082 createTextNode : function(data){
34083 var node = new Text();
34084 node.ownerDocument = this;
34085 node.appendData(data);
34088 createComment : function(data){
34089 var node = new Comment();
34090 node.ownerDocument = this;
34091 node.appendData(data);
34094 createCDATASection : function(data){
34095 var node = new CDATASection();
34096 node.ownerDocument = this;
34097 node.appendData(data);
34100 createProcessingInstruction : function(target,data){
34101 var node = new ProcessingInstruction();
34102 node.ownerDocument = this;
34103 node.tagName = node.target = target;
34104 node.nodeValue= node.data = data;
34107 createAttribute : function(name){
34108 var node = new Attr();
34109 node.ownerDocument = this;
34111 node.nodeName = name;
34112 node.localName = name;
34113 node.specified = true;
34116 createEntityReference : function(name){
34117 var node = new EntityReference();
34118 node.ownerDocument = this;
34119 node.nodeName = name;
34122 // Introduced in DOM Level 2:
34123 createElementNS : function(namespaceURI,qualifiedName){
34124 var node = new Element();
34125 var pl = qualifiedName.split(':');
34126 var attrs = node.attributes = new NamedNodeMap();
34127 node.childNodes = new NodeList();
34128 node.ownerDocument = this;
34129 node.nodeName = qualifiedName;
34130 node.tagName = qualifiedName;
34131 node.namespaceURI = namespaceURI;
34132 if(pl.length == 2){
34133 node.prefix = pl[0];
34134 node.localName = pl[1];
34136 //el.prefix = null;
34137 node.localName = qualifiedName;
34139 attrs._ownerElement = node;
34142 // Introduced in DOM Level 2:
34143 createAttributeNS : function(namespaceURI,qualifiedName){
34144 var node = new Attr();
34145 var pl = qualifiedName.split(':');
34146 node.ownerDocument = this;
34147 node.nodeName = qualifiedName;
34148 node.name = qualifiedName;
34149 node.namespaceURI = namespaceURI;
34150 node.specified = true;
34151 if(pl.length == 2){
34152 node.prefix = pl[0];
34153 node.localName = pl[1];
34155 //el.prefix = null;
34156 node.localName = qualifiedName;
34161 _extends(Document,Node$2);
34164 function Element() {
34166 }Element.prototype = {
34167 nodeType : ELEMENT_NODE,
34168 hasAttribute : function(name){
34169 return this.getAttributeNode(name)!=null;
34171 getAttribute : function(name){
34172 var attr = this.getAttributeNode(name);
34173 return attr && attr.value || '';
34175 getAttributeNode : function(name){
34176 return this.attributes.getNamedItem(name);
34178 setAttribute : function(name, value){
34179 var attr = this.ownerDocument.createAttribute(name);
34180 attr.value = attr.nodeValue = "" + value;
34181 this.setAttributeNode(attr);
34183 removeAttribute : function(name){
34184 var attr = this.getAttributeNode(name);
34185 attr && this.removeAttributeNode(attr);
34188 //four real opeartion method
34189 appendChild:function(newChild){
34190 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
34191 return this.insertBefore(newChild,null);
34193 return _appendSingleChild(this,newChild);
34196 setAttributeNode : function(newAttr){
34197 return this.attributes.setNamedItem(newAttr);
34199 setAttributeNodeNS : function(newAttr){
34200 return this.attributes.setNamedItemNS(newAttr);
34202 removeAttributeNode : function(oldAttr){
34203 //console.log(this == oldAttr.ownerElement)
34204 return this.attributes.removeNamedItem(oldAttr.nodeName);
34206 //get real attribute name,and remove it by removeAttributeNode
34207 removeAttributeNS : function(namespaceURI, localName){
34208 var old = this.getAttributeNodeNS(namespaceURI, localName);
34209 old && this.removeAttributeNode(old);
34212 hasAttributeNS : function(namespaceURI, localName){
34213 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
34215 getAttributeNS : function(namespaceURI, localName){
34216 var attr = this.getAttributeNodeNS(namespaceURI, localName);
34217 return attr && attr.value || '';
34219 setAttributeNS : function(namespaceURI, qualifiedName, value){
34220 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
34221 attr.value = attr.nodeValue = "" + value;
34222 this.setAttributeNode(attr);
34224 getAttributeNodeNS : function(namespaceURI, localName){
34225 return this.attributes.getNamedItemNS(namespaceURI, localName);
34228 getElementsByTagName : function(tagName){
34229 return new LiveNodeList(this,function(base){
34231 _visitNode(base,function(node){
34232 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
34239 getElementsByTagNameNS : function(namespaceURI, localName){
34240 return new LiveNodeList(this,function(base){
34242 _visitNode(base,function(node){
34243 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
34252 Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
34253 Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
34256 _extends(Element,Node$2);
34258 }Attr.prototype.nodeType = ATTRIBUTE_NODE;
34259 _extends(Attr,Node$2);
34262 function CharacterData() {
34263 }CharacterData.prototype = {
34265 substringData : function(offset, count) {
34266 return this.data.substring(offset, offset+count);
34268 appendData: function(text) {
34269 text = this.data+text;
34270 this.nodeValue = this.data = text;
34271 this.length = text.length;
34273 insertData: function(offset,text) {
34274 this.replaceData(offset,0,text);
34277 appendChild:function(newChild){
34278 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
34280 deleteData: function(offset, count) {
34281 this.replaceData(offset,count,"");
34283 replaceData: function(offset, count, text) {
34284 var start = this.data.substring(0,offset);
34285 var end = this.data.substring(offset+count);
34286 text = start + text + end;
34287 this.nodeValue = this.data = text;
34288 this.length = text.length;
34291 _extends(CharacterData,Node$2);
34293 }Text.prototype = {
34294 nodeName : "#text",
34295 nodeType : TEXT_NODE,
34296 splitText : function(offset) {
34297 var text = this.data;
34298 var newText = text.substring(offset);
34299 text = text.substring(0, offset);
34300 this.data = this.nodeValue = text;
34301 this.length = text.length;
34302 var newNode = this.ownerDocument.createTextNode(newText);
34303 if(this.parentNode){
34304 this.parentNode.insertBefore(newNode, this.nextSibling);
34309 _extends(Text,CharacterData);
34310 function Comment() {
34311 }Comment.prototype = {
34312 nodeName : "#comment",
34313 nodeType : COMMENT_NODE
34315 _extends(Comment,CharacterData);
34317 function CDATASection() {
34318 }CDATASection.prototype = {
34319 nodeName : "#cdata-section",
34320 nodeType : CDATA_SECTION_NODE
34322 _extends(CDATASection,CharacterData);
34325 function DocumentType() {
34326 }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
34327 _extends(DocumentType,Node$2);
34329 function Notation() {
34330 }Notation.prototype.nodeType = NOTATION_NODE;
34331 _extends(Notation,Node$2);
34333 function Entity() {
34334 }Entity.prototype.nodeType = ENTITY_NODE;
34335 _extends(Entity,Node$2);
34337 function EntityReference() {
34338 }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
34339 _extends(EntityReference,Node$2);
34341 function DocumentFragment() {
34342 }DocumentFragment.prototype.nodeName = "#document-fragment";
34343 DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
34344 _extends(DocumentFragment,Node$2);
34347 function ProcessingInstruction() {
34349 ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
34350 _extends(ProcessingInstruction,Node$2);
34351 function XMLSerializer$1(){}
34352 XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
34353 return nodeSerializeToString.call(node,isHtml,nodeFilter);
34355 Node$2.prototype.toString = nodeSerializeToString;
34356 function nodeSerializeToString(isHtml,nodeFilter){
34358 var refNode = this.nodeType == 9?this.documentElement:this;
34359 var prefix = refNode.prefix;
34360 var uri = refNode.namespaceURI;
34362 if(uri && prefix == null){
34363 //console.log(prefix)
34364 var prefix = refNode.lookupPrefix(uri);
34365 if(prefix == null){
34367 var visibleNamespaces=[
34368 {namespace:uri,prefix:null}
34369 //{namespace:uri,prefix:''}
34373 serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
34374 //console.log('###',this.nodeType,uri,prefix,buf.join(''))
34375 return buf.join('');
34377 function needNamespaceDefine(node,isHTML, visibleNamespaces) {
34378 var prefix = node.prefix||'';
34379 var uri = node.namespaceURI;
34380 if (!prefix && !uri){
34383 if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace"
34384 || uri == 'http://www.w3.org/2000/xmlns/'){
34388 var i = visibleNamespaces.length;
34389 //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
34391 var ns = visibleNamespaces[i];
34392 // get namespace prefix
34393 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
34394 if (ns.prefix == prefix){
34395 return ns.namespace != uri;
34398 //console.log(isHTML,uri,prefix=='')
34399 //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
34402 //node.flag = '11111'
34403 //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
34406 function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
34408 node = nodeFilter(node);
34410 if(typeof node == 'string'){
34417 //buf.sort.apply(attrs, attributeSorter);
34419 switch(node.nodeType){
34421 if (!visibleNamespaces) visibleNamespaces = [];
34422 var startVisibleNamespaces = visibleNamespaces.length;
34423 var attrs = node.attributes;
34424 var len = attrs.length;
34425 var child = node.firstChild;
34426 var nodeName = node.tagName;
34428 isHTML = (htmlns === node.namespaceURI) ||isHTML;
34429 buf.push('<',nodeName);
34433 for(var i=0;i<len;i++){
34434 // add namespaces for attributes
34435 var attr = attrs.item(i);
34436 if (attr.prefix == 'xmlns') {
34437 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
34438 }else if(attr.nodeName == 'xmlns'){
34439 visibleNamespaces.push({ prefix: '', namespace: attr.value });
34442 for(var i=0;i<len;i++){
34443 var attr = attrs.item(i);
34444 if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
34445 var prefix = attr.prefix||'';
34446 var uri = attr.namespaceURI;
34447 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
34448 buf.push(ns, '="' , uri , '"');
34449 visibleNamespaces.push({ prefix: prefix, namespace:uri });
34451 serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
34453 // add namespace for current node
34454 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
34455 var prefix = node.prefix||'';
34456 var uri = node.namespaceURI;
34457 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
34458 buf.push(ns, '="' , uri , '"');
34459 visibleNamespaces.push({ prefix: prefix, namespace:uri });
34462 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
34464 //if is cdata child node
34465 if(isHTML && /^script$/i.test(nodeName)){
34468 buf.push(child.data);
34470 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
34472 child = child.nextSibling;
34477 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
34478 child = child.nextSibling;
34481 buf.push('</',nodeName,'>');
34485 // remove added visible namespaces
34486 //visibleNamespaces.length = startVisibleNamespaces;
34488 case DOCUMENT_NODE:
34489 case DOCUMENT_FRAGMENT_NODE:
34490 var child = node.firstChild;
34492 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
34493 child = child.nextSibling;
34496 case ATTRIBUTE_NODE:
34497 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
34499 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
34500 case CDATA_SECTION_NODE:
34501 return buf.push( '<![CDATA[',node.data,']]>');
34503 return buf.push( "<!--",node.data,"-->");
34504 case DOCUMENT_TYPE_NODE:
34505 var pubid = node.publicId;
34506 var sysid = node.systemId;
34507 buf.push('<!DOCTYPE ',node.name);
34509 buf.push(' PUBLIC "',pubid);
34510 if (sysid && sysid!='.') {
34511 buf.push( '" "',sysid);
34514 }else if(sysid && sysid!='.'){
34515 buf.push(' SYSTEM "',sysid,'">');
34517 var sub = node.internalSubset;
34519 buf.push(" [",sub,"]");
34524 case PROCESSING_INSTRUCTION_NODE:
34525 return buf.push( "<?",node.target," ",node.data,"?>");
34526 case ENTITY_REFERENCE_NODE:
34527 return buf.push( '&',node.nodeName,';');
34528 //case ENTITY_NODE:
34529 //case NOTATION_NODE:
34531 buf.push('??',node.nodeName);
34534 function importNode(doc,node,deep){
34536 switch (node.nodeType) {
34538 node2 = node.cloneNode(false);
34539 node2.ownerDocument = doc;
34540 //var attrs = node2.attributes;
34541 //var len = attrs.length;
34542 //for(var i=0;i<len;i++){
34543 //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
34545 case DOCUMENT_FRAGMENT_NODE:
34547 case ATTRIBUTE_NODE:
34550 //case ENTITY_REFERENCE_NODE:
34551 //case PROCESSING_INSTRUCTION_NODE:
34552 ////case TEXT_NODE:
34553 //case CDATA_SECTION_NODE:
34554 //case COMMENT_NODE:
34557 //case DOCUMENT_NODE:
34558 //case DOCUMENT_TYPE_NODE:
34559 //cannot be imported.
34560 //case ENTITY_NODE:
34561 //case NOTATION_NODE:
34562 //can not hit in level3
34566 node2 = node.cloneNode(false);//false
34568 node2.ownerDocument = doc;
34569 node2.parentNode = null;
34571 var child = node.firstChild;
34573 node2.appendChild(importNode(doc,child,deep));
34574 child = child.nextSibling;
34580 //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
34581 // attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
34582 function cloneNode(doc,node,deep){
34583 var node2 = new node.constructor();
34584 for(var n in node){
34586 if(typeof v != 'object' ){
34592 if(node.childNodes){
34593 node2.childNodes = new NodeList();
34595 node2.ownerDocument = doc;
34596 switch (node2.nodeType) {
34598 var attrs = node.attributes;
34599 var attrs2 = node2.attributes = new NamedNodeMap();
34600 var len = attrs.length;
34601 attrs2._ownerElement = node2;
34602 for(var i=0;i<len;i++){
34603 node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
34606 case ATTRIBUTE_NODE:
34610 var child = node.firstChild;
34612 node2.appendChild(cloneNode(doc,child,deep));
34613 child = child.nextSibling;
34619 function __set__(object,key,value){
34620 object[key] = value;
34624 if(Object.defineProperty){
34625 Object.defineProperty(LiveNodeList.prototype,'length',{
34627 _updateLiveList(this);
34628 return this.$$length;
34631 Object.defineProperty(Node$2.prototype,'textContent',{
34633 return getTextContent(this);
34635 set:function(data){
34636 switch(this.nodeType){
34638 case DOCUMENT_FRAGMENT_NODE:
34639 while(this.firstChild){
34640 this.removeChild(this.firstChild);
34642 if(data || String(data)){
34643 this.appendChild(this.ownerDocument.createTextNode(data));
34650 this.nodeValue = data;
34655 function getTextContent(node){
34656 switch(node.nodeType){
34658 case DOCUMENT_FRAGMENT_NODE:
34660 node = node.firstChild;
34662 if(node.nodeType!==7 && node.nodeType !==8){
34663 buf.push(getTextContent(node));
34665 node = node.nextSibling;
34667 return buf.join('');
34669 return node.nodeValue;
34672 __set__ = function(object,key,value){
34673 //console.log(value)
34674 object['$$'+key] = value;
34680 //if(typeof require == 'function'){
34681 var DOMImplementation_1 = DOMImplementation;
34682 var XMLSerializer_1 = XMLSerializer$1;
34686 DOMImplementation: DOMImplementation_1,
34687 XMLSerializer: XMLSerializer_1
34690 var domParser = createCommonjsModule(function (module, exports) {
34691 function DOMParser(options){
34692 this.options = options ||{locator:{}};
34695 DOMParser.prototype.parseFromString = function(source,mimeType){
34696 var options = this.options;
34697 var sax$$1 = new XMLReader();
34698 var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
34699 var errorHandler = options.errorHandler;
34700 var locator = options.locator;
34701 var defaultNSMap = options.xmlns||{};
34702 var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
34704 domBuilder.setDocumentLocator(locator);
34707 sax$$1.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
34708 sax$$1.domBuilder = options.domBuilder || domBuilder;
34709 if(/\/x?html?$/.test(mimeType)){
34710 entityMap.nbsp = '\xa0';
34711 entityMap.copy = '\xa9';
34712 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
34714 defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
34716 sax$$1.parse(source,defaultNSMap,entityMap);
34718 sax$$1.errorHandler.error("invalid doc source");
34720 return domBuilder.doc;
34722 function buildErrorHandler(errorImpl,domBuilder,locator){
34724 if(domBuilder instanceof DOMHandler){
34727 errorImpl = domBuilder ;
34729 var errorHandler = {};
34730 var isCallback = errorImpl instanceof Function;
34731 locator = locator||{};
34732 function build(key){
34733 var fn = errorImpl[key];
34734 if(!fn && isCallback){
34735 fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
34737 errorHandler[key] = fn && function(msg){
34738 fn('[xmldom '+key+']\t'+msg+_locator(locator));
34743 build('fatalError');
34744 return errorHandler;
34747 //console.log('#\n\n\n\n\n\n\n####')
34749 * +ContentHandler+ErrorHandler
34750 * +LexicalHandler+EntityResolver2
34751 * -DeclHandler-DTDHandler
34753 * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
34754 * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
34755 * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
34757 function DOMHandler() {
34758 this.cdata = false;
34760 function position(locator,node){
34761 node.lineNumber = locator.lineNumber;
34762 node.columnNumber = locator.columnNumber;
34765 * @see org.xml.sax.ContentHandler#startDocument
34766 * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
34768 DOMHandler.prototype = {
34769 startDocument : function() {
34770 this.doc = new DOMImplementation().createDocument(null, null, null);
34771 if (this.locator) {
34772 this.doc.documentURI = this.locator.systemId;
34775 startElement:function(namespaceURI, localName, qName, attrs) {
34776 var doc = this.doc;
34777 var el = doc.createElementNS(namespaceURI, qName||localName);
34778 var len = attrs.length;
34779 appendElement(this, el);
34780 this.currentElement = el;
34782 this.locator && position(this.locator,el);
34783 for (var i = 0 ; i < len; i++) {
34784 var namespaceURI = attrs.getURI(i);
34785 var value = attrs.getValue(i);
34786 var qName = attrs.getQName(i);
34787 var attr = doc.createAttributeNS(namespaceURI, qName);
34788 this.locator &&position(attrs.getLocator(i),attr);
34789 attr.value = attr.nodeValue = value;
34790 el.setAttributeNode(attr);
34793 endElement:function(namespaceURI, localName, qName) {
34794 var current = this.currentElement;
34795 var tagName = current.tagName;
34796 this.currentElement = current.parentNode;
34798 startPrefixMapping:function(prefix, uri) {
34800 endPrefixMapping:function(prefix) {
34802 processingInstruction:function(target, data) {
34803 var ins = this.doc.createProcessingInstruction(target, data);
34804 this.locator && position(this.locator,ins);
34805 appendElement(this, ins);
34807 ignorableWhitespace:function(ch, start, length) {
34809 characters:function(chars, start, length) {
34810 chars = _toString.apply(this,arguments);
34811 //console.log(chars)
34814 var charNode = this.doc.createCDATASection(chars);
34816 var charNode = this.doc.createTextNode(chars);
34818 if(this.currentElement){
34819 this.currentElement.appendChild(charNode);
34820 }else if(/^\s*$/.test(chars)){
34821 this.doc.appendChild(charNode);
34824 this.locator && position(this.locator,charNode);
34827 skippedEntity:function(name) {
34829 endDocument:function() {
34830 this.doc.normalize();
34832 setDocumentLocator:function (locator) {
34833 if(this.locator = locator){// && !('lineNumber' in locator)){
34834 locator.lineNumber = 0;
34838 comment:function(chars, start, length) {
34839 chars = _toString.apply(this,arguments);
34840 var comm = this.doc.createComment(chars);
34841 this.locator && position(this.locator,comm);
34842 appendElement(this, comm);
34845 startCDATA:function() {
34846 //used in characters() methods
34849 endCDATA:function() {
34850 this.cdata = false;
34853 startDTD:function(name, publicId, systemId) {
34854 var impl = this.doc.implementation;
34855 if (impl && impl.createDocumentType) {
34856 var dt = impl.createDocumentType(name, publicId, systemId);
34857 this.locator && position(this.locator,dt);
34858 appendElement(this, dt);
34862 * @see org.xml.sax.ErrorHandler
34863 * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
34865 warning:function(error) {
34866 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
34868 error:function(error) {
34869 console.error('[xmldom error]\t'+error,_locator(this.locator));
34871 fatalError:function(error) {
34872 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
34876 function _locator(l){
34878 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
34881 function _toString(chars,start,length){
34882 if(typeof chars == 'string'){
34883 return chars.substr(start,length)
34884 }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
34885 if(chars.length >= start+length || start){
34886 return new java.lang.String(chars,start,length)+'';
34893 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
34894 * used method of org.xml.sax.ext.LexicalHandler:
34895 * #comment(chars, start, length)
34898 * #startDTD(name, publicId, systemId)
34901 * IGNORED method of org.xml.sax.ext.LexicalHandler:
34903 * #startEntity(name)
34907 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
34908 * IGNORED method of org.xml.sax.ext.DeclHandler
34909 * #attributeDecl(eName, aName, type, mode, value)
34910 * #elementDecl(name, model)
34911 * #externalEntityDecl(name, publicId, systemId)
34912 * #internalEntityDecl(name, value)
34913 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
34914 * IGNORED method of org.xml.sax.EntityResolver2
34915 * #resolveEntity(String name,String publicId,String baseURI,String systemId)
34916 * #resolveEntity(publicId, systemId)
34917 * #getExternalSubset(name, baseURI)
34918 * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
34919 * IGNORED method of org.xml.sax.DTDHandler
34920 * #notationDecl(name, publicId, systemId) {};
34921 * #unparsedEntityDecl(name, publicId, systemId, notationName) {};
34923 "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
34924 DOMHandler.prototype[key] = function(){return null};
34927 /* 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 */
34928 function appendElement (hander,node) {
34929 if (!hander.currentElement) {
34930 hander.doc.appendChild(node);
34932 hander.currentElement.appendChild(node);
34934 }//appendChild and setAttributeNS are preformance key
34936 //if(typeof require == 'function'){
34937 var XMLReader = sax.XMLReader;
34938 var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
34939 exports.XMLSerializer = dom.XMLSerializer ;
34940 exports.DOMParser = DOMParser;
34943 var domParser_1 = domParser.DOMImplementation;
34944 var domParser_2 = domParser.XMLSerializer;
34945 var domParser_3 = domParser.DOMParser;
34947 var togeojson = createCommonjsModule(function (module, exports) {
34948 var toGeoJSON = (function() {
34950 var removeSpace = /\s*/g,
34951 trimSpace = /^\s*|\s*$/g,
34952 splitSpace = /\s+/;
34953 // generate a short, numeric hash of a string
34954 function okhash(x) {
34955 if (!x || !x.length) return 0;
34956 for (var i = 0, h = 0; i < x.length; i++) {
34957 h = ((h << 5) - h) + x.charCodeAt(i) | 0;
34960 // all Y children of X
34961 function get(x, y) { return x.getElementsByTagName(y); }
34962 function attr(x, y) { return x.getAttribute(y); }
34963 function attrf(x, y) { return parseFloat(attr(x, y)); }
34964 // one Y child of X, if any, otherwise null
34965 function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
34966 // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
34967 function norm(el) { if (el.normalize) { el.normalize(); } return el; }
34968 // cast array x into numbers
34969 function numarray(x) {
34970 for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
34973 // get the content of a text node, if any
34974 function nodeVal(x) {
34975 if (x) { norm(x); }
34976 return (x && x.textContent) || '';
34978 // get the contents of multiple text nodes, if present
34979 function getMulti(x, ys) {
34981 for (k = 0; k < ys.length; k++) {
34982 n = get1(x, ys[k]);
34983 if (n) o[ys[k]] = nodeVal(n);
34987 // add properties of Y to X, overwriting if present in both
34988 function extend(x, y) { for (var k in y) x[k] = y[k]; }
34989 // get one coordinate from a coordinate array, if any
34990 function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
34991 // get all coordinates from a coordinate array as [[],[]]
34992 function coord(v) {
34993 var coords = v.replace(trimSpace, '').split(splitSpace),
34995 for (var i = 0; i < coords.length; i++) {
34996 o.push(coord1(coords[i]));
35000 function coordPair(x) {
35001 var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
35002 ele = get1(x, 'ele'),
35003 // handle namespaced attribute in browser
35004 heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
35005 time = get1(x, 'time'),
35008 e = parseFloat(nodeVal(ele));
35015 time: time ? nodeVal(time) : null,
35016 heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
35020 // create a new feature collection parent object
35023 type: 'FeatureCollection',
35029 if (typeof XMLSerializer !== 'undefined') {
35030 /* istanbul ignore next */
35031 serializer = new XMLSerializer();
35032 // only require xmldom in a node environment
35033 } else if (typeof process === 'object' && !process.browser) {
35034 serializer = new (domParser.XMLSerializer)();
35036 function xml2str(str) {
35037 // IE9 will create a new XMLSerializer but it'll crash immediately.
35038 // This line is ignored because we don't run coverage tests in IE9
35039 /* istanbul ignore next */
35040 if (str.xml !== undefined) return str.xml;
35041 return serializer.serializeToString(str);
35045 kml: function(doc) {
35048 // styleindex keeps track of hashed styles in order to match features
35049 styleIndex = {}, styleByHash = {},
35050 // stylemapindex keeps track of style maps to expose in properties
35051 styleMapIndex = {},
35052 // atomic geospatial types supported by KML - MultiGeometry is
35053 // handled separately
35054 geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
35055 // all root placemarks in the file
35056 placemarks = get(doc, 'Placemark'),
35057 styles = get(doc, 'Style'),
35058 styleMaps = get(doc, 'StyleMap');
35060 for (var k = 0; k < styles.length; k++) {
35061 var hash = okhash(xml2str(styles[k])).toString(16);
35062 styleIndex['#' + attr(styles[k], 'id')] = hash;
35063 styleByHash[hash] = styles[k];
35065 for (var l = 0; l < styleMaps.length; l++) {
35066 styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
35067 var pairs = get(styleMaps[l], 'Pair');
35069 for (var m = 0; m < pairs.length; m++) {
35070 pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
35072 styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
35075 for (var j = 0; j < placemarks.length; j++) {
35076 gj.features = gj.features.concat(getPlacemark(placemarks[j]));
35078 function kmlColor(v) {
35079 var color, opacity;
35081 if (v.substr(0, 1) === '#') { v = v.substr(1); }
35082 if (v.length === 6 || v.length === 3) { color = v; }
35083 if (v.length === 8) {
35084 opacity = parseInt(v.substr(0, 2), 16) / 255;
35085 color = '#' + v.substr(6, 2) +
35089 return [color, isNaN(opacity) ? undefined : opacity];
35091 function gxCoord(v) { return numarray(v.split(' ')); }
35092 function gxCoords(root) {
35093 var elems = get(root, 'coord', 'gx'), coords = [], times = [];
35094 if (elems.length === 0) elems = get(root, 'gx:coord');
35095 for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
35096 var timeElems = get(root, 'when');
35097 for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
35103 function getGeometry(root) {
35104 var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
35105 if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
35106 if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
35107 if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
35108 for (i = 0; i < geotypes.length; i++) {
35109 geomNodes = get(root, geotypes[i]);
35111 for (j = 0; j < geomNodes.length; j++) {
35112 geomNode = geomNodes[j];
35113 if (geotypes[i] === 'Point') {
35116 coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
35118 } else if (geotypes[i] === 'LineString') {
35120 type: 'LineString',
35121 coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
35123 } else if (geotypes[i] === 'Polygon') {
35124 var rings = get(geomNode, 'LinearRing'),
35126 for (k = 0; k < rings.length; k++) {
35127 coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
35131 coordinates: coords
35133 } else if (geotypes[i] === 'Track' ||
35134 geotypes[i] === 'gx:Track') {
35135 var track = gxCoords(geomNode);
35137 type: 'LineString',
35138 coordinates: track.coords
35140 if (track.times.length) coordTimes.push(track.times);
35147 coordTimes: coordTimes
35150 function getPlacemark(root) {
35151 var geomsAndTimes = getGeometry(root), i, properties = {},
35152 name = nodeVal(get1(root, 'name')),
35153 address = nodeVal(get1(root, 'address')),
35154 styleUrl = nodeVal(get1(root, 'styleUrl')),
35155 description = nodeVal(get1(root, 'description')),
35156 timeSpan = get1(root, 'TimeSpan'),
35157 timeStamp = get1(root, 'TimeStamp'),
35158 extendedData = get1(root, 'ExtendedData'),
35159 lineStyle = get1(root, 'LineStyle'),
35160 polyStyle = get1(root, 'PolyStyle'),
35161 visibility = get1(root, 'visibility');
35163 if (!geomsAndTimes.geoms.length) return [];
35164 if (name) properties.name = name;
35165 if (address) properties.address = address;
35167 if (styleUrl[0] !== '#') {
35168 styleUrl = '#' + styleUrl;
35171 properties.styleUrl = styleUrl;
35172 if (styleIndex[styleUrl]) {
35173 properties.styleHash = styleIndex[styleUrl];
35175 if (styleMapIndex[styleUrl]) {
35176 properties.styleMapHash = styleMapIndex[styleUrl];
35177 properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
35179 // Try to populate the lineStyle or polyStyle since we got the style hash
35180 var style = styleByHash[properties.styleHash];
35182 if (!lineStyle) lineStyle = get1(style, 'LineStyle');
35183 if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
35186 if (description) properties.description = description;
35188 var begin = nodeVal(get1(timeSpan, 'begin'));
35189 var end = nodeVal(get1(timeSpan, 'end'));
35190 properties.timespan = { begin: begin, end: end };
35193 properties.timestamp = nodeVal(get1(timeStamp, 'when'));
35196 var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
35197 color = linestyles[0],
35198 opacity = linestyles[1],
35199 width = parseFloat(nodeVal(get1(lineStyle, 'width')));
35200 if (color) properties.stroke = color;
35201 if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
35202 if (!isNaN(width)) properties['stroke-width'] = width;
35205 var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
35206 pcolor = polystyles[0],
35207 popacity = polystyles[1],
35208 fill = nodeVal(get1(polyStyle, 'fill')),
35209 outline = nodeVal(get1(polyStyle, 'outline'));
35210 if (pcolor) properties.fill = pcolor;
35211 if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
35212 if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
35213 if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
35215 if (extendedData) {
35216 var datas = get(extendedData, 'Data'),
35217 simpleDatas = get(extendedData, 'SimpleData');
35219 for (i = 0; i < datas.length; i++) {
35220 properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
35222 for (i = 0; i < simpleDatas.length; i++) {
35223 properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
35227 properties.visibility = nodeVal(visibility);
35229 if (geomsAndTimes.coordTimes.length) {
35230 properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
35231 geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
35235 geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
35236 type: 'GeometryCollection',
35237 geometries: geomsAndTimes.geoms
35239 properties: properties
35241 if (attr(root, 'id')) feature.id = attr(root, 'id');
35246 gpx: function(doc) {
35248 tracks = get(doc, 'trk'),
35249 routes = get(doc, 'rte'),
35250 waypoints = get(doc, 'wpt'),
35251 // a feature collection
35254 for (i = 0; i < tracks.length; i++) {
35255 feature = getTrack(tracks[i]);
35256 if (feature) gj.features.push(feature);
35258 for (i = 0; i < routes.length; i++) {
35259 feature = getRoute(routes[i]);
35260 if (feature) gj.features.push(feature);
35262 for (i = 0; i < waypoints.length; i++) {
35263 gj.features.push(getPoint(waypoints[i]));
35265 function getPoints(node, pointname) {
35266 var pts = get(node, pointname),
35271 if (l < 2) return {}; // Invalid line in GeoJSON
35272 for (var i = 0; i < l; i++) {
35273 var c = coordPair(pts[i]);
35274 line.push(c.coordinates);
35275 if (c.time) times.push(c.time);
35276 if (c.heartRate) heartRates.push(c.heartRate);
35281 heartRates: heartRates
35284 function getTrack(node) {
35285 var segments = get(node, 'trkseg'),
35290 for (var i = 0; i < segments.length; i++) {
35291 line = getPoints(segments[i], 'trkpt');
35293 if (line.line) track.push(line.line);
35294 if (line.times && line.times.length) times.push(line.times);
35295 if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
35298 if (track.length === 0) return;
35299 var properties = getProperties(node);
35300 extend(properties, getLineStyle(get1(node, 'extensions')));
35301 if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
35302 if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
35305 properties: properties,
35307 type: track.length === 1 ? 'LineString' : 'MultiLineString',
35308 coordinates: track.length === 1 ? track[0] : track
35312 function getRoute(node) {
35313 var line = getPoints(node, 'rtept');
35314 if (!line.line) return;
35315 var prop = getProperties(node);
35316 extend(prop, getLineStyle(get1(node, 'extensions')));
35321 type: 'LineString',
35322 coordinates: line.line
35327 function getPoint(node) {
35328 var prop = getProperties(node);
35329 extend(prop, getMulti(node, ['sym']));
35335 coordinates: coordPair(node).coordinates
35339 function getLineStyle(extensions) {
35342 var lineStyle = get1(extensions, 'line');
35344 var color = nodeVal(get1(lineStyle, 'color')),
35345 opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
35346 width = parseFloat(nodeVal(get1(lineStyle, 'width')));
35347 if (color) style.stroke = color;
35348 if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
35349 // GPX width is in mm, convert to px with 96 px per inch
35350 if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
35355 function getProperties(node) {
35356 var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
35357 links = get(node, 'link');
35358 if (links.length) prop.links = [];
35359 for (var i = 0, link; i < links.length; i++) {
35360 link = { href: attr(links[i], 'href') };
35361 extend(link, getMulti(links[i], ['text', 'type']));
35362 prop.links.push(link);
35372 module.exports = toGeoJSON;
35375 var _initialized = false;
35376 var _enabled = false;
35380 function svgGpx$$1(projection$$1, context, dispatch) {
35381 var _showLabels = true;
35382 var detected = utilDetect();
35388 if (_initialized) return; // run once
35394 event.stopPropagation();
35395 event.preventDefault();
35396 event.dataTransfer.dropEffect = 'copy';
35400 .attr('dropzone', 'copy')
35401 .on('drop.localgpx', function() {
35402 event.stopPropagation();
35403 event.preventDefault();
35404 if (!detected.filedrop) return;
35405 drawGpx.files(event.dataTransfer.files);
35407 .on('dragenter.localgpx', over)
35408 .on('dragexit.localgpx', over)
35409 .on('dragover.localgpx', over);
35411 _initialized = true;
35415 function drawGpx(selection$$1) {
35416 var getPath = svgPath(projection$$1).geojson;
35418 layer = selection$$1.selectAll('.layer-gpx')
35419 .data(_enabled ? [0] : []);
35424 layer = layer.enter()
35426 .attr('class', 'layer-gpx')
35437 paths = paths.enter()
35439 .attr('class', 'gpx')
35443 .attr('d', getPath);
35446 var labelData = _showLabels && _geojson.features ? _geojson.features : [];
35447 labelData = labelData.filter(getPath);
35450 .call(drawLabels, 'gpxlabel-halo', labelData)
35451 .call(drawLabels, 'gpxlabel', labelData);
35454 function drawLabels(selection$$1, textClass, data) {
35455 var labels = selection$$1.selectAll('text.' + textClass)
35463 labels = labels.enter()
35465 .attr('class', textClass)
35467 .text(function(d) {
35468 if (d.properties) {
35469 return d.properties.desc || d.properties.name;
35473 .attr('x', function(d) {
35474 var centroid = getPath.centroid(d);
35475 return centroid[0] + 11;
35477 .attr('y', function(d) {
35478 var centroid = getPath.centroid(d);
35479 return centroid[1];
35485 function toDom(x) {
35486 return (new DOMParser()).parseFromString(x, 'text/xml');
35490 function getExtension(fileName) {
35491 if (isUndefined(fileName)) {
35495 var lastDotIndex = fileName.lastIndexOf('.');
35496 if (lastDotIndex < 0) {
35500 return fileName.substr(lastDotIndex);
35504 function parseSaveAndZoom(extension, data) {
35505 switch (extension) {
35507 drawGpx.geojson(togeojson.gpx(toDom(data))).fitZoom();
35510 drawGpx.geojson(togeojson.kml(toDom(data))).fitZoom();
35514 drawGpx.geojson(JSON.parse(data)).fitZoom();
35520 drawGpx.showLabels = function(_) {
35521 if (!arguments.length) return _showLabels;
35527 drawGpx.enabled = function(_) {
35528 if (!arguments.length) return _enabled;
35530 dispatch.call('change');
35535 drawGpx.hasGpx = function() {
35536 return (!(isEmpty(_geojson) || isEmpty(_geojson.features)));
35540 drawGpx.geojson = function(gj) {
35541 if (!arguments.length) return _geojson;
35542 if (isEmpty(gj) || isEmpty(gj.features)) return this;
35544 dispatch.call('change');
35549 drawGpx.url = function(url) {
35550 d3_text(url, function(err, data) {
35553 var extension = getExtension(url);
35554 parseSaveAndZoom(extension, data);
35561 drawGpx.files = function(fileList) {
35562 if (!fileList.length) return this;
35563 var f = fileList[0],
35564 reader = new FileReader();
35566 reader.onload = (function(file) {
35568 var extension = getExtension(file.name);
35569 return function (e) {
35570 parseSaveAndZoom(extension, e.target.result);
35574 reader.readAsText(f);
35579 drawGpx.getSrc = function () {
35584 drawGpx.fitZoom = function() {
35585 if (!this.hasGpx()) return this;
35587 var map = context.map();
35588 var viewport = map.trimmedExtent().polygon();
35589 var coords = reduce(_geojson.features, function(coords, feature) {
35590 var c = feature.geometry.coordinates;
35592 /* eslint-disable no-fallthrough */
35593 switch (feature.geometry.type) {
35600 case 'MultiPolygon':
35603 case 'MultiLineString':
35607 /* eslint-enable no-fallthrough */
35609 return union(coords, c);
35612 if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
35613 var extent = geoExtent$$1(d3_geoBounds({ type: 'LineString', coordinates: coords }));
35614 map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
35625 function svgIcon(name, svgklass, useklass) {
35626 return function drawIcon(selection) {
35627 selection.selectAll('svg')
35631 .attr('class', 'icon ' + (svgklass || ''))
35633 .attr('xlink:href', name)
35634 .attr('class', useklass);
35638 /** Error message constants. */
35639 var FUNC_ERROR_TEXT$3 = 'Expected a function';
35642 * Creates a throttled function that only invokes `func` at most once per
35643 * every `wait` milliseconds. The throttled function comes with a `cancel`
35644 * method to cancel delayed `func` invocations and a `flush` method to
35645 * immediately invoke them. Provide `options` to indicate whether `func`
35646 * should be invoked on the leading and/or trailing edge of the `wait`
35647 * timeout. The `func` is invoked with the last arguments provided to the
35648 * throttled function. Subsequent calls to the throttled function return the
35649 * result of the last `func` invocation.
35651 * **Note:** If `leading` and `trailing` options are `true`, `func` is
35652 * invoked on the trailing edge of the timeout only if the throttled function
35653 * is invoked more than once during the `wait` timeout.
35655 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
35656 * until to the next tick, similar to `setTimeout` with a timeout of `0`.
35658 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
35659 * for details over the differences between `_.throttle` and `_.debounce`.
35664 * @category Function
35665 * @param {Function} func The function to throttle.
35666 * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
35667 * @param {Object} [options={}] The options object.
35668 * @param {boolean} [options.leading=true]
35669 * Specify invoking on the leading edge of the timeout.
35670 * @param {boolean} [options.trailing=true]
35671 * Specify invoking on the trailing edge of the timeout.
35672 * @returns {Function} Returns the new throttled function.
35675 * // Avoid excessively updating the position while scrolling.
35676 * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
35678 * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
35679 * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
35680 * jQuery(element).on('click', throttled);
35682 * // Cancel the trailing throttled invocation.
35683 * jQuery(window).on('popstate', throttled.cancel);
35685 function throttle(func, wait, options) {
35686 var leading = true,
35689 if (typeof func != 'function') {
35690 throw new TypeError(FUNC_ERROR_TEXT$3);
35692 if (isObject(options)) {
35693 leading = 'leading' in options ? !!options.leading : leading;
35694 trailing = 'trailing' in options ? !!options.trailing : trailing;
35696 return debounce(func, wait, {
35697 'leading': leading,
35699 'trailing': trailing
35703 function svgLabels(projection$$1, context) {
35704 var path = d3_geoPath(projection$$1);
35705 var detected = utilDetect();
35706 var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
35707 var _rdrawn = rbush_1();
35708 var _rskipped = rbush_1();
35709 var _textWidthCache = {};
35710 var _entitybboxes = {};
35712 // Listed from highest to lowest priority
35714 ['line', 'aeroway', '*', 12],
35715 ['line', 'highway', 'motorway', 12],
35716 ['line', 'highway', 'trunk', 12],
35717 ['line', 'highway', 'primary', 12],
35718 ['line', 'highway', 'secondary', 12],
35719 ['line', 'highway', 'tertiary', 12],
35720 ['line', 'highway', '*', 12],
35721 ['line', 'railway', '*', 12],
35722 ['line', 'waterway', '*', 12],
35723 ['area', 'aeroway', '*', 12],
35724 ['area', 'amenity', '*', 12],
35725 ['area', 'building', '*', 12],
35726 ['area', 'historic', '*', 12],
35727 ['area', 'leisure', '*', 12],
35728 ['area', 'man_made', '*', 12],
35729 ['area', 'natural', '*', 12],
35730 ['area', 'shop', '*', 12],
35731 ['area', 'tourism', '*', 12],
35732 ['area', 'camp_site', '*', 12],
35733 ['point', 'aeroway', '*', 10],
35734 ['point', 'amenity', '*', 10],
35735 ['point', 'building', '*', 10],
35736 ['point', 'historic', '*', 10],
35737 ['point', 'leisure', '*', 10],
35738 ['point', 'man_made', '*', 10],
35739 ['point', 'natural', '*', 10],
35740 ['point', 'shop', '*', 10],
35741 ['point', 'tourism', '*', 10],
35742 ['point', 'camp_site', '*', 10],
35743 ['line', 'name', '*', 12],
35744 ['area', 'name', '*', 12],
35745 ['point', 'name', '*', 10]
35749 function blacklisted(preset) {
35750 var noIcons = ['building', 'landuse', 'natural'];
35751 return some(noIcons, function(s) {
35752 return preset.id.indexOf(s) >= 0;
35757 function get(array, prop) {
35758 return function(d, i) { return array[i][prop]; };
35762 function textWidth(text, size, elem) {
35763 var c = _textWidthCache[size];
35764 if (!c) c = _textWidthCache[size] = {};
35770 c[text] = elem.getComputedTextLength();
35774 var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
35775 if (str === null) {
35776 return size / 3 * 2 * text.length;
35778 return size / 3 * (2 * text.length + str.length);
35784 function drawLinePaths(selection, entities, filter, classes, labels) {
35785 var paths = selection.selectAll('path')
35787 .data(entities, osmEntity$$1.key);
35796 .style('stroke-width', get(labels, 'font-size'))
35797 .attr('id', function(d) { return 'labelpath-' + d.id; })
35798 .attr('class', classes)
35800 .attr('d', get(labels, 'lineString'));
35804 function drawLineLabels(selection, entities, filter, classes, labels) {
35805 var texts = selection.selectAll('text.' + classes)
35807 .data(entities, osmEntity$$1.key);
35816 .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
35817 .attr('dy', baselineHack ? '0.35em' : null)
35818 .append('textPath')
35819 .attr('class', 'textpath');
35822 selection.selectAll('text.' + classes).selectAll('.textpath')
35824 .data(entities, osmEntity$$1.key)
35825 .attr('startOffset', '50%')
35826 .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
35827 .text(utilDisplayNameForPath);
35831 function drawPointLabels(selection, entities, filter, classes, labels) {
35832 var texts = selection.selectAll('text.' + classes)
35834 .data(entities, osmEntity$$1.key);
35843 .attr('class', function(d, i) {
35844 return classes + ' ' + labels[i].classes + ' ' + d.id;
35847 .attr('x', get(labels, 'x'))
35848 .attr('y', get(labels, 'y'))
35849 .style('text-anchor', get(labels, 'textAnchor'))
35850 .text(utilDisplayName)
35851 .each(function(d, i) {
35852 textWidth(utilDisplayName(d), labels[i].height, this);
35857 function drawAreaLabels(selection, entities, filter, classes, labels) {
35858 entities = entities.filter(hasText);
35859 labels = labels.filter(hasText);
35860 drawPointLabels(selection, entities, filter, classes, labels);
35862 function hasText(d, i) {
35863 return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
35868 function drawAreaIcons(selection, entities, filter, classes, labels) {
35869 var icons = selection.selectAll('use.' + classes)
35871 .data(entities, osmEntity$$1.key);
35880 .attr('class', 'icon ' + classes)
35881 .attr('width', '17px')
35882 .attr('height', '17px')
35884 .attr('transform', get(labels, 'transform'))
35885 .attr('xlink:href', function(d) {
35886 var preset = context.presets().match(d, context.graph());
35887 var picon = preset && preset.icon;
35892 var isMaki = /^maki-/.test(picon);
35893 return '#' + picon + (isMaki ? '-15' : '');
35899 function drawCollisionBoxes(selection, rtree, which) {
35900 var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
35903 if (context.getDebug('collision')) {
35904 gj = rtree.all().map(function(d) {
35905 return { type: 'Polygon', coordinates: [[
35915 var boxes = selection.selectAll('.' + which)
35925 .attr('class', classes)
35927 .attr('d', d3_geoPath());
35931 function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
35932 var wireframe = context.surface().classed('fill-wireframe');
35933 var zoom = geoScaleToZoom(projection$$1.scale());
35935 var labelable = [];
35936 var renderNodeAs = {};
35937 var i, j, k, entity, geometry;
35939 for (i = 0; i < labelStack.length; i++) {
35940 labelable.push([]);
35946 _entitybboxes = {};
35949 for (i = 0; i < entities.length; i++) {
35950 entity = entities[i];
35952 .concat(_entitybboxes[entity.id] || [])
35953 .concat(_entitybboxes[entity.id + 'I'] || []);
35955 for (j = 0; j < toRemove.length; j++) {
35956 _rdrawn.remove(toRemove[j]);
35957 _rskipped.remove(toRemove[j]);
35962 // Loop through all the entities to do some preprocessing
35963 for (i = 0; i < entities.length; i++) {
35964 entity = entities[i];
35965 geometry = entity.geometry(graph);
35967 // Insert collision boxes around interesting points/vertices
35968 if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
35969 var hasDirections = entity.directions(graph, projection$$1).length;
35972 if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
35973 renderNodeAs[entity.id] = 'point';
35974 markerPadding = 20; // extra y for marker height
35976 renderNodeAs[entity.id] = 'vertex';
35980 var coord = projection$$1(entity.loc);
35981 var nodePadding = 10;
35983 minX: coord[0] - nodePadding,
35984 minY: coord[1] - nodePadding - markerPadding,
35985 maxX: coord[0] + nodePadding,
35986 maxY: coord[1] + nodePadding
35989 doInsert(bbox, entity.id + 'P');
35992 // From here on, treat vertices like points
35993 if (geometry === 'vertex') {
35994 geometry = 'point';
35997 // Determine which entities are label-able
35998 var preset = geometry === 'area' && context.presets().match(entity, graph);
35999 var icon = preset && !blacklisted(preset) && preset.icon;
36001 if (!icon && !utilDisplayName(entity))
36004 for (k = 0; k < labelStack.length; k++) {
36005 var matchGeom = labelStack[k][0];
36006 var matchKey = labelStack[k][1];
36007 var matchVal = labelStack[k][2];
36008 var hasVal = entity.tags[matchKey];
36010 if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
36011 labelable[k].push(entity);
36029 // Try and find a valid label for labellable entities
36030 for (k = 0; k < labelable.length; k++) {
36031 var fontSize = labelStack[k][3];
36033 for (i = 0; i < labelable[k].length; i++) {
36034 entity = labelable[k][i];
36035 geometry = entity.geometry(graph);
36037 var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
36038 var name = getName(entity);
36039 var width = name && textWidth(name, fontSize);
36042 if (geometry === 'point' || geometry === 'vertex') {
36043 // no point or vertex labels in wireframe mode
36044 // no vertex labels at low zooms (vertices have no icons)
36045 if (wireframe) continue;
36046 var renderAs = renderNodeAs[entity.id];
36047 if (renderAs === 'vertex' && zoom < 17) continue;
36049 p = getPointLabel(entity, width, fontSize, renderAs);
36051 } else if (geometry === 'line') {
36052 p = getLineLabel(entity, width, fontSize);
36054 } else if (geometry === 'area') {
36055 p = getAreaLabel(entity, width, fontSize);
36059 if (geometry === 'vertex') { geometry = 'point'; } // treat vertex like point
36060 p.classes = geometry + ' tag-' + labelStack[k][1];
36061 positions[geometry].push(p);
36062 labelled[geometry].push(entity);
36068 function isInterestingVertex(entity) {
36069 var selectedIDs = context.selectedIDs();
36071 return entity.hasInterestingTags() ||
36072 entity.isEndpoint(graph) ||
36073 entity.isConnected(graph) ||
36074 selectedIDs.indexOf(entity.id) !== -1 ||
36075 some(graph.parentWays(entity), function(parent) {
36076 return selectedIDs.indexOf(parent.id) !== -1;
36081 function getPointLabel(entity, width, height, geometry) {
36082 var y = (geometry === 'point' ? -12 : 0);
36083 var pointOffsets = {
36084 ltr: [15, y, 'start'],
36085 rtl: [-15, y, 'end']
36088 var coord = projection$$1(entity.loc);
36089 var textPadding = 2;
36090 var offset = pointOffsets[textDirection];
36094 x: coord[0] + offset[0],
36095 y: coord[1] + offset[1],
36096 textAnchor: offset[2]
36099 // insert a collision box for the text label..
36101 if (textDirection === 'rtl') {
36103 minX: p.x - width - textPadding,
36104 minY: p.y - (height / 2) - textPadding,
36105 maxX: p.x + textPadding,
36106 maxY: p.y + (height / 2) + textPadding
36110 minX: p.x - textPadding,
36111 minY: p.y - (height / 2) - textPadding,
36112 maxX: p.x + width + textPadding,
36113 maxY: p.y + (height / 2) + textPadding
36117 if (tryInsert([bbox], entity.id, true)) {
36123 function getLineLabel(entity, width, height) {
36124 var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
36125 var points = map$3(graph.childNodes(entity), 'loc').map(projection$$1);
36126 var length = geoPathLength(points);
36128 if (length < width + 20) return;
36130 // todo: properly clip points to viewport
36132 // % along the line to attempt to place the label
36133 var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
36134 25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
36137 for (var i = 0; i < lineOffsets.length; i++) {
36138 var offset = lineOffsets[i];
36139 var middle = offset / 100 * length;
36140 var start = middle - width / 2;
36142 if (start < 0 || start + width > length) continue;
36144 // generate subpath and ignore paths that are invalid or don't cross viewport.
36145 var sub = subpath(points, start, start + width);
36146 if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
36150 var isReverse = reverse(sub);
36152 sub = sub.reverse();
36156 var boxsize = (height + 2) / 2;
36158 for (var j = 0; j < sub.length - 1; j++) {
36160 var b = sub[j + 1];
36162 // split up the text into small collision boxes
36163 var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
36165 for (var box = 0; box < num; box++) {
36166 var p = geoVecInterp(a, b, box / num);
36167 var x0 = p[0] - boxsize - padding;
36168 var y0 = p[1] - boxsize - padding;
36169 var x1 = p[0] + boxsize + padding;
36170 var y1 = p[1] + boxsize + padding;
36173 minX: Math.min(x0, x1),
36174 minY: Math.min(y0, y1),
36175 maxX: Math.max(x0, x1),
36176 maxY: Math.max(y0, y1)
36181 if (tryInsert(bboxes, entity.id, false)) { // accept this one
36183 'font-size': height + 2,
36184 lineString: lineString(sub),
36185 startOffset: offset + '%'
36190 function reverse(p) {
36191 var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
36192 return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
36195 function lineString(points) {
36196 return 'M' + points.join('L');
36199 function subpath(points, from, to) {
36201 var start, end, i0, i1;
36203 for (var i = 0; i < points.length - 1; i++) {
36205 var b = points[i + 1];
36206 var current = geoVecLength(a, b);
36208 if (!start && sofar + current >= from) {
36209 portion = (from - sofar) / current;
36211 a[0] + portion * (b[0] - a[0]),
36212 a[1] + portion * (b[1] - a[1])
36216 if (!end && sofar + current >= to) {
36217 portion = (to - sofar) / current;
36219 a[0] + portion * (b[0] - a[0]),
36220 a[1] + portion * (b[1] - a[1])
36227 var result = points.slice(i0, i1);
36228 result.unshift(start);
36235 function getAreaLabel(entity, width, height) {
36236 var centroid = path.centroid(entity.asGeoJSON(graph, true));
36237 var extent = entity.extent(graph);
36238 var areaWidth = projection$$1(extent[1])[0] - projection$$1(extent[0])[0];
36240 if (isNaN(centroid[0]) || areaWidth < 20) return;
36242 var preset = context.presets().match(entity, context.graph());
36243 var picon = preset && preset.icon;
36248 if (picon) { // icon and label..
36250 addLabel(iconSize + padding);
36253 } else { // label only..
36260 function addIcon() {
36261 var iconX = centroid[0] - (iconSize / 2);
36262 var iconY = centroid[1] - (iconSize / 2);
36266 maxX: iconX + iconSize,
36267 maxY: iconY + iconSize
36270 if (tryInsert([bbox], entity.id + 'I', true)) {
36271 p.transform = 'translate(' + iconX + ',' + iconY + ')';
36277 function addLabel(yOffset) {
36278 if (width && areaWidth >= width + 20) {
36279 var labelX = centroid[0];
36280 var labelY = centroid[1] + yOffset;
36282 minX: labelX - (width / 2) - padding,
36283 minY: labelY - (height / 2) - padding,
36284 maxX: labelX + (width / 2) + padding,
36285 maxY: labelY + (height / 2) + padding
36288 if (tryInsert([bbox], entity.id, true)) {
36291 p.textAnchor = 'middle';
36301 // force insert a singular bounding box
36302 // singular box only, no array, id better be unique
36303 function doInsert(bbox, id) {
36306 var oldbox = _entitybboxes[id];
36308 _rdrawn.remove(oldbox);
36310 _entitybboxes[id] = bbox;
36311 _rdrawn.insert(bbox);
36315 function tryInsert(bboxes, id, saveSkipped) {
36316 var skipped = false;
36318 for (var i = 0; i < bboxes.length; i++) {
36319 var bbox = bboxes[i];
36322 // Check that label is visible
36323 if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
36327 if (_rdrawn.collides(bbox)) {
36333 _entitybboxes[id] = bboxes;
36337 _rskipped.load(bboxes);
36340 _rdrawn.load(bboxes);
36347 var layer = selection.selectAll('.layer-labels');
36348 var halo = layer.selectAll('.layer-labels-halo');
36349 var label = layer.selectAll('.layer-labels-label');
36350 var debug = layer.selectAll('.layer-labels-debug');
36353 drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
36354 drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
36357 drawLinePaths(halo, labelled.line, filter, '', positions.line);
36358 drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
36359 drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
36362 drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
36363 drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
36364 drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
36365 drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
36368 drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
36369 drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
36371 layer.call(filterLabels);
36375 function filterLabels(selection) {
36376 var layers = selection
36377 .selectAll('.layer-labels-label, .layer-labels-halo');
36379 layers.selectAll('.nolabel')
36380 .classed('nolabel', false);
36382 var mouse = context.mouse();
36383 var graph = context.graph();
36384 var selectedIDs = context.selectedIDs();
36388 // hide labels near the mouse
36391 bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
36392 ids.push.apply(ids, map$3(_rdrawn.search(bbox), 'id'));
36395 // hide labels on selected nodes (they look weird when dragging / haloed)
36396 for (var i = 0; i < selectedIDs.length; i++) {
36397 var entity = graph.hasEntity(selectedIDs[i]);
36398 if (entity && entity.type === 'node') {
36399 ids.push(selectedIDs[i]);
36403 layers.selectAll(utilEntitySelector(ids))
36404 .classed('nolabel', true);
36407 // draw the mouse bbox if debugging is on..
36408 var debug = selection.selectAll('.layer-labels-debug');
36410 if (context.getDebug('collision')) {
36414 [bbox.minX, bbox.minY],
36415 [bbox.maxX, bbox.minY],
36416 [bbox.maxX, bbox.maxY],
36417 [bbox.minX, bbox.maxY],
36418 [bbox.minX, bbox.minY]
36423 var box = debug.selectAll('.debug-mouse')
36433 .attr('class', 'debug debug-mouse yellow')
36435 .attr('d', d3_geoPath());
36439 var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
36442 drawLabels.observe = function(selection) {
36443 var listener = function() { throttleFilterLabels(selection); };
36444 selection.on('mousemove.hidelabels', listener);
36445 context.on('enter.hidelabels', listener);
36449 drawLabels.off = function(selection) {
36450 throttleFilterLabels.cancel();
36451 selection.on('mousemove.hidelabels', null);
36452 context.on('enter.hidelabels', null);
36459 function svgStreetside$$1(projection, context, dispatch) {
36460 var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
36462 var minMarkerZoom = 16;
36463 var minViewfieldZoom = 18;
36464 var layer = select(null);
36465 var _viewerYaw = 0;
36466 var _selectedSequence = null;
36467 var _hoveredBubble = null;
36474 if (svgStreetside$$1.initialized) return; // run once
36475 svgStreetside$$1.enabled = false;
36476 svgStreetside$$1.initialized = true;
36482 function getService() {
36483 if (services.streetside && !_streetside) {
36484 _streetside = services.streetside;
36486 .on('viewerChanged', viewerChanged)
36487 .on('loadedBubbles', throttledRedraw);
36488 } else if (!services.streetside && _streetside) {
36489 _streetside = null;
36492 return _streetside;
36498 function showLayer() {
36499 var service = getService();
36500 if (!service) return;
36502 service.loadViewer(context);
36506 .style('opacity', 0)
36509 .style('opacity', 1)
36510 .on('end', function () { dispatch.call('change'); });
36516 function hideLayer() {
36517 var service = getService();
36519 service.hideViewer();
36522 throttledRedraw.cancel();
36527 .style('opacity', 0)
36528 .on('end', editOff);
36534 function editOn() {
36535 layer.style('display', 'block');
36541 function editOff() {
36542 layer.selectAll('.viewfield-group').remove();
36543 layer.style('display', 'none');
36547 * click() Handles 'bubble' point click event.
36549 function click(d) {
36550 var service = getService();
36551 if (!service) return;
36553 // try to preserve the viewer rotation when staying on the same sequence
36554 if (d.sequenceKey !== _selectedSequence) {
36555 _viewerYaw = 0; // reset
36557 _selectedSequence = d.sequenceKey;
36561 .then(function(r) {
36562 if (r.status === 'ok'){
36563 service.showViewer(_viewerYaw);
36568 context.map().centerEase(d.loc);
36574 function mouseover(d) {
36575 var service = getService();
36576 _hoveredBubble = d;
36577 if (service) service.setStyles(d, true);
36583 function mouseout() {
36584 var service = getService();
36585 _hoveredBubble = null;
36586 if (service) service.setStyles(null, true);
36592 function transform(d) {
36593 var t = svgPointTransform(projection)(d);
36594 var rot = d.ca + _viewerYaw;
36596 t += ' rotate(' + Math.floor(rot) + ',0,0)';
36602 function viewerChanged() {
36603 var service = getService();
36604 if (!service) return;
36606 var viewer = service.viewer();
36607 if (!viewer) return;
36609 // update viewfield rotation
36610 _viewerYaw = viewer.getYaw();
36612 // avoid updating if the map is currently transformed
36613 // e.g. during drags or easing.
36614 if (context.map().isTransformed()) return;
36616 layer.selectAll('.viewfield-group.selected')
36617 .attr('transform', transform);
36624 function update() {
36625 var viewer = select('#photoviewer');
36626 var selected = viewer.empty() ? undefined : viewer.datum();
36627 var z = ~~context.map().zoom();
36628 var showMarkers = (z >= minMarkerZoom);
36629 var showViewfields = (z >= minViewfieldZoom);
36630 var service = getService();
36632 var sequences = (service ? service.sequences(projection) : []);
36633 var bubbles = (service && showMarkers ? service.bubbles(projection) : []);
36635 var traces = layer.selectAll('.sequences').selectAll('.sequence')
36636 .data(sequences, function(d) { return d.properties.key; });
36643 traces = traces.enter()
36645 .attr('class', 'sequence')
36647 .attr('d', svgPath(projection).geojson);
36650 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
36651 .data(bubbles, function(d) {
36652 // force reenter once bubbles are attached to a sequence
36653 return d.key + (d.sequenceKey ? 'v1' : 'v0');
36661 var groupsEnter = groups.enter()
36663 .attr('class', 'viewfield-group')
36664 .on('mouseover', mouseover)
36665 .on('mouseout', mouseout)
36666 .on('click', click);
36670 .attr('class', 'viewfield-scale');
36673 var markers = groups
36674 .merge(groupsEnter)
36675 .sort(function(a, b) {
36676 return (a === selected) ? 1
36677 : (b === selected) ? -1
36678 : b.loc[1] - a.loc[1];
36680 .attr('transform', transform)
36681 .select('.viewfield-scale');
36684 markers.selectAll('circle')
36692 var viewfields = markers.selectAll('.viewfield')
36693 .data(showViewfields ? [0] : []);
36698 // viewfields may or may not be drawn...
36699 // but if they are, draw below the circles
36701 .insert('path', 'circle')
36702 .attr('class', 'viewfield')
36703 .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
36704 .attr('d', viewfieldPath);
36708 service.setStyles(_hoveredBubble, true);
36712 function viewfieldPath() {
36713 var d = this.parentNode.__data__;
36715 return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
36717 return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
36725 * drawImages is the method that is returned (and that runs) everytime 'svgStreetside()' is called.
36726 * 'svgStreetside()' is called from index.js
36728 function drawImages(selection$$1) {
36729 var enabled = svgStreetside$$1.enabled;
36730 var service = getService();
36732 layer = selection$$1.selectAll('.layer-streetside-images')
36733 .data(service ? [0] : []);
36738 var layerEnter = layer.enter()
36740 .attr('class', 'layer-streetside-images')
36741 .style('display', enabled ? 'block' : 'none');
36745 .attr('class', 'sequences');
36749 .attr('class', 'markers');
36755 if (service && ~~context.map().zoom() >= minZoom) {
36758 service.loadBubbles(projection);
36767 * drawImages.enabled().
36769 drawImages.enabled = function(_) {
36770 if (!arguments.length) return svgStreetside$$1.enabled;
36771 svgStreetside$$1.enabled = _;
36772 if (svgStreetside$$1.enabled) {
36777 dispatch.call('change');
36782 * drawImages.supported().
36784 drawImages.supported = function() {
36785 return !!getService();
36793 function svgMapillaryImages$$1(projection, context, dispatch) {
36794 var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
36796 var minMarkerZoom = 16;
36797 var minViewfieldZoom = 18;
36798 var layer = select(null);
36803 if (svgMapillaryImages$$1.initialized) return; // run once
36804 svgMapillaryImages$$1.enabled = false;
36805 svgMapillaryImages$$1.initialized = true;
36809 function getService() {
36810 if (services.mapillary && !_mapillary) {
36811 _mapillary = services.mapillary;
36812 _mapillary.event.on('loadedImages', throttledRedraw);
36813 } else if (!services.mapillary && _mapillary) {
36821 function showLayer() {
36822 var service = getService();
36823 if (!service) return;
36825 service.loadViewer(context);
36829 .style('opacity', 0)
36832 .style('opacity', 1)
36833 .on('end', function () { dispatch.call('change'); });
36837 function hideLayer() {
36838 var service = getService();
36840 service.hideViewer();
36843 throttledRedraw.cancel();
36848 .style('opacity', 0)
36849 .on('end', editOff);
36853 function editOn() {
36854 layer.style('display', 'block');
36858 function editOff() {
36859 layer.selectAll('.viewfield-group').remove();
36860 layer.style('display', 'none');
36864 function click(d) {
36865 var service = getService();
36866 if (!service) return;
36870 .updateViewer(d.key, context)
36873 context.map().centerEase(d.loc);
36877 function mouseover(d) {
36878 var service = getService();
36879 if (service) service.setStyles(d);
36883 function mouseout() {
36884 var service = getService();
36885 if (service) service.setStyles(null);
36889 function transform(d) {
36890 var t = svgPointTransform(projection)(d);
36892 t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
36898 function update() {
36899 var viewer = select('#photoviewer');
36900 var selected = viewer.empty() ? undefined : viewer.datum();
36902 var z = ~~context.map().zoom();
36903 var showMarkers = (z >= minMarkerZoom);
36904 var showViewfields = (z >= minViewfieldZoom);
36906 var service = getService();
36907 var sequences = (service ? service.sequences(projection) : []);
36908 var images = (service && showMarkers ? service.images(projection) : []);
36910 var traces = layer.selectAll('.sequences').selectAll('.sequence')
36911 .data(sequences, function(d) { return d.properties.key; });
36918 traces = traces.enter()
36920 .attr('class', 'sequence')
36922 .attr('d', svgPath(projection).geojson);
36925 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
36926 .data(images, function(d) { return d.key; });
36933 var groupsEnter = groups.enter()
36935 .attr('class', 'viewfield-group')
36936 .on('mouseover', mouseover)
36937 .on('mouseout', mouseout)
36938 .on('click', click);
36942 .attr('class', 'viewfield-scale');
36945 var markers = groups
36946 .merge(groupsEnter)
36947 .sort(function(a, b) {
36948 return (a === selected) ? 1
36949 : (b === selected) ? -1
36950 : b.loc[1] - a.loc[1]; // sort Y
36952 .attr('transform', transform)
36953 .select('.viewfield-scale');
36956 markers.selectAll('circle')
36964 var viewfields = markers.selectAll('.viewfield')
36965 .data(showViewfields ? [0] : []);
36970 viewfields.enter() // viewfields may or may not be drawn...
36971 .insert('path', 'circle') // but if they are, draw below the circles
36972 .attr('class', 'viewfield')
36973 .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
36974 .attr('d', viewfieldPath);
36976 function viewfieldPath() {
36977 var d = this.parentNode.__data__;
36979 return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
36981 return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
36987 function drawImages(selection$$1) {
36988 var enabled = svgMapillaryImages$$1.enabled,
36989 service = getService();
36991 layer = selection$$1.selectAll('.layer-mapillary-images')
36992 .data(service ? [0] : []);
36997 var layerEnter = layer.enter()
36999 .attr('class', 'layer-mapillary-images')
37000 .style('display', enabled ? 'block' : 'none');
37004 .attr('class', 'sequences');
37008 .attr('class', 'markers');
37014 if (service && ~~context.map().zoom() >= minZoom) {
37017 service.loadImages(projection);
37025 drawImages.enabled = function(_) {
37026 if (!arguments.length) return svgMapillaryImages$$1.enabled;
37027 svgMapillaryImages$$1.enabled = _;
37028 if (svgMapillaryImages$$1.enabled) {
37033 dispatch.call('change');
37038 drawImages.supported = function() {
37039 return !!getService();
37047 function svgMapillarySigns$$1(projection, context, dispatch) {
37048 var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
37050 var layer = select(null);
37055 if (svgMapillarySigns$$1.initialized) return; // run once
37056 svgMapillarySigns$$1.enabled = false;
37057 svgMapillarySigns$$1.initialized = true;
37061 function getService() {
37062 if (services.mapillary && !_mapillary) {
37063 _mapillary = services.mapillary;
37064 _mapillary.event.on('loadedSigns', throttledRedraw);
37065 } else if (!services.mapillary && _mapillary) {
37072 function showLayer() {
37073 var service = getService();
37074 if (!service) return;
37076 service.loadViewer(context);
37081 function hideLayer() {
37082 throttledRedraw.cancel();
37087 function editOn() {
37088 layer.style('display', 'block');
37092 function editOff() {
37093 layer.selectAll('.icon-sign').remove();
37094 layer.style('display', 'none');
37098 function click(d) {
37099 var service = getService();
37100 if (!service) return;
37102 context.map().centerEase(d.loc);
37104 var selected = service.getSelectedImage();
37105 var selectedImageKey = selected && selected.key;
37108 // Pick one of the images the sign was detected in,
37109 // preference given to an image already selected.
37110 d.detections.forEach(function(detection) {
37111 if (!imageKey || selectedImageKey === detection.image_key) {
37112 imageKey = detection.image_key;
37117 .selectImage(null, imageKey)
37118 .updateViewer(imageKey, context)
37123 function update() {
37124 var service = getService();
37125 var data = (service ? service.signs(projection) : []);
37126 var viewer = select('#photoviewer');
37127 var selected = viewer.empty() ? undefined : viewer.datum();
37128 var selectedImageKey = selected && selected.key;
37129 var transform = svgPointTransform(projection);
37131 var signs = layer.selectAll('.icon-sign')
37132 .data(data, function(d) { return d.key; });
37139 var enter = signs.enter()
37141 .attr('class', 'icon-sign')
37142 .attr('width', '24px')
37143 .attr('height', '24px')
37144 .attr('x', '-12px')
37145 .attr('y', '-12px')
37146 .attr('xlink:href', function(d) { return '#' + d.value; })
37147 .classed('selected', function(d) {
37148 return some(d.detections, function(detection) {
37149 return detection.image_key === selectedImageKey;
37152 .on('click', click);
37157 .sort(function(a, b) {
37158 return (a === selected) ? 1
37159 : (b === selected) ? -1
37160 : b.loc[1] - a.loc[1]; // sort Y
37162 .attr('transform', transform);
37166 function drawSigns(selection$$1) {
37167 var enabled = svgMapillarySigns$$1.enabled;
37168 var service = getService();
37170 layer = selection$$1.selectAll('.layer-mapillary-signs')
37171 .data(service ? [0] : []);
37176 layer = layer.enter()
37178 .attr('class', 'layer-mapillary-signs')
37179 .style('display', enabled ? 'block' : 'none')
37183 if (service && ~~context.map().zoom() >= minZoom) {
37186 service.loadSigns(context, projection);
37194 drawSigns.enabled = function(_) {
37195 if (!arguments.length) return svgMapillarySigns$$1.enabled;
37196 svgMapillarySigns$$1.enabled = _;
37197 if (svgMapillarySigns$$1.enabled) {
37202 dispatch.call('change');
37207 drawSigns.supported = function() {
37208 return !!getService();
37216 function svgOpenstreetcamImages$$1(projection, context, dispatch) {
37217 var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
37219 var minMarkerZoom = 16;
37220 var minViewfieldZoom = 18;
37221 var layer = select(null);
37222 var _openstreetcam;
37226 if (svgOpenstreetcamImages$$1.initialized) return; // run once
37227 svgOpenstreetcamImages$$1.enabled = false;
37228 svgOpenstreetcamImages$$1.initialized = true;
37232 function getService() {
37233 if (services.openstreetcam && !_openstreetcam) {
37234 _openstreetcam = services.openstreetcam;
37235 _openstreetcam.event.on('loadedImages', throttledRedraw);
37236 } else if (!services.openstreetcam && _openstreetcam) {
37237 _openstreetcam = null;
37240 return _openstreetcam;
37244 function showLayer() {
37245 var service = getService();
37246 if (!service) return;
37248 service.loadViewer(context);
37252 .style('opacity', 0)
37255 .style('opacity', 1)
37256 .on('end', function () { dispatch.call('change'); });
37260 function hideLayer() {
37261 var service = getService();
37263 service.hideViewer();
37266 throttledRedraw.cancel();
37271 .style('opacity', 0)
37272 .on('end', editOff);
37276 function editOn() {
37277 layer.style('display', 'block');
37281 function editOff() {
37282 layer.selectAll('.viewfield-group').remove();
37283 layer.style('display', 'none');
37287 function click(d) {
37288 var service = getService();
37289 if (!service) return;
37296 context.map().centerEase(d.loc);
37300 function mouseover(d) {
37301 var service = getService();
37302 if (service) service.setStyles(d);
37306 function mouseout() {
37307 var service = getService();
37308 if (service) service.setStyles(null);
37312 function transform(d) {
37313 var t = svgPointTransform(projection)(d);
37315 t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
37321 function update() {
37322 var viewer = select('#photoviewer');
37323 var selected = viewer.empty() ? undefined : viewer.datum();
37325 var z = ~~context.map().zoom();
37326 var showMarkers = (z >= minMarkerZoom);
37327 var showViewfields = (z >= minViewfieldZoom);
37329 var service = getService();
37330 var sequences = (service ? service.sequences(projection) : []);
37331 var images = (service && showMarkers ? service.images(projection) : []);
37333 var traces = layer.selectAll('.sequences').selectAll('.sequence')
37334 .data(sequences, function(d) { return d.properties.key; });
37341 traces = traces.enter()
37343 .attr('class', 'sequence')
37345 .attr('d', svgPath(projection).geojson);
37348 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
37349 .data(images, function(d) { return d.key; });
37356 var groupsEnter = groups.enter()
37358 .attr('class', 'viewfield-group')
37359 .on('mouseover', mouseover)
37360 .on('mouseout', mouseout)
37361 .on('click', click);
37365 .attr('class', 'viewfield-scale');
37368 var markers = groups
37369 .merge(groupsEnter)
37370 .sort(function(a, b) {
37371 return (a === selected) ? 1
37372 : (b === selected) ? -1
37373 : b.loc[1] - a.loc[1]; // sort Y
37375 .attr('transform', transform)
37376 .select('.viewfield-scale');
37379 markers.selectAll('circle')
37387 var viewfields = markers.selectAll('.viewfield')
37388 .data(showViewfields ? [0] : []);
37393 viewfields.enter() // viewfields may or may not be drawn...
37394 .insert('path', 'circle') // but if they are, draw below the circles
37395 .attr('class', 'viewfield')
37396 .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
37397 .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');
37401 function drawImages(selection$$1) {
37402 var enabled = svgOpenstreetcamImages$$1.enabled,
37403 service = getService();
37405 layer = selection$$1.selectAll('.layer-openstreetcam-images')
37406 .data(service ? [0] : []);
37411 var layerEnter = layer.enter()
37413 .attr('class', 'layer-openstreetcam-images')
37414 .style('display', enabled ? 'block' : 'none');
37418 .attr('class', 'sequences');
37422 .attr('class', 'markers');
37428 if (service && ~~context.map().zoom() >= minZoom) {
37431 service.loadImages(projection);
37439 drawImages.enabled = function(_) {
37440 if (!arguments.length) return svgOpenstreetcamImages$$1.enabled;
37441 svgOpenstreetcamImages$$1.enabled = _;
37442 if (svgOpenstreetcamImages$$1.enabled) {
37447 dispatch.call('change');
37452 drawImages.supported = function() {
37453 return !!getService();
37461 function svgOsm(projection, context, dispatch) {
37462 var enabled = true;
37465 function drawOsm(selection) {
37466 selection.selectAll('.layer-osm')
37467 .data(['covered', 'areas', 'lines', 'points', 'labels'])
37470 .attr('class', function(d) { return 'layer-osm layer-' + d; });
37472 selection.selectAll('.layer-areas').selectAll('.layer-areas-group')
37473 .data(['areas', 'targets'])
37476 .attr('class', function(d) { return 'layer-areas-group layer-areas-' + d; });
37478 selection.selectAll('.layer-lines').selectAll('.layer-lines-group')
37479 .data(['lines', 'targets'])
37482 .attr('class', function(d) { return 'layer-lines-group layer-lines-' + d; });
37484 selection.selectAll('.layer-points').selectAll('.layer-points-group')
37485 .data(['points', 'midpoints', 'vertices', 'turns', 'targets'])
37488 .attr('class', function(d) { return 'layer-points-group layer-points-' + d; });
37490 selection.selectAll('.layer-labels').selectAll('.layer-labels-group')
37491 .data(['halo', 'label', 'debug'])
37494 .attr('class', function(d) { return 'layer-labels-group layer-labels-' + d; });
37498 function showLayer() {
37499 var layer = context.surface().selectAll('.data-layer-osm');
37503 .classed('disabled', false)
37504 .style('opacity', 0)
37507 .style('opacity', 1)
37508 .on('end interrupt', function () {
37509 dispatch.call('change');
37514 function hideLayer() {
37515 var layer = context.surface().selectAll('.data-layer-osm');
37521 .style('opacity', 0)
37522 .on('end interrupt', function () {
37523 layer.classed('disabled', true);
37524 dispatch.call('change');
37529 drawOsm.enabled = function(_) {
37530 if (!arguments.length) return enabled;
37539 dispatch.call('change');
37547 function svgLayers(projection, context) {
37548 var dispatch$$1 = dispatch('change');
37549 var svg = select(null);
37551 { id: 'osm', layer: svgOsm(projection, context, dispatch$$1) },
37552 { id: 'gpx', layer: svgGpx$$1(projection, context, dispatch$$1) },
37553 { id: 'streetside', layer: svgStreetside$$1(projection, context, dispatch$$1)},
37554 { id: 'mapillary-images', layer: svgMapillaryImages$$1(projection, context, dispatch$$1) },
37555 { id: 'mapillary-signs', layer: svgMapillarySigns$$1(projection, context, dispatch$$1) },
37556 { id: 'openstreetcam-images', layer: svgOpenstreetcamImages$$1(projection, context, dispatch$$1) },
37557 { id: 'debug', layer: svgDebug$$1(projection, context, dispatch$$1) }
37561 function drawLayers(selection$$1) {
37562 svg = selection$$1.selectAll('.surface')
37567 .attr('class', 'surface')
37570 var defs = svg.selectAll('.surface-defs')
37575 .attr('class', 'surface-defs');
37577 var groups = svg.selectAll('.data-layer')
37585 .attr('class', function(d) { return 'data-layer data-layer-' + d.id; })
37587 .each(function(d) { select(this).call(d.layer); });
37591 drawLayers.all = function() {
37596 drawLayers.layer = function(id) {
37597 var obj = find$1(layers, function(o) {return o.id === id;});
37598 return obj && obj.layer;
37602 drawLayers.only = function(what) {
37603 var arr = [].concat(what);
37604 drawLayers.remove(difference(map$3(layers, 'id'), arr));
37609 drawLayers.remove = function(what) {
37610 var arr = [].concat(what);
37611 arr.forEach(function(id) {
37612 layers = reject(layers, function(o) {return o.id === id;});
37614 dispatch$$1.call('change');
37619 drawLayers.add = function(what) {
37620 var arr = [].concat(what);
37621 arr.forEach(function(obj) {
37622 if ('id' in obj && 'layer' in obj) {
37626 dispatch$$1.call('change');
37631 drawLayers.dimensions = function(_) {
37632 if (!arguments.length) return utilGetDimensions(svg);
37633 utilSetDimensions(svg, _);
37638 return utilRebind(drawLayers, dispatch$$1, 'on');
37641 function svgLines$$1(projection, context) {
37642 var detected = utilDetect();
37644 var highway_stack = {
37660 function drawTargets(selection, graph, entities, filter$$1) {
37661 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
37662 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
37663 var getPath = svgPath(projection).geojson;
37664 var activeID = context.activeID();
37666 // The targets and nopes will be MultiLineString sub-segments of the ways
37667 var data = { targets: [], nopes: [] };
37669 entities.forEach(function(way) {
37670 var features = svgSegmentWay(way, graph, activeID);
37671 data.targets.push.apply(data.targets, features.passive);
37672 data.nopes.push.apply(data.nopes, features.active);
37676 // Targets allow hover and vertex snapping
37677 var targetData = data.targets.filter(getPath);
37678 var targets = selection.selectAll('.line.target-allowed')
37679 .filter(function(d) { return filter$$1(d.properties.entity); })
37680 .data(targetData, function key(d) { return d.id; });
37690 .attr('d', getPath)
37691 .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
37695 var nopeData = data.nopes.filter(getPath);
37696 var nopes = selection.selectAll('.line.target-nope')
37697 .filter(function(d) { return filter$$1(d.properties.entity); })
37698 .data(nopeData, function key(d) { return d.id; });
37708 .attr('d', getPath)
37709 .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
37713 function drawLines(selection, graph, entities, filter$$1) {
37715 function waystack(a, b) {
37716 var selected = context.selectedIDs();
37717 var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
37718 var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
37720 if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
37721 if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
37722 return scoreA - scoreB;
37726 function drawLineGroup(selection, klass, isSelected) {
37727 // Note: Don't add `.selected` class in draw modes
37728 var mode = context.mode();
37729 var isDrawing = mode && /^draw/.test(mode.id);
37730 var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
37732 var lines = selection
37735 .data(getPathData(isSelected), osmEntity$$1.key);
37740 // Optimization: Call expensive TagClasses only on enter selection. This
37741 // works because osmEntity.key is defined to include the entity v attribute.
37744 .attr('class', function(d) {
37745 var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
37746 return 'way line ' + klass + ' ' + selectedClass + oldMPClass + d.id;
37748 .call(svgTagClasses())
37751 .attr('d', getPath)
37752 .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
37758 function getPathData(isSelected) {
37759 return function() {
37760 var layer = this.parentNode.__data__;
37761 var data = pathdata[layer] || [];
37762 return data.filter(function(d) {
37764 return context.selectedIDs().indexOf(d.id) !== -1;
37766 return context.selectedIDs().indexOf(d.id) === -1;
37772 var getPath = svgPath(projection, graph);
37775 var onewaydata = {};
37776 var oldMultiPolygonOuters = {};
37778 for (var i = 0; i < entities.length; i++) {
37779 var entity = entities[i];
37780 var outer = osmSimpleMultipolygonOuterMember(entity, graph);
37782 ways.push(entity.mergeTags(outer.tags));
37783 oldMultiPolygonOuters[outer.id] = true;
37784 } else if (entity.geometry(graph) === 'line') {
37789 ways = ways.filter(getPath);
37790 pathdata = groupBy(ways, function(way) { return way.layer(); });
37792 forOwn(pathdata, function(v, k) {
37793 var arr = filter(v, function(d) { return d.isOneWay(); });
37794 onewaydata[k] = flatten(map$3(arr, svgOneWaySegments(projection, graph, 35)));
37798 var covered = selection.selectAll('.layer-covered'); // under areas
37799 var uncovered = selection.selectAll('.layer-lines .layer-lines-lines'); // over areas
37801 [covered, uncovered].forEach(function(selection) {
37802 var range$$1 = (selection === covered ? range(-10,0) : range(0,11));
37803 var layergroup = selection
37804 .selectAll('g.layergroup')
37807 layergroup = layergroup.enter()
37809 .attr('class', function(d) { return 'layergroup layer' + String(d); })
37810 .merge(layergroup);
37813 .selectAll('g.linegroup')
37814 .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
37817 .attr('class', function(d) { return 'linegroup line-' + d; });
37819 layergroup.selectAll('g.line-shadow')
37820 .call(drawLineGroup, 'shadow', false);
37821 layergroup.selectAll('g.line-casing')
37822 .call(drawLineGroup, 'casing', false);
37823 layergroup.selectAll('g.line-stroke')
37824 .call(drawLineGroup, 'stroke', false);
37826 layergroup.selectAll('g.line-shadow-highlighted')
37827 .call(drawLineGroup, 'shadow', true);
37828 layergroup.selectAll('g.line-casing-highlighted')
37829 .call(drawLineGroup, 'casing', true);
37830 layergroup.selectAll('g.line-stroke-highlighted')
37831 .call(drawLineGroup, 'stroke', true);
37834 var onewaygroup = layergroup
37835 .selectAll('g.onewaygroup')
37838 onewaygroup = onewaygroup.enter()
37840 .attr('class', 'onewaygroup')
37841 .merge(onewaygroup);
37843 var oneways = onewaygroup
37847 function data() { return onewaydata[this.parentNode.__data__] || []; },
37848 function key(d) { return [d.id, d.index]; }
37854 oneways = oneways.enter()
37856 .attr('class', 'oneway')
37857 .attr('marker-mid', 'url(#oneway-marker)')
37859 .attr('d', function(d) { return d.d; });
37862 oneways.each(function() { this.parentNode.insertBefore(this, this); });
37867 selection.selectAll('.layer-lines .layer-lines-targets')
37868 .call(drawTargets, graph, ways, filter$$1);
37875 function svgMidpoints$$1(projection, context) {
37876 var targetRadius = 8;
37878 function drawTargets(selection, graph, entities, filter) {
37879 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
37880 var getTransform = svgPointTransform(projection).geojson;
37882 var data = entities.map(function(midpoint) {
37892 coordinates: midpoint.loc
37897 var targets = selection.selectAll('.midpoint.target')
37898 .filter(function(d) { return filter(d.properties.entity); })
37899 .data(data, function key(d) { return d.id; });
37908 .attr('r', targetRadius)
37910 .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
37911 .attr('transform', getTransform);
37915 function drawMidpoints(selection, graph, entities, filter, extent) {
37916 var layer = selection.selectAll('.layer-points .layer-points-midpoints');
37918 var mode = context.mode();
37919 if (mode && mode.id !== 'select') {
37920 layer.selectAll('g.midpoint')
37923 selection.selectAll('.layer-points .layer-points-targets .midpoint.target')
37929 var poly = extent.polygon();
37930 var midpoints = {};
37932 for (var i = 0; i < entities.length; i++) {
37933 var entity = entities[i];
37935 if (entity.type !== 'way')
37937 if (!filter(entity))
37939 if (context.selectedIDs().indexOf(entity.id) < 0)
37942 var nodes = graph.childNodes(entity);
37943 for (var j = 0; j < nodes.length - 1; j++) {
37946 var b = nodes[j + 1];
37947 var id = [a.id, b.id].sort().join('-');
37949 if (midpoints[id]) {
37950 midpoints[id].parents.push(entity);
37952 if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
37953 var point = geoVecInterp(a.loc, b.loc, 0.5);
37956 if (extent.intersects(point)) {
37959 for (var k = 0; k < 4; k++) {
37960 point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
37962 geoVecLength(projection(a.loc), projection(point)) > 20 &&
37963 geoVecLength(projection(b.loc), projection(point)) > 20)
37976 edge: [a.id, b.id],
37986 function midpointFilter(d) {
37987 if (midpoints[d.id])
37990 for (var i = 0; i < d.parents.length; i++) {
37991 if (filter(d.parents[i])) {
38001 .selectAll('g.midpoint')
38002 .filter(midpointFilter)
38003 .data(values$1(midpoints), function(d) { return d.id; });
38008 var enter = groups.enter()
38009 .insert('g', ':first-child')
38010 .attr('class', 'midpoint');
38014 .attr('points', '-6,8 10,0 -6,-8')
38015 .attr('class', 'shadow');
38019 .attr('points', '-3,4 5,0 -3,-4')
38020 .attr('class', 'fill');
38024 .attr('transform', function(d) {
38025 var translate = svgPointTransform(projection);
38026 var a = graph.entity(d.edge[0]);
38027 var b = graph.entity(d.edge[1]);
38028 var angle = geoAngle(a, b, projection) * (180 / Math.PI);
38029 return translate(d) + ' rotate(' + angle + ')';
38031 .call(svgTagClasses().tags(
38032 function(d) { return d.parents[0].tags; }
38035 // Propagate data bindings.
38036 groups.select('polygon.shadow');
38037 groups.select('polygon.fill');
38040 // Draw touch targets..
38041 selection.selectAll('.layer-points .layer-points-targets')
38042 .call(drawTargets, graph, values$1(midpoints), midpointFilter);
38045 return drawMidpoints;
38048 // Touch targets control which other vertices we can drag a vertex onto.
38050 // - the activeID - nope
38051 // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
38052 // - 2 away from the activeID - nope (would create a self intersecting segment)
38053 // - all others on a linear way - yes
38054 // - all others on a closed way - nope (would create a self intersecting polygon)
38057 // 0 = active vertex - no touch/connect
38058 // 1 = passive vertex - yes touch/connect
38059 // 2 = adjacent vertex - yes but pay attention segmenting a line here
38061 function svgPassiveVertex(node, graph, activeID) {
38062 if (!activeID) return 1;
38063 if (activeID === node.id) return 0;
38065 var parents = graph.parentWays(node);
38067 for (var i = 0; i < parents.length; i++) {
38068 var nodes = parents[i].nodes;
38069 var isClosed = parents[i].isClosed();
38070 for (var j = 0; j < nodes.length; j++) { // find this vertex, look nearby
38071 if (nodes[j] === node.id) {
38077 if (isClosed) { // wraparound if needed
38078 var max = nodes.length - 1;
38079 if (ix1 < 0) ix1 = max + ix1;
38080 if (ix2 < 0) ix2 = max + ix2;
38081 if (ix3 > max) ix3 = ix3 - max;
38082 if (ix4 > max) ix4 = ix4 - max;
38085 if (nodes[ix1] === activeID) return 0; // no - prevent self intersect
38086 else if (nodes[ix2] === activeID) return 2; // ok - adjacent
38087 else if (nodes[ix3] === activeID) return 2; // ok - adjacent
38088 else if (nodes[ix4] === activeID) return 0; // no - prevent self intersect
38089 else if (isClosed && nodes.indexOf(activeID) !== -1) return 0; // no - prevent self intersect
38098 function svgOneWaySegments(projection$$1, graph, dt) {
38099 return function(entity) {
38103 var clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream;
38104 var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
38107 if (entity.tags.oneway === '-1') {
38108 coordinates.reverse();
38111 var isReversible = (entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating');
38114 type: 'LineString',
38115 coordinates: coordinates
38116 }, projection$$1.stream(clip({
38117 lineStart: function() {},
38118 lineEnd: function() { a = null; },
38119 point: function(x, y) {
38123 var span = geoVecLength(a, b) - offset;
38126 var heading = geoVecAngle(a, b);
38127 var dx = dt * Math.cos(heading);
38128 var dy = dt * Math.sin(heading);
38130 a[0] + offset * Math.cos(heading),
38131 a[1] + offset * Math.sin(heading)
38134 // gather coordinates
38135 var coord = [a, p];
38136 for (span -= dt; span >= 0; span -= dt) {
38137 p = geoVecAdd(p, [dx, dy]);
38142 // generate svg paths
38146 for (j = 0; j < coord.length; j++) {
38147 segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
38149 segments.push({ id: entity.id, index: i++, d: segment });
38151 if (isReversible) {
38153 for (j = coord.length - 1; j >= 0; j--) {
38154 segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
38156 segments.push({ id: entity.id, index: i++, d: segment });
38172 function svgPath(projection$$1, graph, isArea) {
38174 // Explanation of magic numbers:
38175 // "padding" here allows space for strokes to extend beyond the viewport,
38176 // so that the stroke isn't drawn along the edge of the viewport when
38177 // the shape is clipped.
38179 // When drawing lines, pad viewport by 5px.
38180 // When drawing areas, pad viewport by 65px in each direction to allow
38181 // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
38184 var padding = isArea ? 65 : 5;
38185 var viewport = projection$$1.clipExtent();
38186 var paddedExtent = [
38187 [viewport[0][0] - padding, viewport[0][1] - padding],
38188 [viewport[1][0] + padding, viewport[1][1] + padding]
38190 var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
38191 var project = projection$$1.stream;
38192 var path = d3_geoPath()
38193 .projection({stream: function(output) { return project(clip(output)); }});
38195 var svgpath = function(entity) {
38196 if (entity.id in cache) {
38197 return cache[entity.id];
38199 return cache[entity.id] = path(entity.asGeoJSON(graph));
38203 svgpath.geojson = path;
38209 function svgPointTransform(projection$$1) {
38210 var svgpoint = function(entity) {
38211 // http://jsperf.com/short-array-join
38212 var pt = projection$$1(entity.loc);
38213 return 'translate(' + pt[0] + ',' + pt[1] + ')';
38216 svgpoint.geojson = function(d) {
38217 return svgpoint(d.properties.entity);
38224 function svgRelationMemberTags(graph) {
38225 return function(entity) {
38226 var tags = entity.tags;
38227 graph.parentRelations(entity).forEach(function(relation) {
38228 var type = relation.tags.type;
38229 if (type === 'multipolygon' || type === 'boundary') {
38230 tags = assignIn({}, relation.tags, tags);
38238 function svgSegmentWay(way, graph, activeID) {
38239 var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
38240 var features = { passive: [], active: [] };
38245 for (var i = 0; i < way.nodes.length; i++) {
38246 node = graph.entity(way.nodes[i]);
38247 type = svgPassiveVertex(node, graph, activeID);
38248 end = { node: node, type: type };
38250 if (start.type !== undefined) {
38251 if (start.node.id === activeID || end.node.id === activeID) ; else if (isActiveWay && (start.type === 2 || end.type === 2)) { // one adjacent vertex
38252 pushActive(start, end, i);
38253 } else if (start.type === 0 && end.type === 0) { // both active vertices
38254 pushActive(start, end, i);
38256 pushPassive(start, end, i);
38266 function pushActive(start, end, index) {
38267 features.active.push({
38269 id: way.id + '-' + index + '-nope',
38274 nodes: [start.node, end.node],
38278 type: 'LineString',
38279 coordinates: [start.node.loc, end.node.loc]
38284 function pushPassive(start, end, index) {
38285 features.passive.push({
38287 id: way.id + '-' + index,
38291 nodes: [start.node, end.node],
38295 type: 'LineString',
38296 coordinates: [start.node.loc, end.node.loc]
38302 function svgPoints$$1(projection, context) {
38304 function markerPath(selection, klass) {
38306 .attr('class', klass)
38307 .attr('transform', 'translate(-8, -23)')
38308 .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');
38311 function sortY(a, b) {
38312 return b.loc[1] - a.loc[1];
38316 // Avoid exit/enter if we're just moving stuff around.
38317 // The node will get a new version but we only need to run the update selection.
38318 function fastEntityKey(d) {
38319 var mode = context.mode();
38320 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
38321 return isMoving ? d.id : osmEntity$$1.key(d);
38325 function drawTargets(selection, graph, entities, filter) {
38326 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
38327 var getTransform = svgPointTransform(projection).geojson;
38328 var activeID = context.activeID();
38331 entities.forEach(function(node) {
38332 if (activeID === node.id) return; // draw no target on the activeID
38341 geometry: node.asGeoJSON()
38345 var targets = selection.selectAll('.point.target')
38346 .filter(function(d) { return filter(d.properties.entity); })
38347 .data(data, function key(d) { return d.id; });
38359 .attr('height', 30)
38361 .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
38362 .attr('transform', getTransform);
38366 function drawPoints(selection, graph, entities, filter) {
38367 var wireframe = context.surface().classed('fill-wireframe');
38368 var zoom = geoScaleToZoom(projection.scale());
38370 // points with a direction will render as vertices at higher zooms
38371 function renderAsPoint(entity) {
38372 return entity.geometry(graph) === 'point' &&
38373 !(zoom >= 18 && entity.directions(graph, projection).length);
38376 // all points will render as vertices in wireframe mode too
38377 var points = wireframe ? [] : entities.filter(renderAsPoint);
38379 points.sort(sortY);
38382 var layer = selection.selectAll('.layer-points .layer-points-points');
38384 var groups = layer.selectAll('g.point')
38386 .data(points, fastEntityKey);
38391 var enter = groups.enter()
38393 .attr('class', function(d) { return 'node point ' + d.id; })
38398 .call(markerPath, 'shadow');
38406 .attr('class', 'stroke');
38410 .call(markerPath, 'stroke');
38414 .attr('transform', 'translate(-5, -19)')
38415 .attr('class', 'icon')
38416 .attr('width', '11px')
38417 .attr('height', '11px');
38421 .attr('transform', svgPointTransform(projection))
38422 .call(svgTagClasses());
38424 // Selecting the following implicitly
38425 // sets the data (point entity) on the element
38426 groups.select('.shadow');
38427 groups.select('.stroke');
38428 groups.select('.icon')
38429 .attr('xlink:href', function(entity) {
38430 var preset = context.presets().match(entity, graph);
38431 var picon = preset && preset.icon;
38436 var isMaki = /^maki-/.test(picon);
38437 return '#' + picon + (isMaki ? '-11' : '');
38443 selection.selectAll('.layer-points .layer-points-targets')
38444 .call(drawTargets, graph, points, filter);
38451 function svgTagClasses() {
38453 'building', 'highway', 'railway', 'waterway', 'aeroway',
38454 'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse',
38455 'leisure', 'military', 'place', 'man_made'
38458 'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
38459 'razed', 'demolished', 'obliterated', 'intermittent'
38462 'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
38463 'surface', 'tracktype', 'crossing', 'service', 'sport'
38465 tagClassRe = /^tag-/,
38466 tags = function(entity) { return entity.tags; };
38469 var tagClasses = function(selection$$1) {
38470 selection$$1.each(function tagClassesEach(entity) {
38471 var value = this.className,
38472 classes, primary, status;
38474 if (value.baseVal !== undefined) value = value.baseVal;
38476 classes = value.trim().split(/\s+/).filter(function(name) {
38477 return name.length && !tagClassRe.test(name);
38480 var t = tags(entity), i, k, v;
38482 // pick at most one primary classification tag..
38483 for (i = 0; i < primaries.length; i++) {
38486 if (!v || v === 'no') continue;
38489 if (statuses.indexOf(v) !== -1) { // e.g. `railway=abandoned`
38491 classes += ' tag-' + k;
38493 classes += ' tag-' + k + ' tag-' + k + '-' + v;
38499 // add at most one status tag, only if relates to primary tag..
38501 for (i = 0; i < statuses.length; i++) {
38504 if (!v || v === 'no') continue;
38506 if (v === 'yes') { // e.g. `railway=rail + abandoned=yes`
38509 else if (primary && primary === v) { // e.g. `railway=rail + abandoned=railway`
38511 } else if (!primary && primaries.indexOf(v) !== -1) { // e.g. `abandoned=railway`
38514 classes += ' tag-' + v;
38515 } // else ignore e.g. `highway=path + abandoned=railway`
38522 classes += ' tag-status tag-status-' + status;
38525 // add any secondary (structure) tags
38526 for (i = 0; i < secondaries.length; i++) {
38527 k = secondaries[i];
38529 if (!v || v === 'no') continue;
38530 classes += ' tag-' + k + ' tag-' + k + '-' + v;
38533 // For highways, look for surface tagging..
38534 if (primary === 'highway') {
38535 var paved = (t.highway !== 'track');
38538 if (k in osmPavedTags) {
38539 paved = !!osmPavedTags[k][v];
38544 classes += ' tag-unpaved';
38548 classes = classes.trim();
38550 if (classes !== value) {
38551 select(this).attr('class', classes);
38557 tagClasses.tags = function(_) {
38558 if (!arguments.length) return tags;
38566 function svgTurns(projection) {
38568 return function drawTurns(selection, graph, turns) {
38570 function icon(turn) {
38571 var u = turn.u ? '-u' : '';
38572 if (turn.no) return '#iD-turn-no' + u;
38573 if (turn.only) return '#iD-turn-only' + u;
38574 return '#iD-turn-yes' + u;
38577 var layer = selection.selectAll('.data-layer-osm').selectAll('.layer-turns')
38580 layer = layer.enter()
38582 .attr('class', 'layer-osm layer-turns')
38586 var groups = layer.selectAll('g.turn')
38587 .data(turns, function(d) { return d.key; });
38593 var enter = groups.enter()
38595 .attr('class', function(d) { return 'turn ' + d.key; });
38598 .filter(function(d) { return !d.u; });
38600 nEnter.append('rect')
38601 .attr('transform', 'translate(-22, -12)')
38602 .attr('width', '44')
38603 .attr('height', '24');
38605 nEnter.append('use')
38606 .attr('transform', 'translate(-22, -12)')
38607 .attr('width', '44')
38608 .attr('height', '24');
38612 .filter(function(d) { return d.u; });
38614 uEnter.append('circle')
38617 uEnter.append('use')
38618 .attr('transform', 'translate(-16, -16)')
38619 .attr('width', '32')
38620 .attr('height', '32');
38627 .attr('opacity', function(d) {
38628 return d.direct === false ? '0.7' : null;
38630 .attr('transform', function(d) {
38632 var toWay = graph.entity(d.to.way);
38633 var toPoints = graph.childNodes(toWay)
38634 .map(function (n) { return n.loc; })
38636 var toLength = geoPathLength(toPoints);
38637 var mid = toLength / 2; // midpoint of destination way
38639 var toNode = graph.entity(d.to.node);
38640 var toVertex = graph.entity(d.to.vertex);
38641 var a = geoAngle(toVertex, toNode, projection);
38642 var o = projection(toVertex.loc);
38643 var r = d.u ? 0 // u-turn: no radius
38644 : !toWay.__via ? pxRadius // leaf way: put marker at pxRadius
38645 : Math.min(mid, pxRadius); // via way: prefer pxRadius, fallback to mid for very short ways
38647 return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
38648 'rotate(' + a * 180 / Math.PI + ')';
38651 groups.select('use')
38652 .attr('xlink:href', icon);
38654 groups.select('rect');
38655 groups.select('circle');
38661 function svgVertices$$1(projection, context) {
38663 // z16-, z17, z18+, w/icon
38664 shadow: [6, 7.5, 7.5, 12],
38665 stroke: [2.5, 3.5, 3.5, 8],
38666 fill: [1, 1.5, 1.5, 1.5]
38669 var _currHoverTarget;
38670 var _currPersistent = {};
38671 var _currHover = {};
38672 var _prevHover = {};
38673 var _currSelected = {};
38674 var _prevSelected = {};
38678 function sortY(a, b) {
38679 return b.loc[1] - a.loc[1];
38682 // Avoid exit/enter if we're just moving stuff around.
38683 // The node will get a new version but we only need to run the update selection.
38684 function fastEntityKey(d) {
38685 var mode = context.mode();
38686 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
38687 return isMoving ? d.id : osmEntity$$1.key(d);
38691 function draw(selection$$1, graph, vertices, sets, filter) {
38692 sets = sets || { selected: {}, important: {}, hovered: {} };
38695 var directions = {};
38696 var wireframe = context.surface().classed('fill-wireframe');
38697 var zoom = geoScaleToZoom(projection.scale());
38698 var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
38701 function getIcon(d) {
38702 // always check latest entity, as fastEntityKey avoids enter/exit now
38703 var entity = graph.entity(d.id);
38704 if (entity.id in icons) return icons[entity.id];
38707 entity.hasInterestingTags() &&
38708 context.presets().match(entity, graph).icon;
38709 return icons[entity.id];
38713 // memoize directions results, return false for empty arrays (for use in filter)
38714 function getDirections(entity) {
38715 if (entity.id in directions) return directions[entity.id];
38717 var angles = entity.directions(graph, projection);
38718 directions[entity.id] = angles.length ? angles : false;
38723 function updateAttributes(selection$$1) {
38724 ['shadow', 'stroke', 'fill'].forEach(function(klass) {
38725 var rads = radiuses[klass];
38726 selection$$1.selectAll('.' + klass)
38727 .each(function(entity) {
38728 var i = z && getIcon(entity);
38729 var r = rads[i ? 3 : z];
38731 // slightly increase the size of unconnected endpoints #3775
38732 if (entity.isEndpoint(graph) && !entity.isConnected(graph)) {
38736 if (klass === 'shadow') { // remember this value, so we don't need to
38737 _radii[entity.id] = r; // recompute it when we draw the touch targets
38742 .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
38747 vertices.sort(sortY);
38749 var groups = selection$$1.selectAll('g.vertex')
38751 .data(vertices, fastEntityKey);
38758 var enter = groups.enter()
38760 .attr('class', function(d) { return 'node vertex ' + d.id; })
38765 .attr('class', 'shadow');
38769 .attr('class', 'stroke');
38771 // Vertices with tags get a fill.
38772 enter.filter(function(d) { return d.hasInterestingTags(); })
38774 .attr('class', 'fill');
38779 .attr('transform', svgPointTransform(projection))
38780 .classed('sibling', function(d) { return d.id in sets.selected; })
38781 .classed('shared', function(d) { return graph.isShared(d); })
38782 .classed('endpoint', function(d) { return d.isEndpoint(graph); })
38783 .call(updateAttributes);
38786 // Vertices with icons get a `use`.
38787 var iconUse = groups
38788 .selectAll('.icon')
38789 .data(function data(d) { return zoom >= 17 && getIcon(d) ? [d] : []; }, fastEntityKey);
38798 .attr('class', 'icon')
38799 .attr('width', '11px')
38800 .attr('height', '11px')
38801 .attr('transform', 'translate(-5.5, -5.5)')
38802 .attr('xlink:href', function(d) {
38803 var picon = getIcon(d);
38804 var isMaki = /^maki-/.test(picon);
38805 return '#' + picon + (isMaki ? '-11' : '');
38809 // Vertices with directions get viewfields
38810 var dgroups = groups
38811 .selectAll('.viewfieldgroup')
38812 .data(function data(d) { return zoom >= 18 && getDirections(d) ? [d] : []; }, fastEntityKey);
38819 dgroups = dgroups.enter()
38820 .insert('g', '.shadow')
38821 .attr('class', 'viewfieldgroup')
38824 var viewfields = dgroups.selectAll('.viewfield')
38825 .data(getDirections, function key(d) { return osmEntity$$1.key(d); });
38834 .attr('class', 'viewfield')
38835 .attr('d', 'M0,0H0')
38837 .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
38838 .attr('transform', function(d) { return 'rotate(' + d + ')'; });
38842 function drawTargets(selection$$1, graph, entities, filter) {
38843 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
38844 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
38845 var getTransform = svgPointTransform(projection).geojson;
38846 var activeID = context.activeID();
38847 var data = { targets: [], nopes: [] };
38849 entities.forEach(function(node) {
38850 if (activeID === node.id) return; // draw no target on the activeID
38852 var vertexType = svgPassiveVertex(node, graph, activeID);
38853 if (vertexType !== 0) { // passive or adjacent - allow to connect
38854 data.targets.push({
38861 geometry: node.asGeoJSON()
38866 id: node.id + '-nope',
38872 geometry: node.asGeoJSON()
38878 // Targets allow hover and vertex snapping
38879 var targets = selection$$1.selectAll('.vertex.target-allowed')
38880 .filter(function(d) { return filter(d.properties.entity); })
38881 .data(data.targets, function key(d) { return d.id; });
38890 .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
38892 .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
38893 .attr('transform', getTransform);
38897 var nopes = selection$$1.selectAll('.vertex.target-nope')
38898 .filter(function(d) { return filter(d.properties.entity); })
38899 .data(data.nopes, function key(d) { return d.id; });
38908 .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
38910 .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
38911 .attr('transform', getTransform);
38915 // Points can also render as vertices:
38916 // 1. in wireframe mode or
38917 // 2. at higher zooms if they have a direction
38918 function renderAsVertex(entity, graph, wireframe, zoom) {
38919 var geometry = entity.geometry(graph);
38920 return geometry === 'vertex' || (geometry === 'point' && (
38921 wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
38926 function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
38929 function addChildVertices(entity) {
38930 var geometry = entity.geometry(graph);
38931 if (!context.features().isHiddenFeature(entity, graph, geometry)) {
38933 if (entity.type === 'way') {
38934 for (i = 0; i < entity.nodes.length; i++) {
38935 var child = graph.hasEntity(entity.nodes[i]);
38937 addChildVertices(child);
38940 } else if (entity.type === 'relation') {
38941 for (i = 0; i < entity.members.length; i++) {
38942 var member = graph.hasEntity(entity.members[i].id);
38944 addChildVertices(member);
38947 } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
38948 results[entity.id] = entity;
38953 ids.forEach(function(id) {
38954 var entity = graph.hasEntity(id);
38955 if (!entity) return;
38957 if (entity.type === 'node') {
38958 if (renderAsVertex(entity, graph, wireframe, zoom)) {
38959 results[entity.id] = entity;
38960 graph.parentWays(entity).forEach(function(entity) {
38961 addChildVertices(entity);
38964 } else { // way, relation
38965 addChildVertices(entity);
38973 function drawVertices(selection$$1, graph, entities, filter, extent, fullRedraw) {
38974 var wireframe = context.surface().classed('fill-wireframe');
38975 var zoom = geoScaleToZoom(projection.scale());
38976 var mode = context.mode();
38977 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
38980 _currPersistent = {};
38984 // Collect important vertices from the `entities` list..
38985 // (during a paritial redraw, it will not contain everything)
38986 for (var i = 0; i < entities.length; i++) {
38987 var entity = entities[i];
38988 var geometry = entity.geometry(graph);
38991 // a point that looks like a vertex..
38992 if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
38993 _currPersistent[entity.id] = entity;
38996 // a vertex of some importance..
38997 } else if (geometry === 'vertex' &&
38998 (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
38999 _currPersistent[entity.id] = entity;
39003 // whatever this is, it's not a persistent vertex..
39004 if (!keep && !fullRedraw) {
39005 delete _currPersistent[entity.id];
39009 // 3 sets of vertices to consider:
39011 persistent: _currPersistent, // persistent = important vertices (render always)
39012 selected: _currSelected, // selected + siblings of selected (render always)
39013 hovered: _currHover // hovered + siblings of hovered (render only in draw modes)
39016 var all = assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
39018 // Draw the vertices..
39019 // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
39020 // Adjust the filter function to expand the scope beyond whatever entities were passed in.
39021 var filterRendered = function(d) {
39022 return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
39024 selection$$1.selectAll('.layer-points .layer-points-vertices')
39025 .call(draw, graph, currentVisible(all), sets, filterRendered);
39027 // Draw touch targets..
39028 // When drawing, render all targets (not just those affected by a partial redraw)
39029 var filterTouch = function(d) {
39030 return isMoving ? true : filterRendered(d);
39032 selection$$1.selectAll('.layer-points .layer-points-targets')
39033 .call(drawTargets, graph, currentVisible(all), filterTouch);
39036 function currentVisible(which) {
39037 return Object.keys(which)
39038 .map(graph.hasEntity, graph) // the current version of this entity
39039 .filter(function (entity) { return entity && entity.intersects(extent, graph); });
39044 // partial redraw - only update the selected items..
39045 drawVertices.drawSelected = function(selection$$1, graph, extent) {
39046 var wireframe = context.surface().classed('fill-wireframe');
39047 var zoom = geoScaleToZoom(projection.scale());
39049 _prevSelected = _currSelected || {};
39050 _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
39052 // note that drawVertices will add `_currSelected` automatically if needed..
39053 var filter = function(d) { return d.id in _prevSelected; };
39054 drawVertices(selection$$1, graph, values$1(_prevSelected), filter, extent, false);
39058 // partial redraw - only update the hovered items..
39059 drawVertices.drawHover = function(selection$$1, graph, target, extent) {
39060 if (target === _currHoverTarget) return; // continue only if something changed
39062 var wireframe = context.surface().classed('fill-wireframe');
39063 var zoom = geoScaleToZoom(projection.scale());
39065 _prevHover = _currHover || {};
39066 _currHoverTarget = target;
39067 var entity = target && target.properties && target.properties.entity;
39070 _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
39075 // note that drawVertices will add `_currHover` automatically if needed..
39076 var filter = function(d) { return d.id in _prevHover; };
39077 drawVertices(selection$$1, graph, values$1(_prevHover), filter, extent, false);
39080 return drawVertices;
39083 /* global Mapillary:false */
39085 var apibase = 'https://a.mapillary.com/v3/';
39086 var viewercss = 'mapillary-js/mapillary.min.css';
39087 var viewerjs = 'mapillary-js/mapillary.min.js';
39088 var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
39089 var maxResults = 1000;
39091 var dispatch$1 = dispatch('loadedImages', 'loadedSigns');
39092 var _mlyFallback = false;
39095 var _mlySelectedImage;
39099 function abortRequest(i) {
39104 function nearNullIsland(x, y, z) {
39106 var center = Math.pow(2, z - 1);
39107 var width = Math.pow(2, z - 6);
39108 var min$$1 = center - (width / 2);
39109 var max$$1 = center + (width / 2) - 1;
39110 return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
39116 function maxPageAtZoom(z) {
39117 if (z < 15) return 2;
39118 if (z === 15) return 5;
39119 if (z === 16) return 10;
39120 if (z === 17) return 20;
39121 if (z === 18) return 40;
39122 if (z > 18) return 80;
39126 function localeTimestamp(s) {
39127 if (!s) return null;
39128 var detected = utilDetect();
39130 day: 'numeric', month: 'short', year: 'numeric',
39131 hour: 'numeric', minute: 'numeric', second: 'numeric',
39134 var d = new Date(s);
39135 if (isNaN(d.getTime())) return null;
39136 return d.toLocaleString(detected.locale, options);
39140 function getTiles(projection) {
39141 var s = projection.scale() * 2 * Math.PI;
39142 var z = Math.max(Math.log(s) / Math.log(2) - 8, 0);
39143 var ts = 256 * Math.pow(2, z - tileZoom);
39145 s / 2 - projection.translate()[0],
39146 s / 2 - projection.translate()[1]
39150 .scaleExtent([tileZoom, tileZoom])
39152 .size(projection.clipExtent()[1])
39153 .translate(projection.translate())()
39154 .map(function(tile) {
39155 var x = tile[0] * ts - origin[0];
39156 var y = tile[1] * ts - origin[1];
39159 id: tile.toString(),
39161 extent: geoExtent$$1(
39162 projection.invert([x, y + ts]),
39163 projection.invert([x + ts, y])
39170 function loadTiles(which, url, projection) {
39171 var s = projection.scale() * 2 * Math.PI;
39172 var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0));
39174 var tiles = getTiles(projection).filter(function(t) {
39175 return !nearNullIsland(t.xyz[0], t.xyz[1], t.xyz[2]);
39178 filter(which.inflight, function(v, k) {
39179 var wanted = find$1(tiles, function(tile) { return k === (tile.id + ',0'); });
39180 if (!wanted) delete which.inflight[k];
39182 }).map(abortRequest);
39184 tiles.forEach(function(tile) {
39185 loadNextTilePage(which, currZoom, url, tile);
39190 function loadNextTilePage(which, currZoom, url, tile) {
39191 var cache = _mlyCache[which];
39192 var rect = tile.extent.rectangle();
39193 var maxPages = maxPageAtZoom(currZoom);
39194 var nextPage = cache.nextPage[tile.id] || 0;
39195 var nextURL = cache.nextURL[tile.id] || url +
39197 per_page: maxResults,
39199 client_id: clientId,
39200 bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
39203 if (nextPage > maxPages) return;
39205 var id = tile.id + ',' + String(nextPage);
39206 if (cache.loaded[id] || cache.inflight[id]) return;
39207 cache.inflight[id] = request(nextURL)
39208 .mimeType('application/json')
39209 .response(function(xhr) {
39210 var linkHeader = xhr.getResponseHeader('Link');
39212 var pagination = parsePagination(xhr.getResponseHeader('Link'));
39213 if (pagination.next) {
39214 cache.nextURL[tile.id] = pagination.next;
39217 return JSON.parse(xhr.responseText);
39219 .get(function(err, data) {
39220 cache.loaded[id] = true;
39221 delete cache.inflight[id];
39222 if (err || !data.features || !data.features.length) return;
39224 var features = data.features.map(function(feature) {
39225 var loc = feature.geometry.coordinates;
39228 if (which === 'images') {
39231 key: feature.properties.key,
39232 ca: feature.properties.ca,
39233 captured_at: feature.properties.captured_at,
39234 captured_by: feature.properties.username,
39235 pano: feature.properties.pano
39237 cache.forImageKey[d.key] = d; // cache imageKey -> image
39239 } else if (which === 'sequences') {
39240 var sequenceKey = feature.properties.key;
39241 cache.lineString[sequenceKey] = feature; // cache sequenceKey -> lineString
39242 feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
39243 cache.forImageKey[imageKey] = sequenceKey; // cache imageKey -> sequenceKey
39245 return false; // because no `d` data worth loading into an rbush
39247 } else if (which === 'objects') {
39250 key: feature.properties.key,
39251 value: feature.properties.value,
39252 package: feature.properties.package,
39253 detections: feature.properties.detections
39256 // cache imageKey -> detectionKey
39257 feature.properties.detections.forEach(function(detection) {
39258 var imageKey = detection.image_key;
39259 var detectionKey = detection.detection_key;
39260 if (!_mlyCache.detections[imageKey]) {
39261 _mlyCache.detections[imageKey] = {};
39263 if (!_mlyCache.detections[imageKey][detectionKey]) {
39264 _mlyCache.detections[imageKey][detectionKey] = {};
39270 minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
39273 }).filter(Boolean);
39275 cache.rtree.load(features);
39277 if (which === 'images' || which === 'sequences') {
39278 dispatch$1.call('loadedImages');
39279 } else if (which === 'objects') {
39280 dispatch$1.call('loadedSigns');
39283 if (data.features.length === maxResults) { // more pages to load
39284 cache.nextPage[tile.id] = nextPage + 1;
39285 loadNextTilePage(which, currZoom, url, tile);
39287 cache.nextPage[tile.id] = Infinity; // no more pages to load
39292 // extract links to pages of API results
39293 function parsePagination(links) {
39294 return links.split(',').map(function(rel) {
39295 var elements = rel.split(';');
39296 if (elements.length === 2) {
39298 /<(.+)>/.exec(elements[0])[1],
39299 /rel="(.+)"/.exec(elements[1])[1]
39304 }).reduce(function(pagination, val) {
39305 pagination[val[1]] = val[0];
39311 // partition viewport into `psize` x `psize` regions
39312 function partitionViewport(psize, projection) {
39313 var dimensions = projection.clipExtent()[1];
39314 psize = psize || 16;
39315 var cols = range(0, dimensions[0], psize);
39316 var rows = range(0, dimensions[1], psize);
39317 var partitions = [];
39319 rows.forEach(function(y) {
39320 cols.forEach(function(x) {
39321 var min$$1 = [x, y + psize];
39322 var max$$1 = [x + psize, y];
39324 geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
39332 // no more than `limit` results per partition.
39333 function searchLimited(psize, limit, projection, rtree) {
39334 limit = limit || 3;
39336 var partitions = partitionViewport(psize, projection);
39339 // console.time('previous');
39340 results = flatten(map$3(partitions, function(extent$$1) {
39341 return rtree.search(extent$$1.bbox())
39343 .map(function(d) { return d.data; });
39345 // console.timeEnd('previous');
39347 // console.time('new');
39348 // results = partitions.reduce(function(result, extent) {
39349 // var found = rtree.search(extent.bbox())
39350 // .map(function(d) { return d.data; })
39351 // .sort(function(a, b) {
39352 // return a.loc[1] - b.loc[1];
39353 // // return a.key.localeCompare(b.key);
39355 // .slice(0, limit);
39357 // return (found.length ? result.concat(found) : result);
39359 // console.timeEnd('new');
39366 var serviceMapillary = {
39373 this.event = utilRebind(this, dispatch$1, 'on');
39376 reset: function() {
39377 var cache = _mlyCache;
39380 if (cache.images && cache.images.inflight) {
39381 forEach(cache.images.inflight, abortRequest);
39383 if (cache.objects && cache.objects.inflight) {
39384 forEach(cache.objects.inflight, abortRequest);
39386 if (cache.sequences && cache.sequences.inflight) {
39387 forEach(cache.sequences.inflight, abortRequest);
39392 images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
39393 objects: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
39394 sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} },
39398 _mlySelectedImage = null;
39403 images: function(projection) {
39404 var psize = 16, limit = 3;
39405 return searchLimited(psize, limit, projection, _mlyCache.images.rtree);
39409 signs: function(projection) {
39410 var psize = 32, limit = 3;
39411 return searchLimited(psize, limit, projection, _mlyCache.objects.rtree);
39415 sequences: function(projection) {
39416 var viewport = projection.clipExtent();
39417 var min$$1 = [viewport[0][0], viewport[1][1]];
39418 var max$$1 = [viewport[1][0], viewport[0][1]];
39419 var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
39420 var sequenceKeys = {};
39422 // all sequences for images in viewport
39423 _mlyCache.images.rtree.search(bbox)
39424 .forEach(function(d) {
39425 var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
39427 sequenceKeys[sequenceKey] = true;
39431 // Return lineStrings for the sequences
39432 return Object.keys(sequenceKeys).map(function(sequenceKey) {
39433 return _mlyCache.sequences.lineString[sequenceKey];
39438 signsSupported: function() {
39443 loadImages: function(projection) {
39444 loadTiles('images', apibase + 'images?', projection);
39445 loadTiles('sequences', apibase + 'sequences?', projection);
39449 loadSigns: function(context, projection) {
39450 // if we are looking at signs, we'll actually need to fetch images too
39451 loadTiles('images', apibase + 'images?', projection);
39452 loadTiles('objects', apibase + 'objects?', projection);
39456 loadViewer: function(context) {
39458 var wrap = select('#photoviewer').selectAll('.mly-wrapper')
39461 var wrapEnter = wrap.enter()
39464 .attr('class', 'photo-wrapper mly-wrapper')
39465 .classed('hide', true);
39469 .attr('class', 'photo-attribution fillD');
39472 // load mapillary-viewercss
39473 select('head').selectAll('#mapillary-viewercss')
39477 .attr('id', 'mapillary-viewercss')
39478 .attr('rel', 'stylesheet')
39479 .attr('href', context.asset(viewercss));
39481 // load mapillary-viewerjs
39482 select('head').selectAll('#mapillary-viewerjs')
39486 .attr('id', 'mapillary-viewerjs')
39487 .attr('src', context.asset(viewerjs));
39489 // load mapillary signs sprite
39490 var defs = context.container().select('defs');
39491 defs.call(svgDefs(context).addSprites, ['mapillary-sprite']);
39495 showViewer: function() {
39496 var wrap = select('#photoviewer')
39497 .classed('hide', false);
39499 var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
39503 .selectAll('.photo-wrapper:not(.mly-wrapper)')
39504 .classed('hide', true);
39507 .selectAll('.photo-wrapper.mly-wrapper')
39508 .classed('hide', false);
39510 _mlyViewer.resize();
39517 hideViewer: function() {
39518 _mlySelectedImage = null;
39520 if (!_mlyFallback && _mlyViewer) {
39521 _mlyViewer.getComponent('sequence').stop();
39524 var viewer = select('#photoviewer');
39525 if (!viewer.empty()) viewer.datum(null);
39528 .classed('hide', true)
39529 .selectAll('.photo-wrapper')
39530 .classed('hide', true);
39532 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
39533 .classed('selected', false);
39535 return this.setStyles(null, true);
39539 parsePagination: parsePagination,
39542 updateViewer: function(imageKey, context) {
39543 if (!imageKey) return this;
39546 this.initViewer(imageKey, context);
39548 _mlyViewer.moveToKey(imageKey)
39549 .catch(function(e) { console.error('mly3', e); }); // eslint-disable-line no-console
39556 initViewer: function(imageKey, context) {
39558 if (Mapillary && imageKey) {
39560 baseImageSize: 320,
39568 // Disable components requiring WebGL support
39569 if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
39570 _mlyFallback = true;
39579 image: true, // fallback
39580 navigation: true // fallback
39584 _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
39585 _mlyViewer.on('nodechanged', nodeChanged);
39586 _mlyViewer.moveToKey(imageKey)
39587 .catch(function(e) { console.error('mly3', e); }); // eslint-disable-line no-console
39590 // nodeChanged: called after the viewer has changed images and is ready.
39592 // There is some logic here to batch up clicks into a _mlyClicks array
39593 // because the user might click on a lot of markers quickly and nodechanged
39594 // may be called out of order asychronously.
39596 // Clicks are added to the array in `selectedImage` and removed here.
39598 function nodeChanged(node) {
39599 if (!_mlyFallback) {
39600 _mlyViewer.getComponent('tag').removeAll(); // remove previous detections
39603 var clicks = _mlyClicks;
39604 var index = clicks.indexOf(node.key);
39605 var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
39607 if (index > -1) { // `nodechanged` initiated from clicking on a marker..
39608 clicks.splice(index, 1); // remove the click
39609 // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
39610 // one more time to update the detections and attribution..
39611 if (node.key === selectedKey) {
39612 that.selectImage(_mlySelectedImage, node.key, true);
39614 } else { // `nodechanged` initiated from the Mapillary viewer controls..
39615 var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
39616 context.map().centerEase(loc);
39617 that.selectImage(undefined, node.key, true);
39623 // Pass the image datum itself in `d` or the `imageKey` string.
39624 // This allows images to be selected from places that dont have access
39625 // to the full image datum (like the street signs layer or the js viewer)
39626 selectImage: function(d, imageKey, fromViewer) {
39627 if (!d && imageKey) {
39628 // If the user clicked on something that's not an image marker, we
39629 // might get in here.. Cache lookup can fail, e.g. if the user
39630 // clicked a streetsign, but images are loading slowly asynchronously.
39631 // We'll try to carry on anyway if there is no datum. There just
39632 // might be a delay before user sees detections, captured_at, etc.
39633 d = _mlyCache.images.forImageKey[imageKey];
39636 _mlySelectedImage = d;
39637 var viewer = select('#photoviewer');
39638 if (!viewer.empty()) viewer.datum(d);
39640 imageKey = (d && d.key) || imageKey;
39641 if (!fromViewer && imageKey) {
39642 _mlyClicks.push(imageKey);
39645 this.setStyles(null, true);
39647 d3_selectAll('.layer-mapillary-signs .icon-sign')
39648 .classed('selected', function(d) {
39649 return some(d.detections, function(detection) {
39650 return detection.image_key === imageKey;
39654 var wrap = select('#photoviewer .mly-wrapper');
39655 var attribution = wrap.selectAll('.photo-attribution').html('');
39658 if (d.captured_by) {
39661 .attr('class', 'captured_by')
39662 .attr('target', '_blank')
39663 .attr('href', 'https://www.mapillary.com/app/user/' + encodeURIComponent(d.captured_by))
39664 .text('@' + d.captured_by);
39671 if (d.captured_at) {
39674 .attr('class', 'captured_at')
39675 .text(localeTimestamp(d.captured_at));
39684 .attr('class', 'image_link')
39685 .attr('target', '_blank')
39686 .attr('href', 'https://www.mapillary.com/app/?pKey=' + encodeURIComponent(d.key) +
39687 '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
39688 .text('mapillary.com');
39690 this.updateDetections(d);
39697 getSelectedImage: function() {
39698 return _mlySelectedImage;
39702 getSequenceKeyForImage: function(d) {
39703 var imageKey = d && d.key;
39704 return imageKey && _mlyCache.sequences.forImageKey[imageKey];
39708 setStyles: function(hovered, reset) {
39709 if (reset) { // reset all layers
39710 d3_selectAll('.viewfield-group')
39711 .classed('highlighted', false)
39712 .classed('hovered', false)
39713 .classed('selected', false);
39715 d3_selectAll('.sequence')
39716 .classed('highlighted', false)
39717 .classed('selected', false);
39720 var hoveredImageKey = hovered && hovered.key;
39721 var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
39722 var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
39723 var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
39725 var viewer = select('#photoviewer');
39726 var selected = viewer.empty() ? undefined : viewer.datum();
39727 var selectedImageKey = selected && selected.key;
39728 var selectedSequenceKey = this.getSequenceKeyForImage(selected);
39729 var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
39730 var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
39732 // highlight sibling viewfields on either the selected or the hovered sequences
39733 var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
39735 d3_selectAll('.layer-mapillary-images .viewfield-group')
39736 .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
39737 .classed('hovered', function(d) { return d.key === hoveredImageKey; })
39738 .classed('selected', function(d) { return d.key === selectedImageKey; });
39740 d3_selectAll('.layer-mapillary-images .sequence')
39741 .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
39742 .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
39744 // update viewfields if needed
39745 d3_selectAll('.viewfield-group .viewfield')
39746 .attr('d', viewfieldPath);
39748 function viewfieldPath() {
39749 var d = this.parentNode.__data__;
39750 if (d.pano && d.key !== selectedImageKey) {
39751 return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
39753 return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
39761 updateDetections: function(d) {
39762 if (!_mlyViewer || _mlyFallback) return;
39764 var imageKey = d && d.key;
39765 var detections = (imageKey && _mlyCache.detections[imageKey]) || [];
39767 forEach(detections, function(data, k) {
39768 if (isEmpty(data)) {
39771 var tag = makeTag(data);
39773 var tagComponent = _mlyViewer.getComponent('tag');
39774 tagComponent.add([tag]);
39780 function loadDetection(detectionKey) {
39781 var url = apibase + 'detections/' +
39782 detectionKey + '?' + utilQsString({ client_id: clientId });
39785 .mimeType('application/json')
39786 .response(function(xhr) {
39787 return JSON.parse(xhr.responseText);
39789 .get(function(err, data) {
39790 if (!data || !data.properties) return;
39792 var imageKey = data.properties.image_key;
39793 _mlyCache.detections[imageKey][detectionKey] = data;
39795 var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
39796 if (imageKey === selectedKey) {
39797 var tag = makeTag(data);
39799 var tagComponent = _mlyViewer.getComponent('tag');
39800 tagComponent.add([tag]);
39807 function makeTag(data) {
39808 var valueParts = data.properties.value.split('--');
39809 if (valueParts.length !== 3) return;
39811 var text = valueParts[1].replace(/-/g, ' ');
39814 // Currently only two shapes <Polygon|Point>
39815 if (data.properties.shape.type === 'Polygon') {
39816 var polygonGeometry = new Mapillary
39818 .PolygonGeometry(data.properties.shape.coordinates[0]);
39820 tag = new Mapillary.TagComponent.OutlineTag(
39821 data.properties.key,
39825 textColor: 0xffff00,
39826 lineColor: 0xffff00,
39828 fillColor: 0xffff00,
39833 } else if (data.properties.shape.type === 'Point') {
39834 var pointGeometry = new Mapillary
39836 .PointGeometry(data.properties.shape.coordinates[0]);
39838 tag = new Mapillary.TagComponent.SpotTag(
39839 data.properties.key,
39844 textColor: 0xffff00
39854 cache: function() {
39860 var apibase$1 = 'https://nominatim.openstreetmap.org/',
39865 var serviceNominatim = {
39869 nominatimCache = rbush_1();
39872 reset: function() {
39873 forEach(inflight, function(req) { req.abort(); });
39875 nominatimCache = rbush_1();
39879 countryCode: function (location, callback) {
39880 this.reverse(location, function(err, result) {
39882 return callback(err);
39883 } else if (result.address) {
39884 return callback(null, result.address.country_code);
39886 return callback('Unable to geocode', null);
39892 reverse: function (location, callback) {
39893 var cached = nominatimCache.search(
39894 { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
39897 if (cached.length > 0) {
39898 return callback(null, cached[0].data);
39901 var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
39902 var url = apibase$1 + 'reverse?' + utilQsString(params);
39903 if (inflight[url]) return;
39905 inflight[url] = d3_json(url, function(err, result) {
39906 delete inflight[url];
39909 return callback(err);
39910 } else if (result && result.error) {
39911 return callback(result.error);
39914 var extent = geoExtent$$1(location).padByMeters(200);
39915 nominatimCache.insert(assign(extent.bbox(), {data: result}));
39917 callback(null, result);
39922 search: function (val, callback) {
39923 var searchVal = encodeURIComponent(val);
39924 var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
39925 if (inflight[url]) return;
39927 inflight[url] = d3_json(url, function(err, result) {
39928 delete inflight[url];
39929 callback(err, result);
39935 var apibase$2 = 'https://openstreetcam.org',
39936 maxResults$1 = 1000,
39938 dispatch$2 = dispatch('loadedImages'),
39939 imgZoom = d3_zoom()
39940 .extent([[0, 0], [320, 240]])
39941 .translateExtent([[0, 0], [320, 240]])
39942 .scaleExtent([1, 15])
39943 .on('zoom', zoomPan),
39948 function abortRequest$1(i) {
39953 function nearNullIsland$1(x, y, z) {
39955 var center = Math.pow(2, z - 1),
39956 width = Math.pow(2, z - 6),
39957 min$$1 = center - (width / 2),
39958 max$$1 = center + (width / 2) - 1;
39959 return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
39965 function maxPageAtZoom$1(z) {
39966 if (z < 15) return 2;
39967 if (z === 15) return 5;
39968 if (z === 16) return 10;
39969 if (z === 17) return 20;
39970 if (z === 18) return 40;
39971 if (z > 18) return 80;
39975 function getTiles$1(projection) {
39976 var s = projection.scale() * 2 * Math.PI,
39977 z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
39978 ts = 256 * Math.pow(2, z - tileZoom$1),
39980 s / 2 - projection.translate()[0],
39981 s / 2 - projection.translate()[1]];
39984 .scaleExtent([tileZoom$1, tileZoom$1])
39986 .size(projection.clipExtent()[1])
39987 .translate(projection.translate())()
39988 .map(function(tile) {
39989 var x = tile[0] * ts - origin[0],
39990 y = tile[1] * ts - origin[1];
39993 id: tile.toString(),
39995 extent: geoExtent$$1(
39996 projection.invert([x, y + ts]),
39997 projection.invert([x + ts, y])
40004 function loadTiles$1(which, url, projection) {
40005 var s = projection.scale() * 2 * Math.PI,
40006 currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0));
40008 var tiles = getTiles$1(projection).filter(function(t) {
40009 return !nearNullIsland$1(t.xyz[0], t.xyz[1], t.xyz[2]);
40012 filter(which.inflight, function(v, k) {
40013 var wanted = find$1(tiles, function(tile) { return k === (tile.id + ',0'); });
40014 if (!wanted) delete which.inflight[k];
40016 }).map(abortRequest$1);
40018 tiles.forEach(function(tile) {
40019 loadNextTilePage$1(which, currZoom, url, tile);
40024 function loadNextTilePage$1(which, currZoom, url, tile) {
40025 var cache = _oscCache[which];
40026 var bbox = tile.extent.bbox();
40027 var maxPages = maxPageAtZoom$1(currZoom);
40028 var nextPage = cache.nextPage[tile.id] || 1;
40029 var params = utilQsString({
40032 // client_id: clientId,
40033 bbTopLeft: [bbox.maxY, bbox.minX].join(','),
40034 bbBottomRight: [bbox.minY, bbox.maxX].join(',')
40037 if (nextPage > maxPages) return;
40039 var id = tile.id + ',' + String(nextPage);
40040 if (cache.loaded[id] || cache.inflight[id]) return;
40042 cache.inflight[id] = request(url)
40043 .mimeType('application/json')
40044 .header('Content-type', 'application/x-www-form-urlencoded')
40045 .response(function(xhr) { return JSON.parse(xhr.responseText); })
40046 .post(params, function(err, data) {
40047 cache.loaded[id] = true;
40048 delete cache.inflight[id];
40049 if (err || !data.currentPageItems || !data.currentPageItems.length) return;
40051 function localeDateString(s) {
40052 if (!s) return null;
40053 var detected = utilDetect();
40054 var options = { day: 'numeric', month: 'short', year: 'numeric' };
40055 var d = new Date(s);
40056 if (isNaN(d.getTime())) return null;
40057 return d.toLocaleDateString(detected.locale, options);
40060 var features = data.currentPageItems.map(function(item) {
40061 var loc = [+item.lng, +item.lat],
40064 if (which === 'images') {
40069 captured_at: localeDateString(item.shot_date || item.date_added),
40070 captured_by: item.username,
40071 imagePath: item.lth_name,
40072 sequence_id: item.sequence_id,
40073 sequence_index: +item.sequence_index
40076 // cache sequence info
40077 var seq = _oscCache.sequences[d.sequence_id];
40079 seq = { rotation: 0, images: [] };
40080 _oscCache.sequences[d.sequence_id] = seq;
40082 seq.images[d.sequence_index] = d;
40086 minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
40090 cache.rtree.load(features);
40092 if (which === 'images') {
40093 dispatch$2.call('loadedImages');
40096 if (data.currentPageItems.length === maxResults$1) { // more pages to load
40097 cache.nextPage[tile.id] = nextPage + 1;
40098 loadNextTilePage$1(which, currZoom, url, tile);
40100 cache.nextPage[tile.id] = Infinity; // no more pages to load
40106 // partition viewport into `psize` x `psize` regions
40107 function partitionViewport$1(psize, projection) {
40108 var dimensions = projection.clipExtent()[1];
40109 psize = psize || 16;
40110 var cols = range(0, dimensions[0], psize),
40111 rows = range(0, dimensions[1], psize),
40114 rows.forEach(function(y) {
40115 cols.forEach(function(x) {
40116 var min$$1 = [x, y + psize],
40117 max$$1 = [x + psize, y];
40119 geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
40127 // no more than `limit` results per partition.
40128 function searchLimited$1(psize, limit, projection, rtree) {
40129 limit = limit || 3;
40131 var partitions = partitionViewport$1(psize, projection);
40134 results = flatten(map$3(partitions, function(extent$$1) {
40135 return rtree.search(extent$$1.bbox())
40137 .map(function(d) { return d.data; });
40143 function zoomPan() {
40144 var t = event.transform;
40145 select('#photoviewer .osc-image-wrap')
40146 .call(utilSetTransform, t.x, t.y, t.k);
40150 var serviceOpenstreetcam = {
40157 this.event = utilRebind(this, dispatch$2, 'on');
40160 reset: function() {
40161 var cache = _oscCache;
40164 if (cache.images && cache.images.inflight) {
40165 forEach(cache.images.inflight, abortRequest$1);
40170 images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
40174 _oscSelectedImage = null;
40178 images: function(projection) {
40179 var psize = 16, limit = 3;
40180 return searchLimited$1(psize, limit, projection, _oscCache.images.rtree);
40184 sequences: function(projection) {
40185 var viewport = projection.clipExtent();
40186 var min$$1 = [viewport[0][0], viewport[1][1]];
40187 var max$$1 = [viewport[1][0], viewport[0][1]];
40188 var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
40189 var sequenceKeys = {};
40191 // all sequences for images in viewport
40192 _oscCache.images.rtree.search(bbox)
40193 .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
40195 // make linestrings from those sequences
40196 var lineStrings = [];
40197 Object.keys(sequenceKeys)
40198 .forEach(function(sequenceKey) {
40199 var seq = _oscCache.sequences[sequenceKey];
40200 var images = seq && seq.images;
40203 type: 'LineString',
40204 coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
40205 properties: { key: sequenceKey }
40209 return lineStrings;
40213 loadImages: function(projection) {
40214 var url = apibase$2 + '/1.0/list/nearby-photos/';
40215 loadTiles$1('images', url, projection);
40219 loadViewer: function(context) {
40223 var wrap = select('#photoviewer').selectAll('.osc-wrapper')
40226 var wrapEnter = wrap.enter()
40228 .attr('class', 'photo-wrapper osc-wrapper')
40229 .classed('hide', true)
40231 .on('dblclick.zoom', null);
40235 .attr('class', 'photo-attribution fillD');
40237 var controlsEnter = wrapEnter
40239 .attr('class', 'osc-controls-wrap')
40241 .attr('class', 'osc-controls');
40245 .on('click.back', step(-1))
40250 .on('click.rotate-ccw', rotate(-90))
40255 .on('click.rotate-cw', rotate(90))
40260 .on('click.forward', step(1))
40265 .attr('class', 'osc-image-wrap');
40268 function rotate(deg) {
40269 return function() {
40270 if (!_oscSelectedImage) return;
40271 var sequenceKey = _oscSelectedImage.sequence_id;
40272 var sequence = _oscCache.sequences[sequenceKey];
40273 if (!sequence) return;
40275 var r = sequence.rotation || 0;
40278 if (r > 180) r -= 360;
40279 if (r < -180) r += 360;
40280 sequence.rotation = r;
40282 var wrap = select('#photoviewer .osc-wrapper');
40287 .call(imgZoom.transform, identity$7);
40289 wrap.selectAll('.osc-image')
40292 .style('transform', 'rotate(' + r + 'deg)');
40296 function step(stepBy) {
40297 return function() {
40298 if (!_oscSelectedImage) return;
40299 var sequenceKey = _oscSelectedImage.sequence_id;
40300 var sequence = _oscCache.sequences[sequenceKey];
40301 if (!sequence) return;
40303 var nextIndex = _oscSelectedImage.sequence_index + stepBy;
40304 var nextImage = sequence.images[nextIndex];
40305 if (!nextImage) return;
40307 context.map().centerEase(nextImage.loc);
40310 .selectImage(nextImage)
40311 .updateViewer(nextImage);
40317 showViewer: function() {
40318 var viewer = select('#photoviewer')
40319 .classed('hide', false);
40321 var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
40325 .selectAll('.photo-wrapper:not(.osc-wrapper)')
40326 .classed('hide', true);
40329 .selectAll('.photo-wrapper.osc-wrapper')
40330 .classed('hide', false);
40337 hideViewer: function() {
40338 _oscSelectedImage = null;
40340 var viewer = select('#photoviewer');
40341 if (!viewer.empty()) viewer.datum(null);
40344 .classed('hide', true)
40345 .selectAll('.photo-wrapper')
40346 .classed('hide', true);
40348 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
40349 .classed('selected', false);
40351 return this.setStyles(null, true);
40355 updateViewer: function(d) {
40356 var wrap = select('#photoviewer .osc-wrapper');
40357 var imageWrap = wrap.selectAll('.osc-image-wrap');
40358 var attribution = wrap.selectAll('.photo-attribution').html('');
40363 .call(imgZoom.transform, identity$7);
40366 .selectAll('.osc-image')
40370 var sequence = _oscCache.sequences[d.sequence_id];
40371 var r = (sequence && sequence.rotation) || 0;
40375 .attr('class', 'osc-image')
40376 .attr('src', apibase$2 + '/' + d.imagePath)
40377 .style('transform', 'rotate(' + r + 'deg)');
40379 if (d.captured_by) {
40382 .attr('class', 'captured_by')
40383 .attr('target', '_blank')
40384 .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
40385 .text('@' + d.captured_by);
40392 if (d.captured_at) {
40395 .attr('class', 'captured_at')
40396 .text(d.captured_at);
40405 .attr('class', 'image_link')
40406 .attr('target', '_blank')
40407 .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
40408 .text('openstreetcam.org');
40414 selectImage: function(d) {
40415 _oscSelectedImage = d;
40416 var viewer = select('#photoviewer');
40417 if (!viewer.empty()) viewer.datum(d);
40419 this.setStyles(null, true);
40421 d3_selectAll('.icon-sign')
40422 .classed('selected', false);
40428 getSelectedImage: function() {
40429 return _oscSelectedImage;
40433 getSequenceKeyForImage: function(d) {
40434 return d && d.sequence_id;
40438 setStyles: function(hovered, reset) {
40439 if (reset) { // reset all layers
40440 d3_selectAll('.viewfield-group')
40441 .classed('highlighted', false)
40442 .classed('hovered', false)
40443 .classed('selected', false);
40445 d3_selectAll('.sequence')
40446 .classed('highlighted', false)
40447 .classed('selected', false);
40450 var hoveredImageKey = hovered && hovered.key;
40451 var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
40452 var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
40453 var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
40455 var viewer = select('#photoviewer');
40456 var selected = viewer.empty() ? undefined : viewer.datum();
40457 var selectedImageKey = selected && selected.key;
40458 var selectedSequenceKey = this.getSequenceKeyForImage(selected);
40459 var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
40460 var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
40462 // highlight sibling viewfields on either the selected or the hovered sequences
40463 var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
40465 d3_selectAll('.layer-openstreetcam-images .viewfield-group')
40466 .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
40467 .classed('hovered', function(d) { return d.key === hoveredImageKey; })
40468 .classed('selected', function(d) { return d.key === selectedImageKey; });
40470 d3_selectAll('.layer-openstreetcam-images .sequence')
40471 .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
40472 .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
40474 // update viewfields if needed
40475 d3_selectAll('.viewfield-group .viewfield')
40476 .attr('d', viewfieldPath);
40478 function viewfieldPath() {
40479 var d = this.parentNode.__data__;
40480 if (d.pano && d.key !== selectedImageKey) {
40481 return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
40483 return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
40491 cache: function() {
40497 /* Built-in method references for those with the same name as other `lodash` methods. */
40498 var nativeCeil = Math.ceil,
40499 nativeMax$4 = Math.max;
40502 * Creates an array of elements split into groups the length of `size`.
40503 * If `array` can't be split evenly, the final chunk will be the remaining
40510 * @param {Array} array The array to process.
40511 * @param {number} [size=1] The length of each chunk
40512 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
40513 * @returns {Array} Returns the new array of chunks.
40516 * _.chunk(['a', 'b', 'c', 'd'], 2);
40517 * // => [['a', 'b'], ['c', 'd']]
40519 * _.chunk(['a', 'b', 'c', 'd'], 3);
40520 * // => [['a', 'b', 'c'], ['d']]
40522 function chunk(array, size, guard) {
40523 if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
40526 size = nativeMax$4(toInteger(size), 0);
40528 var length = array == null ? 0 : array.length;
40529 if (!length || size < 1) {
40534 result = Array(nativeCeil(length / size));
40536 while (index < length) {
40537 result[resIndex++] = baseSlice(array, index, (index += size));
40542 var hashes = createCommonjsModule(function (module, exports) {
40544 * jshashes - https://github.com/h2non/jshashes
40545 * Released under the "New BSD" license
40547 * Algorithms specification:
40549 * MD5 - http://www.ietf.org/rfc/rfc1321.txt
40550 * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
40551 * SHA1 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
40552 * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
40553 * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
40554 * HMAC - http://www.ietf.org/rfc/rfc2104.txt
40559 function utf8Encode(str) {
40560 var x, y, output = '',
40564 if (str && str.length) {
40566 while ((i += 1) < l) {
40567 /* Decode utf-16 surrogate pairs */
40568 x = str.charCodeAt(i);
40569 y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
40570 if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
40571 x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
40574 /* Encode output as utf-8 */
40576 output += String.fromCharCode(x);
40577 } else if (x <= 0x7FF) {
40578 output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
40579 0x80 | (x & 0x3F));
40580 } else if (x <= 0xFFFF) {
40581 output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
40582 0x80 | ((x >>> 6) & 0x3F),
40583 0x80 | (x & 0x3F));
40584 } else if (x <= 0x1FFFFF) {
40585 output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
40586 0x80 | ((x >>> 12) & 0x3F),
40587 0x80 | ((x >>> 6) & 0x3F),
40588 0x80 | (x & 0x3F));
40595 function utf8Decode(str) {
40596 var i, ac, c1, c2, c3, arr = [],
40598 i = ac = c1 = c2 = c3 = 0;
40600 if (str && str.length) {
40605 c1 = str.charCodeAt(i);
40608 arr[ac] = String.fromCharCode(c1);
40610 } else if (c1 > 191 && c1 < 224) {
40611 c2 = str.charCodeAt(i + 1);
40612 arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
40615 c2 = str.charCodeAt(i + 1);
40616 c3 = str.charCodeAt(i + 2);
40617 arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
40622 return arr.join('');
40626 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
40627 * to work around bugs in some JS interpreters.
40630 function safe_add(x, y) {
40631 var lsw = (x & 0xFFFF) + (y & 0xFFFF),
40632 msw = (x >> 16) + (y >> 16) + (lsw >> 16);
40633 return (msw << 16) | (lsw & 0xFFFF);
40637 * Bitwise rotate a 32-bit number to the left.
40640 function bit_rol(num, cnt) {
40641 return (num << cnt) | (num >>> (32 - cnt));
40645 * Convert a raw string to a hex string
40648 function rstr2hex(input, hexcase) {
40649 var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
40653 for (; i < l; i += 1) {
40654 x = input.charCodeAt(i);
40655 output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
40661 * Convert an array of big-endian words to a string
40664 function binb2rstr(input) {
40665 var i, l = input.length * 32,
40667 for (i = 0; i < l; i += 8) {
40668 output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
40674 * Convert an array of little-endian words to a string
40677 function binl2rstr(input) {
40678 var i, l = input.length * 32,
40680 for (i = 0; i < l; i += 8) {
40681 output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
40687 * Convert a raw string to an array of little-endian words
40688 * Characters >255 have their high-byte silently ignored.
40691 function rstr2binl(input) {
40692 var i, l = input.length * 8,
40693 output = Array(input.length >> 2),
40694 lo = output.length;
40695 for (i = 0; i < lo; i += 1) {
40698 for (i = 0; i < l; i += 8) {
40699 output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
40705 * Convert a raw string to an array of big-endian words
40706 * Characters >255 have their high-byte silently ignored.
40709 function rstr2binb(input) {
40710 var i, l = input.length * 8,
40711 output = Array(input.length >> 2),
40712 lo = output.length;
40713 for (i = 0; i < lo; i += 1) {
40716 for (i = 0; i < l; i += 8) {
40717 output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
40723 * Convert a raw string to an arbitrary string encoding
40726 function rstr2any(input, encoding) {
40727 var divisor = encoding.length,
40728 remainders = Array(),
40729 i, q, x, ld, quotient, dividend, output, full_length;
40731 /* Convert to an array of 16-bit big-endian values, forming the dividend */
40732 dividend = Array(Math.ceil(input.length / 2));
40733 ld = dividend.length;
40734 for (i = 0; i < ld; i += 1) {
40735 dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
40739 * Repeatedly perform a long division. The binary array forms the dividend,
40740 * the length of the encoding is the divisor. Once computed, the quotient
40741 * forms the dividend for the next step. We stop when the dividend is zerHashes.
40742 * All remainders are stored for later use.
40744 while (dividend.length > 0) {
40745 quotient = Array();
40747 for (i = 0; i < dividend.length; i += 1) {
40748 x = (x << 16) + dividend[i];
40749 q = Math.floor(x / divisor);
40751 if (quotient.length > 0 || q > 0) {
40752 quotient[quotient.length] = q;
40755 remainders[remainders.length] = x;
40756 dividend = quotient;
40759 /* Convert the remainders to the output string */
40761 for (i = remainders.length - 1; i >= 0; i--) {
40762 output += encoding.charAt(remainders[i]);
40765 /* Append leading zero equivalents */
40766 full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
40767 for (i = output.length; i < full_length; i += 1) {
40768 output = encoding[0] + output;
40774 * Convert a raw string to a base-64 string
40777 function rstr2b64(input, b64pad) {
40778 var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
40780 len = input.length,
40782 b64pad = b64pad || '=';
40783 for (i = 0; i < len; i += 3) {
40784 triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
40785 for (j = 0; j < 4; j += 1) {
40786 if (i * 8 + j * 6 > input.length * 8) {
40789 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
40798 * @property {String} version
40807 Base64: function() {
40808 // private properties
40809 var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
40810 pad = '=', // default pad according with the RFC standard
40811 utf8 = true; // by default enable UTF-8 support encoding
40813 // public method for encoding
40814 this.encode = function(input) {
40817 len = input.length;
40820 input = (utf8) ? utf8Encode(input) : input;
40822 for (i = 0; i < len; i += 3) {
40823 triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
40824 for (j = 0; j < 4; j += 1) {
40825 if (i * 8 + j * 6 > len * 8) {
40828 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
40835 // public method for decoding
40836 this.decode = function(input) {
40837 // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
40838 var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
40846 input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
40849 do { // unpack four hexets into three octets using index points in b64
40850 h1 = tab.indexOf(input.charAt(i += 1));
40851 h2 = tab.indexOf(input.charAt(i += 1));
40852 h3 = tab.indexOf(input.charAt(i += 1));
40853 h4 = tab.indexOf(input.charAt(i += 1));
40855 bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
40857 o1 = bits >> 16 & 0xff;
40858 o2 = bits >> 8 & 0xff;
40863 arr[ac] = String.fromCharCode(o1);
40864 } else if (h4 === 64) {
40865 arr[ac] = String.fromCharCode(o1, o2);
40867 arr[ac] = String.fromCharCode(o1, o2, o3);
40869 } while (i < input.length);
40871 dec = arr.join('');
40872 dec = (utf8) ? utf8Decode(dec) : dec;
40877 // set custom pad string
40878 this.setPad = function(str) {
40882 // set custom tab string characters
40883 this.setTab = function(str) {
40887 this.setUTF8 = function(bool) {
40888 if (typeof bool === 'boolean') {
40896 * CRC-32 calculation
40900 * @param {String} str Input String
40903 CRC32: function(str) {
40908 str = utf8Encode(str);
40911 '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
40912 '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
40913 '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
40914 '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
40915 'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
40916 '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
40917 'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
40918 '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
40919 'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
40920 '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
40921 'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
40922 '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
40923 'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
40924 '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
40925 '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
40926 '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
40927 '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
40928 'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
40929 '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
40930 'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
40931 '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
40932 'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
40933 '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
40934 'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
40935 '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
40936 'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
40940 for (i = 0, iTop = str.length; i < iTop; i += 1) {
40941 y = (crc ^ str.charCodeAt(i)) & 0xFF;
40942 x = '0x' + table.substr(y * 9, 8);
40943 crc = (crc >>> 8) ^ x;
40945 // always return a positive number (that's what >>> 0 does)
40946 return (crc ^ (-1)) >>> 0;
40952 * @param {Object} [config]
40954 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
40955 * Digest Algorithm, as defined in RFC 1321.
40956 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
40957 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
40958 * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
40960 MD5: function(options) {
40962 * Private config properties. You may need to tweak these to be compatible with
40963 * the server-side, but the defaults work in most cases.
40964 * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
40966 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
40967 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
40968 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
40970 // privileged (public) methods
40971 this.hex = function(s) {
40972 return rstr2hex(rstr(s, utf8), hexcase);
40974 this.b64 = function(s) {
40975 return rstr2b64(rstr(s), b64pad);
40977 this.any = function(s, e) {
40978 return rstr2any(rstr(s, utf8), e);
40980 this.raw = function(s) {
40981 return rstr(s, utf8);
40983 this.hex_hmac = function(k, d) {
40984 return rstr2hex(rstr_hmac(k, d), hexcase);
40986 this.b64_hmac = function(k, d) {
40987 return rstr2b64(rstr_hmac(k, d), b64pad);
40989 this.any_hmac = function(k, d, e) {
40990 return rstr2any(rstr_hmac(k, d), e);
40993 * Perform a simple self-test to see if the VM is working
40994 * @return {String} Hexadecimal hash sample
40996 this.vm_test = function() {
40997 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
41000 * Enable/disable uppercase hexadecimal returned string
41002 * @return {Object} this
41004 this.setUpperCase = function(a) {
41005 if (typeof a === 'boolean') {
41011 * Defines a base64 pad string
41012 * @param {String} Pad
41013 * @return {Object} this
41015 this.setPad = function(a) {
41016 b64pad = a || b64pad;
41020 * Defines a base64 pad string
41022 * @return {Object} [this]
41024 this.setUTF8 = function(a) {
41025 if (typeof a === 'boolean') {
41034 * Calculate the MD5 of a raw string
41038 s = (utf8) ? utf8Encode(s) : s;
41039 return binl2rstr(binl(rstr2binl(s), s.length * 8));
41043 * Calculate the HMAC-MD5, of a key and some data (raw strings)
41046 function rstr_hmac(key, data) {
41047 var bkey, ipad, opad, hash, i;
41049 key = (utf8) ? utf8Encode(key) : key;
41050 data = (utf8) ? utf8Encode(data) : data;
41051 bkey = rstr2binl(key);
41052 if (bkey.length > 16) {
41053 bkey = binl(bkey, key.length * 8);
41056 ipad = Array(16), opad = Array(16);
41057 for (i = 0; i < 16; i += 1) {
41058 ipad[i] = bkey[i] ^ 0x36363636;
41059 opad[i] = bkey[i] ^ 0x5C5C5C5C;
41061 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
41062 return binl2rstr(binl(opad.concat(hash), 512 + 128));
41066 * Calculate the MD5 of an array of little-endian words, and a bit length.
41069 function binl(x, len) {
41070 var i, olda, oldb, oldc, oldd,
41076 /* append padding */
41077 x[len >> 5] |= 0x80 << ((len) % 32);
41078 x[(((len + 64) >>> 9) << 4) + 14] = len;
41080 for (i = 0; i < x.length; i += 16) {
41086 a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
41087 d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
41088 c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
41089 b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
41090 a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
41091 d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
41092 c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
41093 b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
41094 a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
41095 d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
41096 c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
41097 b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
41098 a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
41099 d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
41100 c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
41101 b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
41103 a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
41104 d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
41105 c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
41106 b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
41107 a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
41108 d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
41109 c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
41110 b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
41111 a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
41112 d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
41113 c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
41114 b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
41115 a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
41116 d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
41117 c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
41118 b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
41120 a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
41121 d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
41122 c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
41123 b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
41124 a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
41125 d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
41126 c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
41127 b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
41128 a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
41129 d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
41130 c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
41131 b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
41132 a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
41133 d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
41134 c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
41135 b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
41137 a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
41138 d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
41139 c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
41140 b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
41141 a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
41142 d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
41143 c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
41144 b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
41145 a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
41146 d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
41147 c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
41148 b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
41149 a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
41150 d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
41151 c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
41152 b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
41154 a = safe_add(a, olda);
41155 b = safe_add(b, oldb);
41156 c = safe_add(c, oldc);
41157 d = safe_add(d, oldd);
41159 return Array(a, b, c, d);
41163 * These functions implement the four basic operations the algorithm uses.
41166 function md5_cmn(q, a, b, x, s, t) {
41167 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
41170 function md5_ff(a, b, c, d, x, s, t) {
41171 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
41174 function md5_gg(a, b, c, d, x, s, t) {
41175 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
41178 function md5_hh(a, b, c, d, x, s, t) {
41179 return md5_cmn(b ^ c ^ d, a, b, x, s, t);
41182 function md5_ii(a, b, c, d, x, s, t) {
41183 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
41188 * @class Hashes.SHA1
41189 * @param {Object} [config]
41192 * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
41193 * Version 2.2 Copyright Paul Johnston 2000 - 2009.
41194 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
41195 * See http://pajhome.org.uk/crypt/md5 for details.
41197 SHA1: function(options) {
41199 * Private config properties. You may need to tweak these to be compatible with
41200 * the server-side, but the defaults work in most cases.
41201 * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
41203 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
41204 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
41205 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
41208 this.hex = function(s) {
41209 return rstr2hex(rstr(s, utf8), hexcase);
41211 this.b64 = function(s) {
41212 return rstr2b64(rstr(s, utf8), b64pad);
41214 this.any = function(s, e) {
41215 return rstr2any(rstr(s, utf8), e);
41217 this.raw = function(s) {
41218 return rstr(s, utf8);
41220 this.hex_hmac = function(k, d) {
41221 return rstr2hex(rstr_hmac(k, d));
41223 this.b64_hmac = function(k, d) {
41224 return rstr2b64(rstr_hmac(k, d), b64pad);
41226 this.any_hmac = function(k, d, e) {
41227 return rstr2any(rstr_hmac(k, d), e);
41230 * Perform a simple self-test to see if the VM is working
41231 * @return {String} Hexadecimal hash sample
41234 this.vm_test = function() {
41235 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
41238 * @description Enable/disable uppercase hexadecimal returned string
41240 * @return {Object} this
41243 this.setUpperCase = function(a) {
41244 if (typeof a === 'boolean') {
41250 * @description Defines a base64 pad string
41251 * @param {string} Pad
41252 * @return {Object} this
41255 this.setPad = function(a) {
41256 b64pad = a || b64pad;
41260 * @description Defines a base64 pad string
41262 * @return {Object} this
41265 this.setUTF8 = function(a) {
41266 if (typeof a === 'boolean') {
41275 * Calculate the SHA-512 of a raw string
41279 s = (utf8) ? utf8Encode(s) : s;
41280 return binb2rstr(binb(rstr2binb(s), s.length * 8));
41284 * Calculate the HMAC-SHA1 of a key and some data (raw strings)
41287 function rstr_hmac(key, data) {
41288 var bkey, ipad, opad, i, hash;
41289 key = (utf8) ? utf8Encode(key) : key;
41290 data = (utf8) ? utf8Encode(data) : data;
41291 bkey = rstr2binb(key);
41293 if (bkey.length > 16) {
41294 bkey = binb(bkey, key.length * 8);
41296 ipad = Array(16), opad = Array(16);
41297 for (i = 0; i < 16; i += 1) {
41298 ipad[i] = bkey[i] ^ 0x36363636;
41299 opad[i] = bkey[i] ^ 0x5C5C5C5C;
41301 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
41302 return binb2rstr(binb(opad.concat(hash), 512 + 160));
41306 * Calculate the SHA-1 of an array of big-endian words, and a bit length
41309 function binb(x, len) {
41310 var i, j, t, olda, oldb, oldc, oldd, olde,
41318 /* append padding */
41319 x[len >> 5] |= 0x80 << (24 - len % 32);
41320 x[((len + 64 >> 9) << 4) + 15] = len;
41322 for (i = 0; i < x.length; i += 16) {
41329 for (j = 0; j < 80; j += 1) {
41333 w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
41335 t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
41336 safe_add(safe_add(e, w[j]), sha1_kt(j)));
41339 c = bit_rol(b, 30);
41344 a = safe_add(a, olda);
41345 b = safe_add(b, oldb);
41346 c = safe_add(c, oldc);
41347 d = safe_add(d, oldd);
41348 e = safe_add(e, olde);
41350 return Array(a, b, c, d, e);
41354 * Perform the appropriate triplet combination function for the current
41358 function sha1_ft(t, b, c, d) {
41360 return (b & c) | ((~b) & d);
41366 return (b & c) | (b & d) | (c & d);
41372 * Determine the appropriate additive constant for the current iteration
41375 function sha1_kt(t) {
41376 return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
41377 (t < 60) ? -1894007588 : -899497514;
41381 * @class Hashes.SHA256
41384 * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
41385 * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
41386 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
41387 * See http://pajhome.org.uk/crypt/md5 for details.
41388 * Also http://anmar.eu.org/projects/jssha2/
41390 SHA256: function(options) {
41392 * Private properties configuration variables. You may need to tweak these to be compatible with
41393 * the server-side, but the defaults work in most cases.
41394 * @see this.setUpperCase() method
41395 * @see this.setPad() method
41397 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase */
41398 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
41399 /* base-64 pad character. Default '=' for strict RFC compliance */
41400 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
41401 /* enable/disable utf8 encoding */
41404 /* privileged (public) methods */
41405 this.hex = function(s) {
41406 return rstr2hex(rstr(s, utf8));
41408 this.b64 = function(s) {
41409 return rstr2b64(rstr(s, utf8), b64pad);
41411 this.any = function(s, e) {
41412 return rstr2any(rstr(s, utf8), e);
41414 this.raw = function(s) {
41415 return rstr(s, utf8);
41417 this.hex_hmac = function(k, d) {
41418 return rstr2hex(rstr_hmac(k, d));
41420 this.b64_hmac = function(k, d) {
41421 return rstr2b64(rstr_hmac(k, d), b64pad);
41423 this.any_hmac = function(k, d, e) {
41424 return rstr2any(rstr_hmac(k, d), e);
41427 * Perform a simple self-test to see if the VM is working
41428 * @return {String} Hexadecimal hash sample
41431 this.vm_test = function() {
41432 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
41435 * Enable/disable uppercase hexadecimal returned string
41437 * @return {Object} this
41440 this.setUpperCase = function(a) {
41441 if (typeof a === 'boolean') {
41447 * @description Defines a base64 pad string
41448 * @param {string} Pad
41449 * @return {Object} this
41452 this.setPad = function(a) {
41453 b64pad = a || b64pad;
41457 * Defines a base64 pad string
41459 * @return {Object} this
41462 this.setUTF8 = function(a) {
41463 if (typeof a === 'boolean') {
41472 * Calculate the SHA-512 of a raw string
41475 function rstr(s, utf8) {
41476 s = (utf8) ? utf8Encode(s) : s;
41477 return binb2rstr(binb(rstr2binb(s), s.length * 8));
41481 * Calculate the HMAC-sha256 of a key and some data (raw strings)
41484 function rstr_hmac(key, data) {
41485 key = (utf8) ? utf8Encode(key) : key;
41486 data = (utf8) ? utf8Encode(data) : data;
41488 bkey = rstr2binb(key),
41492 if (bkey.length > 16) {
41493 bkey = binb(bkey, key.length * 8);
41496 for (; i < 16; i += 1) {
41497 ipad[i] = bkey[i] ^ 0x36363636;
41498 opad[i] = bkey[i] ^ 0x5C5C5C5C;
41501 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
41502 return binb2rstr(binb(opad.concat(hash), 512 + 256));
41506 * Main sha256 function, with its support functions
41509 function sha256_S(X, n) {
41510 return (X >>> n) | (X << (32 - n));
41513 function sha256_R(X, n) {
41517 function sha256_Ch(x, y, z) {
41518 return ((x & y) ^ ((~x) & z));
41521 function sha256_Maj(x, y, z) {
41522 return ((x & y) ^ (x & z) ^ (y & z));
41525 function sha256_Sigma0256(x) {
41526 return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
41529 function sha256_Sigma1256(x) {
41530 return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
41533 function sha256_Gamma0256(x) {
41534 return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
41537 function sha256_Gamma1256(x) {
41538 return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
41542 1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
41543 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
41544 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
41545 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
41546 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
41547 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
41548 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
41551 function binb(m, l) {
41552 var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
41553 1359893119, -1694144372, 528734635, 1541459225
41555 var W = new Array(64);
41556 var a, b, c, d, e, f, g, h;
41559 /* append padding */
41560 m[l >> 5] |= 0x80 << (24 - l % 32);
41561 m[((l + 64 >> 9) << 4) + 15] = l;
41563 for (i = 0; i < m.length; i += 16) {
41573 for (j = 0; j < 64; j += 1) {
41577 W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
41578 sha256_Gamma0256(W[j - 15])), W[j - 16]);
41581 T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
41582 sha256_K[j]), W[j]);
41583 T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
41587 e = safe_add(d, T1);
41591 a = safe_add(T1, T2);
41594 HASH[0] = safe_add(a, HASH[0]);
41595 HASH[1] = safe_add(b, HASH[1]);
41596 HASH[2] = safe_add(c, HASH[2]);
41597 HASH[3] = safe_add(d, HASH[3]);
41598 HASH[4] = safe_add(e, HASH[4]);
41599 HASH[5] = safe_add(f, HASH[5]);
41600 HASH[6] = safe_add(g, HASH[6]);
41601 HASH[7] = safe_add(h, HASH[7]);
41609 * @class Hashes.SHA512
41612 * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
41613 * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
41614 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
41615 * See http://pajhome.org.uk/crypt/md5 for details.
41617 SHA512: function(options) {
41619 * Private properties configuration variables. You may need to tweak these to be compatible with
41620 * the server-side, but the defaults work in most cases.
41621 * @see this.setUpperCase() method
41622 * @see this.setPad() method
41624 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
41625 /* hexadecimal output case format. false - lowercase; true - uppercase */
41626 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
41627 /* base-64 pad character. Default '=' for strict RFC compliance */
41628 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
41629 /* enable/disable utf8 encoding */
41632 /* privileged (public) methods */
41633 this.hex = function(s) {
41634 return rstr2hex(rstr(s));
41636 this.b64 = function(s) {
41637 return rstr2b64(rstr(s), b64pad);
41639 this.any = function(s, e) {
41640 return rstr2any(rstr(s), e);
41642 this.raw = function(s) {
41643 return rstr(s, utf8);
41645 this.hex_hmac = function(k, d) {
41646 return rstr2hex(rstr_hmac(k, d));
41648 this.b64_hmac = function(k, d) {
41649 return rstr2b64(rstr_hmac(k, d), b64pad);
41651 this.any_hmac = function(k, d, e) {
41652 return rstr2any(rstr_hmac(k, d), e);
41655 * Perform a simple self-test to see if the VM is working
41656 * @return {String} Hexadecimal hash sample
41659 this.vm_test = function() {
41660 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
41663 * @description Enable/disable uppercase hexadecimal returned string
41665 * @return {Object} this
41668 this.setUpperCase = function(a) {
41669 if (typeof a === 'boolean') {
41675 * @description Defines a base64 pad string
41676 * @param {string} Pad
41677 * @return {Object} this
41680 this.setPad = function(a) {
41681 b64pad = a || b64pad;
41685 * @description Defines a base64 pad string
41687 * @return {Object} this
41690 this.setUTF8 = function(a) {
41691 if (typeof a === 'boolean') {
41697 /* private methods */
41700 * Calculate the SHA-512 of a raw string
41704 s = (utf8) ? utf8Encode(s) : s;
41705 return binb2rstr(binb(rstr2binb(s), s.length * 8));
41708 * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
41711 function rstr_hmac(key, data) {
41712 key = (utf8) ? utf8Encode(key) : key;
41713 data = (utf8) ? utf8Encode(data) : data;
41716 bkey = rstr2binb(key),
41720 if (bkey.length > 32) {
41721 bkey = binb(bkey, key.length * 8);
41724 for (; i < 32; i += 1) {
41725 ipad[i] = bkey[i] ^ 0x36363636;
41726 opad[i] = bkey[i] ^ 0x5C5C5C5C;
41729 hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
41730 return binb2rstr(binb(opad.concat(hash), 1024 + 512));
41734 * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
41737 function binb(x, len) {
41740 hash = new Array(16),
41741 //Initial hash values
41743 new int64(0x6a09e667, -205731576),
41744 new int64(-1150833019, -2067093701),
41745 new int64(0x3c6ef372, -23791573),
41746 new int64(-1521486534, 0x5f1d36f1),
41747 new int64(0x510e527f, -1377402159),
41748 new int64(-1694144372, 0x2b3e6c1f),
41749 new int64(0x1f83d9ab, -79577749),
41750 new int64(0x5be0cd19, 0x137e2179)
41752 T1 = new int64(0, 0),
41753 T2 = new int64(0, 0),
41754 a = new int64(0, 0),
41755 b = new int64(0, 0),
41756 c = new int64(0, 0),
41757 d = new int64(0, 0),
41758 e = new int64(0, 0),
41759 f = new int64(0, 0),
41760 g = new int64(0, 0),
41761 h = new int64(0, 0),
41762 //Temporary variables not specified by the document
41763 s0 = new int64(0, 0),
41764 s1 = new int64(0, 0),
41765 Ch = new int64(0, 0),
41766 Maj = new int64(0, 0),
41767 r1 = new int64(0, 0),
41768 r2 = new int64(0, 0),
41769 r3 = new int64(0, 0);
41771 if (sha512_k === undefined) {
41774 new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
41775 new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
41776 new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
41777 new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
41778 new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
41779 new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
41780 new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
41781 new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
41782 new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
41783 new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
41784 new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
41785 new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
41786 new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
41787 new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
41788 new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
41789 new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
41790 new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
41791 new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
41792 new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
41793 new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
41794 new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
41795 new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
41796 new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
41797 new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
41798 new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
41799 new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
41800 new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
41801 new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
41802 new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
41803 new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
41804 new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
41805 new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
41806 new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
41807 new int64(-354779690, -840897762), new int64(-176337025, -294727304),
41808 new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
41809 new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
41810 new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
41811 new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
41812 new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
41813 new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
41817 for (i = 0; i < 80; i += 1) {
41818 W[i] = new int64(0, 0);
41821 // append padding to the source string. The format is described in the FIPS.
41822 x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
41823 x[((len + 128 >> 10) << 5) + 31] = len;
41825 for (i = 0; i < l; i += 32) { //32 dwords is the block size
41826 int64copy(a, H[0]);
41827 int64copy(b, H[1]);
41828 int64copy(c, H[2]);
41829 int64copy(d, H[3]);
41830 int64copy(e, H[4]);
41831 int64copy(f, H[5]);
41832 int64copy(g, H[6]);
41833 int64copy(h, H[7]);
41835 for (j = 0; j < 16; j += 1) {
41836 W[j].h = x[i + 2 * j];
41837 W[j].l = x[i + 2 * j + 1];
41840 for (j = 16; j < 80; j += 1) {
41842 int64rrot(r1, W[j - 2], 19);
41843 int64revrrot(r2, W[j - 2], 29);
41844 int64shr(r3, W[j - 2], 6);
41845 s1.l = r1.l ^ r2.l ^ r3.l;
41846 s1.h = r1.h ^ r2.h ^ r3.h;
41848 int64rrot(r1, W[j - 15], 1);
41849 int64rrot(r2, W[j - 15], 8);
41850 int64shr(r3, W[j - 15], 7);
41851 s0.l = r1.l ^ r2.l ^ r3.l;
41852 s0.h = r1.h ^ r2.h ^ r3.h;
41854 int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
41857 for (j = 0; j < 80; j += 1) {
41859 Ch.l = (e.l & f.l) ^ (~e.l & g.l);
41860 Ch.h = (e.h & f.h) ^ (~e.h & g.h);
41863 int64rrot(r1, e, 14);
41864 int64rrot(r2, e, 18);
41865 int64revrrot(r3, e, 9);
41866 s1.l = r1.l ^ r2.l ^ r3.l;
41867 s1.h = r1.h ^ r2.h ^ r3.h;
41870 int64rrot(r1, a, 28);
41871 int64revrrot(r2, a, 2);
41872 int64revrrot(r3, a, 7);
41873 s0.l = r1.l ^ r2.l ^ r3.l;
41874 s0.h = r1.h ^ r2.h ^ r3.h;
41877 Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
41878 Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
41880 int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
41881 int64add(T2, s0, Maj);
41886 int64add(e, d, T1);
41890 int64add(a, T1, T2);
41892 int64add(H[0], H[0], a);
41893 int64add(H[1], H[1], b);
41894 int64add(H[2], H[2], c);
41895 int64add(H[3], H[3], d);
41896 int64add(H[4], H[4], e);
41897 int64add(H[5], H[5], f);
41898 int64add(H[6], H[6], g);
41899 int64add(H[7], H[7], h);
41902 //represent the hash as an array of 32-bit dwords
41903 for (i = 0; i < 8; i += 1) {
41904 hash[2 * i] = H[i].h;
41905 hash[2 * i + 1] = H[i].l;
41910 //A constructor for 64-bit numbers
41912 function int64(h, l) {
41915 //this.toString = int64toString;
41918 //Copies src into dst, assuming both are 64-bit numbers
41920 function int64copy(dst, src) {
41925 //Right-rotates a 64-bit number by shift
41926 //Won't handle cases of shift>=32
41927 //The function revrrot() is for that
41929 function int64rrot(dst, x, shift) {
41930 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
41931 dst.h = (x.h >>> shift) | (x.l << (32 - shift));
41934 //Reverses the dwords of the source and then rotates right by shift.
41935 //This is equivalent to rotation by 32+shift
41937 function int64revrrot(dst, x, shift) {
41938 dst.l = (x.h >>> shift) | (x.l << (32 - shift));
41939 dst.h = (x.l >>> shift) | (x.h << (32 - shift));
41942 //Bitwise-shifts right a 64-bit number by shift
41943 //Won't handle shift>=32, but it's never needed in SHA512
41945 function int64shr(dst, x, shift) {
41946 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
41947 dst.h = (x.h >>> shift);
41950 //Adds two 64-bit numbers
41951 //Like the original implementation, does not rely on 32-bit operations
41953 function int64add(dst, x, y) {
41954 var w0 = (x.l & 0xffff) + (y.l & 0xffff);
41955 var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
41956 var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
41957 var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
41958 dst.l = (w0 & 0xffff) | (w1 << 16);
41959 dst.h = (w2 & 0xffff) | (w3 << 16);
41962 //Same, except with 4 addends. Works faster than adding them one by one.
41964 function int64add4(dst, a, b, c, d) {
41965 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
41966 var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
41967 var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
41968 var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
41969 dst.l = (w0 & 0xffff) | (w1 << 16);
41970 dst.h = (w2 & 0xffff) | (w3 << 16);
41973 //Same, except with 5 addends
41975 function int64add5(dst, a, b, c, d, e) {
41976 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
41977 w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
41978 w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
41979 w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
41980 dst.l = (w0 & 0xffff) | (w1 << 16);
41981 dst.h = (w2 & 0xffff) | (w3 << 16);
41985 * @class Hashes.RMD160
41987 * @param {Object} [config]
41989 * A JavaScript implementation of the RIPEMD-160 Algorithm
41990 * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
41991 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
41992 * See http://pajhome.org.uk/crypt/md5 for details.
41993 * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
41995 RMD160: function(options) {
41997 * Private properties configuration variables. You may need to tweak these to be compatible with
41998 * the server-side, but the defaults work in most cases.
41999 * @see this.setUpperCase() method
42000 * @see this.setPad() method
42002 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
42003 /* hexadecimal output case format. false - lowercase; true - uppercase */
42004 b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
42005 /* base-64 pad character. Default '=' for strict RFC compliance */
42006 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
42007 /* enable/disable utf8 encoding */
42009 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
42010 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
42011 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
42012 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
42013 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
42016 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
42017 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
42018 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
42019 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
42020 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
42023 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
42024 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
42025 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
42026 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
42027 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
42030 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
42031 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
42032 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
42033 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
42034 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
42037 /* privileged (public) methods */
42038 this.hex = function(s) {
42039 return rstr2hex(rstr(s, utf8));
42041 this.b64 = function(s) {
42042 return rstr2b64(rstr(s, utf8), b64pad);
42044 this.any = function(s, e) {
42045 return rstr2any(rstr(s, utf8), e);
42047 this.raw = function(s) {
42048 return rstr(s, utf8);
42050 this.hex_hmac = function(k, d) {
42051 return rstr2hex(rstr_hmac(k, d));
42053 this.b64_hmac = function(k, d) {
42054 return rstr2b64(rstr_hmac(k, d), b64pad);
42056 this.any_hmac = function(k, d, e) {
42057 return rstr2any(rstr_hmac(k, d), e);
42060 * Perform a simple self-test to see if the VM is working
42061 * @return {String} Hexadecimal hash sample
42064 this.vm_test = function() {
42065 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
42068 * @description Enable/disable uppercase hexadecimal returned string
42070 * @return {Object} this
42073 this.setUpperCase = function(a) {
42074 if (typeof a === 'boolean') {
42080 * @description Defines a base64 pad string
42081 * @param {string} Pad
42082 * @return {Object} this
42085 this.setPad = function(a) {
42086 if (typeof a !== 'undefined') {
42092 * @description Defines a base64 pad string
42094 * @return {Object} this
42097 this.setUTF8 = function(a) {
42098 if (typeof a === 'boolean') {
42104 /* private methods */
42107 * Calculate the rmd160 of a raw string
42111 s = (utf8) ? utf8Encode(s) : s;
42112 return binl2rstr(binl(rstr2binl(s), s.length * 8));
42116 * Calculate the HMAC-rmd160 of a key and some data (raw strings)
42119 function rstr_hmac(key, data) {
42120 key = (utf8) ? utf8Encode(key) : key;
42121 data = (utf8) ? utf8Encode(data) : data;
42123 bkey = rstr2binl(key),
42127 if (bkey.length > 16) {
42128 bkey = binl(bkey, key.length * 8);
42131 for (i = 0; i < 16; i += 1) {
42132 ipad[i] = bkey[i] ^ 0x36363636;
42133 opad[i] = bkey[i] ^ 0x5C5C5C5C;
42135 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
42136 return binl2rstr(binl(opad.concat(hash), 512 + 160));
42140 * Convert an array of little-endian words to a string
42143 function binl2rstr(input) {
42144 var i, output = '',
42145 l = input.length * 32;
42146 for (i = 0; i < l; i += 8) {
42147 output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
42153 * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
42156 function binl(x, len) {
42163 A1, B1, C1, D1, E1,
42164 A2, B2, C2, D2, E2;
42166 /* append padding */
42167 x[len >> 5] |= 0x80 << (len % 32);
42168 x[(((len + 64) >>> 9) << 4) + 14] = len;
42171 for (i = 0; i < l; i += 16) {
42177 for (j = 0; j <= 79; j += 1) {
42178 T = safe_add(A1, rmd160_f(j, B1, C1, D1));
42179 T = safe_add(T, x[i + rmd160_r1[j]]);
42180 T = safe_add(T, rmd160_K1(j));
42181 T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
42184 D1 = bit_rol(C1, 10);
42187 T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
42188 T = safe_add(T, x[i + rmd160_r2[j]]);
42189 T = safe_add(T, rmd160_K2(j));
42190 T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
42193 D2 = bit_rol(C2, 10);
42198 T = safe_add(h1, safe_add(C1, D2));
42199 h1 = safe_add(h2, safe_add(D1, E2));
42200 h2 = safe_add(h3, safe_add(E1, A2));
42201 h3 = safe_add(h4, safe_add(A1, B2));
42202 h4 = safe_add(h0, safe_add(B1, C2));
42205 return [h0, h1, h2, h3, h4];
42208 // specific algorithm methods
42210 function rmd160_f(j, x, y, z) {
42211 return (0 <= j && j <= 15) ? (x ^ y ^ z) :
42212 (16 <= j && j <= 31) ? (x & y) | (~x & z) :
42213 (32 <= j && j <= 47) ? (x | ~y) ^ z :
42214 (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
42215 (64 <= j && j <= 79) ? x ^ (y | ~z) :
42216 'rmd160_f: j out of range';
42219 function rmd160_K1(j) {
42220 return (0 <= j && j <= 15) ? 0x00000000 :
42221 (16 <= j && j <= 31) ? 0x5a827999 :
42222 (32 <= j && j <= 47) ? 0x6ed9eba1 :
42223 (48 <= j && j <= 63) ? 0x8f1bbcdc :
42224 (64 <= j && j <= 79) ? 0xa953fd4e :
42225 'rmd160_K1: j out of range';
42228 function rmd160_K2(j) {
42229 return (0 <= j && j <= 15) ? 0x50a28be6 :
42230 (16 <= j && j <= 31) ? 0x5c4dd124 :
42231 (32 <= j && j <= 47) ? 0x6d703ef3 :
42232 (48 <= j && j <= 63) ? 0x7a6d76e9 :
42233 (64 <= j && j <= 79) ? 0x00000000 :
42234 'rmd160_K2: j out of range';
42240 (function(window, undefined) {
42241 var freeExports = false;
42243 freeExports = exports;
42244 if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
42245 window = commonjsGlobal;
42249 if (typeof undefined === 'function' && typeof undefined.amd === 'object' && undefined.amd) {
42250 // define as an anonymous module, so, through path mapping, it can be aliased
42251 undefined(function() {
42254 } else if (freeExports) {
42255 // in Node.js or RingoJS v0.8.0+
42256 if (module && module.exports === freeExports) {
42257 module.exports = Hashes;
42259 // in Narwhal or RingoJS v0.7.0-
42261 freeExports.Hashes = Hashes;
42264 // in a browser or Rhino
42265 window.Hashes = Hashes;
42271 var immutable = extend$2;
42273 var hasOwnProperty$g = Object.prototype.hasOwnProperty;
42275 function extend$2() {
42278 for (var i = 0; i < arguments.length; i++) {
42279 var source = arguments[i];
42281 for (var key in source) {
42282 if (hasOwnProperty$g.call(source, key)) {
42283 target[key] = source[key];
42291 var sha1 = new hashes.SHA1();
42295 ohauth.qsString = function(obj) {
42296 return Object.keys(obj).sort().map(function(key) {
42297 return ohauth.percentEncode(key) + '=' +
42298 ohauth.percentEncode(obj[key]);
42302 ohauth.stringQs = function(str) {
42303 return str.split('&').filter(function (pair) {
42304 return pair !== '';
42305 }).reduce(function(obj, pair){
42306 var parts = pair.split('=');
42307 obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
42308 '' : decodeURIComponent(parts[1]);
42313 ohauth.rawxhr = function(method, url, data, headers, callback) {
42314 var xhr = new XMLHttpRequest(),
42315 twoHundred = /^20\d$/;
42316 xhr.onreadystatechange = function() {
42317 if (4 === xhr.readyState && 0 !== xhr.status) {
42318 if (twoHundred.test(xhr.status)) callback(null, xhr);
42319 else return callback(xhr, null);
42322 xhr.onerror = function(e) { return callback(e, null); };
42323 xhr.open(method, url, true);
42324 for (var h in headers) xhr.setRequestHeader(h, headers[h]);
42329 ohauth.xhr = function(method, url, auth, data, options, callback) {
42330 var headers = (options && options.header) || {
42331 'Content-Type': 'application/x-www-form-urlencoded'
42333 headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
42334 return ohauth.rawxhr(method, url, data, headers, callback);
42337 ohauth.nonce = function() {
42338 for (var o = ''; o.length < 6;) {
42339 o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
42344 ohauth.authHeader = function(obj) {
42345 return Object.keys(obj).sort().map(function(key) {
42346 return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
42350 ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
42352 ohauth.percentEncode = function(s) {
42353 return encodeURIComponent(s)
42354 .replace(/\!/g, '%21').replace(/\'/g, '%27')
42355 .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
42358 ohauth.baseString = function(method, url, params) {
42359 if (params.oauth_signature) delete params.oauth_signature;
42362 ohauth.percentEncode(url),
42363 ohauth.percentEncode(ohauth.qsString(params))].join('&');
42366 ohauth.signature = function(oauth_secret, token_secret, baseString) {
42367 return sha1.b64_hmac(
42368 ohauth.percentEncode(oauth_secret) + '&' +
42369 ohauth.percentEncode(token_secret),
42374 * Takes an options object for configuration (consumer_key,
42375 * consumer_secret, version, signature_method, token, token_secret)
42376 * and returns a function that generates the Authorization header
42379 * The returned function takes these parameters:
42380 * - method: GET/POST/...
42381 * - uri: full URI with protocol, port, path and query string
42382 * - extra_params: any extra parameters (that are passed in the POST data),
42383 * can be an object or a from-urlencoded string.
42385 * Returned function returns full OAuth header with "OAuth" string in it.
42388 ohauth.headerGenerator = function(options) {
42389 options = options || {};
42390 var consumer_key = options.consumer_key || '',
42391 consumer_secret = options.consumer_secret || '',
42392 signature_method = options.signature_method || 'HMAC-SHA1',
42393 version = options.version || '1.0',
42394 token = options.token || '',
42395 token_secret = options.token_secret || '';
42397 return function(method, uri, extra_params) {
42398 method = method.toUpperCase();
42399 if (typeof extra_params === 'string' && extra_params.length > 0) {
42400 extra_params = ohauth.stringQs(extra_params);
42403 var uri_parts = uri.split('?', 2),
42404 base_uri = uri_parts[0];
42406 var query_params = uri_parts.length === 2 ?
42407 ohauth.stringQs(uri_parts[1]) : {};
42409 var oauth_params = {
42410 oauth_consumer_key: consumer_key,
42411 oauth_signature_method: signature_method,
42412 oauth_version: version,
42413 oauth_timestamp: ohauth.timestamp(),
42414 oauth_nonce: ohauth.nonce()
42417 if (token) oauth_params.oauth_token = token;
42419 var all_params = immutable({}, oauth_params, query_params, extra_params),
42420 base_str = ohauth.baseString(method, base_uri, all_params);
42422 oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
42424 return 'OAuth ' + ohauth.authHeader(oauth_params);
42428 var ohauth_1 = ohauth;
42430 var resolveUrl = createCommonjsModule(function (module, exports) {
42431 // Copyright 2014 Simon Lydell
42432 // X11 (“MIT”) Licensed. (See LICENSE.)
42434 void (function(root, factory) {
42435 if (typeof undefined === "function" && undefined.amd) {
42436 undefined(factory);
42438 module.exports = factory();
42440 }(commonjsGlobal, function() {
42442 function resolveUrl(/* ...urls */) {
42443 var numUrls = arguments.length;
42445 if (numUrls === 0) {
42446 throw new Error("resolveUrl requires at least one argument; got none.")
42449 var base = document.createElement("base");
42450 base.href = arguments[0];
42452 if (numUrls === 1) {
42456 var head = document.getElementsByTagName("head")[0];
42457 head.insertBefore(base, head.firstChild);
42459 var a = document.createElement("a");
42462 for (var index = 1; index < numUrls; index++) {
42463 a.href = arguments[index];
42465 base.href = resolved;
42468 head.removeChild(base);
42478 var assign$1 = make_assign();
42479 var create$2 = make_create();
42480 var trim = make_trim();
42481 var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
42493 isFunction: isFunction$1,
42494 isObject: isObject$1,
42498 function make_assign() {
42499 if (Object.assign) {
42500 return Object.assign
42502 return function shimAssign(obj, props1, props2, etc) {
42503 for (var i = 1; i < arguments.length; i++) {
42504 each(Object(arguments[i]), function(val, key) {
42513 function make_create() {
42514 if (Object.create) {
42515 return function create(obj, assignProps1, assignProps2, etc) {
42516 var assignArgsList = slice$7(arguments, 1);
42517 return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
42520 function F() {} // eslint-disable-line no-inner-declarations
42521 return function create(obj, assignProps1, assignProps2, etc) {
42522 var assignArgsList = slice$7(arguments, 1);
42524 return assign$1.apply(this, [new F()].concat(assignArgsList))
42529 function make_trim() {
42530 if (String.prototype.trim) {
42531 return function trim(str) {
42532 return String.prototype.trim.call(str)
42535 return function trim(str) {
42536 return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
42541 function bind(obj, fn) {
42542 return function() {
42543 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
42547 function slice$7(arr, index) {
42548 return Array.prototype.slice.call(arr, index || 0)
42551 function each(obj, fn) {
42552 pluck(obj, function(val, key) {
42558 function map$4(obj, fn) {
42559 var res = (isList(obj) ? [] : {});
42560 pluck(obj, function(v, k) {
42567 function pluck(obj, fn) {
42569 for (var i=0; i<obj.length; i++) {
42570 if (fn(obj[i], i)) {
42575 for (var key in obj) {
42576 if (obj.hasOwnProperty(key)) {
42577 if (fn(obj[key], key)) {
42585 function isList(val) {
42586 return (val != null && typeof val != 'function' && typeof val.length == 'number')
42589 function isFunction$1(val) {
42590 return val && {}.toString.call(val) === '[object Function]'
42593 function isObject$1(val) {
42594 return val && {}.toString.call(val) === '[object Object]'
42597 var slice$8 = util.slice;
42598 var pluck$1 = util.pluck;
42599 var each$1 = util.each;
42600 var bind$1 = util.bind;
42601 var create$3 = util.create;
42602 var isList$1 = util.isList;
42603 var isFunction$2 = util.isFunction;
42604 var isObject$2 = util.isObject;
42606 var storeEngine = {
42607 createStore: createStore
42614 // get returns the value of the given key. If that value
42615 // is undefined, it returns optionalDefaultValue instead.
42616 get: function(key, optionalDefaultValue) {
42617 var data = this.storage.read(this._namespacePrefix + key);
42618 return this._deserialize(data, optionalDefaultValue)
42621 // set will store the given value at key and returns value.
42622 // Calling set with value === undefined is equivalent to calling remove.
42623 set: function(key, value) {
42624 if (value === undefined) {
42625 return this.remove(key)
42627 this.storage.write(this._namespacePrefix + key, this._serialize(value));
42631 // remove deletes the key and value stored at the given key.
42632 remove: function(key) {
42633 this.storage.remove(this._namespacePrefix + key);
42636 // each will call the given callback once for each key-value pair
42638 each: function(callback) {
42640 this.storage.each(function(val, namespacedKey) {
42641 callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
42645 // clearAll will remove all the stored key-value pairs in this store.
42646 clearAll: function() {
42647 this.storage.clearAll();
42650 // additional functionality that can't live in plugins
42651 // ---------------------------------------------------
42653 // hasNamespace returns true if this store instance has the given namespace.
42654 hasNamespace: function(namespace) {
42655 return (this._namespacePrefix == '__storejs_'+namespace+'_')
42658 // createStore creates a store.js instance with the first
42659 // functioning storage in the list of storage candidates,
42660 // and applies the the given mixins to the instance.
42661 createStore: function() {
42662 return createStore.apply(this, arguments)
42665 addPlugin: function(plugin) {
42666 this._addPlugin(plugin);
42669 namespace: function(namespace) {
42670 return createStore(this.storage, this.plugins, namespace)
42675 var _console = (typeof console == 'undefined' ? null : console);
42676 if (!_console) { return }
42677 var fn = (_console.warn ? _console.warn : _console.log);
42678 fn.apply(_console, arguments);
42681 function createStore(storages, plugins, namespace) {
42685 if (storages && !isList$1(storages)) {
42686 storages = [storages];
42688 if (plugins && !isList$1(plugins)) {
42689 plugins = [plugins];
42692 var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
42693 var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
42694 var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
42695 if (!legalNamespaces.test(namespace)) {
42696 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
42699 var _privateStoreProps = {
42700 _namespacePrefix: namespacePrefix,
42701 _namespaceRegexp: namespaceRegexp,
42703 _testStorage: function(storage) {
42705 var testStr = '__storejs__test__';
42706 storage.write(testStr, testStr);
42707 var ok = (storage.read(testStr) === testStr);
42708 storage.remove(testStr);
42715 _assignPluginFnProp: function(pluginFnProp, propName) {
42716 var oldFn = this[propName];
42717 this[propName] = function pluginFn() {
42718 var args = slice$8(arguments, 0);
42721 // super_fn calls the old function which was overwritten by
42723 function super_fn() {
42724 if (!oldFn) { return }
42725 each$1(arguments, function(arg, i) {
42728 return oldFn.apply(self, args)
42731 // Give mixing function access to super_fn by prefixing all mixin function
42732 // arguments with super_fn.
42733 var newFnArgs = [super_fn].concat(args);
42735 return pluginFnProp.apply(self, newFnArgs)
42739 _serialize: function(obj) {
42740 return JSON.stringify(obj)
42743 _deserialize: function(strVal, defaultVal) {
42744 if (!strVal) { return defaultVal }
42745 // It is possible that a raw string value has been previously stored
42746 // in a storage without using store.js, meaning it will be a raw
42747 // string value instead of a JSON serialized string. By defaulting
42748 // to the raw string value in case of a JSON parse error, we allow
42749 // for past stored values to be forwards-compatible with store.js
42751 try { val = JSON.parse(strVal); }
42752 catch(e) { val = strVal; }
42754 return (val !== undefined ? val : defaultVal)
42757 _addStorage: function(storage) {
42758 if (this.enabled) { return }
42759 if (this._testStorage(storage)) {
42760 this.storage = storage;
42761 this.enabled = true;
42765 _addPlugin: function(plugin) {
42768 // If the plugin is an array, then add all plugins in the array.
42769 // This allows for a plugin to depend on other plugins.
42770 if (isList$1(plugin)) {
42771 each$1(plugin, function(plugin) {
42772 self._addPlugin(plugin);
42777 // Keep track of all plugins we've seen so far, so that we
42778 // don't add any of them twice.
42779 var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
42780 return (plugin === seenPlugin)
42785 this.plugins.push(plugin);
42787 // Check that the plugin is properly formed
42788 if (!isFunction$2(plugin)) {
42789 throw new Error('Plugins must be function values that return objects')
42792 var pluginProperties = plugin.call(this);
42793 if (!isObject$2(pluginProperties)) {
42794 throw new Error('Plugins must return an object of function properties')
42797 // Add the plugin function properties to this store instance.
42798 each$1(pluginProperties, function(pluginFnProp, propName) {
42799 if (!isFunction$2(pluginFnProp)) {
42800 throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
42802 self._assignPluginFnProp(pluginFnProp, propName);
42806 // Put deprecated properties in the private API, so as to not expose it to accidential
42807 // discovery through inspection of the store object.
42809 // Deprecated: addStorage
42810 addStorage: function(storage) {
42811 _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
42812 this._addStorage(storage);
42816 var store = create$3(_privateStoreProps, storeAPI, {
42820 each$1(store, function(prop, propName) {
42821 if (isFunction$2(prop)) {
42822 store.raw[propName] = bind$1(store, prop);
42825 each$1(storages, function(storage) {
42826 store._addStorage(storage);
42828 each$1(plugins, function(plugin) {
42829 store._addPlugin(plugin);
42834 var Global$1 = util.Global;
42836 var localStorage_1 = {
42837 name: 'localStorage',
42842 clearAll: clearAll,
42845 function localStorage$1() {
42846 return Global$1.localStorage
42849 function read(key) {
42850 return localStorage$1().getItem(key)
42853 function write(key, data) {
42854 return localStorage$1().setItem(key, data)
42857 function each$2(fn) {
42858 for (var i = localStorage$1().length - 1; i >= 0; i--) {
42859 var key = localStorage$1().key(i);
42860 fn(read(key), key);
42864 function remove$2(key) {
42865 return localStorage$1().removeItem(key)
42868 function clearAll() {
42869 return localStorage$1().clear()
42872 // oldFF-globalStorage provides storage for Firefox
42873 // versions 6 and 7, where no localStorage, etc
42877 var Global$2 = util.Global;
42879 var oldFFGlobalStorage = {
42880 name: 'oldFF-globalStorage',
42885 clearAll: clearAll$1,
42888 var globalStorage = Global$2.globalStorage;
42890 function read$1(key) {
42891 return globalStorage[key]
42894 function write$1(key, data) {
42895 globalStorage[key] = data;
42898 function each$3(fn) {
42899 for (var i = globalStorage.length - 1; i >= 0; i--) {
42900 var key = globalStorage.key(i);
42901 fn(globalStorage[key], key);
42905 function remove$3(key) {
42906 return globalStorage.removeItem(key)
42909 function clearAll$1() {
42910 each$3(function(key, _) {
42911 delete globalStorage[key];
42915 // oldIE-userDataStorage provides storage for Internet Explorer
42916 // versions 6 and 7, where no localStorage, sessionStorage, etc
42920 var Global$3 = util.Global;
42922 var oldIEUserDataStorage = {
42923 name: 'oldIE-userDataStorage',
42928 clearAll: clearAll$2,
42931 var storageName = 'storejs';
42932 var doc = Global$3.document;
42933 var _withStorageEl = _makeIEStorageElFunction();
42934 var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
42936 function write$2(unfixedKey, data) {
42937 if (disable) { return }
42938 var fixedKey = fixKey(unfixedKey);
42939 _withStorageEl(function(storageEl) {
42940 storageEl.setAttribute(fixedKey, data);
42941 storageEl.save(storageName);
42945 function read$2(unfixedKey) {
42946 if (disable) { return }
42947 var fixedKey = fixKey(unfixedKey);
42949 _withStorageEl(function(storageEl) {
42950 res = storageEl.getAttribute(fixedKey);
42955 function each$4(callback) {
42956 _withStorageEl(function(storageEl) {
42957 var attributes = storageEl.XMLDocument.documentElement.attributes;
42958 for (var i=attributes.length-1; i>=0; i--) {
42959 var attr = attributes[i];
42960 callback(storageEl.getAttribute(attr.name), attr.name);
42965 function remove$4(unfixedKey) {
42966 var fixedKey = fixKey(unfixedKey);
42967 _withStorageEl(function(storageEl) {
42968 storageEl.removeAttribute(fixedKey);
42969 storageEl.save(storageName);
42973 function clearAll$2() {
42974 _withStorageEl(function(storageEl) {
42975 var attributes = storageEl.XMLDocument.documentElement.attributes;
42976 storageEl.load(storageName);
42977 for (var i=attributes.length-1; i>=0; i--) {
42978 storageEl.removeAttribute(attributes[i].name);
42980 storageEl.save(storageName);
42987 // In IE7, keys cannot start with a digit or contain certain chars.
42988 // See https://github.com/marcuswestin/store.js/issues/40
42989 // See https://github.com/marcuswestin/store.js/issues/83
42990 var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
42991 function fixKey(key) {
42992 return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
42995 function _makeIEStorageElFunction() {
42996 if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
42999 var scriptTag = 'script',
43004 // Since #userData storage applies only to specific paths, we need to
43005 // somehow link our data to a specific path. We choose /favicon.ico
43006 // as a pretty safe option, since all browsers already make a request to
43007 // this URL anyway and being a 404 will not hurt us here. We wrap an
43008 // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
43009 // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
43010 // since the iframe access rules appear to allow direct access and
43011 // manipulation of the document element, even for a 404 page. This
43012 // document can be used instead of the current document (which would
43013 // have been limited to the current path) to perform #userData storage.
43015 /* global ActiveXObject */
43016 storageContainer = new ActiveXObject('htmlfile');
43017 storageContainer.open();
43018 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
43019 storageContainer.close();
43020 storageOwner = storageContainer.w.frames[0].document;
43021 storageEl = storageOwner.createElement('div');
43023 // somehow ActiveXObject instantiation failed (perhaps some special
43024 // security settings or otherwse), fall back to per-path storage
43025 storageEl = doc.createElement('div');
43026 storageOwner = doc.body;
43029 return function(storeFunction) {
43030 var args = [].slice.call(arguments, 0);
43031 args.unshift(storageEl);
43032 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
43033 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
43034 storageOwner.appendChild(storageEl);
43035 storageEl.addBehavior('#default#userData');
43036 storageEl.load(storageName);
43037 storeFunction.apply(this, args);
43038 storageOwner.removeChild(storageEl);
43043 // cookieStorage is useful Safari private browser mode, where localStorage
43044 // doesn't work but cookies do. This implementation is adopted from
43045 // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
43048 var Global$4 = util.Global;
43049 var trim$1 = util.trim;
43051 var cookieStorage = {
43052 name: 'cookieStorage',
43057 clearAll: clearAll$3,
43060 var doc$1 = Global$4.document;
43062 function read$3(key) {
43063 if (!key || !_has(key)) { return null }
43064 var regexpStr = "(?:^|.*;\\s*)" +
43065 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
43066 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
43067 return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
43070 function each$5(callback) {
43071 var cookies = doc$1.cookie.split(/; ?/g);
43072 for (var i = cookies.length - 1; i >= 0; i--) {
43073 if (!trim$1(cookies[i])) {
43076 var kvp = cookies[i].split('=');
43077 var key = unescape(kvp[0]);
43078 var val = unescape(kvp[1]);
43079 callback(val, key);
43083 function write$3(key, data) {
43084 if(!key) { return }
43085 doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
43088 function remove$5(key) {
43089 if (!key || !_has(key)) {
43092 doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
43095 function clearAll$3() {
43096 each$5(function(_, key) {
43101 function _has(key) {
43102 return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
43105 var Global$5 = util.Global;
43107 var sessionStorage_1 = {
43108 name: 'sessionStorage',
43113 clearAll: clearAll$4
43116 function sessionStorage() {
43117 return Global$5.sessionStorage
43120 function read$4(key) {
43121 return sessionStorage().getItem(key)
43124 function write$4(key, data) {
43125 return sessionStorage().setItem(key, data)
43128 function each$6(fn) {
43129 for (var i = sessionStorage().length - 1; i >= 0; i--) {
43130 var key = sessionStorage().key(i);
43131 fn(read$4(key), key);
43135 function remove$6(key) {
43136 return sessionStorage().removeItem(key)
43139 function clearAll$4() {
43140 return sessionStorage().clear()
43143 // memoryStorage is a useful last fallback to ensure that the store
43144 // is functions (meaning store.get(), store.set(), etc will all function).
43145 // However, stored values will not persist when the browser navigates to
43146 // a new page or reloads the current page.
43148 var memoryStorage_1 = {
43149 name: 'memoryStorage',
43154 clearAll: clearAll$5,
43157 var memoryStorage = {};
43159 function read$5(key) {
43160 return memoryStorage[key]
43163 function write$5(key, data) {
43164 memoryStorage[key] = data;
43167 function each$7(callback) {
43168 for (var key in memoryStorage) {
43169 if (memoryStorage.hasOwnProperty(key)) {
43170 callback(memoryStorage[key], key);
43175 function remove$7(key) {
43176 delete memoryStorage[key];
43179 function clearAll$5(key) {
43180 memoryStorage = {};
43184 // Listed in order of usage preference
43186 oldFFGlobalStorage,
43187 oldIEUserDataStorage,
43193 /* eslint-disable */
43198 // NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
43199 // See http://www.JSON.org/js.html
43200 // This code should be minified before deployment.
43201 // See http://javascript.crockford.com/jsmin.html
43203 // USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
43206 // This file creates a global JSON object containing two methods: stringify
43207 // and parse. This file provides the ES5 JSON capability to ES3 systems.
43208 // If a project might run on IE8 or earlier, then this file should be included.
43209 // This file does nothing on ES5 systems.
43211 // JSON.stringify(value, replacer, space)
43212 // value any JavaScript value, usually an object or array.
43213 // replacer an optional parameter that determines how object
43214 // values are stringified for objects. It can be a
43215 // function or an array of strings.
43216 // space an optional parameter that specifies the indentation
43217 // of nested structures. If it is omitted, the text will
43218 // be packed without extra whitespace. If it is a number,
43219 // it will specify the number of spaces to indent at each
43220 // level. If it is a string (such as "\t" or " "),
43221 // it contains the characters used to indent at each level.
43222 // This method produces a JSON text from a JavaScript value.
43223 // When an object value is found, if the object contains a toJSON
43224 // method, its toJSON method will be called and the result will be
43225 // stringified. A toJSON method does not serialize: it returns the
43226 // value represented by the name/value pair that should be serialized,
43227 // or undefined if nothing should be serialized. The toJSON method
43228 // will be passed the key associated with the value, and this will be
43229 // bound to the value.
43231 // For example, this would serialize Dates as ISO strings.
43233 // Date.prototype.toJSON = function (key) {
43235 // // Format integers to have at least two digits.
43240 // return this.getUTCFullYear() + "-" +
43241 // f(this.getUTCMonth() + 1) + "-" +
43242 // f(this.getUTCDate()) + "T" +
43243 // f(this.getUTCHours()) + ":" +
43244 // f(this.getUTCMinutes()) + ":" +
43245 // f(this.getUTCSeconds()) + "Z";
43248 // You can provide an optional replacer method. It will be passed the
43249 // key and value of each member, with this bound to the containing
43250 // object. The value that is returned from your method will be
43251 // serialized. If your method returns undefined, then the member will
43252 // be excluded from the serialization.
43254 // If the replacer parameter is an array of strings, then it will be
43255 // used to select the members to be serialized. It filters the results
43256 // such that only members with keys listed in the replacer array are
43259 // Values that do not have JSON representations, such as undefined or
43260 // functions, will not be serialized. Such values in objects will be
43261 // dropped; in arrays they will be replaced with null. You can use
43262 // a replacer function to replace those with JSON values.
43264 // JSON.stringify(undefined) returns undefined.
43266 // The optional space parameter produces a stringification of the
43267 // value that is filled with line breaks and indentation to make it
43270 // If the space parameter is a non-empty string, then that string will
43271 // be used for indentation. If the space parameter is a number, then
43272 // the indentation will be that many spaces.
43276 // text = JSON.stringify(["e", {pluribus: "unum"}]);
43277 // // text is '["e",{"pluribus":"unum"}]'
43279 // text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
43280 // // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
43282 // text = JSON.stringify([new Date()], function (key, value) {
43283 // return this[key] instanceof Date
43284 // ? "Date(" + this[key] + ")"
43287 // // text is '["Date(---current time---)"]'
43289 // JSON.parse(text, reviver)
43290 // This method parses a JSON text to produce an object or array.
43291 // It can throw a SyntaxError exception.
43293 // The optional reviver parameter is a function that can filter and
43294 // transform the results. It receives each of the keys and values,
43295 // and its return value is used instead of the original value.
43296 // If it returns what it received, then the structure is not modified.
43297 // If it returns undefined then the member is deleted.
43301 // // Parse the text. Values that look like ISO date strings will
43302 // // be converted to Date objects.
43304 // myData = JSON.parse(text, function (key, value) {
43306 // if (typeof value === "string") {
43308 // /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
43310 // return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
43317 // myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
43319 // if (typeof value === "string" &&
43320 // value.slice(0, 5) === "Date(" &&
43321 // value.slice(-1) === ")") {
43322 // d = new Date(value.slice(5, -1));
43330 // This is a reference implementation. You are free to copy, modify, or
43338 JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
43339 getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
43340 lastIndex, length, parse, prototype, push, replace, slice, stringify,
43341 test, toJSON, toString, valueOf
43345 // Create a JSON object only if one does not already exist. We create the
43346 // methods in a closure to avoid creating global variables.
43348 if (typeof JSON !== "object") {
43354 var rx_one = /^[\],:{}\s]*$/;
43355 var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
43356 var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
43357 var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
43358 var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
43359 var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
43362 // Format integers to have at least two digits.
43368 function this_value() {
43369 return this.valueOf();
43372 if (typeof Date.prototype.toJSON !== "function") {
43374 Date.prototype.toJSON = function () {
43376 return isFinite(this.valueOf())
43377 ? this.getUTCFullYear() + "-" +
43378 f(this.getUTCMonth() + 1) + "-" +
43379 f(this.getUTCDate()) + "T" +
43380 f(this.getUTCHours()) + ":" +
43381 f(this.getUTCMinutes()) + ":" +
43382 f(this.getUTCSeconds()) + "Z"
43386 Boolean.prototype.toJSON = this_value;
43387 Number.prototype.toJSON = this_value;
43388 String.prototype.toJSON = this_value;
43397 function quote(string) {
43399 // If the string contains no control characters, no quote characters, and no
43400 // backslash characters, then we can safely slap some quotes around it.
43401 // Otherwise we must also replace the offending characters with safe escape
43404 rx_escapable.lastIndex = 0;
43405 return rx_escapable.test(string)
43406 ? "\"" + string.replace(rx_escapable, function (a) {
43408 return typeof c === "string"
43410 : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
43412 : "\"" + string + "\"";
43416 function str(key, holder) {
43418 // Produce a string from holder[key].
43420 var i; // The loop counter.
43421 var k; // The member key.
43422 var v; // The member value.
43426 var value = holder[key];
43428 // If the value has a toJSON method, call it to obtain a replacement value.
43430 if (value && typeof value === "object" &&
43431 typeof value.toJSON === "function") {
43432 value = value.toJSON(key);
43435 // If we were called with a replacer function, then call the replacer to
43436 // obtain a replacement value.
43438 if (typeof rep === "function") {
43439 value = rep.call(holder, key, value);
43442 // What happens next depends on the value's type.
43444 switch (typeof value) {
43446 return quote(value);
43450 // JSON numbers must be finite. Encode non-finite numbers as null.
43452 return isFinite(value)
43459 // If the value is a boolean or null, convert it to a string. Note:
43460 // typeof null does not produce "null". The case is included here in
43461 // the remote chance that this gets fixed someday.
43463 return String(value);
43465 // If the type is "object", we might be dealing with an object or an array or
43470 // Due to a specification blunder in ECMAScript, typeof null is "object",
43471 // so watch out for that case.
43477 // Make an array to hold the partial results of stringifying this object value.
43482 // Is the value an array?
43484 if (Object.prototype.toString.apply(value) === "[object Array]") {
43486 // The value is an array. Stringify every element. Use null as a placeholder
43487 // for non-JSON values.
43489 length = value.length;
43490 for (i = 0; i < length; i += 1) {
43491 partial[i] = str(i, value) || "null";
43494 // Join all of the elements together, separated with commas, and wrap them in
43497 v = partial.length === 0
43500 ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
43501 : "[" + partial.join(",") + "]";
43506 // If the replacer is an array, use it to select the members to be stringified.
43508 if (rep && typeof rep === "object") {
43509 length = rep.length;
43510 for (i = 0; i < length; i += 1) {
43511 if (typeof rep[i] === "string") {
43515 partial.push(quote(k) + (
43525 // Otherwise, iterate through all of the keys in the object.
43528 if (Object.prototype.hasOwnProperty.call(value, k)) {
43531 partial.push(quote(k) + (
43541 // Join all of the member texts together, separated with commas,
43542 // and wrap them in braces.
43544 v = partial.length === 0
43547 ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
43548 : "{" + partial.join(",") + "}";
43554 // If the JSON object does not yet have a stringify method, give it one.
43556 if (typeof JSON.stringify !== "function") {
43557 meta = { // table of character substitutions
43566 JSON.stringify = function (value, replacer, space) {
43568 // The stringify method takes a value and an optional replacer, and an optional
43569 // space parameter, and returns a JSON text. The replacer can be a function
43570 // that can replace values, or an array of strings that will select the keys.
43571 // A default replacer method can be provided. Use of the space parameter can
43572 // produce text that is more easily readable.
43578 // If the space parameter is a number, make an indent string containing that
43581 if (typeof space === "number") {
43582 for (i = 0; i < space; i += 1) {
43586 // If the space parameter is a string, it will be used as the indent string.
43588 } else if (typeof space === "string") {
43592 // If there is a replacer, it must be a function or an array.
43593 // Otherwise, throw an error.
43596 if (replacer && typeof replacer !== "function" &&
43597 (typeof replacer !== "object" ||
43598 typeof replacer.length !== "number")) {
43599 throw new Error("JSON.stringify");
43602 // Make a fake root object containing our value under the key of "".
43603 // Return the result of stringifying the value.
43605 return str("", {"": value});
43610 // If the JSON object does not yet have a parse method, give it one.
43612 if (typeof JSON.parse !== "function") {
43613 JSON.parse = function (text, reviver) {
43615 // The parse method takes a text and an optional reviver function, and returns
43616 // a JavaScript value if the text is a valid JSON text.
43620 function walk(holder, key) {
43622 // The walk method is used to recursively walk the resulting structure so
43623 // that modifications can be made.
43627 var value = holder[key];
43628 if (value && typeof value === "object") {
43630 if (Object.prototype.hasOwnProperty.call(value, k)) {
43631 v = walk(value, k);
43632 if (v !== undefined) {
43640 return reviver.call(holder, key, value);
43644 // Parsing happens in four stages. In the first stage, we replace certain
43645 // Unicode characters with escape sequences. JavaScript handles many characters
43646 // incorrectly, either silently deleting them, or treating them as line endings.
43648 text = String(text);
43649 rx_dangerous.lastIndex = 0;
43650 if (rx_dangerous.test(text)) {
43651 text = text.replace(rx_dangerous, function (a) {
43653 ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
43657 // In the second stage, we run the text against regular expressions that look
43658 // for non-JSON patterns. We are especially concerned with "()" and "new"
43659 // because they can cause invocation, and "=" because it can cause mutation.
43660 // But just to be safe, we want to reject all unexpected forms.
43662 // We split the second stage into 4 regexp operations in order to work around
43663 // crippling inefficiencies in IE's and Safari's regexp engines. First we
43664 // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
43665 // replace all simple value tokens with "]" characters. Third, we delete all
43666 // open brackets that follow a colon or comma or that begin the text. Finally,
43667 // we look to see that the remaining characters are only whitespace or "]" or
43668 // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
43673 .replace(rx_two, "@")
43674 .replace(rx_three, "]")
43675 .replace(rx_four, "")
43679 // In the third stage we use the eval function to compile the text into a
43680 // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
43681 // in JavaScript: it can begin a block or an object literal. We wrap the text
43682 // in parens to eliminate the ambiguity.
43684 j = eval("(" + text + ")");
43686 // In the optional fourth stage, we recursively walk the new structure, passing
43687 // each name/value pair to a reviver function for possible transformation.
43689 return (typeof reviver === "function")
43690 ? walk({"": j}, "")
43694 // If the text is not JSON parseable, then a SyntaxError is thrown.
43696 throw new SyntaxError("JSON.parse");
43701 var json2 = json2Plugin;
43703 function json2Plugin() {
43708 var plugins = [json2];
43710 var store_legacy = storeEngine.createStore(all, plugins);
43714 // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
43715 // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
43716 // does not support custom headers, which this uses everywhere.
43717 var osmAuth = function(o) {
43721 // authenticated users will also have a request token secret, but it's
43722 // not used in transactions with the server
43723 oauth.authenticated = function() {
43724 return !!(token('oauth_token') && token('oauth_token_secret'));
43727 oauth.logout = function() {
43728 token('oauth_token', '');
43729 token('oauth_token_secret', '');
43730 token('oauth_request_token_secret', '');
43734 // TODO: detect lack of click event
43735 oauth.authenticate = function(callback) {
43736 if (oauth.authenticated()) return callback();
43740 // ## Getting a request token
43741 var params = timenonce(getAuth(o)),
43742 url = o.url + '/oauth/request_token';
43744 params.oauth_signature = ohauth_1.signature(
43745 o.oauth_secret, '',
43746 ohauth_1.baseString('POST', url, params));
43748 if (!o.singlepage) {
43749 // Create a 600x550 popup window in the center of the screen
43750 var w = 600, h = 550,
43752 ['width', w], ['height', h],
43753 ['left', screen.width / 2 - w / 2],
43754 ['top', screen.height / 2 - h / 2]].map(function(x) {
43755 return x.join('=');
43757 popup = window.open('about:blank', 'oauth_window', settings);
43760 // Request a request token. When this is complete, the popup
43761 // window is redirected to OSM's authorization page.
43762 ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
43765 function reqTokenDone(err, xhr) {
43767 if (err) return callback(err);
43768 var resp = ohauth_1.stringQs(xhr.response);
43769 token('oauth_request_token_secret', resp.oauth_token_secret);
43770 var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
43771 oauth_token: resp.oauth_token,
43772 oauth_callback: resolveUrl(o.landing)
43775 if (o.singlepage) {
43776 location.href = authorize_url;
43778 popup.location = authorize_url;
43782 // Called by a function in a landing page, in the popup window. The
43783 // window closes itself.
43784 window.authComplete = function(token) {
43785 var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
43786 get_access_token(oauth_token.oauth_token);
43787 delete window.authComplete;
43790 // ## Getting an request token
43792 // At this point we have an `oauth_token`, brought in from a function
43793 // call on a landing page popup.
43794 function get_access_token(oauth_token) {
43795 var url = o.url + '/oauth/access_token',
43796 params = timenonce(getAuth(o)),
43797 request_token_secret = token('oauth_request_token_secret');
43798 params.oauth_token = oauth_token;
43799 params.oauth_signature = ohauth_1.signature(
43801 request_token_secret,
43802 ohauth_1.baseString('POST', url, params));
43804 // ## Getting an access token
43806 // The final token required for authentication. At this point
43807 // we have a `request token secret`
43808 ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
43812 function accessTokenDone(err, xhr) {
43814 if (err) return callback(err);
43815 var access_token = ohauth_1.stringQs(xhr.response);
43816 token('oauth_token', access_token.oauth_token);
43817 token('oauth_token_secret', access_token.oauth_token_secret);
43818 callback(null, oauth);
43822 oauth.bootstrapToken = function(oauth_token, callback) {
43823 // ## Getting an request token
43824 // At this point we have an `oauth_token`, brought in from a function
43825 // call on a landing page popup.
43826 function get_access_token(oauth_token) {
43827 var url = o.url + '/oauth/access_token',
43828 params = timenonce(getAuth(o)),
43829 request_token_secret = token('oauth_request_token_secret');
43830 params.oauth_token = oauth_token;
43831 params.oauth_signature = ohauth_1.signature(
43833 request_token_secret,
43834 ohauth_1.baseString('POST', url, params));
43836 // ## Getting an access token
43837 // The final token required for authentication. At this point
43838 // we have a `request token secret`
43839 ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
43843 function accessTokenDone(err, xhr) {
43845 if (err) return callback(err);
43846 var access_token = ohauth_1.stringQs(xhr.response);
43847 token('oauth_token', access_token.oauth_token);
43848 token('oauth_token_secret', access_token.oauth_token_secret);
43849 callback(null, oauth);
43852 get_access_token(oauth_token);
43857 // A single XMLHttpRequest wrapper that does authenticated calls if the
43858 // user has logged in.
43859 oauth.xhr = function(options, callback) {
43860 if (!oauth.authenticated()) {
43862 return oauth.authenticate(run);
43864 callback('not authenticated', null);
43872 var params = timenonce(getAuth(o)),
43873 oauth_token_secret = token('oauth_token_secret'),
43874 url = (options.prefix !== false) ? o.url + options.path : options.path,
43875 url_parts = url.replace(/#.*$/, '').split('?', 2),
43876 base_url = url_parts[0],
43877 query = (url_parts.length === 2) ? url_parts[1] : '';
43879 // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
43880 if ((!options.options || !options.options.header ||
43881 options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
43883 params = immutable(params, ohauth_1.stringQs(options.content));
43886 params.oauth_token = token('oauth_token');
43887 params.oauth_signature = ohauth_1.signature(
43889 oauth_token_secret,
43890 ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
43893 return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
43896 function done(err, xhr) {
43897 if (err) return callback(err);
43898 else if (xhr.responseXML) return callback(err, xhr.responseXML);
43899 else return callback(err, xhr.response);
43903 // pre-authorize this object, if we can just get a token and token_secret
43905 oauth.preauth = function(c) {
43907 if (c.oauth_token) token('oauth_token', c.oauth_token);
43908 if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
43912 oauth.options = function(_) {
43913 if (!arguments.length) return o;
43916 o.url = o.url || 'https://www.openstreetmap.org';
43917 o.landing = o.landing || 'land.html';
43918 o.singlepage = o.singlepage || false;
43920 // Optional loading and loading-done functions for nice UI feedback.
43921 // by default, no-ops
43922 o.loading = o.loading || function() {};
43923 o.done = o.done || function() {};
43925 return oauth.preauth(o);
43928 // 'stamp' an authentication object from `getAuth()`
43929 // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
43931 function timenonce(o) {
43932 o.oauth_timestamp = ohauth_1.timestamp();
43933 o.oauth_nonce = ohauth_1.nonce();
43937 // get/set tokens. These are prefixed with the base URL so that `osm-auth`
43938 // can be used with multiple APIs and the keys in `localStorage`
43942 if (store_legacy.enabled) {
43943 token = function (x, y) {
43944 if (arguments.length === 1) return store_legacy.get(o.url + x);
43945 else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
43949 token = function (x, y) {
43950 if (arguments.length === 1) return storage[o.url + x];
43951 else if (arguments.length === 2) return storage[o.url + x] = y;
43955 // Get an authentication object. If you just add and remove properties
43956 // from a single object, you'll need to use `delete` to make sure that
43957 // it doesn't contain undesired properties for authentication
43958 function getAuth(o) {
43960 oauth_consumer_key: o.oauth_consumer_key,
43961 oauth_signature_method: 'HMAC-SHA1'
43965 // potentially pre-authorize
43971 var JXON = new (function () {
43973 sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
43974 aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
43976 function parseText (sValue) {
43977 if (rIsNull.test(sValue)) { return null; }
43978 if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
43979 if (isFinite(sValue)) { return parseFloat(sValue); }
43980 if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
43984 function EmptyTree () { }
43985 EmptyTree.prototype.toString = function () { return 'null'; };
43986 EmptyTree.prototype.valueOf = function () { return null; };
43988 function objectify (vValue) {
43989 return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
43992 function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
43994 nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
43995 bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
43998 sProp, vContent, nLength = 0, sCollectedTxt = '',
43999 vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
44002 for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
44003 oNode = oParentNode.childNodes.item(nItem);
44004 if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
44005 else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
44006 else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
44010 var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
44012 if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
44014 for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
44015 sProp = aCache[nElId].nodeName.toLowerCase();
44016 vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
44017 if (vResult.hasOwnProperty(sProp)) {
44018 if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
44019 vResult[sProp].push(vContent);
44021 vResult[sProp] = vContent;
44028 nAttrLen = oParentNode.attributes.length,
44029 sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
44031 for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
44032 oAttrib = oParentNode.attributes.item(nAttrib);
44033 oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
44037 if (bFreeze) { Object.freeze(oAttrParent); }
44038 vResult[sAttributesProp] = oAttrParent;
44039 nLength -= nAttrLen - 1;
44043 if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
44044 vResult[sValueProp] = vBuiltVal;
44045 } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
44046 vResult = vBuiltVal;
44049 if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
44051 aCache.length = nLevelStart;
44056 function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
44057 var vValue, oChild;
44059 if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
44060 oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
44061 } else if (oParentObj.constructor === Date) {
44062 oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));
44065 for (var sName in oParentObj) {
44066 vValue = oParentObj[sName];
44067 if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
44068 if (sName === sValueProp) {
44069 if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
44070 } else if (sName === sAttributesProp) { /* verbosity level is 3 */
44071 for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
44072 } else if (sName.charAt(0) === sAttrPref) {
44073 oParentEl.setAttribute(sName.slice(1), vValue);
44074 } else if (vValue.constructor === Array) {
44075 for (var nItem = 0; nItem < vValue.length; nItem++) {
44076 oChild = oXMLDoc.createElement(sName);
44077 loadObjTree(oXMLDoc, oChild, vValue[nItem]);
44078 oParentEl.appendChild(oChild);
44081 oChild = oXMLDoc.createElement(sName);
44082 if (vValue instanceof Object) {
44083 loadObjTree(oXMLDoc, oChild, vValue);
44084 } else if (vValue !== null && vValue !== true) {
44085 oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
44087 oParentEl.appendChild(oChild);
44092 this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
44093 var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
44094 return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);
44097 this.unbuild = function (oObjTree) {
44098 var oNewDoc = document.implementation.createDocument('', '', null);
44099 loadObjTree(oNewDoc, oNewDoc, oObjTree);
44103 this.stringify = function (oObjTree) {
44104 return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
44108 // var myObject = JXON.build(doc);
44109 // we got our javascript object! try: alert(JSON.stringify(myObject));
44111 // var newDoc = JXON.unbuild(myObject);
44112 // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
44114 var dispatch$3 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded');
44115 var urlroot = 'https://www.openstreetmap.org';
44116 var oauth = osmAuth({
44118 oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
44119 oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
44120 loading: authLoading,
44124 var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
44125 var _tiles = { loaded: {}, inflight: {} };
44126 var _changeset = {};
44127 var _entityCache = {};
44128 var _connectionID = 1;
44129 var _tileZoom = 16;
44130 var _rateLimitError;
44131 var _userChangesets;
44136 function authLoading() {
44137 dispatch$3.call('authLoading');
44141 function authDone() {
44142 dispatch$3.call('authDone');
44146 function abortRequest$2(i) {
44153 function getLoc(attrs) {
44154 var lon = attrs.lon && attrs.lon.value;
44155 var lat = attrs.lat && attrs.lat.value;
44156 return [parseFloat(lon), parseFloat(lat)];
44160 function getNodes(obj) {
44161 var elems = obj.getElementsByTagName('nd');
44162 var nodes = new Array(elems.length);
44163 for (var i = 0, l = elems.length; i < l; i++) {
44164 nodes[i] = 'n' + elems[i].attributes.ref.value;
44170 function getTags(obj) {
44171 var elems = obj.getElementsByTagName('tag');
44173 for (var i = 0, l = elems.length; i < l; i++) {
44174 var attrs = elems[i].attributes;
44175 tags[attrs.k.value] = attrs.v.value;
44182 function getMembers(obj) {
44183 var elems = obj.getElementsByTagName('member');
44184 var members = new Array(elems.length);
44185 for (var i = 0, l = elems.length; i < l; i++) {
44186 var attrs = elems[i].attributes;
44188 id: attrs.type.value[0] + attrs.ref.value,
44189 type: attrs.type.value,
44190 role: attrs.role.value
44197 function getVisible(attrs) {
44198 return (!attrs.visible || attrs.visible.value !== 'false');
44203 node: function nodeData(obj, uid) {
44204 var attrs = obj.attributes;
44205 return new osmNode({
44207 visible: getVisible(attrs),
44208 version: attrs.version.value,
44209 changeset: attrs.changeset && attrs.changeset.value,
44210 timestamp: attrs.timestamp && attrs.timestamp.value,
44211 user: attrs.user && attrs.user.value,
44212 uid: attrs.uid && attrs.uid.value,
44213 loc: getLoc(attrs),
44218 way: function wayData(obj, uid) {
44219 var attrs = obj.attributes;
44220 return new osmWay({
44222 visible: getVisible(attrs),
44223 version: attrs.version.value,
44224 changeset: attrs.changeset && attrs.changeset.value,
44225 timestamp: attrs.timestamp && attrs.timestamp.value,
44226 user: attrs.user && attrs.user.value,
44227 uid: attrs.uid && attrs.uid.value,
44228 tags: getTags(obj),
44229 nodes: getNodes(obj),
44233 relation: function relationData(obj, uid) {
44234 var attrs = obj.attributes;
44235 return new osmRelation({
44237 visible: getVisible(attrs),
44238 version: attrs.version.value,
44239 changeset: attrs.changeset && attrs.changeset.value,
44240 timestamp: attrs.timestamp && attrs.timestamp.value,
44241 user: attrs.user && attrs.user.value,
44242 uid: attrs.uid && attrs.uid.value,
44243 tags: getTags(obj),
44244 members: getMembers(obj)
44250 function parse$1(xml$$1, callback, options) {
44251 options = assignIn({ cache: true }, options);
44252 if (!xml$$1 || !xml$$1.childNodes) return;
44254 var root = xml$$1.childNodes[0];
44255 var children = root.childNodes;
44257 function parseChild(child) {
44258 var parser = parsers[child.nodeName];
44260 var uid = osmEntity$$1.id.fromOSM(child.nodeName, child.attributes.id.value);
44261 if (options.cache && _entityCache[uid]) {
44264 return parser(child, uid);
44268 utilIdleWorker(children, parseChild, callback);
44275 utilRebind(this, dispatch$3, 'on');
44279 reset: function() {
44281 _userChangesets = undefined;
44282 _userDetails = undefined;
44283 _rateLimitError = undefined;
44284 forEach(_tiles.inflight, abortRequest$2);
44285 if (_changeset.inflight) abortRequest$2(_changeset.inflight);
44286 _tiles = { loaded: {}, inflight: {} };
44293 getConnectionId: function() {
44294 return _connectionID;
44298 changesetURL: function(changesetId) {
44299 return urlroot + '/changeset/' + changesetId;
44303 changesetsURL: function(center, zoom) {
44304 var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
44305 return urlroot + '/history#map=' +
44306 Math.floor(zoom) + '/' +
44307 center[1].toFixed(precision) + '/' +
44308 center[0].toFixed(precision);
44312 entityURL: function(entity) {
44313 return urlroot + '/' + entity.type + '/' + entity.osmId();
44317 historyURL: function(entity) {
44318 return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
44322 userURL: function(username) {
44323 return urlroot + '/user/' + username;
44327 loadFromAPI: function(path, callback, options) {
44328 options = assignIn({ cache: true }, options);
44330 var cid = _connectionID;
44332 function done(err, xml$$1) {
44333 if (that.getConnectionId() !== cid) {
44334 if (callback) callback({ message: 'Connection Switched', status: -1 });
44338 var isAuthenticated = that.authenticated();
44340 // 400 Bad Request, 401 Unauthorized, 403 Forbidden
44341 // Logout and retry the request..
44342 if (isAuthenticated && err && (err.status === 400 || err.status === 401 || err.status === 403)) {
44344 that.loadFromAPI(path, callback);
44346 // else, no retry..
44348 // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
44349 // Set the rateLimitError flag and trigger a warning..
44350 if (!isAuthenticated && !_rateLimitError && err &&
44351 (err.status === 509 || err.status === 429)) {
44352 _rateLimitError = err;
44353 dispatch$3.call('change');
44357 if (err) return callback(err, null);
44358 parse$1(xml$$1, function (entities) {
44359 if (options.cache) {
44360 for (var i in entities) {
44361 _entityCache[entities[i].id] = true;
44364 callback(null, entities);
44370 if (this.authenticated()) {
44371 return oauth.xhr({ method: 'GET', path: path }, done);
44373 var url = urlroot + path;
44374 return d3_xml(url).get(done);
44379 loadEntity: function(id, callback) {
44380 var type = osmEntity$$1.id.type(id);
44381 var osmID = osmEntity$$1.id.toOSM(id);
44382 var options = { cache: false };
44385 '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
44386 function(err, entities) {
44387 if (callback) callback(err, { data: entities });
44394 loadEntityVersion: function(id, version, callback) {
44395 var type = osmEntity$$1.id.type(id);
44396 var osmID = osmEntity$$1.id.toOSM(id);
44397 var options = { cache: false };
44400 '/api/0.6/' + type + '/' + osmID + '/' + version,
44401 function(err, entities) {
44402 if (callback) callback(err, { data: entities });
44409 loadMultiple: function(ids, callback) {
44412 forEach(groupBy(uniq(ids), osmEntity$$1.id.type), function(v, k) {
44413 var type = k + 's';
44414 var osmIDs = map$3(v, osmEntity$$1.id.toOSM);
44415 var options = { cache: false };
44417 forEach(chunk(osmIDs, 150), function(arr) {
44419 '/api/0.6/' + type + '?' + type + '=' + arr.join(),
44420 function(err, entities) {
44421 if (callback) callback(err, { data: entities });
44430 authenticated: function() {
44431 return oauth.authenticated();
44435 putChangeset: function(changeset, changes, callback) {
44436 if (_changeset.inflight) {
44437 return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
44441 var cid = _connectionID;
44443 if (_changeset.open) { // reuse existing open changeset..
44444 createdChangeset(null, _changeset.open);
44445 } else { // open a new changeset..
44446 _changeset.inflight = oauth.xhr({
44448 path: '/api/0.6/changeset/create',
44449 options: { header: { 'Content-Type': 'text/xml' } },
44450 content: JXON.stringify(changeset.asJXON())
44451 }, createdChangeset);
44455 function createdChangeset(err, changesetID) {
44456 _changeset.inflight = null;
44459 // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
44460 if (err.status === 400 || err.status === 401 || err.status === 403) {
44463 return callback(err, changeset);
44465 if (that.getConnectionId() !== cid) {
44466 return callback({ message: 'Connection Switched', status: -1 }, changeset);
44469 _changeset.open = changesetID;
44470 changeset = changeset.update({ id: changesetID });
44472 // Upload the changeset..
44473 _changeset.inflight = oauth.xhr({
44475 path: '/api/0.6/changeset/' + changesetID + '/upload',
44476 options: { header: { 'Content-Type': 'text/xml' } },
44477 content: JXON.stringify(changeset.osmChangeJXON(changes))
44478 }, uploadedChangeset);
44482 function uploadedChangeset(err) {
44483 _changeset.inflight = null;
44485 if (err) return callback(err, changeset);
44487 // Upload was successful, safe to call the callback.
44488 // Add delay to allow for postgres replication #1646 #2678
44489 window.setTimeout(function() {
44490 callback(null, changeset);
44493 _changeset.open = null;
44495 // At this point, we don't really care if the connection was switched..
44496 // Only try to close the changeset if we're still talking to the same server.
44497 if (that.getConnectionId() === cid) {
44498 // Still attempt to close changeset, but ignore response because #2667
44501 path: '/api/0.6/changeset/' + changeset.id + '/close',
44502 options: { header: { 'Content-Type': 'text/xml' } }
44503 }, function() { return true; });
44509 userDetails: function(callback) {
44510 if (_userDetails) {
44511 callback(undefined, _userDetails);
44516 var cid = _connectionID;
44518 function done(err, user_details) {
44520 // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
44521 if (err.status === 400 || err.status === 401 || err.status === 403) {
44524 return callback(err);
44526 if (that.getConnectionId() !== cid) {
44527 return callback({ message: 'Connection Switched', status: -1 });
44531 var u = user_details.getElementsByTagName('user')[0];
44532 var img = u.getElementsByTagName('img');
44533 var image_url = '';
44535 if (img && img[0] && img[0].getAttribute('href')) {
44536 image_url = img[0].getAttribute('href');
44539 var changesets = u.getElementsByTagName('changesets');
44540 var changesets_count = 0;
44542 if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
44543 changesets_count = changesets[0].getAttribute('count');
44547 id: u.attributes.id.value,
44548 display_name: u.attributes.display_name.value,
44549 image_url: image_url,
44550 changesets_count: changesets_count
44553 callback(undefined, _userDetails);
44556 oauth.xhr({ method: 'GET', path: '/api/0.6/user/details' }, done);
44560 userChangesets: function(callback) {
44561 if (_userChangesets) {
44562 callback(undefined, _userChangesets);
44567 var cid = _connectionID;
44569 this.userDetails(function(err, user) {
44571 return callback(err);
44573 if (that.getConnectionId() !== cid) {
44574 return callback({ message: 'Connection Switched', status: -1 });
44577 function done(err, changesets) {
44579 // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
44580 if (err.status === 400 || err.status === 401 || err.status === 403) {
44583 return callback(err);
44585 if (that.getConnectionId() !== cid) {
44586 return callback({ message: 'Connection Switched', status: -1 });
44589 _userChangesets = Array.prototype.map.call(
44590 changesets.getElementsByTagName('changeset'),
44591 function (changeset) {
44592 return { tags: getTags(changeset) };
44594 ).filter(function (changeset) {
44595 var comment = changeset.tags.comment;
44596 return comment && comment !== '';
44599 callback(undefined, _userChangesets);
44602 oauth.xhr({ method: 'GET', path: '/api/0.6/changesets?user=' + user.id }, done);
44607 status: function(callback) {
44609 var cid = _connectionID;
44611 function done(xml$$1) {
44612 if (that.getConnectionId() !== cid) {
44613 return callback({ message: 'Connection Switched', status: -1 }, 'connectionSwitched');
44616 // update blacklists
44617 var elements = xml$$1.getElementsByTagName('blacklist');
44619 for (var i = 0; i < elements.length; i++) {
44620 var regex = elements[i].getAttribute('regex'); // needs unencode?
44622 regexes.push(regex);
44625 if (regexes.length) {
44626 _blacklists = regexes;
44630 if (_rateLimitError) {
44631 callback(_rateLimitError, 'rateLimited');
44633 var apiStatus = xml$$1.getElementsByTagName('status');
44634 var val = apiStatus[0].getAttribute('api');
44636 callback(undefined, val);
44640 d3_xml(urlroot + '/api/capabilities').get()
44642 .on('error', callback);
44646 imageryBlacklists: function() {
44647 return _blacklists;
44651 tileZoom: function(_) {
44652 if (!arguments.length) return _tileZoom;
44658 loadTiles: function(projection, dimensions, callback) {
44662 var s = projection.scale() * 2 * Math.PI;
44663 var z = Math.max(Math.log(s) / Math.log(2) - 8, 0);
44664 var ts = 256 * Math.pow(2, z - _tileZoom);
44666 s / 2 - projection.translate()[0],
44667 s / 2 - projection.translate()[1]
44670 var tiles = d3geoTile()
44671 .scaleExtent([_tileZoom, _tileZoom])
44674 .translate(projection.translate())()
44675 .map(function(tile) {
44676 var x = tile[0] * ts - origin[0];
44677 var y = tile[1] * ts - origin[1];
44680 id: tile.toString(),
44681 extent: geoExtent$$1(
44682 projection.invert([x, y + ts]),
44683 projection.invert([x + ts, y]))
44687 filter(_tiles.inflight, function(v, i) {
44688 var wanted = find$1(tiles, function(tile) {
44689 return i === tile.id;
44691 if (!wanted) delete _tiles.inflight[i];
44693 }).map(abortRequest$2);
44695 tiles.forEach(function(tile) {
44698 if (_tiles.loaded[id] || _tiles.inflight[id]) return;
44700 if (isEmpty(_tiles.inflight)) {
44701 dispatch$3.call('loading');
44704 _tiles.inflight[id] = that.loadFromAPI(
44705 '/api/0.6/map?bbox=' + tile.extent.toParam(),
44706 function(err, parsed) {
44707 delete _tiles.inflight[id];
44709 _tiles.loaded[id] = true;
44713 callback(err, assignIn({ data: parsed }, tile));
44716 if (isEmpty(_tiles.inflight)) {
44717 dispatch$3.call('loaded');
44725 switch: function(options) {
44726 urlroot = options.urlroot;
44728 oauth.options(assignIn({
44730 loading: authLoading,
44735 this.userChangesets(function() {}); // eagerly load user details/changesets
44736 dispatch$3.call('change');
44741 toggle: function(_) {
44747 loadedTiles: function(_) {
44748 if (!arguments.length) return _tiles.loaded;
44754 logout: function() {
44755 _userChangesets = undefined;
44756 _userDetails = undefined;
44758 dispatch$3.call('change');
44763 authenticate: function(callback) {
44765 var cid = _connectionID;
44766 _userChangesets = undefined;
44767 _userDetails = undefined;
44769 function done(err, res) {
44771 if (callback) callback(err);
44774 if (that.getConnectionId() !== cid) {
44775 if (callback) callback({ message: 'Connection Switched', status: -1 });
44778 _rateLimitError = undefined;
44779 dispatch$3.call('change');
44780 if (callback) callback(err, res);
44781 that.userChangesets(function() {}); // eagerly load user details/changesets
44784 return oauth.authenticate(done);
44788 var jsonpCache = {};
44789 window.jsonpCache = jsonpCache;
44791 function jsonpRequest(url, callback) {
44793 abort: function() {}
44796 if (window.JSONP_FIX) {
44797 if (window.JSONP_DELAY === 0) {
44798 callback(window.JSONP_FIX);
44800 var t = window.setTimeout(function() {
44801 callback(window.JSONP_FIX);
44802 }, window.JSONP_DELAY || 0);
44804 request.abort = function() { window.clearTimeout(t); };
44811 var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
44814 while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
44818 function create$$1(url) {
44819 var e = url.match(/callback=(\w+)/);
44820 var c = e ? e[1] : rand();
44822 jsonpCache[c] = function(data) {
44823 if (jsonpCache[c]) {
44829 function finalize() {
44830 delete jsonpCache[c];
44834 request.abort = finalize;
44835 return 'jsonpCache.' + c;
44838 var cb = create$$1(url);
44840 var script = select('head')
44842 .attr('type', 'text/javascript')
44843 .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
44848 var q = createCommonjsModule(function (module, exports) {
44849 // vim:ts=4:sts=4:sw=4:
44852 * Copyright 2009-2017 Kris Kowal under the terms of the MIT
44853 * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
44855 * With parts by Tyler Close
44856 * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
44857 * at http://www.opensource.org/licenses/mit-license.html
44858 * Forked at ref_send.js version: 2009-05-11
44860 * With parts by Mark Miller
44861 * Copyright (C) 2011 Google Inc.
44863 * Licensed under the Apache License, Version 2.0 (the "License");
44864 * you may not use this file except in compliance with the License.
44865 * You may obtain a copy of the License at
44867 * http://www.apache.org/licenses/LICENSE-2.0
44869 * Unless required by applicable law or agreed to in writing, software
44870 * distributed under the License is distributed on an "AS IS" BASIS,
44871 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
44872 * See the License for the specific language governing permissions and
44873 * limitations under the License.
44877 (function (definition) {
44879 // This file will function properly as a <script> tag, or a module
44880 // using CommonJS and NodeJS or RequireJS module formats. In
44881 // Common/Node/RequireJS, the module exports the Q API and when
44882 // executed as a simple <script>, it creates a Q global instead.
44885 if (typeof bootstrap === "function") {
44886 bootstrap("promise", definition);
44890 module.exports = definition();
44897 var hasStacks = false;
44901 hasStacks = !!e.stack;
44904 // All code after this point will be filtered from stack traces reported
44906 var qStartingLine = captureLine();
44911 // used for fallback in "allResolved"
44912 var noop = function () {};
44914 // Use the fastest possible means to execute a task in a future turn
44915 // of the event loop.
44916 var nextTick =(function () {
44917 // linked list of tasks (single, with head node)
44918 var head = {task: void 0, next: null};
44920 var flushing = false;
44921 var requestTick = void 0;
44922 var isNodeJS = false;
44923 // queue for late tasks, used by unhandled rejection tracking
44924 var laterQueue = [];
44927 /* jshint loopfunc: true */
44930 while (head.next) {
44933 head.task = void 0;
44934 domain = head.domain;
44937 head.domain = void 0;
44940 runSingle(task, domain);
44943 while (laterQueue.length) {
44944 task = laterQueue.pop();
44949 // runs a single function in the async queue
44950 function runSingle(task, domain) {
44956 // In node, uncaught exceptions are considered fatal errors.
44957 // Re-throw them synchronously to interrupt flushing!
44959 // Ensure continuation if the uncaught exception is suppressed
44960 // listening "uncaughtException" events (as domains does).
44961 // Continue in next event to avoid tick recursion.
44965 setTimeout(flush, 0);
44973 // In browsers, uncaught exceptions are not fatal.
44974 // Re-throw them asynchronously to avoid slow-downs.
44975 setTimeout(function () {
44986 nextTick = function (task) {
44987 tail = tail.next = {
44989 domain: isNodeJS && process.domain,
44999 if (typeof process === "object" &&
45000 process.toString() === "[object process]" && process.nextTick) {
45001 // Ensure Q is in a real Node environment, with a `process.nextTick`.
45002 // To see through fake Node environments:
45003 // * Mocha test runner - exposes a `process` global without a `nextTick`
45004 // * Browserify - exposes a `process.nexTick` function that uses
45005 // `setTimeout`. In this case `setImmediate` is preferred because
45006 // it is faster. Browserify's `process.toString()` yields
45007 // "[object Object]", while in a real Node environment
45008 // `process.toString()` yields "[object process]".
45011 requestTick = function () {
45012 process.nextTick(flush);
45015 } else if (typeof setImmediate === "function") {
45016 // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
45017 if (typeof window !== "undefined") {
45018 requestTick = setImmediate.bind(window, flush);
45020 requestTick = function () {
45021 setImmediate(flush);
45025 } else if (typeof MessageChannel !== "undefined") {
45027 // http://www.nonblocking.io/2011/06/windownexttick.html
45028 var channel = new MessageChannel();
45029 // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
45030 // working message ports the first time a page loads.
45031 channel.port1.onmessage = function () {
45032 requestTick = requestPortTick;
45033 channel.port1.onmessage = flush;
45036 var requestPortTick = function () {
45037 // Opera requires us to provide a message payload, regardless of
45038 // whether we use it.
45039 channel.port2.postMessage(0);
45041 requestTick = function () {
45042 setTimeout(flush, 0);
45048 requestTick = function () {
45049 setTimeout(flush, 0);
45052 // runs a task after all other tasks have been run
45053 // this is useful for unhandled rejection tracking that needs to happen
45054 // after all `then`d tasks have been run.
45055 nextTick.runAfter = function (task) {
45056 laterQueue.push(task);
45065 // Attempt to make generics safe in the face of downstream
45067 // There is no situation where this is necessary.
45068 // If you need a security guarantee, these primordials need to be
45069 // deeply frozen anyway, and if you don’t need a security guarantee,
45070 // this is just plain paranoid.
45071 // However, this **might** have the nice side-effect of reducing the size of
45072 // the minified code by reducing x.call() to merely x()
45073 // See Mark Miller’s explanation of what this does.
45074 // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
45075 var call = Function.call;
45076 function uncurryThis(f) {
45077 return function () {
45078 return call.apply(f, arguments);
45081 // This is equivalent, but slower:
45082 // uncurryThis = Function_bind.bind(Function_bind.call);
45083 // http://jsperf.com/uncurrythis
45085 var array_slice = uncurryThis(Array.prototype.slice);
45087 var array_reduce = uncurryThis(
45088 Array.prototype.reduce || function (callback, basis) {
45090 length = this.length;
45091 // concerning the initial value, if one is not provided
45092 if (arguments.length === 1) {
45093 // seek to the first value in the array, accounting
45094 // for the possibility that is is a sparse array
45096 if (index in this) {
45097 basis = this[index++];
45100 if (++index >= length) {
45101 throw new TypeError();
45106 for (; index < length; index++) {
45107 // account for the possibility that the array is sparse
45108 if (index in this) {
45109 basis = callback(basis, this[index], index);
45116 var array_indexOf = uncurryThis(
45117 Array.prototype.indexOf || function (value) {
45118 // not a very good shim, but good enough for our one use of it
45119 for (var i = 0; i < this.length; i++) {
45120 if (this[i] === value) {
45128 var array_map = uncurryThis(
45129 Array.prototype.map || function (callback, thisp) {
45132 array_reduce(self, function (undefined, value, index) {
45133 collect.push(callback.call(thisp, value, index, self));
45139 var object_create = Object.create || function (prototype) {
45140 function Type() { }
45141 Type.prototype = prototype;
45145 var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
45146 obj[prop] = descriptor.value;
45150 var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
45152 var object_keys = Object.keys || function (object) {
45154 for (var key in object) {
45155 if (object_hasOwnProperty(object, key)) {
45162 var object_toString = uncurryThis(Object.prototype.toString);
45164 function isObject(value) {
45165 return value === Object(value);
45168 // generator related shims
45170 // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
45171 function isStopIteration(exception) {
45173 object_toString(exception) === "[object StopIteration]" ||
45174 exception instanceof QReturnValue
45178 // FIXME: Remove this helper and Q.return once ES6 generators are in
45181 if (typeof ReturnValue !== "undefined") {
45182 QReturnValue = ReturnValue;
45184 QReturnValue = function (value) {
45185 this.value = value;
45189 // long stack traces
45191 var STACK_JUMP_SEPARATOR = "From previous event:";
45193 function makeStackTraceLong(error, promise) {
45194 // If possible, transform the error stack trace by removing Node and Q
45195 // cruft, then concatenating with the stack trace of `promise`. See #57.
45198 typeof error === "object" &&
45203 for (var p = promise; !!p; p = p.source) {
45204 if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
45205 object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
45206 stacks.unshift(p.stack);
45209 stacks.unshift(error.stack);
45211 var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
45212 var stack = filterStackString(concatedStacks);
45213 object_defineProperty(error, "stack", {value: stack, configurable: true});
45217 function filterStackString(stackString) {
45218 var lines = stackString.split("\n");
45219 var desiredLines = [];
45220 for (var i = 0; i < lines.length; ++i) {
45221 var line = lines[i];
45223 if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
45224 desiredLines.push(line);
45227 return desiredLines.join("\n");
45230 function isNodeFrame(stackLine) {
45231 return stackLine.indexOf("(module.js:") !== -1 ||
45232 stackLine.indexOf("(node.js:") !== -1;
45235 function getFileNameAndLineNumber(stackLine) {
45236 // Named functions: "at functionName (filename:lineNumber:columnNumber)"
45237 // In IE10 function name can have spaces ("Anonymous function") O_o
45238 var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
45240 return [attempt1[1], Number(attempt1[2])];
45243 // Anonymous functions: "at filename:lineNumber:columnNumber"
45244 var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
45246 return [attempt2[1], Number(attempt2[2])];
45249 // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
45250 var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
45252 return [attempt3[1], Number(attempt3[2])];
45256 function isInternalFrame(stackLine) {
45257 var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
45259 if (!fileNameAndLineNumber) {
45263 var fileName = fileNameAndLineNumber[0];
45264 var lineNumber = fileNameAndLineNumber[1];
45266 return fileName === qFileName &&
45267 lineNumber >= qStartingLine &&
45268 lineNumber <= qEndingLine;
45271 // discover own file name and line number range for filtering stack
45273 function captureLine() {
45281 var lines = e.stack.split("\n");
45282 var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
45283 var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
45284 if (!fileNameAndLineNumber) {
45288 qFileName = fileNameAndLineNumber[0];
45289 return fileNameAndLineNumber[1];
45293 function deprecate(callback, name, alternative) {
45294 return function () {
45295 if (typeof console !== "undefined" &&
45296 typeof console.warn === "function") {
45297 console.warn(name + " is deprecated, use " + alternative +
45298 " instead.", new Error("").stack);
45300 return callback.apply(callback, arguments);
45305 // beginning of real work
45308 * Constructs a promise for an immediate reference, passes promises through, or
45309 * coerces promises from different systems.
45310 * @param value immediate reference or promise
45312 function Q(value) {
45313 // If the object is already a Promise, return it directly. This enables
45314 // the resolve function to both be used to created references from objects,
45315 // but to tolerably coerce non-promises to promises.
45316 if (value instanceof Promise) {
45320 // assimilate thenables
45321 if (isPromiseAlike(value)) {
45322 return coerce(value);
45324 return fulfill(value);
45330 * Performs a task in a future turn of the event loop.
45331 * @param {Function} task
45333 Q.nextTick = nextTick;
45336 * Controls whether or not long stack traces will be on
45338 Q.longStackSupport = false;
45341 * The counter is used to determine the stopping point for building
45342 * long stack traces. In makeStackTraceLong we walk backwards through
45343 * the linked list of promises, only stacks which were created before
45344 * the rejection are concatenated.
45346 var longStackCounter = 1;
45348 // enable long stacks if Q_DEBUG is set
45349 if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
45350 Q.longStackSupport = true;
45354 * Constructs a {promise, resolve, reject} object.
45356 * `resolve` is a callback to invoke with a more resolved value for the
45357 * promise. To fulfill the promise, invoke `resolve` with any value that is
45358 * not a thenable. To reject the promise, invoke `resolve` with a rejected
45359 * thenable, or invoke `reject` with the reason directly. To resolve the
45360 * promise to another thenable, thus putting it in the same state, invoke
45361 * `resolve` with that other thenable.
45365 // if "messages" is an "Array", that indicates that the promise has not yet
45366 // been resolved. If it is "undefined", it has been resolved. Each
45367 // element of the messages array is itself an array of complete arguments to
45368 // forward to the resolved promise. We coerce the resolution value to a
45369 // promise using the `resolve` function because it handles both fully
45370 // non-thenable values and other thenables gracefully.
45371 var messages = [], progressListeners = [], resolvedPromise;
45373 var deferred = object_create(defer.prototype);
45374 var promise = object_create(Promise.prototype);
45376 promise.promiseDispatch = function (resolve, op, operands) {
45377 var args = array_slice(arguments);
45379 messages.push(args);
45380 if (op === "when" && operands[1]) { // progress operand
45381 progressListeners.push(operands[1]);
45384 Q.nextTick(function () {
45385 resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
45391 promise.valueOf = function () {
45395 var nearerValue = nearer(resolvedPromise);
45396 if (isPromise(nearerValue)) {
45397 resolvedPromise = nearerValue; // shorten chain
45399 return nearerValue;
45402 promise.inspect = function () {
45403 if (!resolvedPromise) {
45404 return { state: "pending" };
45406 return resolvedPromise.inspect();
45409 if (Q.longStackSupport && hasStacks) {
45413 // NOTE: don't try to use `Error.captureStackTrace` or transfer the
45414 // accessor around; that causes memory leaks as per GH-111. Just
45415 // reify the stack trace as a string ASAP.
45417 // At the same time, cut off the first line; it's always just
45418 // "[object Promise]\n", as per the `toString`.
45419 promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
45420 promise.stackCounter = longStackCounter++;
45424 // NOTE: we do the checks for `resolvedPromise` in each method, instead of
45425 // consolidating them into `become`, since otherwise we'd create new
45426 // promises with the lines `become(whatever(value))`. See e.g. GH-252.
45428 function become(newPromise) {
45429 resolvedPromise = newPromise;
45431 if (Q.longStackSupport && hasStacks) {
45432 // Only hold a reference to the new promise if long stacks
45433 // are enabled to reduce memory usage
45434 promise.source = newPromise;
45437 array_reduce(messages, function (undefined, message) {
45438 Q.nextTick(function () {
45439 newPromise.promiseDispatch.apply(newPromise, message);
45444 progressListeners = void 0;
45447 deferred.promise = promise;
45448 deferred.resolve = function (value) {
45449 if (resolvedPromise) {
45456 deferred.fulfill = function (value) {
45457 if (resolvedPromise) {
45461 become(fulfill(value));
45463 deferred.reject = function (reason) {
45464 if (resolvedPromise) {
45468 become(reject(reason));
45470 deferred.notify = function (progress) {
45471 if (resolvedPromise) {
45475 array_reduce(progressListeners, function (undefined, progressListener) {
45476 Q.nextTick(function () {
45477 progressListener(progress);
45486 * Creates a Node-style callback that will resolve or reject the deferred
45488 * @returns a nodeback
45490 defer.prototype.makeNodeResolver = function () {
45492 return function (error, value) {
45494 self.reject(error);
45495 } else if (arguments.length > 2) {
45496 self.resolve(array_slice(arguments, 1));
45498 self.resolve(value);
45504 * @param resolver {Function} a function that returns nothing and accepts
45505 * the resolve, reject, and notify functions for a deferred.
45506 * @returns a promise that may be resolved with the given resolve and reject
45507 * functions, or rejected by a thrown exception in resolver
45509 Q.Promise = promise; // ES6
45510 Q.promise = promise;
45511 function promise(resolver) {
45512 if (typeof resolver !== "function") {
45513 throw new TypeError("resolver must be a function.");
45515 var deferred = defer();
45517 resolver(deferred.resolve, deferred.reject, deferred.notify);
45519 deferred.reject(reason);
45521 return deferred.promise;
45524 promise.race = race; // ES6
45525 promise.all = all; // ES6
45526 promise.reject = reject; // ES6
45527 promise.resolve = Q; // ES6
45529 // XXX experimental. This method is a way to denote that a local value is
45530 // serializable and should be immediately dispatched to a remote upon request,
45531 // instead of passing a reference.
45532 Q.passByCopy = function (object) {
45534 //passByCopies.set(object, true);
45538 Promise.prototype.passByCopy = function () {
45540 //passByCopies.set(object, true);
45545 * If two promises eventually fulfill to the same value, promises that value,
45546 * but otherwise rejects.
45549 * @returns {Any*} a promise for x and y if they are the same, but a rejection
45553 Q.join = function (x, y) {
45554 return Q(x).join(y);
45557 Promise.prototype.join = function (that) {
45558 return Q([this, that]).spread(function (x, y) {
45560 // TODO: "===" should be Object.is or equiv
45563 throw new Error("Q can't join: not the same: " + x + " " + y);
45569 * Returns a promise for the first of an array of promises to become settled.
45570 * @param answers {Array[Any*]} promises to race
45571 * @returns {Any*} the first promise to be settled
45574 function race(answerPs) {
45575 return promise(function (resolve, reject) {
45576 // Switch to this once we can assume at least ES5
45577 // answerPs.forEach(function (answerP) {
45578 // Q(answerP).then(resolve, reject);
45580 // Use this in the meantime
45581 for (var i = 0, len = answerPs.length; i < len; i++) {
45582 Q(answerPs[i]).then(resolve, reject);
45587 Promise.prototype.race = function () {
45588 return this.then(Q.race);
45592 * Constructs a Promise with a promise descriptor object and optional fallback
45593 * function. The descriptor contains methods like when(rejected), get(name),
45594 * set(name, value), post(name, args), and delete(name), which all
45595 * return either a value, a promise for a value, or a rejection. The fallback
45596 * accepts the operation name, a resolver, and any further arguments that would
45597 * have been forwarded to the appropriate method above had a method been
45598 * provided with the proper name. The API makes no guarantees about the nature
45599 * of the returned object, apart from that it is usable whereever promises are
45602 Q.makePromise = Promise;
45603 function Promise(descriptor, fallback, inspect) {
45604 if (fallback === void 0) {
45605 fallback = function (op) {
45606 return reject(new Error(
45607 "Promise does not support operation: " + op
45611 if (inspect === void 0) {
45612 inspect = function () {
45613 return {state: "unknown"};
45617 var promise = object_create(Promise.prototype);
45619 promise.promiseDispatch = function (resolve, op, args) {
45622 if (descriptor[op]) {
45623 result = descriptor[op].apply(promise, args);
45625 result = fallback.call(promise, op, args);
45627 } catch (exception) {
45628 result = reject(exception);
45635 promise.inspect = inspect;
45637 // XXX deprecated `valueOf` and `exception` support
45639 var inspected = inspect();
45640 if (inspected.state === "rejected") {
45641 promise.exception = inspected.reason;
45644 promise.valueOf = function () {
45645 var inspected = inspect();
45646 if (inspected.state === "pending" ||
45647 inspected.state === "rejected") {
45650 return inspected.value;
45657 Promise.prototype.toString = function () {
45658 return "[object Promise]";
45661 Promise.prototype.then = function (fulfilled, rejected, progressed) {
45663 var deferred = defer();
45664 var done = false; // ensure the untrusted promise makes at most a
45665 // single call to one of the callbacks
45667 function _fulfilled(value) {
45669 return typeof fulfilled === "function" ? fulfilled(value) : value;
45670 } catch (exception) {
45671 return reject(exception);
45675 function _rejected(exception) {
45676 if (typeof rejected === "function") {
45677 makeStackTraceLong(exception, self);
45679 return rejected(exception);
45680 } catch (newException) {
45681 return reject(newException);
45684 return reject(exception);
45687 function _progressed(value) {
45688 return typeof progressed === "function" ? progressed(value) : value;
45691 Q.nextTick(function () {
45692 self.promiseDispatch(function (value) {
45698 deferred.resolve(_fulfilled(value));
45699 }, "when", [function (exception) {
45705 deferred.resolve(_rejected(exception));
45709 // Progress propagator need to be attached in the current tick.
45710 self.promiseDispatch(void 0, "when", [void 0, function (value) {
45714 newValue = _progressed(value);
45725 deferred.notify(newValue);
45729 return deferred.promise;
45732 Q.tap = function (promise, callback) {
45733 return Q(promise).tap(callback);
45737 * Works almost like "finally", but not called for rejections.
45738 * Original resolution value is passed through callback unaffected.
45739 * Callback may return a promise that will be awaited for.
45740 * @param {Function} callback
45741 * @returns {Q.Promise}
45745 * .tap(console.log)
45748 Promise.prototype.tap = function (callback) {
45749 callback = Q(callback);
45751 return this.then(function (value) {
45752 return callback.fcall(value).thenResolve(value);
45757 * Registers an observer on a promise.
45761 * 1. that fulfilled and rejected will be called only once.
45762 * 2. that either the fulfilled callback or the rejected callback will be
45763 * called, but not both.
45764 * 3. that fulfilled and rejected will not be called in this turn.
45766 * @param value promise or immediate reference to observe
45767 * @param fulfilled function to be called with the fulfilled value
45768 * @param rejected function to be called with the rejection exception
45769 * @param progressed function to be called on any progress notifications
45770 * @return promise for the return value from the invoked callback
45773 function when(value, fulfilled, rejected, progressed) {
45774 return Q(value).then(fulfilled, rejected, progressed);
45777 Promise.prototype.thenResolve = function (value) {
45778 return this.then(function () { return value; });
45781 Q.thenResolve = function (promise, value) {
45782 return Q(promise).thenResolve(value);
45785 Promise.prototype.thenReject = function (reason) {
45786 return this.then(function () { throw reason; });
45789 Q.thenReject = function (promise, reason) {
45790 return Q(promise).thenReject(reason);
45794 * If an object is not a promise, it is as "near" as possible.
45795 * If a promise is rejected, it is as "near" as possible too.
45796 * If it’s a fulfilled promise, the fulfillment value is nearer.
45797 * If it’s a deferred promise and the deferred has been resolved, the
45798 * resolution is "nearer".
45800 * @returns most resolved (nearest) form of the object
45803 // XXX should we re-do this?
45805 function nearer(value) {
45806 if (isPromise(value)) {
45807 var inspected = value.inspect();
45808 if (inspected.state === "fulfilled") {
45809 return inspected.value;
45816 * @returns whether the given object is a promise.
45817 * Otherwise it is a fulfilled value.
45819 Q.isPromise = isPromise;
45820 function isPromise(object) {
45821 return object instanceof Promise;
45824 Q.isPromiseAlike = isPromiseAlike;
45825 function isPromiseAlike(object) {
45826 return isObject(object) && typeof object.then === "function";
45830 * @returns whether the given object is a pending promise, meaning not
45831 * fulfilled or rejected.
45833 Q.isPending = isPending;
45834 function isPending(object) {
45835 return isPromise(object) && object.inspect().state === "pending";
45838 Promise.prototype.isPending = function () {
45839 return this.inspect().state === "pending";
45843 * @returns whether the given object is a value or fulfilled
45846 Q.isFulfilled = isFulfilled;
45847 function isFulfilled(object) {
45848 return !isPromise(object) || object.inspect().state === "fulfilled";
45851 Promise.prototype.isFulfilled = function () {
45852 return this.inspect().state === "fulfilled";
45856 * @returns whether the given object is a rejected promise.
45858 Q.isRejected = isRejected;
45859 function isRejected(object) {
45860 return isPromise(object) && object.inspect().state === "rejected";
45863 Promise.prototype.isRejected = function () {
45864 return this.inspect().state === "rejected";
45867 //// BEGIN UNHANDLED REJECTION TRACKING
45869 // This promise library consumes exceptions thrown in handlers so they can be
45870 // handled by a subsequent promise. The exceptions get added to this array when
45871 // they are created, and removed when they are handled. Note that in ES6 or
45872 // shimmed environments, this would naturally be a `Set`.
45873 var unhandledReasons = [];
45874 var unhandledRejections = [];
45875 var reportedUnhandledRejections = [];
45876 var trackUnhandledRejections = true;
45878 function resetUnhandledRejections() {
45879 unhandledReasons.length = 0;
45880 unhandledRejections.length = 0;
45882 if (!trackUnhandledRejections) {
45883 trackUnhandledRejections = true;
45887 function trackRejection(promise, reason) {
45888 if (!trackUnhandledRejections) {
45891 if (typeof process === "object" && typeof process.emit === "function") {
45892 Q.nextTick.runAfter(function () {
45893 if (array_indexOf(unhandledRejections, promise) !== -1) {
45894 process.emit("unhandledRejection", reason, promise);
45895 reportedUnhandledRejections.push(promise);
45900 unhandledRejections.push(promise);
45901 if (reason && typeof reason.stack !== "undefined") {
45902 unhandledReasons.push(reason.stack);
45904 unhandledReasons.push("(no stack) " + reason);
45908 function untrackRejection(promise) {
45909 if (!trackUnhandledRejections) {
45913 var at = array_indexOf(unhandledRejections, promise);
45915 if (typeof process === "object" && typeof process.emit === "function") {
45916 Q.nextTick.runAfter(function () {
45917 var atReport = array_indexOf(reportedUnhandledRejections, promise);
45918 if (atReport !== -1) {
45919 process.emit("rejectionHandled", unhandledReasons[at], promise);
45920 reportedUnhandledRejections.splice(atReport, 1);
45924 unhandledRejections.splice(at, 1);
45925 unhandledReasons.splice(at, 1);
45929 Q.resetUnhandledRejections = resetUnhandledRejections;
45931 Q.getUnhandledReasons = function () {
45932 // Make a copy so that consumers can't interfere with our internal state.
45933 return unhandledReasons.slice();
45936 Q.stopUnhandledRejectionTracking = function () {
45937 resetUnhandledRejections();
45938 trackUnhandledRejections = false;
45941 resetUnhandledRejections();
45943 //// END UNHANDLED REJECTION TRACKING
45946 * Constructs a rejected promise.
45947 * @param reason value describing the failure
45950 function reject(reason) {
45951 var rejection = Promise({
45952 "when": function (rejected) {
45953 // note that the error has been handled
45955 untrackRejection(this);
45957 return rejected ? rejected(reason) : this;
45959 }, function fallback() {
45961 }, function inspect() {
45962 return { state: "rejected", reason: reason };
45965 // Note that the reason has not been handled.
45966 trackRejection(rejection, reason);
45972 * Constructs a fulfilled promise for an immediate reference.
45973 * @param value immediate reference
45975 Q.fulfill = fulfill;
45976 function fulfill(value) {
45978 "when": function () {
45981 "get": function (name) {
45982 return value[name];
45984 "set": function (name, rhs) {
45987 "delete": function (name) {
45988 delete value[name];
45990 "post": function (name, args) {
45991 // Mark Miller proposes that post with no name should apply a
45992 // promised function.
45993 if (name === null || name === void 0) {
45994 return value.apply(void 0, args);
45996 return value[name].apply(value, args);
45999 "apply": function (thisp, args) {
46000 return value.apply(thisp, args);
46002 "keys": function () {
46003 return object_keys(value);
46005 }, void 0, function inspect() {
46006 return { state: "fulfilled", value: value };
46011 * Converts thenables to Q promises.
46012 * @param promise thenable promise
46013 * @returns a Q promise
46015 function coerce(promise) {
46016 var deferred = defer();
46017 Q.nextTick(function () {
46019 promise.then(deferred.resolve, deferred.reject, deferred.notify);
46020 } catch (exception) {
46021 deferred.reject(exception);
46024 return deferred.promise;
46028 * Annotates an object such that it will never be
46029 * transferred away from this process over any promise
46030 * communication channel.
46032 * @returns promise a wrapping of that object that
46033 * additionally responds to the "isDef" message
46034 * without a rejection.
46037 function master(object) {
46039 "isDef": function () {}
46040 }, function fallback(op, args) {
46041 return dispatch(object, op, args);
46043 return Q(object).inspect();
46048 * Spreads the values of a promised array of arguments into the
46049 * fulfillment callback.
46050 * @param fulfilled callback that receives variadic arguments from the
46052 * @param rejected callback that receives the exception if the promise
46054 * @returns a promise for the return value or thrown exception of
46058 function spread(value, fulfilled, rejected) {
46059 return Q(value).spread(fulfilled, rejected);
46062 Promise.prototype.spread = function (fulfilled, rejected) {
46063 return this.all().then(function (array) {
46064 return fulfilled.apply(void 0, array);
46069 * The async function is a decorator for generator functions, turning
46070 * them into asynchronous generators. Although generators are only part
46071 * of the newest ECMAScript 6 drafts, this code does not cause syntax
46072 * errors in older engines. This code should continue to work and will
46073 * in fact improve over time as the language improves.
46075 * ES6 generators are currently part of V8 version 3.19 with the
46076 * --harmony-generators runtime flag enabled. SpiderMonkey has had them
46077 * for longer, but under an older Python-inspired form. This function
46078 * works on both kinds of generators.
46080 * Decorates a generator function such that:
46081 * - it may yield promises
46082 * - execution will continue when that promise is fulfilled
46083 * - the value of the yield expression will be the fulfilled value
46084 * - it returns a promise for the return value (when the generator
46086 * - the decorated function returns a promise for the return value
46087 * of the generator or the first rejected promise among those
46089 * - if an error is thrown in the generator, it propagates through
46090 * every following yield until it is caught, or until it escapes
46091 * the generator function altogether, and is translated into a
46092 * rejection for the promise returned by the decorated generator.
46095 function async(makeGenerator) {
46096 return function () {
46097 // when verb is "send", arg is a value
46098 // when verb is "throw", arg is an exception
46099 function continuer(verb, arg) {
46102 // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
46103 // engine that has a deployed base of browsers that support generators.
46104 // However, SM's generators use the Python-inspired semantics of
46105 // outdated ES6 drafts. We would like to support ES6, but we'd also
46106 // like to make it possible to use generators in deployed browsers, so
46107 // we also support Python-style generators. At some point we can remove
46110 if (typeof StopIteration === "undefined") {
46113 result = generator[verb](arg);
46114 } catch (exception) {
46115 return reject(exception);
46118 return Q(result.value);
46120 return when(result.value, callback, errback);
46123 // SpiderMonkey Generators
46124 // FIXME: Remove this case when SM does ES6 generators.
46126 result = generator[verb](arg);
46127 } catch (exception) {
46128 if (isStopIteration(exception)) {
46129 return Q(exception.value);
46131 return reject(exception);
46134 return when(result, callback, errback);
46137 var generator = makeGenerator.apply(this, arguments);
46138 var callback = continuer.bind(continuer, "next");
46139 var errback = continuer.bind(continuer, "throw");
46145 * The spawn function is a small wrapper around async that immediately
46146 * calls the generator and also ends the promise chain, so that any
46147 * unhandled errors are thrown instead of forwarded to the error
46148 * handler. This is useful because it's extremely common to run
46149 * generators at the top-level to work with libraries.
46152 function spawn(makeGenerator) {
46153 Q.done(Q.async(makeGenerator)());
46156 // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
46158 * Throws a ReturnValue exception to stop an asynchronous generator.
46160 * This interface is a stop-gap measure to support generator return
46161 * values in older Firefox/SpiderMonkey. In browsers that support ES6
46162 * generators like Chromium 29, just use "return" in your generator
46165 * @param value the return value for the surrounding generator
46166 * @throws ReturnValue exception with the value.
46169 * Q.async(function* () {
46170 * var foo = yield getFooPromise();
46171 * var bar = yield getBarPromise();
46172 * return foo + bar;
46174 * // Older SpiderMonkey style
46175 * Q.async(function () {
46176 * var foo = yield getFooPromise();
46177 * var bar = yield getBarPromise();
46178 * Q.return(foo + bar);
46181 Q["return"] = _return;
46182 function _return(value) {
46183 throw new QReturnValue(value);
46187 * The promised function decorator ensures that any promise arguments
46188 * are settled and passed as values (`this` is also settled and passed
46189 * as a value). It will also ensure that the result of a function is
46190 * always a promise.
46193 * var add = Q.promised(function (a, b) {
46198 * @param {function} callback The function to decorate
46199 * @returns {function} a function that has been decorated.
46201 Q.promised = promised;
46202 function promised(callback) {
46203 return function () {
46204 return spread([this, all(arguments)], function (self, args) {
46205 return callback.apply(self, args);
46211 * sends a message to a value in a future turn
46212 * @param object* the recipient
46213 * @param op the name of the message operation, e.g., "when",
46214 * @param args further arguments to be forwarded to the operation
46215 * @returns result {Promise} a promise for the result of the operation
46217 Q.dispatch = dispatch;
46218 function dispatch(object, op, args) {
46219 return Q(object).dispatch(op, args);
46222 Promise.prototype.dispatch = function (op, args) {
46224 var deferred = defer();
46225 Q.nextTick(function () {
46226 self.promiseDispatch(deferred.resolve, op, args);
46228 return deferred.promise;
46232 * Gets the value of a property in a future turn.
46233 * @param object promise or immediate reference for target object
46234 * @param name name of property to get
46235 * @return promise for the property value
46237 Q.get = function (object, key) {
46238 return Q(object).dispatch("get", [key]);
46241 Promise.prototype.get = function (key) {
46242 return this.dispatch("get", [key]);
46246 * Sets the value of a property in a future turn.
46247 * @param object promise or immediate reference for object object
46248 * @param name name of property to set
46249 * @param value new value of property
46250 * @return promise for the return value
46252 Q.set = function (object, key, value) {
46253 return Q(object).dispatch("set", [key, value]);
46256 Promise.prototype.set = function (key, value) {
46257 return this.dispatch("set", [key, value]);
46261 * Deletes a property in a future turn.
46262 * @param object promise or immediate reference for target object
46263 * @param name name of property to delete
46264 * @return promise for the return value
46266 Q.del = // XXX legacy
46267 Q["delete"] = function (object, key) {
46268 return Q(object).dispatch("delete", [key]);
46271 Promise.prototype.del = // XXX legacy
46272 Promise.prototype["delete"] = function (key) {
46273 return this.dispatch("delete", [key]);
46277 * Invokes a method in a future turn.
46278 * @param object promise or immediate reference for target object
46279 * @param name name of method to invoke
46280 * @param value a value to post, typically an array of
46281 * invocation arguments for promises that
46282 * are ultimately backed with `resolve` values,
46283 * as opposed to those backed with URLs
46284 * wherein the posted value can be any
46285 * JSON serializable object.
46286 * @return promise for the return value
46288 // bound locally because it is used by other methods
46289 Q.mapply = // XXX As proposed by "Redsandro"
46290 Q.post = function (object, name, args) {
46291 return Q(object).dispatch("post", [name, args]);
46294 Promise.prototype.mapply = // XXX As proposed by "Redsandro"
46295 Promise.prototype.post = function (name, args) {
46296 return this.dispatch("post", [name, args]);
46300 * Invokes a method in a future turn.
46301 * @param object promise or immediate reference for target object
46302 * @param name name of method to invoke
46303 * @param ...args array of invocation arguments
46304 * @return promise for the return value
46306 Q.send = // XXX Mark Miller's proposed parlance
46307 Q.mcall = // XXX As proposed by "Redsandro"
46308 Q.invoke = function (object, name /*...args*/) {
46309 return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
46312 Promise.prototype.send = // XXX Mark Miller's proposed parlance
46313 Promise.prototype.mcall = // XXX As proposed by "Redsandro"
46314 Promise.prototype.invoke = function (name /*...args*/) {
46315 return this.dispatch("post", [name, array_slice(arguments, 1)]);
46319 * Applies the promised function in a future turn.
46320 * @param object promise or immediate reference for target function
46321 * @param args array of application arguments
46323 Q.fapply = function (object, args) {
46324 return Q(object).dispatch("apply", [void 0, args]);
46327 Promise.prototype.fapply = function (args) {
46328 return this.dispatch("apply", [void 0, args]);
46332 * Calls the promised function in a future turn.
46333 * @param object promise or immediate reference for target function
46334 * @param ...args array of application arguments
46337 Q.fcall = function (object /* ...args*/) {
46338 return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
46341 Promise.prototype.fcall = function (/*...args*/) {
46342 return this.dispatch("apply", [void 0, array_slice(arguments)]);
46346 * Binds the promised function, transforming return values into a fulfilled
46347 * promise and thrown errors into a rejected one.
46348 * @param object promise or immediate reference for target function
46349 * @param ...args array of application arguments
46351 Q.fbind = function (object /*...args*/) {
46352 var promise = Q(object);
46353 var args = array_slice(arguments, 1);
46354 return function fbound() {
46355 return promise.dispatch("apply", [
46357 args.concat(array_slice(arguments))
46361 Promise.prototype.fbind = function (/*...args*/) {
46362 var promise = this;
46363 var args = array_slice(arguments);
46364 return function fbound() {
46365 return promise.dispatch("apply", [
46367 args.concat(array_slice(arguments))
46373 * Requests the names of the owned properties of a promised
46374 * object in a future turn.
46375 * @param object promise or immediate reference for target object
46376 * @return promise for the keys of the eventually settled object
46378 Q.keys = function (object) {
46379 return Q(object).dispatch("keys", []);
46382 Promise.prototype.keys = function () {
46383 return this.dispatch("keys", []);
46387 * Turns an array of promises into a promise for an array. If any of
46388 * the promises gets rejected, the whole array is rejected immediately.
46389 * @param {Array*} an array (or promise for an array) of values (or
46390 * promises for values)
46391 * @returns a promise for an array of the corresponding values
46394 // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
46396 function all(promises) {
46397 return when(promises, function (promises) {
46398 var pendingCount = 0;
46399 var deferred = defer();
46400 array_reduce(promises, function (undefined, promise, index) {
46403 isPromise(promise) &&
46404 (snapshot = promise.inspect()).state === "fulfilled"
46406 promises[index] = snapshot.value;
46412 promises[index] = value;
46413 if (--pendingCount === 0) {
46414 deferred.resolve(promises);
46418 function (progress) {
46419 deferred.notify({ index: index, value: progress });
46424 if (pendingCount === 0) {
46425 deferred.resolve(promises);
46427 return deferred.promise;
46431 Promise.prototype.all = function () {
46436 * Returns the first resolved promise of an array. Prior rejected promises are
46437 * ignored. Rejects only if all promises are rejected.
46438 * @param {Array*} an array containing values or promises for values
46439 * @returns a promise fulfilled with the value of the first resolved promise,
46440 * or a rejected promise if all promises are rejected.
46444 function any(promises) {
46445 if (promises.length === 0) {
46446 return Q.resolve();
46449 var deferred = Q.defer();
46450 var pendingCount = 0;
46451 array_reduce(promises, function (prev, current, index) {
46452 var promise = promises[index];
46456 when(promise, onFulfilled, onRejected, onProgress);
46457 function onFulfilled(result) {
46458 deferred.resolve(result);
46460 function onRejected(err) {
46462 if (pendingCount === 0) {
46463 var rejection = err || new Error("" + err);
46465 rejection.message = ("Q can't get fulfillment value from any promise, all " +
46466 "promises were rejected. Last error message: " + rejection.message);
46468 deferred.reject(rejection);
46471 function onProgress(progress) {
46479 return deferred.promise;
46482 Promise.prototype.any = function () {
46487 * Waits for all promises to be settled, either fulfilled or
46488 * rejected. This is distinct from `all` since that would stop
46489 * waiting at the first rejection. The promise returned by
46490 * `allResolved` will never be rejected.
46491 * @param promises a promise for an array (or an array) of promises
46493 * @return a promise for an array of promises
46495 Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
46496 function allResolved(promises) {
46497 return when(promises, function (promises) {
46498 promises = array_map(promises, Q);
46499 return when(all(array_map(promises, function (promise) {
46500 return when(promise, noop, noop);
46507 Promise.prototype.allResolved = function () {
46508 return allResolved(this);
46512 * @see Promise#allSettled
46514 Q.allSettled = allSettled;
46515 function allSettled(promises) {
46516 return Q(promises).allSettled();
46520 * Turns an array of promises into a promise for an array of their states (as
46521 * returned by `inspect`) when they have all settled.
46522 * @param {Array[Any*]} values an array (or promise for an array) of values (or
46523 * promises for values)
46524 * @returns {Array[State]} an array of states for the respective values.
46526 Promise.prototype.allSettled = function () {
46527 return this.then(function (promises) {
46528 return all(array_map(promises, function (promise) {
46529 promise = Q(promise);
46530 function regardless() {
46531 return promise.inspect();
46533 return promise.then(regardless, regardless);
46539 * Captures the failure of a promise, giving an oportunity to recover
46540 * with a callback. If the given promise is fulfilled, the returned
46541 * promise is fulfilled.
46542 * @param {Any*} promise for something
46543 * @param {Function} callback to fulfill the returned promise if the
46544 * given promise is rejected
46545 * @returns a promise for the return value of the callback
46547 Q.fail = // XXX legacy
46548 Q["catch"] = function (object, rejected) {
46549 return Q(object).then(void 0, rejected);
46552 Promise.prototype.fail = // XXX legacy
46553 Promise.prototype["catch"] = function (rejected) {
46554 return this.then(void 0, rejected);
46558 * Attaches a listener that can respond to progress notifications from a
46559 * promise's originating deferred. This listener receives the exact arguments
46560 * passed to ``deferred.notify``.
46561 * @param {Any*} promise for something
46562 * @param {Function} callback to receive any progress notifications
46563 * @returns the given promise, unchanged
46565 Q.progress = progress;
46566 function progress(object, progressed) {
46567 return Q(object).then(void 0, void 0, progressed);
46570 Promise.prototype.progress = function (progressed) {
46571 return this.then(void 0, void 0, progressed);
46575 * Provides an opportunity to observe the settling of a promise,
46576 * regardless of whether the promise is fulfilled or rejected. Forwards
46577 * the resolution to the returned promise when the callback is done.
46578 * The callback can return a promise to defer completion.
46579 * @param {Any*} promise
46580 * @param {Function} callback to observe the resolution of the given
46581 * promise, takes no arguments.
46582 * @returns a promise for the resolution of the given promise when
46585 Q.fin = // XXX legacy
46586 Q["finally"] = function (object, callback) {
46587 return Q(object)["finally"](callback);
46590 Promise.prototype.fin = // XXX legacy
46591 Promise.prototype["finally"] = function (callback) {
46592 if (!callback || typeof callback.apply !== "function") {
46593 throw new Error("Q can't apply finally callback");
46595 callback = Q(callback);
46596 return this.then(function (value) {
46597 return callback.fcall().then(function () {
46600 }, function (reason) {
46601 // TODO attempt to recycle the rejection with "this".
46602 return callback.fcall().then(function () {
46609 * Terminates a chain of promises, forcing rejections to be
46610 * thrown as exceptions.
46611 * @param {Any*} promise at the end of a chain of promises
46614 Q.done = function (object, fulfilled, rejected, progress) {
46615 return Q(object).done(fulfilled, rejected, progress);
46618 Promise.prototype.done = function (fulfilled, rejected, progress) {
46619 var onUnhandledError = function (error) {
46620 // forward to a future turn so that ``when``
46621 // does not catch it and turn it into a rejection.
46622 Q.nextTick(function () {
46623 makeStackTraceLong(error, promise);
46632 // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
46633 var promise = fulfilled || rejected || progress ?
46634 this.then(fulfilled, rejected, progress) :
46637 if (typeof process === "object" && process && process.domain) {
46638 onUnhandledError = process.domain.bind(onUnhandledError);
46641 promise.then(void 0, onUnhandledError);
46645 * Causes a promise to be rejected if it does not get fulfilled before
46646 * some milliseconds time out.
46647 * @param {Any*} promise
46648 * @param {Number} milliseconds timeout
46649 * @param {Any*} custom error message or Error object (optional)
46650 * @returns a promise for the resolution of the given promise if it is
46651 * fulfilled before the timeout, otherwise rejected.
46653 Q.timeout = function (object, ms, error) {
46654 return Q(object).timeout(ms, error);
46657 Promise.prototype.timeout = function (ms, error) {
46658 var deferred = defer();
46659 var timeoutId = setTimeout(function () {
46660 if (!error || "string" === typeof error) {
46661 error = new Error(error || "Timed out after " + ms + " ms");
46662 error.code = "ETIMEDOUT";
46664 deferred.reject(error);
46667 this.then(function (value) {
46668 clearTimeout(timeoutId);
46669 deferred.resolve(value);
46670 }, function (exception) {
46671 clearTimeout(timeoutId);
46672 deferred.reject(exception);
46673 }, deferred.notify);
46675 return deferred.promise;
46679 * Returns a promise for the given value (or promised value), some
46680 * milliseconds after it resolved. Passes rejections immediately.
46681 * @param {Any*} promise
46682 * @param {Number} milliseconds
46683 * @returns a promise for the resolution of the given promise after milliseconds
46684 * time has elapsed since the resolution of the given promise.
46685 * If the given promise rejects, that is passed immediately.
46687 Q.delay = function (object, timeout) {
46688 if (timeout === void 0) {
46692 return Q(object).delay(timeout);
46695 Promise.prototype.delay = function (timeout) {
46696 return this.then(function (value) {
46697 var deferred = defer();
46698 setTimeout(function () {
46699 deferred.resolve(value);
46701 return deferred.promise;
46706 * Passes a continuation to a Node function, which is called with the given
46707 * arguments provided as an array, and returns a promise.
46709 * Q.nfapply(FS.readFile, [__filename])
46710 * .then(function (content) {
46714 Q.nfapply = function (callback, args) {
46715 return Q(callback).nfapply(args);
46718 Promise.prototype.nfapply = function (args) {
46719 var deferred = defer();
46720 var nodeArgs = array_slice(args);
46721 nodeArgs.push(deferred.makeNodeResolver());
46722 this.fapply(nodeArgs).fail(deferred.reject);
46723 return deferred.promise;
46727 * Passes a continuation to a Node function, which is called with the given
46728 * arguments provided individually, and returns a promise.
46730 * Q.nfcall(FS.readFile, __filename)
46731 * .then(function (content) {
46735 Q.nfcall = function (callback /*...args*/) {
46736 var args = array_slice(arguments, 1);
46737 return Q(callback).nfapply(args);
46740 Promise.prototype.nfcall = function (/*...args*/) {
46741 var nodeArgs = array_slice(arguments);
46742 var deferred = defer();
46743 nodeArgs.push(deferred.makeNodeResolver());
46744 this.fapply(nodeArgs).fail(deferred.reject);
46745 return deferred.promise;
46749 * Wraps a NodeJS continuation passing function and returns an equivalent
46750 * version that returns a promise.
46752 * Q.nfbind(FS.readFile, __filename)("utf-8")
46753 * .then(console.log)
46757 Q.denodeify = function (callback /*...args*/) {
46758 if (callback === undefined) {
46759 throw new Error("Q can't wrap an undefined function");
46761 var baseArgs = array_slice(arguments, 1);
46762 return function () {
46763 var nodeArgs = baseArgs.concat(array_slice(arguments));
46764 var deferred = defer();
46765 nodeArgs.push(deferred.makeNodeResolver());
46766 Q(callback).fapply(nodeArgs).fail(deferred.reject);
46767 return deferred.promise;
46771 Promise.prototype.nfbind =
46772 Promise.prototype.denodeify = function (/*...args*/) {
46773 var args = array_slice(arguments);
46774 args.unshift(this);
46775 return Q.denodeify.apply(void 0, args);
46778 Q.nbind = function (callback, thisp /*...args*/) {
46779 var baseArgs = array_slice(arguments, 2);
46780 return function () {
46781 var nodeArgs = baseArgs.concat(array_slice(arguments));
46782 var deferred = defer();
46783 nodeArgs.push(deferred.makeNodeResolver());
46785 return callback.apply(thisp, arguments);
46787 Q(bound).fapply(nodeArgs).fail(deferred.reject);
46788 return deferred.promise;
46792 Promise.prototype.nbind = function (/*thisp, ...args*/) {
46793 var args = array_slice(arguments, 0);
46794 args.unshift(this);
46795 return Q.nbind.apply(void 0, args);
46799 * Calls a method of a Node-style object that accepts a Node-style
46800 * callback with a given array of arguments, plus a provided callback.
46801 * @param object an object that has the named method
46802 * @param {String} name name of the method of object
46803 * @param {Array} args arguments to pass to the method; the callback
46804 * will be provided by Q and appended to these arguments.
46805 * @returns a promise for the value or error
46807 Q.nmapply = // XXX As proposed by "Redsandro"
46808 Q.npost = function (object, name, args) {
46809 return Q(object).npost(name, args);
46812 Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
46813 Promise.prototype.npost = function (name, args) {
46814 var nodeArgs = array_slice(args || []);
46815 var deferred = defer();
46816 nodeArgs.push(deferred.makeNodeResolver());
46817 this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
46818 return deferred.promise;
46822 * Calls a method of a Node-style object that accepts a Node-style
46823 * callback, forwarding the given variadic arguments, plus a provided
46824 * callback argument.
46825 * @param object an object that has the named method
46826 * @param {String} name name of the method of object
46827 * @param ...args arguments to pass to the method; the callback will
46828 * be provided by Q and appended to these arguments.
46829 * @returns a promise for the value or error
46831 Q.nsend = // XXX Based on Mark Miller's proposed "send"
46832 Q.nmcall = // XXX Based on "Redsandro's" proposal
46833 Q.ninvoke = function (object, name /*...args*/) {
46834 var nodeArgs = array_slice(arguments, 2);
46835 var deferred = defer();
46836 nodeArgs.push(deferred.makeNodeResolver());
46837 Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
46838 return deferred.promise;
46841 Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
46842 Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
46843 Promise.prototype.ninvoke = function (name /*...args*/) {
46844 var nodeArgs = array_slice(arguments, 1);
46845 var deferred = defer();
46846 nodeArgs.push(deferred.makeNodeResolver());
46847 this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
46848 return deferred.promise;
46852 * If a function would like to support both Node continuation-passing-style and
46853 * promise-returning-style, it can end its internal promise chain with
46854 * `nodeify(nodeback)`, forwarding the optional nodeback argument. If the user
46855 * elects to use a nodeback, the result will be sent there. If they do not
46856 * pass a nodeback, they will receive the result promise.
46857 * @param object a result (or a promise for a result)
46858 * @param {Function} nodeback a Node.js-style callback
46859 * @returns either the promise or nothing
46861 Q.nodeify = nodeify;
46862 function nodeify(object, nodeback) {
46863 return Q(object).nodeify(nodeback);
46866 Promise.prototype.nodeify = function (nodeback) {
46868 this.then(function (value) {
46869 Q.nextTick(function () {
46870 nodeback(null, value);
46872 }, function (error) {
46873 Q.nextTick(function () {
46882 Q.noConflict = function() {
46883 throw new Error("Q.noConflict only works when Q is used as a global");
46886 // All code before this point will be filtered from stack traces.
46887 var qEndingLine = captureLine();
46894 var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
46895 var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
46896 var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
46897 var pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
46898 var pannellumViewerJS = 'pannellum-streetside/pannellum.js';
46899 var maxResults$2 = 2000;
46900 var tileZoom$2 = 16.5;
46901 var dispatch$4 = dispatch('loadedBubbles', 'viewerChanged');
46902 var minHfov = 10; // zoom in degrees: 20, 10, 5
46903 var maxHfov = 90; // zoom out degrees
46904 var defaultHfov = 45;
46905 var _hires = false;
46906 var _resolution = 512; // higher numbers are slower - 512, 1024, 2048, 4096
46907 var _currScene = 0;
46909 var _pannellumViewer;
46911 var _dataUrlArray = [];
46916 function abortRequest$3(i) {
46921 * nearNullIsland().
46923 function nearNullIsland$2(x, y, z) {
46925 var center = Math.pow(2, z - 1);
46926 var width = Math.pow(2, z - 6);
46927 var min$$1 = center - (width / 2);
46928 var max$$1 = center + (width / 2) - 1;
46929 return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
46935 * localeTimeStamp().
46937 function localeTimestamp$1(s) {
46938 if (!s) return null;
46939 var detected = utilDetect();
46940 var options = { day: 'numeric', month: 'short', year: 'numeric' };
46941 var d = new Date(s);
46942 if (isNaN(d.getTime())) return null;
46943 return d.toLocaleString(detected.locale, options);
46947 * getTiles() returns array of d3 geo tiles.
46948 * Using d3.geo.tiles.js from lib, gets tile extents for each grid tile in a grid created from
46949 * an area around (and including) the current map view extents.
46951 function getTiles$2(projection, margin) {
46952 // s is the current map scale
46953 // z is the 'Level of Detail', or zoom-level, where Level 1 is far from the earth, and Level 23 is close to the ground.
46954 // ts ('tile size') here is the formula for determining the width/height of the map in pixels, but with a modification.
46955 // See 'Ground Resolution and Map Scale': //https://msdn.microsoft.com/en-us/library/bb259689.aspx.
46956 // As used here, by subtracting constant 'tileZoom' from z (the level), you end up with a much smaller value for the tile size (in pixels).
46957 var s = projection.scale() * 2 * Math.PI;
46958 var z = Math.max(Math.log(s) / Math.log(2) - 8, 0);
46959 var ts = 256 * Math.pow(2, z - tileZoom$2);
46961 s / 2 - projection.translate()[0],
46962 s / 2 - projection.translate()[1]
46965 var tiler = d3geoTile()
46966 .scaleExtent([tileZoom$2, tileZoom$2])
46968 .size(projection.clipExtent()[1])
46969 .translate(projection.translate())
46970 .margin(margin || 0); // request nearby tiles so we can connect sequences.
46973 .map(function(tile) {
46974 var x = tile[0] * ts - origin[0];
46975 var y = tile[1] * ts - origin[1];
46977 id: tile.toString(),
46979 extent: geoExtent$$1(
46980 projection.invert([x, y + ts]),
46981 projection.invert([x + ts, y])
46988 * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
46990 function loadTiles$2(which, url, projection, margin) {
46991 var s = projection.scale() * 2 * Math.PI;
46992 var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0));
46994 // breakup the map view into tiles
46995 var tiles = getTiles$2(projection, margin).filter(function (t$$1) {
46996 return !nearNullIsland$2(t$$1.xyz[0], t$$1.xyz[1], t$$1.xyz[2]);
46999 tiles.forEach(function (tile) {
47000 loadNextTilePage$2(which, currZoom, url, tile);
47005 * loadNextTilePage() load data for the next tile page in line.
47007 function loadNextTilePage$2(which, currZoom, url, tile) {
47008 var cache = _ssCache[which];
47009 var nextPage = cache.nextPage[tile.id] || 0;
47010 var id = tile.id + ',' + String(nextPage);
47011 if (cache.loaded[id] || cache.inflight[id]) return;
47013 cache.inflight[id] = getBubbles(url, tile, function(bubbles) {
47014 cache.loaded[id] = true;
47015 delete cache.inflight[id];
47016 if (!bubbles) return;
47018 // [].shift() removes the first element, some statistics info, not a bubble point
47021 var features = bubbles.map(function (bubble) {
47022 if (cache.points[bubble.id]) return null; // skip duplicates
47024 var loc = [bubble.lo, bubble.la];
47029 captured_at: bubble.cd,
47030 captured_by: 'microsoft',
47031 // nbn: bubble.nbn,
47032 // pbn: bubble.pbn,
47035 pr: bubble.pr, // previous
47036 ne: bubble.ne, // next
47041 cache.points[bubble.id] = d;
47043 // a sequence starts here
47044 if (bubble.pr === undefined) {
47045 cache.leaders.push(bubble.id);
47049 minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
47052 }).filter(Boolean);
47054 cache.rtree.load(features);
47056 connectSequences();
47058 if (which === 'bubbles') {
47059 dispatch$4.call('loadedBubbles');
47065 // call this sometimes to connect the bubbles into sequences
47066 function connectSequences() {
47067 var cache = _ssCache.bubbles;
47068 var keepLeaders = [];
47070 for (var i = 0; i < cache.leaders.length; i++) {
47071 var bubble = cache.points[cache.leaders[i]];
47074 // try to make a sequence.. use the key of the leader bubble.
47075 var sequence = { key: bubble.key, bubbles: [] };
47076 var complete = false;
47079 sequence.bubbles.push(bubble);
47080 seen[bubble.key] = true;
47082 if (bubble.ne === undefined) {
47085 bubble = cache.points[bubble.ne]; // advance to next
47087 } while (bubble && !seen[bubble.key] && !complete);
47091 _ssCache.sequences[sequence.key] = sequence;
47093 // assign bubbles to the sequence
47094 for (var j = 0; j < sequence.bubbles.length; j++) {
47095 sequence.bubbles[j].sequenceKey = sequence.key;
47098 // create a GeoJSON LineString
47099 sequence.geojson = {
47100 type: 'LineString',
47101 properties: { key: sequence.key },
47102 coordinates: sequence.bubbles.map(function (d) { return d.loc; })
47106 keepLeaders.push(cache.leaders[i]);
47110 // couldn't complete these, save for later
47111 cache.leaders = keepLeaders;
47115 * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
47117 function getBubbles(url, tile, callback) {
47118 var rect = tile.extent.rectangle();
47119 var urlForRequest = url + utilQsString({
47125 appkey: bubbleAppKey,
47126 jsCallback: '{callback}'
47129 return jsonpRequest(urlForRequest, function (data) {
47130 if (!data || data.error) {
47139 * partitionViewport() partition viewport into `psize` x `psize` regions.
47141 function partitionViewport$2(psize, projection) {
47142 var dimensions = projection.clipExtent()[1];
47143 psize = psize || 16;
47145 var cols = range(0, dimensions[0], psize);
47146 var rows = range(0, dimensions[1], psize);
47147 var partitions = [];
47149 rows.forEach(function (y) {
47150 cols.forEach(function (x) {
47151 var min$$1 = [x, y + psize];
47152 var max$$1 = [x + psize, y];
47153 partitions.push(geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
47164 function searchLimited$2(psize, limit, projection, rtree) {
47165 limit = limit || 3;
47167 var partitions = partitionViewport$2(psize, projection);
47170 results = flatten(map$3(partitions, function (extent$$1) {
47171 return rtree.search(extent$$1.bbox())
47173 .map(function (d) { return d.data; });
47183 function getImage(imgInfo) {
47184 var response = q.defer();
47185 var img = new Image();
47187 img.onload = function() {
47188 var canvas = document.getElementById('canvas' + imgInfo.face);
47189 var ctx = canvas.getContext('2d');
47190 ctx.drawImage(img, imgInfo.x, imgInfo.y);
47191 response.resolve({imgInfo:imgInfo, status: 'ok'});
47193 img.onerror = function() {
47194 response.resolve({data: imgInfo, status: 'error'});
47196 img.setAttribute('crossorigin', '');
47197 img.src = imgInfo.url;
47199 return response.promise;
47206 function loadCanvas(imgInfoGroup) {
47207 var response = q.defer();
47208 var getImagePromises = imgInfoGroup.map(function(imgInfo) {
47209 return getImage(imgInfo);
47212 q.all(getImagePromises).then(function(data) {
47213 var canvas = document.getElementById('canvas' + data[0].imgInfo.face);
47214 switch (data[0].imgInfo.face) {
47216 _dataUrlArray[0] = canvas.toDataURL('image/jpeg', 1.0);
47219 _dataUrlArray[1] = canvas.toDataURL('image/jpeg', 1.0);
47222 _dataUrlArray[2] = canvas.toDataURL('image/jpeg', 1.0);
47225 _dataUrlArray[3] = canvas.toDataURL('image/jpeg', 1.0);
47228 _dataUrlArray[4] = canvas.toDataURL('image/jpeg', 1.0);
47231 _dataUrlArray[5] = canvas.toDataURL('image/jpeg', 1.0);
47234 response.resolve({status:'loadCanvas for face ' + data[0].imgInfo.face + 'ok'});
47237 return response.promise;
47241 function setupCanvas(selection$$1, reset) {
47243 selection$$1.selectAll('#divForCanvasWork')
47247 // Add the Streetside working canvases. These are used for 'stitching', or combining,
47248 // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls
47249 selection$$1.selectAll('#divForCanvasWork')
47253 .attr('id', 'divForCanvasWork')
47254 .attr('display', 'none')
47255 .selectAll('canvas')
47256 .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
47259 .attr('id', function(d) { return d; })
47260 .attr('width', _resolution)
47261 .attr('height', _resolution);
47268 function processFaces(imgFaceInfoGroups) {
47269 var response = q.defer();
47270 var loadCanvasPromises = imgFaceInfoGroups.map(function(faceImgGroup) {
47271 return loadCanvas(faceImgGroup);
47274 q.all(loadCanvasPromises).then(function() {
47275 response.resolve({status: 'processFaces done'});
47278 return response.promise;
47283 function qkToXY(qk) {
47287 for (var i = qk.length; i > 0; i--) {
47289 x += (+(key === '1' || key === '3')) * scale;
47290 y += (+(key === '2' || key === '3')) * scale;
47297 function getQuadKeys() {
47298 var dim = _resolution / 256;
47303 '0000','0001','0010','0011','0100','0101','0110','0111', '1000','1001','1010','1011','1100','1101','1110','1111',
47304 '0002','0003','0012','0013','0102','0103','0112','0113', '1002','1003','1012','1013','1102','1103','1112','1113',
47305 '0020','0021','0030','0031','0120','0121','0130','0131', '1020','1021','1030','1031','1120','1121','1130','1131',
47306 '0022','0023','0032','0033','0122','0123','0132','0133', '1022','1023','1032','1033','1122','1123','1132','1133',
47307 '0200','0201','0210','0211','0300','0301','0310','0311', '1200','1201','1210','1211','1300','1301','1310','1311',
47308 '0202','0203','0212','0213','0302','0303','0312','0313', '1202','1203','1212','1213','1302','1303','1312','1313',
47309 '0220','0221','0230','0231','0320','0321','0330','0331', '1220','1221','1230','1231','1320','1321','1330','1331',
47310 '0222','0223','0232','0233','0322','0323','0332','0333', '1222','1223','1232','1233','1322','1323','1332','1333',
47312 '2000','2001','2010','2011','2100','2101','2110','2111', '3000','3001','3010','3011','3100','3101','3110','3111',
47313 '2002','2003','2012','2013','2102','2103','2112','2113', '3002','3003','3012','3013','3102','3103','3112','3113',
47314 '2020','2021','2030','2031','2120','2121','2130','2131', '3020','3021','3030','3031','3120','3121','3130','3131',
47315 '2022','2023','2032','2033','2122','2123','2132','2133', '3022','3023','3032','3033','3122','3123','3132','3133',
47316 '2200','2201','2210','2211','2300','2301','2310','2311', '3200','3201','3210','3211','3300','3301','3310','3311',
47317 '2202','2203','2212','2213','2302','2303','2312','2313', '3202','3203','3212','3213','3302','3303','3312','3313',
47318 '2220','2221','2230','2231','2320','2321','2330','2331', '3220','3221','3230','3231','3320','3321','3330','3331',
47319 '2222','2223','2232','2233','2322','2323','2332','2333', '3222','3223','3232','3233','3322','3323','3332','3333'
47322 } else if (dim === 8) {
47324 '000','001','010','011', '100','101','110','111',
47325 '002','003','012','013', '102','103','112','113',
47326 '020','021','030','031', '120','121','130','131',
47327 '022','023','032','033', '122','123','132','133',
47329 '200','201','210','211', '300','301','310','311',
47330 '202','203','212','213', '302','303','312','313',
47331 '220','221','230','231', '320','321','330','331',
47332 '222','223','232','233', '322','323','332','333'
47335 } else if (dim === 4) {
47337 '00','01', '10','11',
47338 '02','03', '12','13',
47340 '20','21', '30','31',
47341 '22','23', '32','33'
47344 } else { // dim === 2
47356 var serviceStreetside = {
47358 * init() initialize streetside.
47360 init: function () {
47365 this.event = utilRebind(this, dispatch$4, 'on');
47369 * reset() reset the cache.
47371 reset: function () {
47372 var cache = _ssCache;
47375 if (cache.bubbles && cache.bubbles.inflight) {
47376 forEach(cache.bubbles.inflight, abortRequest$3);
47381 bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1(), points: {}, leaders: [] },
47389 bubbles: function (projection) {
47390 var psize = 32, limit = 3;
47391 return searchLimited$2(psize, limit, projection, _ssCache.bubbles.rtree);
47395 sequences: function(projection) {
47396 var viewport = projection.clipExtent();
47397 var min$$1 = [viewport[0][0], viewport[1][1]];
47398 var max$$1 = [viewport[1][0], viewport[0][1]];
47399 var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
47403 // all sequences for bubbles in viewport
47404 _ssCache.bubbles.rtree.search(bbox)
47405 .forEach(function(d) {
47406 var key = d.data.sequenceKey;
47407 if (key && !seen[key]) {
47409 results.push(_ssCache.sequences[key].geojson);
47420 loadBubbles: function (projection, margin) {
47421 // by default: request 2 nearby tiles so we can connect sequences.
47422 if (margin === undefined) margin = 2;
47424 loadTiles$2('bubbles', bubbleApi, projection, margin);
47428 viewer: function() {
47429 return _pannellumViewer;
47433 initViewer: function () {
47434 if (!window.pannellum) return;
47435 if (_pannellumViewer) return;
47437 var sceneID = ++_currScene + '';
47439 'default': { firstScene: sceneID },
47442 options.scenes[sceneID] = _sceneOptions;
47444 _pannellumViewer = window.pannellum.viewer('viewer-streetside', options);
47447 .on('mousedown', function() {
47448 select(window).on('mousemove.pannellum', function() {
47449 dispatch$4.call('viewerChanged');
47452 .on('mouseup', function() {
47453 select(window).on('mousemove.pannellum', null);
47454 // continue dispatching events for a few seconds, in case viewer has inertia.
47455 var t$$1 = timer(function(elapsed) {
47456 dispatch$4.call('viewerChanged');
47457 if (elapsed > 2000) {
47466 * loadViewer() create the streeside viewer.
47468 loadViewer: function (context) {
47469 // create ms-wrapper, a photo wrapper class
47470 var wrap = select('#photoviewer').selectAll('.ms-wrapper')
47473 // inject ms-wrapper into the photoviewer div
47474 // (used by all to house each custom photo viewer)
47475 var wrapEnter = wrap.enter()
47478 .attr('class', 'photo-wrapper ms-wrapper')
47479 .classed('hide', true);
47481 // inject div to support streetside viewer (pannellum) and attribution line
47484 .attr('id', 'viewer-streetside')
47486 .attr('class', 'photo-attribution fillD');
47488 // create working canvas for stitching together images
47491 .call(setupCanvas, true);
47493 // load streetside pannellum viewer css
47494 select('head').selectAll('#streetside-viewercss')
47498 .attr('id', 'streetside-viewercss')
47499 .attr('rel', 'stylesheet')
47500 .attr('href', context.asset(pannellumViewerCSS));
47502 // load streetside pannellum viewer js
47503 select('head').selectAll('#streetside-viewerjs')
47507 .attr('id', 'streetside-viewerjs')
47508 .attr('src', context.asset(pannellumViewerJS));
47514 showViewer: function (yaw) {
47515 if (!_sceneOptions) return;
47517 if (yaw !== undefined) {
47518 _sceneOptions.yaw = yaw;
47521 if (!_pannellumViewer) {
47524 // make a new scene
47525 var sceneID = ++_currScene + '';
47527 .addScene(sceneID, _sceneOptions)
47528 .loadScene(sceneID);
47530 // remove previous scene
47531 if (_currScene > 2) {
47532 sceneID = (_currScene - 1) + '';
47534 .removeScene(sceneID);
47538 var wrap = select('#photoviewer')
47539 .classed('hide', false);
47541 var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
47545 .selectAll('.photo-wrapper:not(.ms-wrapper)')
47546 .classed('hide', true);
47549 .selectAll('.photo-wrapper.ms-wrapper')
47550 .classed('hide', false);
47559 hideViewer: function () {
47560 var viewer = select('#photoviewer');
47561 if (!viewer.empty()) viewer.datum(null);
47564 .classed('hide', true)
47565 .selectAll('.photo-wrapper')
47566 .classed('hide', true);
47568 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
47569 .classed('selected', false);
47571 return this.setStyles(null, true);
47577 selectImage: function (d) {
47578 var response = q.defer();
47581 var viewer = select('#photoviewer');
47582 if (!viewer.empty()) viewer.datum(d);
47584 this.setStyles(null, true);
47586 var wrap = select('#photoviewer .ms-wrapper');
47587 var attribution = wrap.selectAll('.photo-attribution').html('');
47589 wrap.selectAll('.pnlm-load-box') // display "loading.."
47590 .style('display', 'block');
47593 response.resolve({status: 'ok'});
47594 return response.promise;
47597 // Add hires checkbox
47598 var label = attribution
47600 .attr('class', 'streetside-hires');
47604 .attr('type', 'checkbox')
47605 .attr('id', 'streetside-hires-input')
47606 .property('checked', _hires)
47607 .on('click', function() {
47608 event.stopPropagation();
47611 _resolution = _hires ? 1024 : 512;
47612 wrap.call(setupCanvas, true);
47615 yaw: _pannellumViewer.getYaw(),
47616 pitch: _pannellumViewer.getPitch(),
47617 hfov: _pannellumViewer.getHfov()
47620 that.selectImage(d)
47621 .then(function(r) {
47622 if (r.status === 'ok') {
47623 _sceneOptions = assignIn(_sceneOptions, viewstate);
47631 .text(t('streetside.hires'));
47634 // Add capture date
47635 if (d.captured_by) {
47636 var yyyy = (new Date()).getFullYear();
47640 .attr('class', 'captured_by')
47641 .attr('target', '_blank')
47642 .attr('href', 'https://www.microsoft.com/en-us/maps/streetside')
47643 .text('©' + yyyy + ' Microsoft');
47650 if (d.captured_at) {
47653 .attr('class', 'captured_at')
47654 .text(localeTimestamp$1(d.captured_at));
47660 .attr('class', 'image_link')
47661 .attr('target', '_blank')
47662 .attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + encodeURIComponent(d.key) +
47663 '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
47664 .text(t('streetside.report'));
47667 var bubbleIdQuadKey = d.key.toString(4);
47668 var paddingNeeded = 16 - bubbleIdQuadKey.length;
47669 for (var i = 0; i < paddingNeeded; i++) {
47670 bubbleIdQuadKey = '0' + bubbleIdQuadKey;
47672 var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
47673 var imgUrlSuffix = '.jpg?g=6338&n=z';
47675 // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
47676 var faceKeys = ['01','02','03','10','11','12'];
47678 // Map images to cube faces
47679 var quadKeys = getQuadKeys();
47680 var faces = faceKeys.map(function(faceKey) {
47681 return quadKeys.map(function(quadKey) {
47682 var xy = qkToXY(quadKey);
47685 url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
47692 processFaces(faces).then(function() {
47694 showFullscreenCtrl: false,
47712 response.resolve({status: 'ok'});
47715 return response.promise;
47719 getSequenceKeyForBubble: function(d) {
47720 return d && d.sequenceKey;
47727 setStyles: function (hovered, reset) {
47728 if (reset) { // reset all layers
47729 d3_selectAll('.viewfield-group')
47730 .classed('highlighted', false)
47731 .classed('hovered', false)
47732 .classed('selected', false);
47734 d3_selectAll('.sequence')
47735 .classed('highlighted', false)
47736 .classed('selected', false);
47739 var hoveredBubbleKey = hovered && hovered.key;
47740 var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
47741 var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
47742 var hoveredBubbleKeys = (hoveredSequence && hoveredSequence.bubbles.map(function (d) { return d.key; })) || [];
47744 var viewer = select('#photoviewer');
47745 var selected = viewer.empty() ? undefined : viewer.datum();
47746 var selectedBubbleKey = selected && selected.key;
47747 var selectedSequenceKey = this.getSequenceKeyForBubble(selected);
47748 var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
47749 var selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(function (d) { return d.key; })) || [];
47751 // highlight sibling viewfields on either the selected or the hovered sequences
47752 var highlightedBubbleKeys = union(hoveredBubbleKeys, selectedBubbleKeys);
47754 d3_selectAll('.layer-streetside-images .viewfield-group')
47755 .classed('highlighted', function (d) { return highlightedBubbleKeys.indexOf(d.key) !== -1; })
47756 .classed('hovered', function (d) { return d.key === hoveredBubbleKey; })
47757 .classed('selected', function (d) { return d.key === selectedBubbleKey; });
47759 d3_selectAll('.layer-streetside-images .sequence')
47760 .classed('highlighted', function (d) { return d.properties.key === hoveredSequenceKey; })
47761 .classed('selected', function (d) { return d.properties.key === selectedSequenceKey; });
47763 // update viewfields if needed
47764 d3_selectAll('.viewfield-group .viewfield')
47765 .attr('d', viewfieldPath);
47767 function viewfieldPath() {
47768 var d = this.parentNode.__data__;
47769 if (d.pano && d.key !== selectedBubbleKey) {
47770 return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
47772 return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
47782 cache: function () {
47787 var apibase$3 = 'https://taginfo.openstreetmap.org/api/4/',
47792 point: 'count_nodes',
47793 vertex: 'count_nodes',
47794 area: 'count_ways',
47797 tag_sort_members = {
47798 point: 'count_node_members',
47799 vertex: 'count_node_members',
47800 area: 'count_way_members',
47801 line: 'count_way_members',
47802 relation: 'count_relation_members'
47810 tag_members_fractions = {
47811 point: 'count_node_members_fraction',
47812 vertex: 'count_node_members_fraction',
47813 area: 'count_way_members_fraction',
47814 line: 'count_way_members_fraction',
47815 relation: 'count_relation_members_fraction'
47819 function sets(params, n, o) {
47820 if (params.geometry && o[params.geometry]) {
47821 params[n] = o[params.geometry];
47827 function setFilter(params) {
47828 return sets(params, 'filter', tag_filters);
47832 function setSort(params) {
47833 return sets(params, 'sortname', tag_sorts);
47837 function setSortMembers(params) {
47838 return sets(params, 'sortname', tag_sort_members);
47842 function clean(params) {
47843 return omit(params, ['geometry', 'debounce']);
47847 function filterKeys(type) {
47848 var count_type = type ? 'count_' + type : 'count_all';
47849 return function(d) {
47850 return parseFloat(d[count_type]) > 2500 || d.in_wiki;
47855 function filterMultikeys(prefix) {
47856 return function(d) {
47857 // d.key begins with prefix, and d.key contains no additional ':'s
47858 var re = new RegExp('^' + prefix + '(.*)$');
47859 var matches = d.key.match(re) || [];
47860 return (matches.length === 2 && matches[1].indexOf(':') === -1);
47865 function filterValues(allowUpperCase) {
47866 return function(d) {
47867 if (d.value.match(/[;,]/) !== null) return false; // exclude some punctuation
47868 if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false; // exclude uppercase letters
47869 return parseFloat(d.fraction) > 0.0 || d.in_wiki;
47874 function filterRoles(geometry) {
47875 return function(d) {
47876 if (d.role === '') return false; // exclude empty role
47877 if (d.role.match(/[A-Z*;,]/) !== null) return false; // exclude uppercase letters and some punctuation
47878 return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
47883 function valKey(d) {
47891 function valKeyDescription(d) {
47894 title: d.description || d.value
47899 function roleKey(d) {
47907 // sort keys with ':' lower than keys without ':'
47908 function sortKeys(a, b) {
47909 return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
47910 : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
47915 var debouncedRequest = debounce(request$1, 500, { leading: false });
47917 function request$1(url, params, exactMatch, callback, loaded) {
47918 if (inflight$1[url]) return;
47920 if (checkCache(url, params, exactMatch, callback)) return;
47922 inflight$1[url] = d3_json(url, function (err, data) {
47923 delete inflight$1[url];
47929 function checkCache(url, params, exactMatch, callback) {
47930 var rp = params.rp || 25,
47931 testQuery = params.query || '',
47935 var hit = taginfoCache[testUrl];
47937 // exact match, or shorter match yielding fewer than max results (rp)
47938 if (hit && (url === testUrl || hit.length < rp)) {
47939 callback(null, hit);
47943 // don't try to shorten the query
47944 if (exactMatch || !testQuery.length) return false;
47946 // do shorten the query to see if we already have a cached result
47947 // that has returned fewer than max results (rp)
47948 testQuery = testQuery.slice(0, -1);
47949 testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
47950 } while (testQuery.length >= 0);
47956 var serviceTaginfo = {
47963 // Fetch popular keys. We'll exclude these from `values`
47964 // lookups because they stress taginfo, and they aren't likely
47965 // to yield meaningful autocomplete results.. see #3955
47966 var params = { rp: 100, sortname: 'values_all', sortorder: 'desc', page: 1, debounce: false };
47967 this.keys(params, function(err, data) {
47969 data.forEach(function(d) {
47970 if (d.value === 'opening_hours') return; // exception
47971 popularKeys[d.value] = true;
47977 reset: function() {
47978 forEach(inflight$1, function(req) { req.abort(); });
47983 keys: function(params, callback) {
47984 var doRequest = params.debounce ? debouncedRequest : request$1;
47985 params = clean(setSort(params));
47986 params = assignIn({ rp: 10, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
47988 var url = apibase$3 + 'keys/all?' + utilQsString(params);
47989 doRequest(url, params, false, callback, function(err, d) {
47993 var f = filterKeys(params.filter);
47994 var result = d.data.filter(f).sort(sortKeys).map(valKey);
47995 taginfoCache[url] = result;
47996 callback(null, result);
48002 multikeys: function(params, callback) {
48003 var doRequest = params.debounce ? debouncedRequest : request$1;
48004 params = clean(setSort(params));
48005 params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
48006 var prefix = params.query;
48008 var url = apibase$3 + 'keys/all?' + utilQsString(params);
48009 doRequest(url, params, true, callback, function(err, d) {
48013 var f = filterMultikeys(prefix);
48014 var result = d.data.filter(f).map(valKey);
48015 taginfoCache[url] = result;
48016 callback(null, result);
48022 values: function(params, callback) {
48023 // Exclude popular keys from values lookups.. see #3955
48024 var key = params.key;
48025 if (key && popularKeys[key]) {
48026 callback(null, []);
48030 var doRequest = params.debounce ? debouncedRequest : request$1;
48031 params = clean(setSort(setFilter(params)));
48032 params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
48034 var url = apibase$3 + 'key/values?' + utilQsString(params);
48035 doRequest(url, params, false, callback, function(err, d) {
48039 // In most cases we prefer taginfo value results with lowercase letters.
48040 // A few OSM keys expect values to contain uppercase values (see #3377).
48041 // This is not an exhaustive list (e.g. `name` also has uppercase values)
48042 // but these are the fields where taginfo value lookup is most useful.
48043 var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|booth|rating|:output|_hours|_times/;
48044 var allowUpperCase = (params.key.match(re) !== null);
48045 var f = filterValues(allowUpperCase);
48047 var result = d.data.filter(f).map(valKeyDescription);
48048 taginfoCache[url] = result;
48049 callback(null, result);
48055 roles: function(params, callback) {
48056 var doRequest = params.debounce ? debouncedRequest : request$1;
48057 var geometry = params.geometry;
48058 params = clean(setSortMembers(params));
48059 params = assignIn({ rp: 25, sortname: 'count_all_members', sortorder: 'desc', page: 1 }, params);
48061 var url = apibase$3 + 'relation/roles?' + utilQsString(params);
48062 doRequest(url, params, true, callback, function(err, d) {
48066 var f = filterRoles(geometry);
48067 var result = d.data.filter(f).map(roleKey);
48068 taginfoCache[url] = result;
48069 callback(null, result);
48075 docs: function(params, callback) {
48076 var doRequest = params.debounce ? debouncedRequest : request$1;
48077 params = clean(setSort(params));
48079 var path = 'key/wiki_pages?';
48080 if (params.value) path = 'tag/wiki_pages?';
48081 else if (params.rtype) path = 'relation/wiki_pages?';
48083 var url = apibase$3 + path + utilQsString(params);
48084 doRequest(url, params, true, callback, function(err, d) {
48088 taginfoCache[url] = d.data;
48089 callback(null, d.data);
48095 apibase: function(_) {
48096 if (!arguments.length) return apibase$3;
48103 var endpoint = 'https://www.wikidata.org/w/api.php?';
48105 var serviceWikidata = {
48107 init: function() {},
48108 reset: function() {},
48111 // Given a Wikipedia language and article title, return an array of
48112 // corresponding Wikidata entities.
48113 itemsByTitle: function(lang, title, callback) {
48119 lang = lang || 'en';
48120 jsonpRequest(endpoint + utilQsString({
48121 action: 'wbgetentities',
48123 sites: lang.replace(/-/g, '_') + 'wiki',
48125 languages: 'en', // shrink response by filtering to one language
48126 callback: '{callback}'
48127 }), function(data) {
48128 if (!data || data.error) {
48131 callback(title, data.entities || {});
48138 var endpoint$1 = 'https://en.wikipedia.org/w/api.php?';
48140 var serviceWikipedia = {
48142 init: function() {},
48143 reset: function() {},
48146 search: function(lang, query, callback) {
48152 lang = lang || 'en';
48153 jsonpRequest(endpoint$1.replace('en', lang) +
48158 srinfo: 'suggestion',
48160 callback: '{callback}',
48162 }), function(data) {
48163 if (!data || !data.query || !data.query.search || data.error) {
48166 var results = data.query.search.map(function(d) { return d.title; });
48167 callback(query, results);
48174 suggestions: function(lang, query, callback) {
48180 lang = lang || 'en';
48181 jsonpRequest(endpoint$1.replace('en', lang) +
48183 action: 'opensearch',
48187 callback: '{callback}',
48189 }), function(data) {
48190 if (!data || data.error) {
48193 callback(data[0], data[1] || []);
48200 translations: function(lang, title, callback) {
48206 jsonpRequest(endpoint$1.replace('en', lang) +
48211 callback: '{callback}',
48214 }), function(data) {
48215 if (!data || !data.query || !data.query.pages || data.error) {
48218 var list = data.query.pages[Object.keys(data.query.pages)[0]],
48220 if (list && list.langlinks) {
48221 list.langlinks.forEach(function(d) {
48222 translations[d.lang] = d['*'];
48225 callback(translations);
48234 geocoder: serviceNominatim,
48235 mapillary: serviceMapillary,
48236 openstreetcam: serviceOpenstreetcam,
48238 streetside: serviceStreetside,
48239 taginfo: serviceTaginfo,
48240 wikidata: serviceWikidata,
48241 wikipedia: serviceWikipedia
48244 var _isSaving = false;
48247 function modeSave$$1(context) {
48248 var mode = { id: 'save' };
48249 var keybinding = d3keybinding('modeSave');
48251 var loading = uiLoading(context)
48252 .message(t('save.uploading'))
48255 var commit = uiCommit(context)
48256 .on('cancel', cancel)
48262 var _toLoadCount = 0;
48263 var _toLoadTotal = 0;
48265 var _conflicts = [];
48271 function cancel(selectedID) {
48273 context.enter(modeSelect(context, [selectedID]));
48275 context.enter(modeBrowse(context));
48280 function save(changeset, tryAgain, checkConflicts) {
48281 // Guard against accidentally entering save code twice - #4641
48282 if (_isSaving && !tryAgain) {
48286 var osm = context.connection();
48292 // If user somehow got logged out mid-save, try to reauthenticate..
48293 // This can happen if they were logged in from before, but the tokens are no longer valid.
48294 if (!osm.authenticated()) {
48295 osm.authenticate(function(err) {
48297 cancel(); // quit save mode..
48299 save(changeset, tryAgain, checkConflicts); // continue where we left off..
48307 context.container().call(loading); // block input
48311 var history = context.history();
48312 var localGraph = context.graph();
48313 var remoteGraph = coreGraph$$1(history.base(), true);
48318 // Store original changes, in case user wants to download them as an .osc file
48319 _origChanges = history.changes(actionDiscardTags(history.difference()));
48321 // First time, `history.perform` a no-op action.
48322 // Any conflict resolutions will be done as `history.replace`
48324 history.perform(actionNoop());
48327 // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
48328 if (!checkConflicts) {
48331 // Do the full (slow) conflict check..
48333 var modified = filter(history.difference().summary(), { changeType: 'modified' });
48334 _toCheck = map$3(map$3(modified, 'entity'), 'id');
48335 _toLoad = withChildNodes(_toCheck, localGraph);
48338 _toLoadTotal = _toLoad.length;
48340 if (_toCheck.length) {
48341 showProgress(_toLoadCount, _toLoadTotal);
48342 _toLoad.forEach(function(id) { _loaded[id] = false; });
48343 osm.loadMultiple(_toLoad, loaded);
48352 function withChildNodes(ids, graph) {
48353 return uniq(reduce(ids, function(result, id) {
48354 var entity = graph.entity(id);
48355 if (entity.type === 'way') {
48357 var children = graph.childNodes(entity);
48358 result.push.apply(result, map$3(filter(children, 'version'), 'id'));
48360 /* eslint-disable no-console */
48361 if (typeof console !== 'undefined') console.error(err);
48362 /* eslint-enable no-console */
48370 // Reload modified entities into an alternate graph and check for conflicts..
48371 function loaded(err, result) {
48372 if (_errors.length) return;
48376 msg: err.message || err.responseText,
48377 details: [ t('save.status_code', { code: err.status }) ]
48384 result.data.forEach(function(entity) {
48385 remoteGraph.replace(entity);
48386 _loaded[entity.id] = true;
48387 _toLoad = without(_toLoad, entity.id);
48389 if (!entity.visible) return;
48391 // Because loadMultiple doesn't download /full like loadEntity,
48392 // need to also load children that aren't already being checked..
48394 if (entity.type === 'way') {
48395 for (i = 0; i < entity.nodes.length; i++) {
48396 id = entity.nodes[i];
48397 if (_loaded[id] === undefined) {
48398 _loaded[id] = false;
48402 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
48403 for (i = 0; i < entity.members.length; i++) {
48404 id = entity.members[i].id;
48405 if (_loaded[id] === undefined) {
48406 _loaded[id] = false;
48413 _toLoadCount += result.data.length;
48414 _toLoadTotal += loadMore.length;
48415 showProgress(_toLoadCount, _toLoadTotal);
48417 if (loadMore.length) {
48418 _toLoad.push.apply(_toLoad, loadMore);
48419 osm.loadMultiple(loadMore, loaded);
48422 if (!_toLoad.length) {
48429 function detectConflicts() {
48430 function choice(id, text, action) {
48431 return { id: id, text: text, action: function() { history.replace(action); } };
48433 function formatUser(d) {
48434 return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
48436 function entityName(entity) {
48437 return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
48440 function sameVersions(local$$1, remote) {
48441 if (local$$1.version !== remote.version) return false;
48443 if (local$$1.type === 'way') {
48444 var children = union(local$$1.nodes, remote.nodes);
48445 for (var i = 0; i < children.length; i++) {
48446 var a = localGraph.hasEntity(children[i]);
48447 var b = remoteGraph.hasEntity(children[i]);
48448 if (a && b && a.version !== b.version) return false;
48455 _toCheck.forEach(function(id) {
48456 var local$$1 = localGraph.entity(id);
48457 var remote = remoteGraph.entity(id);
48459 if (sameVersions(local$$1, remote)) return;
48461 var action = actionMergeRemoteChanges;
48462 var merge = action(id, localGraph, remoteGraph, formatUser);
48464 history.replace(merge);
48466 var mergeConflicts = merge.conflicts();
48467 if (!mergeConflicts.length) return; // merged safely
48469 var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
48470 var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
48471 var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
48472 var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
48476 name: entityName(local$$1),
48477 details: mergeConflicts,
48480 choice(id, keepMine, forceLocal),
48481 choice(id, keepTheirs, forceRemote)
48491 function upload(changeset) {
48492 var osm = context.connection();
48494 _errors.push({ msg: 'No OSM Service' });
48497 if (_conflicts.length) {
48498 _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
48499 showConflicts(changeset);
48501 } else if (_errors.length) {
48505 var history = context.history();
48506 var changes = history.changes(actionDiscardTags(history.difference()));
48507 if (changes.modified.length || changes.created.length || changes.deleted.length) {
48508 loadLocation(); // so it is ready when we display the save screen
48509 osm.putChangeset(changeset, changes, uploadCallback);
48510 } else { // changes were insignificant or reverted by user
48511 select('.inspector-wrap *').remove();
48521 function uploadCallback(err, changeset) {
48523 if (err.status === 409) { // 409 Conflict
48524 save(changeset, true, true); // tryAgain = true, checkConflicts = true
48527 msg: err.message || err.responseText,
48528 details: [ t('save.status_code', { code: err.status }) ]
48534 context.history().clearSaved();
48535 success(changeset);
48536 // Add delay to allow for postgres replication #1646 #2678
48537 window.setTimeout(function() {
48538 select('.inspector-wrap *').remove();
48547 function showProgress(num, total) {
48548 var modal = context.container().select('.loading-modal .modal-section');
48549 var progress = modal.selectAll('.progress')
48555 .attr('class', 'progress')
48557 .text(t('save.conflict_progress', { num: num, total: total }));
48561 function showConflicts(changeset) {
48562 var history = context.history();
48563 var selection$$1 = context.container()
48564 .select('#sidebar')
48566 .attr('class','sidebar-component');
48571 var ui = uiConflicts(context)
48572 .conflictList(_conflicts)
48573 .origChanges(_origChanges)
48574 .on('cancel', function() {
48576 selection$$1.remove();
48579 .on('save', function() {
48580 for (var i = 0; i < _conflicts.length; i++) {
48581 if (_conflicts[i].chosen === 1) { // user chose "keep theirs"
48582 var entity = context.hasEntity(_conflicts[i].id);
48583 if (entity && entity.type === 'way') {
48584 var children = uniq(entity.nodes);
48585 for (var j = 0; j < children.length; j++) {
48586 history.replace(actionRevert(children[j]));
48589 history.replace(actionRevert(_conflicts[i].id));
48593 selection$$1.remove();
48594 save(changeset, true, false); // tryAgain = true, checkConflicts = false
48597 selection$$1.call(ui);
48601 function showErrors() {
48603 context.history().pop();
48607 var selection$$1 = uiConfirm(context.container());
48609 .select('.modal-section.header')
48611 .text(t('save.error'));
48613 addErrors(selection$$1, _errors);
48614 selection$$1.okButton();
48618 function addErrors(selection$$1, data) {
48619 var message = selection$$1
48620 .select('.modal-section.message-text');
48622 var items = message
48623 .selectAll('.error-container')
48626 var enter = items.enter()
48628 .attr('class', 'error-container');
48632 .attr('class', 'error-description')
48634 .classed('hide-toggle', true)
48635 .text(function(d) { return d.msg || t('save.unknown_error_details'); })
48636 .on('click', function() {
48637 event.preventDefault();
48639 var error = select(this);
48640 var detail = select(this.nextElementSibling);
48641 var exp = error.classed('expanded');
48643 detail.style('display', exp ? 'none' : 'block');
48644 error.classed('expanded', !exp);
48647 var details = enter
48649 .attr('class', 'error-detail-container')
48650 .style('display', 'none');
48654 .attr('class', 'error-detail-list')
48656 .data(function(d) { return d.details || []; })
48659 .attr('class', 'error-detail-item')
48660 .text(function(d) { return d; });
48667 function success(changeset) {
48670 var ui = uiSuccess$$1(context)
48671 .changeset(changeset)
48672 .location(_location)
48673 .on('cancel', function() { context.ui().sidebar.hide(); });
48675 context.enter(modeBrowse(context).sidebar(ui));
48679 function keybindingOn() {
48681 .call(keybinding.on('⎋', cancel, true));
48685 function keybindingOff() {
48687 .call(keybinding.off);
48691 // Reverse geocode current map location so we can display a message on
48692 // the success screen like "Thank you for editing around city, state."
48693 function loadLocation() {
48695 if (!services.geocoder) return;
48697 services.geocoder.reverse(context.map().center(), function(err, result) {
48698 if (err || !result || !result.address) return;
48701 var addr = result.address;
48702 var city = addr && (addr.town || addr.city || addr.county);
48703 if (city) parts.push(city);
48704 var region = addr && (addr.state || addr.country);
48705 if (region) parts.push(region);
48707 _location = parts.join(', ');
48712 mode.enter = function() {
48714 context.ui().sidebar.show(commit);
48719 context.container().selectAll('#content')
48720 .attr('class', 'inactive');
48722 var osm = context.connection();
48728 if (osm.authenticated()) {
48731 osm.authenticate(function(err) {
48742 mode.exit = function() {
48747 context.container().selectAll('#content')
48748 .attr('class', 'active');
48750 context.ui().sidebar.hide();
48756 /* Built-in method references for those with the same name as other `lodash` methods. */
48757 var nativeMin$1 = Math.min;
48760 * The base implementation of methods like `_.intersection`, without support
48761 * for iteratee shorthands, that accepts an array of arrays to inspect.
48764 * @param {Array} arrays The arrays to inspect.
48765 * @param {Function} [iteratee] The iteratee invoked per element.
48766 * @param {Function} [comparator] The comparator invoked per element.
48767 * @returns {Array} Returns the new array of shared values.
48769 function baseIntersection(arrays, iteratee, comparator) {
48770 var includes = comparator ? arrayIncludesWith : arrayIncludes,
48771 length = arrays[0].length,
48772 othLength = arrays.length,
48773 othIndex = othLength,
48774 caches = Array(othLength),
48775 maxLength = Infinity,
48778 while (othIndex--) {
48779 var array = arrays[othIndex];
48780 if (othIndex && iteratee) {
48781 array = arrayMap(array, baseUnary(iteratee));
48783 maxLength = nativeMin$1(array.length, maxLength);
48784 caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
48785 ? new SetCache(othIndex && array)
48794 while (++index < length && result.length < maxLength) {
48795 var value = array[index],
48796 computed = iteratee ? iteratee(value) : value;
48798 value = (comparator || value !== 0) ? value : 0;
48800 ? cacheHas(seen, computed)
48801 : includes(result, computed, comparator)
48803 othIndex = othLength;
48804 while (--othIndex) {
48805 var cache = caches[othIndex];
48807 ? cacheHas(cache, computed)
48808 : includes(arrays[othIndex], computed, comparator))
48814 seen.push(computed);
48816 result.push(value);
48823 * Casts `value` to an empty array if it's not an array like object.
48826 * @param {*} value The value to inspect.
48827 * @returns {Array|Object} Returns the cast array-like object.
48829 function castArrayLikeObject(value) {
48830 return isArrayLikeObject(value) ? value : [];
48834 * Creates an array of unique values that are included in all given arrays
48835 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
48836 * for equality comparisons. The order and references of result values are
48837 * determined by the first array.
48843 * @param {...Array} [arrays] The arrays to inspect.
48844 * @returns {Array} Returns the new array of intersecting values.
48847 * _.intersection([2, 1], [2, 3]);
48850 var intersection = baseRest(function(arrays) {
48851 var mapped = arrayMap(arrays, castArrayLikeObject);
48852 return (mapped.length && mapped[0] === arrays[0])
48853 ? baseIntersection(mapped)
48857 // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
48858 // For example, ⌘Z -> Ctrl+Z
48859 var uiCmd = function (code) {
48860 var detected = utilDetect();
48862 if (detected.os === 'mac') {
48866 if (detected.os === 'win') {
48867 if (code === '⌘⇧Z') return 'Ctrl+Y';
48879 for (var i = 0; i < code.length; i++) {
48880 if (code[i] in replacements) {
48881 result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
48891 // return a display-focused string for a given keyboard code
48892 uiCmd.display = function(code) {
48893 if (code.length !== 1) return code;
48895 var detected = utilDetect();
48896 var mac = (detected.os === 'mac');
48897 var replacements = {
48898 '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd') : t('shortcuts.key.ctrl'),
48899 '⇧': mac ? '⇧ ' + t('shortcuts.key.shift') : t('shortcuts.key.shift'),
48900 '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
48901 '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl') : t('shortcuts.key.ctrl'),
48902 '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
48903 '⌦': mac ? '⌦ ' + t('shortcuts.key.del') : t('shortcuts.key.del'),
48904 '↖': mac ? '↖ ' + t('shortcuts.key.pgup') : t('shortcuts.key.pgup'),
48905 '↘': mac ? '↘ ' + t('shortcuts.key.pgdn') : t('shortcuts.key.pgdn'),
48906 '⇞': mac ? '⇞ ' + t('shortcuts.key.home') : t('shortcuts.key.home'),
48907 '⇟': mac ? '⇟ ' + t('shortcuts.key.end') : t('shortcuts.key.end'),
48908 '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
48909 '⎋': mac ? '⎋ ' + t('shortcuts.key.esc') : t('shortcuts.key.esc'),
48912 return replacements[code] || code;
48918 function modeSelect(context, selectedIDs) {
48924 var keybinding = d3keybinding('select');
48925 var timeout = null;
48927 behaviorCopy(context),
48928 behaviorPaste(context),
48929 behaviorBreathe(context),
48930 behaviorHover(context),
48931 behaviorSelect(context),
48932 behaviorLasso(context),
48933 modeDragNode$$1(context).restoreSelectedIDs(selectedIDs).behavior
48937 var newFeature = false;
48938 var suppressMenu = true;
48939 var follow = false;
48942 var wrap = context.container()
48943 .select('.inspector-wrap');
48946 function singular() {
48947 if (selectedIDs.length === 1) {
48948 return context.hasEntity(selectedIDs[0]);
48953 function checkSelectedIDs() {
48955 if (Array.isArray(selectedIDs)) {
48956 ids = selectedIDs.filter(function(id) {
48957 return context.hasEntity(id);
48964 context.enter(modeBrowse(context));
48966 return !!ids.length;
48970 // find the common parent ways for nextVertex, previousVertex
48971 function commonParents() {
48972 var graph = context.graph();
48973 var commonParents = [];
48975 for (var i = 0; i < selectedIDs.length; i++) {
48976 var entity = context.hasEntity(selectedIDs[i]);
48977 if (!entity || entity.geometry(graph) !== 'vertex') {
48978 return []; // selection includes some not vertexes
48981 var currParents = map$3(graph.parentWays(entity), 'id');
48982 if (!commonParents.length) {
48983 commonParents = currParents;
48987 commonParents = intersection(commonParents, currParents);
48988 if (!commonParents.length) {
48993 return commonParents;
48997 function singularParent() {
48998 var parents = commonParents();
48999 if (!parents || parents.length === 0) {
49000 relatedParent = null;
49004 // relatedParent is used when we visit a vertex with multiple
49005 // parents, and we want to remember which parent line we started on.
49007 if (parents.length === 1) {
49008 relatedParent = parents[0]; // remember this parent for later
49009 return relatedParent;
49012 if (parents.indexOf(relatedParent) !== -1) {
49013 return relatedParent; // prefer the previously seen parent
49020 function closeMenu() {
49022 context.surface().call(editMenu.close);
49027 function positionMenu() {
49028 if (!editMenu) { return; }
49030 var entity = singular();
49031 if (entity && context.geometry(entity.id) === 'relation') {
49032 suppressMenu = true;
49034 var point$$1 = context.mouse();
49035 var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
49037 if (point$$1 && geoPointInPolygon(point$$1, viewport)) {
49038 editMenu.center(point$$1);
49040 suppressMenu = true;
49046 function showMenu() {
49049 context.surface().call(editMenu);
49054 function toggleMenu() {
49055 // deprecation warning - Radial Menu to be removed in iD v3
49056 if (select('.edit-menu, .radial-menu').empty()) {
49065 mode.selectedIDs = function() {
49066 return selectedIDs;
49070 mode.reselect = function() {
49071 if (!checkSelectedIDs()) return;
49073 var surfaceNode = context.surface().node();
49074 if (surfaceNode.focus) { // FF doesn't support it
49075 surfaceNode.focus();
49079 if (!suppressMenu) {
49085 mode.newFeature = function(_) {
49086 if (!arguments.length) return newFeature;
49092 mode.suppressMenu = function(_) {
49093 if (!arguments.length) return suppressMenu;
49099 mode.follow = function(_) {
49100 if (!arguments.length) return follow;
49106 mode.enter = function() {
49108 function update() {
49110 checkSelectedIDs();
49114 function dblclick() {
49115 var target = select(event.target);
49117 var datum = target.datum();
49118 var entity = datum && datum.properties && datum.properties.entity;
49119 if (!entity) return;
49121 if (entity instanceof osmWay && target.classed('target')) {
49122 var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
49123 var prev = entity.nodes[choice.index - 1];
49124 var next = entity.nodes[choice.index];
49127 actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
49128 t('operations.add.annotation.vertex')
49131 event.preventDefault();
49132 event.stopPropagation();
49134 } else if (entity.type === 'midpoint') {
49136 actionAddMidpoint({loc: entity.loc, edge: entity.edge}, osmNode()),
49137 t('operations.add.annotation.vertex'));
49139 event.preventDefault();
49140 event.stopPropagation();
49145 function selectElements(drawn) {
49146 if (!checkSelectedIDs()) return;
49148 var surface = context.surface();
49149 var entity = singular();
49151 if (entity && context.geometry(entity.id) === 'relation') {
49152 suppressMenu = true;
49156 surface.selectAll('.related')
49157 .classed('related', false);
49160 if (relatedParent) {
49161 surface.selectAll(utilEntitySelector([relatedParent]))
49162 .classed('related', true);
49165 var selection$$1 = context.surface()
49166 .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
49168 if (selection$$1.empty()) {
49169 // Return to browse mode if selected DOM elements have
49170 // disappeared because the user moved them out of view..
49171 var source = event && event.type === 'zoom' && event.sourceEvent;
49172 if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
49173 context.enter(modeBrowse(context));
49177 .classed('selected', true);
49183 context.enter(modeBrowse(context));
49187 function firstVertex() {
49188 event.preventDefault();
49189 var entity = singular();
49190 var parent = singularParent();
49193 if (entity && entity.type === 'way') {
49195 } else if (parent) {
49196 way = context.entity(parent);
49201 modeSelect(context, [way.first()]).follow(true)
49207 function lastVertex() {
49208 event.preventDefault();
49209 var entity = singular();
49210 var parent = singularParent();
49213 if (entity && entity.type === 'way') {
49215 } else if (parent) {
49216 way = context.entity(parent);
49221 modeSelect(context, [way.last()]).follow(true)
49227 function previousVertex() {
49228 event.preventDefault();
49229 var parent = singularParent();
49230 if (!parent) return;
49232 var way = context.entity(parent);
49233 var length = way.nodes.length;
49234 var curr = way.nodes.indexOf(selectedIDs[0]);
49239 } else if (way.isClosed()) {
49240 index = length - 2;
49243 if (index !== -1) {
49245 modeSelect(context, [way.nodes[index]]).follow(true)
49251 function nextVertex() {
49252 event.preventDefault();
49253 var parent = singularParent();
49254 if (!parent) return;
49256 var way = context.entity(parent);
49257 var length = way.nodes.length;
49258 var curr = way.nodes.indexOf(selectedIDs[0]);
49261 if (curr < length - 1) {
49263 } else if (way.isClosed()) {
49267 if (index !== -1) {
49269 modeSelect(context, [way.nodes[index]]).follow(true)
49275 function nextParent() {
49276 event.preventDefault();
49277 var parents = uniq(commonParents());
49278 if (!parents || parents.length < 2) return;
49280 var index = parents.indexOf(relatedParent);
49281 if (index < 0 || index > parents.length - 2) {
49282 relatedParent = parents[0];
49284 relatedParent = parents[index + 1];
49287 var surface = context.surface();
49288 surface.selectAll('.related')
49289 .classed('related', false);
49291 if (relatedParent) {
49292 surface.selectAll(utilEntitySelector([relatedParent]))
49293 .classed('related', true);
49298 if (!checkSelectedIDs()) return;
49300 var operations = without(values$1(Operations), operationDelete)
49301 .map(function(o) { return o(selectedIDs, context); })
49302 .filter(function(o) { return o.available(); });
49304 // deprecation warning - Radial Menu to be removed in iD v3
49305 var isRadialMenu = context.storage('edit-menu-style') === 'radial';
49306 if (isRadialMenu) {
49307 operations = operations.slice(0,7);
49308 operations.unshift(operationDelete(selectedIDs, context));
49310 operations.push(operationDelete(selectedIDs, context));
49313 operations.forEach(function(operation) {
49314 if (operation.behavior) {
49315 behaviors.push(operation.behavior);
49319 behaviors.forEach(function(behavior) {
49320 context.install(behavior);
49324 .on(['[', 'pgup'], previousVertex)
49325 .on([']', 'pgdown'], nextVertex)
49326 .on(['{', uiCmd('⌘['), 'home'], firstVertex)
49327 .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
49328 .on(['\\', 'pause'], nextParent)
49329 .on('⎋', esc, true)
49330 .on('space', toggleMenu);
49336 // deprecation warning - Radial Menu to be removed in iD v3
49337 editMenu = isRadialMenu
49338 ? uiRadialMenu(context, operations)
49339 : uiEditMenu(context, operations);
49341 context.ui().sidebar
49342 .select(singular() ? singular().id : null, newFeature);
49345 .on('undone.select', update)
49346 .on('redone.select', update);
49349 .on('move.select', closeMenu)
49350 .on('drawn.select', selectElements);
49353 .on('dblclick.select', dblclick);
49358 if (selectedIDs.length > 1) {
49359 var entities = uiSelectionList(context, selectedIDs);
49360 context.ui().sidebar.show(entities);
49364 var extent = geoExtent$$1();
49365 var graph = context.graph();
49366 selectedIDs.forEach(function(id) {
49367 var entity = context.entity(id);
49368 extent._extend(entity.extent(graph));
49371 var loc = extent.center();
49372 context.map().centerEase(loc);
49373 } else if (singular() && singular().type === 'way') {
49374 context.map().pan([0,0]); // full redraw, to adjust z-sorting #2914
49377 timeout = window.setTimeout(function() {
49379 if (!suppressMenu) {
49382 }, 270); /* after any centerEase completes */
49387 mode.exit = function() {
49388 if (timeout) window.clearTimeout(timeout);
49389 if (inspector) wrap.call(inspector.close);
49391 behaviors.forEach(function(behavior) {
49392 context.uninstall(behavior);
49397 editMenu = undefined;
49400 .on('undone.select', null)
49401 .on('redone.select', null);
49403 var surface = context.surface();
49406 .on('dblclick.select', null);
49409 .selectAll('.selected')
49410 .classed('selected', false);
49413 .selectAll('.related')
49414 .classed('related', false);
49416 context.map().on('drawn.select', null);
49417 context.ui().sidebar.hide();
49424 function behaviorAddWay(context) {
49425 var dispatch$$1 = dispatch('start', 'startFromWay', 'startFromNode'),
49426 draw = behaviorDraw(context);
49428 var addWay = function(surface) {
49429 draw.on('click', function() { dispatch$$1.apply('start', this, arguments); })
49430 .on('clickWay', function() { dispatch$$1.apply('startFromWay', this, arguments); })
49431 .on('clickNode', function() { dispatch$$1.apply('startFromNode', this, arguments); })
49432 .on('cancel', addWay.cancel)
49433 .on('finish', addWay.cancel);
49436 .dblclickEnable(false);
49438 surface.call(draw);
49442 addWay.off = function(surface) {
49443 surface.call(draw.off);
49447 addWay.cancel = function() {
49448 window.setTimeout(function() {
49449 context.map().dblclickEnable(true);
49452 context.enter(modeBrowse(context));
49456 addWay.tail = function(text) {
49462 return utilRebind(addWay, dispatch$$1, 'on');
49465 function behaviorBreathe() {
49466 var duration = 800,
49468 selector$$1 = '.selected.shadow, .selected .shadow',
49469 selected = select(null),
49476 function ratchetyInterpolator(a, b, steps, units) {
49479 var sample = quantize()
49481 .range(d3_quantize(interpolateNumber(a, b), steps));
49483 return function(t) {
49484 return String(sample(t)) + (units || '');
49489 function reset(selection$$1) {
49491 .style('stroke-opacity', null)
49492 .style('stroke-width', null)
49493 .style('fill-opacity', null)
49498 function setAnimationParams(transition, fromTo) {
49499 var toFrom = (fromTo === 'from' ? 'to' : 'from');
49502 .styleTween('stroke-opacity', function(d) {
49503 return ratchetyInterpolator(
49504 params[d.id][toFrom].opacity,
49505 params[d.id][fromTo].opacity,
49509 .styleTween('stroke-width', function(d) {
49510 return ratchetyInterpolator(
49511 params[d.id][toFrom].width,
49512 params[d.id][fromTo].width,
49517 .styleTween('fill-opacity', function(d) {
49518 return ratchetyInterpolator(
49519 params[d.id][toFrom].opacity,
49520 params[d.id][fromTo].opacity,
49524 .styleTween('r', function(d) {
49525 return ratchetyInterpolator(
49526 params[d.id][toFrom].width,
49527 params[d.id][fromTo].width,
49535 function calcAnimationParams(selection$$1) {
49538 .each(function(d) {
49539 var s = select(this),
49540 tag = s.node().tagName,
49541 p = {'from': {}, 'to': {}},
49544 // determine base opacity and width
49545 if (tag === 'circle') {
49546 opacity = parseFloat(s.style('fill-opacity') || 0.5);
49547 width = parseFloat(s.style('r') || 15.5);
49549 opacity = parseFloat(s.style('stroke-opacity') || 0.7);
49550 width = parseFloat(s.style('stroke-width') || 10);
49553 // calculate from/to interpolation params..
49555 p.from.opacity = opacity * 0.6;
49556 p.to.opacity = opacity * 1.25;
49557 p.from.width = width * 0.7;
49558 p.to.width = width * (tag === 'circle' ? 1.5 : 1);
49564 function run(surface, fromTo) {
49565 var toFrom = (fromTo === 'from' ? 'to' : 'from'),
49566 currSelected = surface.selectAll(selector$$1),
49567 currClassed = surface.attr('class');
49569 if (done || currSelected.empty()) {
49570 selected.call(reset);
49574 if (!isEqual(currSelected.data(), selected.data()) || currClassed !== classed) {
49575 selected.call(reset);
49576 classed = currClassed;
49577 selected = currSelected.call(calcAnimationParams);
49582 .duration(duration)
49583 .call(setAnimationParams, fromTo)
49584 .on('end', function() {
49585 surface.call(run, toFrom);
49590 var breathe = function(surface) {
49592 timer$$1 = timer(function() {
49593 // wait for elements to actually become selected
49594 if (surface.selectAll(selector$$1).empty()) {
49598 surface.call(run, 'from');
49605 breathe.off = function() {
49619 function behaviorCopy(context) {
49620 var keybinding = d3keybinding('copy');
49623 function groupEntities(ids, graph) {
49624 var entities = ids.map(function (id) { return graph.entity(id); });
49625 return assignIn({relation: [], way: [], node: []},
49626 groupBy(entities, function(entity) { return entity.type; }));
49630 function getDescendants(id, graph, descendants) {
49631 var entity = graph.entity(id),
49634 descendants = descendants || {};
49636 if (entity.type === 'relation') {
49637 children = map$3(entity.members, 'id');
49638 } else if (entity.type === 'way') {
49639 children = entity.nodes;
49644 for (i = 0; i < children.length; i++) {
49645 if (!descendants[children[i]]) {
49646 descendants[children[i]] = true;
49647 descendants = getDescendants(children[i], graph, descendants);
49651 return descendants;
49655 function doCopy() {
49656 if (!getSelectionText()) event.preventDefault();
49658 var graph = context.graph(),
49659 selected = groupEntities(context.selectedIDs(), graph),
49664 for (i = 0; i < selected.relation.length; i++) {
49665 entity = selected.relation[i];
49666 if (!skip[entity.id] && entity.isComplete(graph)) {
49667 canCopy.push(entity.id);
49668 skip = getDescendants(entity.id, graph, skip);
49671 for (i = 0; i < selected.way.length; i++) {
49672 entity = selected.way[i];
49673 if (!skip[entity.id]) {
49674 canCopy.push(entity.id);
49675 skip = getDescendants(entity.id, graph, skip);
49678 for (i = 0; i < selected.node.length; i++) {
49679 entity = selected.node[i];
49680 if (!skip[entity.id]) {
49681 canCopy.push(entity.id);
49685 context.copyIDs(canCopy);
49690 keybinding.on(uiCmd('⌘C'), doCopy);
49691 select(document).call(keybinding);
49695 function getSelectionText() {
49696 return window.getSelection().toString();
49699 copy.off = function() {
49700 select(document).call(keybinding.off);
49708 `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
49710 * The `origin` function is expected to return an [x, y] tuple rather than an
49712 * The events are `start`, `move`, and `end`.
49713 (https://github.com/mbostock/d3/issues/563)
49714 * The `start` event is not dispatched until the first cursor movement occurs.
49715 (https://github.com/mbostock/d3/pull/368)
49716 * The `move` event has a `point` and `delta` [x, y] tuple properties rather
49717 than `x`, `y`, `dx`, and `dy` properties.
49718 * The `end` event is not dispatched if no movement occurs.
49719 * An `off` function is available that unbinds the drag's internal event handlers.
49722 function behaviorDrag() {
49723 var dispatch$$1 = dispatch('start', 'move', 'end');
49724 var _origin = null;
49725 var _selector = '';
49731 var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
49732 var d3_event_userSelectSuppress = function() {
49733 var selection$$1 = selection();
49734 var select$$1 = selection$$1.style(d3_event_userSelectProperty);
49735 selection$$1.style(d3_event_userSelectProperty, 'none');
49736 return function() {
49737 selection$$1.style(d3_event_userSelectProperty, select$$1);
49742 function d3_eventCancel() {
49743 event.stopPropagation();
49744 event.preventDefault();
49748 function eventOf(thiz, argumentz) {
49749 return function(e1) {
49751 customEvent(e1, dispatch$$1.apply, dispatch$$1, [e1.type, thiz, argumentz]);
49756 function dragstart() {
49758 _event = eventOf(_target, arguments);
49760 var eventTarget = event.target;
49761 var touchId = event.touches ? event.changedTouches[0].identifier : null;
49763 var startOrigin = point$$1();
49764 var started = false;
49765 var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
49768 .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
49769 .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
49772 offset = _origin.apply(_target, arguments);
49773 offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
49778 if (touchId === null) {
49779 event.stopPropagation();
49783 function point$$1() {
49784 var p = _surface || _target.parentNode;
49785 return touchId !== null ? d3_touches(p).filter(function(p) {
49786 return p.identifier === touchId;
49791 function dragmove() {
49792 var p = point$$1();
49793 var dx = p[0] - startOrigin[0];
49794 var dy = p[1] - startOrigin[1];
49796 if (dx === 0 && dy === 0)
49804 _event({ type: 'start' });
49808 point: [p[0] + offset[0], p[1] + offset[1]],
49815 function dragend() {
49817 _event({ type: 'end' });
49820 if (event.target === eventTarget) {
49822 .on('click.drag', click, true);
49827 .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
49828 .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
49837 .on('click.drag', null);
49842 function drag(selection$$1) {
49843 var matchesSelector = utilPrefixDOMProperty('matchesSelector');
49844 var delegate = dragstart;
49847 delegate = function() {
49849 var target = event.target;
49850 for (; target && target !== root; target = target.parentNode) {
49851 var datum = target.__data__;
49852 var entity = datum && datum.properties && datum.properties.entity;
49853 if (entity && target[matchesSelector](_selector)) {
49854 return dragstart.call(target, entity);
49861 .on('mousedown.drag' + _selector, delegate)
49862 .on('touchstart.drag' + _selector, delegate);
49866 drag.off = function(selection$$1) {
49868 .on('mousedown.drag' + _selector, null)
49869 .on('touchstart.drag' + _selector, null);
49873 drag.selector = function(_) {
49874 if (!arguments.length) return _selector;
49880 drag.origin = function (_) {
49881 if (!arguments.length) return _origin;
49887 drag.cancel = function() {
49889 .on('mousemove.drag', null)
49890 .on('mouseup.drag', null);
49895 drag.target = function() {
49896 if (!arguments.length) return _target;
49897 _target = arguments[0];
49898 _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
49903 drag.surface = function() {
49904 if (!arguments.length) return _surface;
49905 _surface = arguments[0];
49910 return utilRebind(drag, dispatch$$1, 'on');
49913 function behaviorDrawWay(context, wayId, index, mode, startGraph) {
49914 var origWay = context.entity(wayId);
49915 var annotation = t((origWay.isDegenerate() ?
49916 'operations.start.annotation.' :
49917 'operations.continue.annotation.') + context.geometry(wayId)
49919 var behavior = behaviorDraw(context);
49920 var _tempEdits = 0;
49922 var end = osmNode({ loc: context.map().mouseCoordinates() });
49924 // Push an annotated state for undo to return back to.
49925 // We must make sure to remove this edit later.
49926 context.perform(actionNoop(), annotation);
49929 // Add the drawing node to the graph.
49930 // We must make sure to remove this edit later.
49931 context.perform(_actionAddDrawNode());
49936 function keydown() {
49937 if (event.keyCode === d3keybinding.modifierCodes.alt) {
49938 if (context.surface().classed('nope')) {
49940 .classed('nope-suppressed', true);
49943 .classed('nope', false)
49944 .classed('nope-disabled', true);
49950 if (event.keyCode === d3keybinding.modifierCodes.alt) {
49951 if (context.surface().classed('nope-suppressed')) {
49953 .classed('nope', true);
49956 .classed('nope-suppressed', false)
49957 .classed('nope-disabled', false);
49963 // - `mode/drag_node.js` `doMode()`
49964 // - `behavior/draw.js` `click()`
49965 // - `behavior/draw_way.js` `move()`
49966 function move(datum) {
49967 context.surface().classed('nope-disabled', event.altKey);
49969 var targetLoc = datum && datum.properties && datum.properties.entity && datum.properties.entity.loc;
49970 var targetNodes = datum && datum.properties && datum.properties.nodes;
49971 var loc = context.map().mouseCoordinates();
49973 if (targetLoc) { // snap to node/vertex - a point target with `.loc`
49976 } else if (targetNodes) { // snap to way - a line target with `.nodes`
49977 var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
49983 context.replace(actionMoveNode(end.id, loc));
49984 end = context.entity(end.id);
49985 checkGeometry(false);
49989 // Check whether this edit causes the geometry to break.
49990 // If so, class the surface with a nope cursor.
49991 // `finishDraw` - Only checks the relevant line segments if finishing drawing
49992 function checkGeometry(finishDraw) {
49993 var nopeDisabled = context.surface().classed('nope-disabled');
49994 var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
49996 if (nopeDisabled) {
49998 .classed('nope', false)
49999 .classed('nope-suppressed', isInvalid);
50002 .classed('nope', isInvalid)
50003 .classed('nope-suppressed', false);
50008 function isInvalidGeometry(entity, graph, finishDraw) {
50009 var parents = graph.parentWays(entity);
50011 for (var i = 0; i < parents.length; i++) {
50012 var parent = parents[i];
50013 var nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
50015 if (origWay.isClosed()) { // Check if Area
50017 nodes.splice(-2, 1);
50018 entity = nodes[nodes.length-2];
50028 if (geoHasSelfIntersections(nodes, entity.id)) {
50037 function undone() {
50038 // Undo popped the history back to the initial annotated no-op edit.
50039 // Remove initial no-op edit and whatever edit happened immediately before it.
50043 if (context.hasEntity(wayId)) {
50044 context.enter(mode);
50046 context.enter(modeBrowse(context));
50051 function setActiveElements() {
50052 context.surface().selectAll('.' + end.id)
50053 .classed('active', true);
50057 var drawWay = function(surface) {
50060 .on('click', drawWay.add)
50061 .on('clickWay', drawWay.addWay)
50062 .on('clickNode', drawWay.addNode)
50063 .on('undo', context.undo)
50064 .on('cancel', drawWay.cancel)
50065 .on('finish', drawWay.finish);
50068 .on('keydown.drawWay', keydown)
50069 .on('keyup.drawWay', keyup);
50072 .dblclickEnable(false)
50073 .on('drawn.draw', setActiveElements);
50075 setActiveElements();
50077 surface.call(behavior);
50080 .on('undone.draw', undone);
50084 drawWay.off = function(surface) {
50085 // Drawing was interrupted unexpectedly.
50086 // This can happen if the user changes modes,
50087 // clicks geolocate button, a hashchange event occurs, etc.
50089 context.pop(_tempEdits);
50090 while (context.graph() !== startGraph) {
50096 .on('drawn.draw', null);
50098 surface.call(behavior.off)
50099 .selectAll('.active')
50100 .classed('active', false);
50103 .classed('nope', false)
50104 .classed('nope-suppressed', false)
50105 .classed('nope-disabled', false);
50108 .on('keydown.hover', null)
50109 .on('keyup.hover', null);
50112 .on('undone.draw', null);
50116 function _actionAddDrawNode() {
50117 return function(graph) {
50120 .replace(origWay.addNode(end.id, index));
50125 function _actionReplaceDrawNode(newNode) {
50126 return function(graph) {
50128 .replace(origWay.addNode(newNode.id, index))
50134 // Accept the current position of the drawing node and continue drawing.
50135 drawWay.add = function(loc, d) {
50136 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
50137 return; // can't click here
50140 context.pop(_tempEdits);
50144 _actionAddDrawNode(),
50148 checkGeometry(false); // finishDraw = false
50149 context.enter(mode);
50153 // Connect the way to an existing way.
50154 drawWay.addWay = function(loc, edge, d) {
50155 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
50156 return; // can't click here
50159 context.pop(_tempEdits);
50163 _actionAddDrawNode(),
50164 actionAddMidpoint({ loc: loc, edge: edge }, end),
50168 checkGeometry(false); // finishDraw = false
50169 context.enter(mode);
50173 // Connect the way to an existing node and continue drawing.
50174 drawWay.addNode = function(node, d) {
50175 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
50176 return; // can't click here
50179 context.pop(_tempEdits);
50183 _actionReplaceDrawNode(node),
50187 checkGeometry(false); // finishDraw = false
50188 context.enter(mode);
50192 // Finish the draw operation, removing the temporary edits.
50193 // If the way has enough nodes to be valid, it's selected.
50194 // Otherwise, delete everything and return to browse mode.
50195 drawWay.finish = function() {
50196 checkGeometry(true); // finishDraw = true
50197 if (context.surface().classed('nope')) {
50198 return; // can't click here
50201 context.pop(_tempEdits);
50204 var way = context.hasEntity(wayId);
50205 if (!way || way.isDegenerate()) {
50210 window.setTimeout(function() {
50211 context.map().dblclickEnable(true);
50214 context.enter(modeSelect(context, [wayId]).newFeature(true));
50218 // Cancel the draw operation, delete everything, and return to browse mode.
50219 drawWay.cancel = function() {
50220 context.pop(_tempEdits);
50223 while (context.graph() !== startGraph) {
50227 window.setTimeout(function() {
50228 context.map().dblclickEnable(true);
50232 .classed('nope', false)
50233 .classed('nope-disabled', false)
50234 .classed('nope-suppressed', false);
50236 context.enter(modeBrowse(context));
50240 drawWay.activeID = function() {
50241 if (!arguments.length) return end.id;
50247 drawWay.tail = function(text) {
50248 behavior.tail(text);
50256 function behaviorHash(context) {
50257 var s0 = null; // cached window.location.hash
50258 var lat = 90 - 1e-8; // allowable latitude range
50261 var parser = function(map, s) {
50262 var q = utilStringQs(s);
50263 var args = (q.map || '').split('/').map(Number);
50265 if (args.length < 3 || args.some(isNaN)) {
50266 return true; // replace bogus hash
50268 } else if (s !== formatter(map).slice(1)) { // hash has changed
50269 var mode = context.mode(),
50270 dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
50273 // Don't allow the hash location to change too much while drawing
50274 // This can happen if the user accidently hit the back button. #3996
50275 if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
50276 context.enter(modeBrowse(context));
50279 map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
50284 var formatter = function(map) {
50285 var center = map.center();
50286 var zoom = map.zoom();
50287 var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
50288 var q = omit(utilStringQs(window.location.hash.substring(1)),
50289 ['comment', 'source', 'hashtags', 'walkthrough']
50291 var newParams = {};
50294 var selected = context.selectedIDs().filter(function(id) {
50295 return !context.entity(id).isNew();
50297 if (selected.length) {
50298 newParams.id = selected.join(',');
50301 newParams.map = zoom.toFixed(2) +
50302 '/' + center[1].toFixed(precision) +
50303 '/' + center[0].toFixed(precision);
50305 return '#' + utilQsString(assign(q, newParams), true);
50309 function update() {
50310 if (context.inIntro()) return;
50311 var s1 = formatter(context.map());
50313 window.location.replace(s0 = s1); // don't recenter the map!
50318 var throttledUpdate = throttle(update, 500);
50321 function hashchange() {
50322 if (window.location.hash === s0) return; // ignore spurious hashchange events
50323 if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
50324 update(); // replace bogus hash
50331 .on('move.hash', throttledUpdate);
50334 .on('enter.hash', throttledUpdate);
50337 .on('hashchange.hash', hashchange);
50339 if (window.location.hash) {
50341 var q = utilStringQs(window.location.hash.substring(1));
50344 context.zoomToEntity(q.id.split(',')[0], !q.map);
50348 context.storage('comment', q.comment);
50349 context.storage('commentDate', Date.now());
50353 context.storage('source', q.source);
50354 context.storage('commentDate', Date.now());
50358 context.storage('hashtags', q.hashtags);
50361 if (q.walkthrough === 'true') {
50362 hash.startWalkthrough = true;
50368 hash.hadHash = true;
50374 hash.off = function() {
50375 throttledUpdate.cancel();
50378 .on('move.hash', null);
50381 .on('enter.hash', null);
50384 .on('hashchange.hash', null);
50386 window.location.hash = '';
50393 function behaviorLasso(context) {
50395 var behavior = function(selection$$1) {
50399 function mousedown() {
50400 var button = 0; // left
50401 if (event.button === button && event.shiftKey === true) {
50405 .on('mousemove.lasso', mousemove)
50406 .on('mouseup.lasso', mouseup);
50408 event.stopPropagation();
50413 function mousemove() {
50415 lasso = uiLasso(context);
50416 context.surface().call(lasso);
50419 lasso.p(context.mouse());
50423 function normalize(a, b) {
50425 [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
50426 [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
50430 function lassoed() {
50431 if (!lasso) return [];
50433 var graph = context.graph(),
50434 bounds = lasso.extent().map(context.projection.invert),
50435 extent = geoExtent$$1(normalize(bounds[0], bounds[1]));
50437 return map$3(context.intersects(extent).filter(function(entity) {
50438 return entity.type === 'node' &&
50439 geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
50440 !context.features().isHidden(entity, graph, entity.geometry(graph));
50445 function mouseup() {
50447 .on('mousemove.lasso', null)
50448 .on('mouseup.lasso', null);
50450 if (!lasso) return;
50452 var ids = lassoed();
50456 context.enter(modeSelect(context, ids));
50461 .on('mousedown.lasso', mousedown);
50465 behavior.off = function(selection$$1) {
50466 selection$$1.on('mousedown.lasso', null);
50473 /* Creates a keybinding behavior for an operation */
50474 function behaviorOperation() {
50475 var _operation, keybinding;
50477 var behavior = function () {
50478 if (_operation && _operation.available()) {
50479 keybinding = d3keybinding('behavior.key.' + _operation.id);
50480 keybinding.on(_operation.keys, function() {
50481 event.preventDefault();
50482 var disabled = _operation.disabled();
50488 .iconName('#iD-operation-' + _operation.id)
50489 .iconClass('operation disabled')
50490 .text(_operation.tooltip);
50497 .iconName('#iD-operation-' + _operation.id)
50498 .iconClass('operation')
50499 .text(_operation.annotation() || _operation.title);
50506 select(document).call(keybinding);
50513 behavior.off = function() {
50515 select(document).call(keybinding.off);
50520 behavior.which = function (_) {
50521 if (!arguments.length) return _operation;
50531 * The base implementation of `_.invert` and `_.invertBy` which inverts
50532 * `object` with values transformed by `iteratee` and set by `setter`.
50535 * @param {Object} object The object to iterate over.
50536 * @param {Function} setter The function to set `accumulator` values.
50537 * @param {Function} iteratee The iteratee to transform values.
50538 * @param {Object} accumulator The initial inverted object.
50539 * @returns {Function} Returns `accumulator`.
50541 function baseInverter(object, setter, iteratee, accumulator) {
50542 baseForOwn(object, function(value, key, object) {
50543 setter(accumulator, iteratee(value), key, object);
50545 return accumulator;
50549 * Creates a function like `_.invertBy`.
50552 * @param {Function} setter The function to set accumulator values.
50553 * @param {Function} toIteratee The function to resolve iteratees.
50554 * @returns {Function} Returns the new inverter function.
50556 function createInverter(setter, toIteratee) {
50557 return function(object, iteratee) {
50558 return baseInverter(object, setter, toIteratee(iteratee), {});
50562 /** Used for built-in method references. */
50563 var objectProto$j = Object.prototype;
50566 * Used to resolve the
50567 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
50570 var nativeObjectToString$2 = objectProto$j.toString;
50573 * Creates an object composed of the inverted keys and values of `object`.
50574 * If `object` contains duplicate values, subsequent values overwrite
50575 * property assignments of previous values.
50581 * @param {Object} object The object to invert.
50582 * @returns {Object} Returns the new inverted object.
50585 * var object = { 'a': 1, 'b': 2, 'c': 1 };
50587 * _.invert(object);
50588 * // => { '1': 'c', '2': 'b' }
50590 var invert = createInverter(function(result, value, key) {
50591 if (value != null &&
50592 typeof value.toString != 'function') {
50593 value = nativeObjectToString$2.call(value);
50596 result[value] = key;
50597 }, constant$d(identity$8));
50600 * Creates an object with the same keys as `object` and values generated
50601 * by running each own enumerable string keyed property of `object` thru
50602 * `iteratee`. The iteratee is invoked with three arguments:
50603 * (value, key, object).
50609 * @param {Object} object The object to iterate over.
50610 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
50611 * @returns {Object} Returns the new mapped object.
50616 * 'fred': { 'user': 'fred', 'age': 40 },
50617 * 'pebbles': { 'user': 'pebbles', 'age': 1 }
50620 * _.mapValues(users, function(o) { return o.age; });
50621 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
50623 * // The `_.property` iteratee shorthand.
50624 * _.mapValues(users, 'age');
50625 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
50627 function mapValues(object, iteratee) {
50629 iteratee = baseIteratee(iteratee, 3);
50631 baseForOwn(object, function(value, key, object) {
50632 baseAssignValue(result, key, iteratee(value, key, object));
50637 function behaviorPaste(context) {
50638 var keybinding = d3keybinding('paste');
50641 function doPaste() {
50642 event.preventDefault();
50644 var baseGraph = context.graph(),
50645 mouse$$1 = context.mouse(),
50646 projection = context.projection,
50647 viewport = geoExtent$$1(projection.clipExtent()).polygon();
50649 if (!geoPointInPolygon(mouse$$1, viewport)) return;
50651 var extent = geoExtent$$1(),
50652 oldIDs = context.copyIDs(),
50653 oldGraph = context.copyGraph(),
50656 if (!oldIDs.length) return;
50658 var action = actionCopyEntities(oldIDs, oldGraph);
50659 context.perform(action);
50661 var copies = action.copies();
50662 var originals = invert(mapValues(copies, 'id'));
50663 for (var id in copies) {
50664 var oldEntity = oldGraph.entity(id),
50665 newEntity = copies[id];
50667 extent._extend(oldEntity.extent(oldGraph));
50669 // Exclude child nodes from newIDs if their parent way was also copied.
50670 var parents = context.graph().parentWays(newEntity),
50671 parentCopied = false;
50672 for (var i = 0; i < parents.length; i++) {
50673 if (originals[parents[i].id]) {
50674 parentCopied = true;
50679 if (!parentCopied) {
50680 newIDs.push(newEntity.id);
50684 // Put pasted objects where mouse pointer is..
50685 var center = projection(extent.center()),
50686 delta = [ mouse$$1[0] - center[0], mouse$$1[1] - center[1] ];
50688 context.perform(actionMove(newIDs, delta, projection));
50689 context.enter(modeMove$$1(context, newIDs, baseGraph));
50694 keybinding.on(uiCmd('⌘V'), doPaste);
50695 select(document).call(keybinding);
50700 paste.off = function() {
50701 select(document).call(keybinding.off);
50708 function behaviorSelect(context) {
50709 var lastMouse = null;
50710 var suppressMenu = true;
50715 function point$$1() {
50716 return mouse(context.container().node());
50720 function keydown() {
50722 if (e && e.shiftKey) {
50724 .classed('behavior-multiselect', true);
50727 if (e && e.keyCode === 93) { // context menu
50728 e.preventDefault();
50729 e.stopPropagation();
50736 if (!e || !e.shiftKey) {
50738 .classed('behavior-multiselect', false);
50742 if (e && e.keyCode === 93) { // context menu
50743 e.preventDefault();
50744 e.stopPropagation();
50750 function mousedown() {
50751 if (!p1) p1 = point$$1();
50753 .on('mouseup.select', mouseup, true);
50755 var isShowAlways = +context.storage('edit-menu-show-always') === 1;
50756 suppressMenu = !isShowAlways;
50760 function mousemove() {
50761 if (event) lastMouse = event;
50765 function mouseup() {
50770 function contextmenu() {
50772 e.preventDefault();
50773 e.stopPropagation();
50775 if (!+e.clientX && !+e.clientY) {
50777 e.sourceEvent = lastMouse;
50783 if (!p1) p1 = point$$1();
50784 suppressMenu = false;
50791 .on('mouseup.select', null, true);
50794 var p2 = point$$1();
50795 var dist = geoVecLength(p1, p2);
50798 if (dist > tolerance) {
50802 var isMultiselect = event.shiftKey || select('#surface .lasso').node();
50803 var isShowAlways = +context.storage('edit-menu-show-always') === 1;
50804 var datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__);
50805 var mode = context.mode();
50807 var entity = datum && datum.properties && datum.properties.entity;
50808 if (entity) datum = entity;
50810 if (datum && datum.type === 'midpoint') {
50811 datum = datum.parents[0];
50814 if (!(datum instanceof osmEntity$$1)) {
50815 // clicked nothing..
50816 if (!isMultiselect && mode.id !== 'browse') {
50817 context.enter(modeBrowse(context));
50821 // clicked an entity..
50822 var selectedIDs = context.selectedIDs();
50824 if (!isMultiselect) {
50825 if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
50826 // multiple things already selected, just show the menu...
50827 mode.suppressMenu(false).reselect();
50829 // select a single thing..
50830 context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
50834 if (selectedIDs.indexOf(datum.id) !== -1) {
50835 // clicked entity is already in the selectedIDs list..
50836 if (!suppressMenu && !isShowAlways) {
50837 // don't deselect clicked entity, just show the menu.
50838 mode.suppressMenu(false).reselect();
50840 // deselect clicked entity, then reenter select mode or return to browse mode..
50841 selectedIDs = without(selectedIDs, datum.id);
50842 context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
50845 // clicked entity is not in the selected list, add it..
50846 selectedIDs = selectedIDs.concat([datum.id]);
50847 context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
50852 // reset for next time..
50853 suppressMenu = true;
50857 var behavior = function(selection$$1) {
50859 suppressMenu = true;
50863 .on('keydown.select', keydown)
50864 .on('keyup.select', keyup)
50865 .on('contextmenu.select-window', function() {
50866 // Edge and IE really like to show the contextmenu on the
50867 // menubar when user presses a keyboard menu button
50868 // even after we've already preventdefaulted the key event.
50870 if (+e.clientX === 0 && +e.clientY === 0) {
50871 event.preventDefault();
50872 event.stopPropagation();
50877 .on('mousedown.select', mousedown)
50878 .on('mousemove.select', mousemove)
50879 .on('contextmenu.select', contextmenu);
50881 if (event && event.shiftKey) {
50883 .classed('behavior-multiselect', true);
50888 behavior.off = function(selection$$1) {
50890 .on('keydown.select', null)
50891 .on('keyup.select', null)
50892 .on('contextmenu.select-window', null)
50893 .on('mouseup.select', null, true);
50896 .on('mousedown.select', null)
50897 .on('mousemove.select', null)
50898 .on('contextmenu.select', null);
50901 .classed('behavior-multiselect', false);
50908 function uiAccount(context) {
50909 var osm = context.connection();
50912 function update(selection$$1) {
50915 if (!osm.authenticated()) {
50916 selection$$1.selectAll('#userLink, #logoutLink')
50917 .classed('hide', true);
50921 osm.userDetails(function(err, details) {
50922 var userLink = selection$$1.select('#userLink'),
50923 logoutLink = selection$$1.select('#logoutLink');
50926 logoutLink.html('');
50930 selection$$1.selectAll('#userLink, #logoutLink')
50931 .classed('hide', false);
50934 userLink.append('a')
50935 .attr('href', osm.userURL(details.display_name))
50936 .attr('target', '_blank');
50938 // Add thumbnail or dont
50939 if (details.image_url) {
50940 userLink.append('img')
50941 .attr('class', 'icon pre-text user-icon')
50942 .attr('src', details.image_url);
50945 .call(svgIcon('#iD-icon-avatar', 'pre-text light'));
50949 userLink.append('span')
50950 .attr('class', 'label')
50951 .text(details.display_name);
50953 logoutLink.append('a')
50954 .attr('class', 'logout')
50957 .on('click.logout', function() {
50958 event.preventDefault();
50965 return function(selection$$1) {
50966 selection$$1.append('li')
50967 .attr('id', 'logoutLink')
50968 .classed('hide', true);
50970 selection$$1.append('li')
50971 .attr('id', 'userLink')
50972 .classed('hide', true);
50975 osm.on('change.account', function() { update(selection$$1); });
50976 update(selection$$1);
50981 function uiAttribution(context) {
50985 function attribution(data, klass) {
50986 var div = selection$$1.selectAll('.' + klass)
50991 .attr('class', klass)
50995 var background = div.selectAll('.attribution')
50996 .data(data, function(d) { return d.name(); });
51001 background = background.enter()
51003 .attr('class', 'attribution')
51004 .each(function(d) {
51005 if (d.terms_html) {
51007 .html(d.terms_html);
51013 selection$$1 = select(this)
51015 .attr('href', d.terms_url)
51016 .attr('target', '_blank');
51018 selection$$1 = select(this);
51022 var id_safe = d.id.replace('.', '<TX_DOT>');
51023 var terms_text = t('imagery.' + id_safe + '.attribution.text',
51024 { default: d.terms_text || d.id || d.name() }
51027 if (d.icon && !d.overlay) {
51030 .attr('class', 'source-image')
51031 .attr('src', d.icon);
51036 .attr('class', 'attribution-text')
51039 .merge(background);
51042 var copyright = background.selectAll('.copyright-notice')
51043 .data(function(d) {
51044 var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
51045 return notice ? [notice] : [];
51051 copyright = copyright.enter()
51053 .attr('class', 'copyright-notice')
51061 function update() {
51062 attribution([context.background().baseLayerSource()], 'base-layer-attribution');
51063 attribution(context.background().overlayLayerSources().filter(function (s) {
51064 return s.validZoom(context.map().zoom());
51065 }), 'overlay-layer-attribution');
51069 return function(select$$1) {
51070 selection$$1 = select$$1;
51072 context.background()
51073 .on('change.attribution', update);
51076 .on('move.attribution', throttle(update, 400, {leading: false}));
51082 // toggles the visibility of ui elements, using a combination of the
51083 // hide class, which sets display=none, and a d3 transition for opacity.
51084 // this will cause blinking when called repeatedly, so check that the
51085 // value actually changes between calls.
51086 function uiToggle(show, callback) {
51087 return function(selection$$1) {
51089 .style('opacity', show ? 0 : 1)
51090 .classed('hide', false)
51092 .style('opacity', show ? 1 : 0)
51093 .on('end', function() {
51095 .classed('hide', !show)
51096 .style('opacity', null);
51097 if (callback) callback.apply(this);
51102 function uiDisclosure(context, key, expandedDefault) {
51103 var dispatch$$1 = dispatch('toggled');
51104 var _preference = (context.storage('disclosure.' + key + '.expanded'));
51105 var _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true'));
51107 var _updatePreference = true;
51108 var _content = function () {};
51111 var disclosure = function(selection$$1) {
51112 var hideToggle = selection$$1.selectAll('.hide-toggle-' + key)
51116 var hideToggleEnter = hideToggle.enter()
51119 .attr('class', 'hide-toggle hide-toggle-' + key)
51120 .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
51124 .attr('class', 'hide-toggle-text');
51127 hideToggle = hideToggleEnter
51128 .merge(hideToggle);
51131 .on('click', toggle)
51132 .classed('expanded', _expanded);
51134 hideToggle.selectAll('.hide-toggle-text')
51137 hideToggle.selectAll('.hide-toggle-icon')
51138 .attr('xlink:href', _expanded ? '#iD-icon-down'
51139 : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
51143 var wrap = selection$$1.selectAll('.disclosure-wrap')
51146 wrap = wrap.enter()
51148 .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
51152 .classed('hide', !_expanded)
51156 function toggle() {
51157 event.preventDefault();
51159 _expanded = !_expanded;
51161 if (_updatePreference) {
51162 context.storage('disclosure.' + key + '.expanded', _expanded);
51166 .classed('expanded', _expanded);
51168 hideToggle.selectAll('.hide-toggle-icon')
51169 .attr('xlink:href', _expanded ? '#iD-icon-down'
51170 : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
51174 .call(uiToggle(_expanded));
51176 dispatch$$1.call('toggled', this, _expanded);
51181 disclosure.title = function(_) {
51182 if (!arguments.length) return _title;
51188 disclosure.expanded = function(_) {
51189 if (!arguments.length) return _expanded;
51195 disclosure.updatePreference = function(_) {
51196 if (!arguments.length) return _updatePreference;
51197 _updatePreference = _;
51202 disclosure.content = function(_) {
51203 if (!arguments.length) return _content;
51209 return utilRebind(disclosure, dispatch$$1, 'on');
51212 function uiBackgroundDisplayOptions(context) {
51213 var detected = utilDetect();
51214 var storedOpacity = context.storage('background-opacity');
51216 var maxVal = detected.cssfilters ? 2 : 1;
51218 var sliders = detected.cssfilters
51219 ? ['brightness', 'contrast', 'saturation', 'sharpness']
51223 brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
51229 var _selection = select(null);
51232 function clamp(x, min, max) {
51233 return Math.max(min, Math.min(x, max));
51237 function updateValue(d, val) {
51238 if (!val && event && event.target) {
51239 val = event.target.value;
51242 val = clamp(val, minVal, maxVal);
51245 context.background()[d](val);
51247 if (d === 'brightness') {
51248 context.storage('background-opacity', val);
51256 function render(selection$$1) {
51257 var container = selection$$1.selectAll('.display-options-container')
51260 var containerEnter = container.enter()
51262 .attr('class', 'display-options-container controls-list');
51264 // add slider controls
51265 var slidersEnter = containerEnter.selectAll('.display-control')
51269 .attr('class', function(d) { return 'display-control display-control-' + d; });
51273 .text(function(d) { return t('background.' + d); })
51275 .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
51279 .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
51280 .attr('type', 'range')
51281 .attr('min', minVal)
51282 .attr('max', maxVal)
51283 .attr('step', '0.05')
51284 .on('input', function(d) {
51285 var val = select(this).property('value');
51286 updateValue(d, val);
51291 .attr('title', t('background.reset'))
51292 .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
51293 .on('click', function(d) {
51294 if (event.button !== 0) return;
51297 .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
51301 container = containerEnter
51304 container.selectAll('.display-option-input')
51305 .property('value', function(d) { return _options[d]; });
51307 container.selectAll('.display-option-value')
51308 .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
51310 container.selectAll('.display-option-reset')
51311 .classed('disabled', function(d) { return _options[d] === 1; });
51313 // first time only, set brightness if needed
51314 if (containerEnter.size() && _options.brightness !== 1) {
51315 context.background().brightness(_options.brightness);
51320 function backgroundDisplayOptions(selection$$1) {
51321 _selection = selection$$1;
51324 .call(uiDisclosure(context, 'background_display_options', true)
51325 .title(t('background.display_options'))
51331 return backgroundDisplayOptions;
51334 function uiBackgroundOffset(context) {
51336 ['right', [0.5, 0]],
51337 ['top', [0, -0.5]],
51338 ['left', [-0.5, 0]],
51339 ['bottom', [0, 0.5]]
51343 function d3_eventCancel() {
51344 event.stopPropagation();
51345 event.preventDefault();
51349 function updateValue() {
51350 var meters = geoOffsetToMeters(context.background().offset());
51351 var x = +meters[0].toFixed(2);
51352 var y = +meters[1].toFixed(2);
51354 d3_selectAll('.nudge-inner-rect')
51356 .classed('error', false)
51357 .property('value', x + ', ' + y);
51359 d3_selectAll('.nudge-reset')
51360 .classed('disabled', function() {
51361 return (x === 0 && y === 0);
51366 function resetOffset() {
51367 context.background().offset([0, 0]);
51372 function nudge(d) {
51373 context.background().nudge(d, context.map().zoom());
51378 function clickNudgeButton(d) {
51380 var timeout = window.setTimeout(function() {
51381 interval = window.setInterval(nudge.bind(null, d), 100);
51384 function doneNudge() {
51385 window.clearTimeout(timeout);
51386 window.clearInterval(interval);
51388 .on('mouseup.buttonoffset', null, true)
51389 .on('mousedown.buttonoffset', null, true);
51393 .on('mouseup.buttonoffset', doneNudge, true)
51394 .on('mousedown.buttonoffset', doneNudge, true);
51400 function inputOffset() {
51401 var input = select(this);
51402 var d = input.node().value;
51404 if (d === '') return resetOffset();
51406 d = d.replace(/;/g, ',').split(',').map(function(n) {
51407 // if n is NaN, it will always get mapped to false.
51408 return !isNaN(n) && n;
51411 if (d.length !== 2 || !d[0] || !d[1]) {
51412 input.classed('error', true);
51416 context.background().offset(geoMetersToOffset(d));
51421 function dragOffset() {
51422 event.preventDefault();
51423 if (event.button !== 0) return;
51425 var origin = [event.clientX, event.clientY];
51427 context.container()
51429 .attr('class', 'nudge-surface');
51432 .on('mousemove.offset', function() {
51433 var latest = [event.clientX, event.clientY];
51435 -(origin[0] - latest[0]) / 4,
51436 -(origin[1] - latest[1]) / 4
51442 .on('mouseup.offset', function() {
51443 if (event.button !== 0) return;
51444 d3_selectAll('.nudge-surface')
51448 .on('mousemove.offset', null)
51449 .on('mouseup.offset', null);
51454 function render(selection$$1) {
51455 var container = selection$$1.selectAll('.nudge-container')
51458 var containerEnter = container.enter()
51460 .attr('class', 'nudge-container cf');
51464 .attr('class', 'nudge-instructions')
51465 .text(t('background.offset'));
51467 var nudgeEnter = containerEnter
51469 .attr('class', 'nudge-outer-rect')
51470 .on('mousedown', dragOffset);
51474 .attr('class', 'nudge-inner-rect')
51476 .on('change', inputOffset);
51480 .selectAll('button')
51481 .data(directions).enter()
51483 .attr('class', function(d) { return d[0] + ' nudge'; })
51484 .on('contextmenu', d3_eventCancel)
51485 .on('mousedown', function(d) {
51486 if (event.button !== 0) return;
51487 clickNudgeButton(d[1]);
51492 .attr('title', t('background.reset'))
51493 .attr('class', 'nudge-reset disabled')
51494 .on('contextmenu', d3_eventCancel)
51495 .on('click', function() {
51496 if (event.button !== 0) return;
51499 .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
51505 function backgroundOffset(selection$$1) {
51507 .call(uiDisclosure(context, 'background_offset', false)
51508 .title(t('background.fix_misalignment'))
51514 context.background()
51515 .on('change.backgroundOffset-update', updateValue);
51517 return backgroundOffset;
51520 var marked = createCommonjsModule(function (module, exports) {
51524 * Block-Level Grammar
51529 code: /^( {4}[^\n]+\n*)+/,
51531 hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
51532 heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
51534 blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
51535 list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
51536 html: '^ {0,3}(?:' // optional indentation
51537 + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
51538 + '|comment[^\\n]*(\\n+|$)' // (2)
51539 + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
51540 + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
51541 + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
51542 + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
51543 + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
51544 + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
51546 def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
51548 lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
51549 paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
51553 block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
51554 block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
51555 block.def = edit(block.def)
51556 .replace('label', block._label)
51557 .replace('title', block._title)
51560 block.bullet = /(?:[*+-]|\d+\.)/;
51561 block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
51562 block.item = edit(block.item, 'gm')
51563 .replace(/bull/g, block.bullet)
51566 block.list = edit(block.list)
51567 .replace(/bull/g, block.bullet)
51568 .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
51569 .replace('def', '\\n+(?=' + block.def.source + ')')
51572 block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
51573 + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
51574 + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
51575 + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
51576 + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
51578 block._comment = /<!--(?!-?>)[\s\S]*?-->/;
51579 block.html = edit(block.html, 'i')
51580 .replace('comment', block._comment)
51581 .replace('tag', block._tag)
51582 .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
51585 block.paragraph = edit(block.paragraph)
51586 .replace('hr', block.hr)
51587 .replace('heading', block.heading)
51588 .replace('lheading', block.lheading)
51589 .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
51592 block.blockquote = edit(block.blockquote)
51593 .replace('paragraph', block.paragraph)
51597 * Normal Block Grammar
51600 block.normal = merge({}, block);
51603 * GFM Block Grammar
51606 block.gfm = merge({}, block.normal, {
51607 fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,
51609 heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
51612 block.gfm.paragraph = edit(block.paragraph)
51613 .replace('(?!', '(?!'
51614 + block.gfm.fences.source.replace('\\1', '\\2') + '|'
51615 + block.list.source.replace('\\1', '\\3') + '|')
51619 * GFM + Tables Block Grammar
51622 block.tables = merge({}, block.gfm, {
51623 nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
51624 table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
51631 block.pedantic = merge({}, block.normal, {
51633 '^ *(?:comment *(?:\\n|\\s*$)'
51634 + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
51635 + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
51636 .replace('comment', block._comment)
51637 .replace(/tag/g, '(?!(?:'
51638 + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
51639 + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
51640 + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
51642 def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
51649 function Lexer(options) {
51651 this.tokens.links = {};
51652 this.options = options || marked.defaults;
51653 this.rules = block.normal;
51655 if (this.options.pedantic) {
51656 this.rules = block.pedantic;
51657 } else if (this.options.gfm) {
51658 if (this.options.tables) {
51659 this.rules = block.tables;
51661 this.rules = block.gfm;
51667 * Expose Block Rules
51670 Lexer.rules = block;
51673 * Static Lex Method
51676 Lexer.lex = function(src, options) {
51677 var lexer = new Lexer(options);
51678 return lexer.lex(src);
51685 Lexer.prototype.lex = function(src) {
51687 .replace(/\r\n|\r/g, '\n')
51688 .replace(/\t/g, ' ')
51689 .replace(/\u00a0/g, ' ')
51690 .replace(/\u2424/g, '\n');
51692 return this.token(src, true);
51699 Lexer.prototype.token = function(src, top) {
51700 src = src.replace(/^ +$/gm, '');
51717 if (cap = this.rules.newline.exec(src)) {
51718 src = src.substring(cap[0].length);
51719 if (cap[0].length > 1) {
51727 if (cap = this.rules.code.exec(src)) {
51728 src = src.substring(cap[0].length);
51729 cap = cap[0].replace(/^ {4}/gm, '');
51732 text: !this.options.pedantic
51733 ? cap.replace(/\n+$/, '')
51740 if (cap = this.rules.fences.exec(src)) {
51741 src = src.substring(cap[0].length);
51751 if (cap = this.rules.heading.exec(src)) {
51752 src = src.substring(cap[0].length);
51755 depth: cap[1].length,
51761 // table no leading pipe (gfm)
51762 if (top && (cap = this.rules.nptable.exec(src))) {
51765 header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
51766 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
51767 cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
51770 if (item.header.length === item.align.length) {
51771 src = src.substring(cap[0].length);
51773 for (i = 0; i < item.align.length; i++) {
51774 if (/^ *-+: *$/.test(item.align[i])) {
51775 item.align[i] = 'right';
51776 } else if (/^ *:-+: *$/.test(item.align[i])) {
51777 item.align[i] = 'center';
51778 } else if (/^ *:-+ *$/.test(item.align[i])) {
51779 item.align[i] = 'left';
51781 item.align[i] = null;
51785 for (i = 0; i < item.cells.length; i++) {
51786 item.cells[i] = splitCells(item.cells[i], item.header.length);
51789 this.tokens.push(item);
51796 if (cap = this.rules.hr.exec(src)) {
51797 src = src.substring(cap[0].length);
51805 if (cap = this.rules.blockquote.exec(src)) {
51806 src = src.substring(cap[0].length);
51809 type: 'blockquote_start'
51812 cap = cap[0].replace(/^ *> ?/gm, '');
51814 // Pass `top` to keep the current
51815 // "toplevel" state. This is exactly
51816 // how markdown.pl works.
51817 this.token(cap, top);
51820 type: 'blockquote_end'
51827 if (cap = this.rules.list.exec(src)) {
51828 src = src.substring(cap[0].length);
51830 isordered = bull.length > 1;
51833 type: 'list_start',
51834 ordered: isordered,
51835 start: isordered ? +bull : ''
51838 // Get each top-level item.
51839 cap = cap[0].match(this.rules.item);
51845 for (; i < l; i++) {
51848 // Remove the list item's bullet
51849 // so it is seen as the next token.
51850 space = item.length;
51851 item = item.replace(/^ *([*+-]|\d+\.) +/, '');
51853 // Outdent whatever the
51854 // list item contains. Hacky.
51855 if (~item.indexOf('\n ')) {
51856 space -= item.length;
51857 item = !this.options.pedantic
51858 ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
51859 : item.replace(/^ {1,4}/gm, '');
51862 // Determine whether the next list item belongs here.
51863 // Backpedal if it does not belong in this list.
51864 if (this.options.smartLists && i !== l - 1) {
51865 b = block.bullet.exec(cap[i + 1])[0];
51866 if (bull !== b && !(bull.length > 1 && b.length > 1)) {
51867 src = cap.slice(i + 1).join('\n') + src;
51872 // Determine whether item is loose or not.
51873 // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
51874 // for discount behavior.
51875 loose = next || /\n\n(?!\s*$)/.test(item);
51877 next = item.charAt(item.length - 1) === '\n';
51878 if (!loose) loose = next;
51881 // Check for task list items
51882 istask = /^\[[ xX]\] /.test(item);
51883 ischecked = undefined;
51885 ischecked = item[1] !== ' ';
51886 item = item.replace(/^\[[ xX]\] +/, '');
51891 ? 'loose_item_start'
51892 : 'list_item_start',
51898 this.token(item, false);
51901 type: 'list_item_end'
51913 if (cap = this.rules.html.exec(src)) {
51914 src = src.substring(cap[0].length);
51916 type: this.options.sanitize
51919 pre: !this.options.sanitizer
51920 && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
51927 if (top && (cap = this.rules.def.exec(src))) {
51928 src = src.substring(cap[0].length);
51929 if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
51930 tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
51931 if (!this.tokens.links[tag]) {
51932 this.tokens.links[tag] = {
51941 if (top && (cap = this.rules.table.exec(src))) {
51944 header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
51945 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
51946 cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : []
51949 if (item.header.length === item.align.length) {
51950 src = src.substring(cap[0].length);
51952 for (i = 0; i < item.align.length; i++) {
51953 if (/^ *-+: *$/.test(item.align[i])) {
51954 item.align[i] = 'right';
51955 } else if (/^ *:-+: *$/.test(item.align[i])) {
51956 item.align[i] = 'center';
51957 } else if (/^ *:-+ *$/.test(item.align[i])) {
51958 item.align[i] = 'left';
51960 item.align[i] = null;
51964 for (i = 0; i < item.cells.length; i++) {
51965 item.cells[i] = splitCells(
51966 item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
51967 item.header.length);
51970 this.tokens.push(item);
51977 if (cap = this.rules.lheading.exec(src)) {
51978 src = src.substring(cap[0].length);
51981 depth: cap[2] === '=' ? 1 : 2,
51987 // top-level paragraph
51988 if (top && (cap = this.rules.paragraph.exec(src))) {
51989 src = src.substring(cap[0].length);
51992 text: cap[1].charAt(cap[1].length - 1) === '\n'
51993 ? cap[1].slice(0, -1)
52000 if (cap = this.rules.text.exec(src)) {
52001 // Top-level should never reach here.
52002 src = src.substring(cap[0].length);
52011 throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
52015 return this.tokens;
52019 * Inline-Level Grammar
52023 escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
52024 autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
52027 + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
52028 + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
52029 + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
52030 + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
52031 + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
52032 link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
52033 reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
52034 nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
52035 strong: /^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)|^__([^\s])__(?!_)|^\*\*([^\s])\*\*(?!\*)/,
52036 em: /^_([^\s][\s\S]*?[^\s_])_(?!_)|^_([^\s_][\s\S]*?[^\s])_(?!_)|^\*([^\s][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*][\s\S]*?[^\s])\*(?!\*)|^_([^\s_])_(?!_)|^\*([^\s*])\*(?!\*)/,
52037 code: /^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,
52038 br: /^ {2,}\n(?!\s*$)/,
52040 text: /^[\s\S]+?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
52043 inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
52045 inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
52046 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])?)+(?![-_])/;
52047 inline.autolink = edit(inline.autolink)
52048 .replace('scheme', inline._scheme)
52049 .replace('email', inline._email)
52052 inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
52054 inline.tag = edit(inline.tag)
52055 .replace('comment', block._comment)
52056 .replace('attribute', inline._attribute)
52059 inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/;
52060 inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f()\\]*\)|[^\s\x00-\x1f()\\])*?)/;
52061 inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
52063 inline.link = edit(inline.link)
52064 .replace('label', inline._label)
52065 .replace('href', inline._href)
52066 .replace('title', inline._title)
52069 inline.reflink = edit(inline.reflink)
52070 .replace('label', inline._label)
52074 * Normal Inline Grammar
52077 inline.normal = merge({}, inline);
52080 * Pedantic Inline Grammar
52083 inline.pedantic = merge({}, inline.normal, {
52084 strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
52085 em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
52086 link: edit(/^!?\[(label)\]\((.*?)\)/)
52087 .replace('label', inline._label)
52089 reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
52090 .replace('label', inline._label)
52095 * GFM Inline Grammar
52098 inline.gfm = merge({}, inline.normal, {
52099 escape: edit(inline.escape).replace('])', '~|])').getRegex(),
52100 url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/)
52101 .replace('email', inline._email)
52103 _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
52104 del: /^~~(?=\S)([\s\S]*?\S)~~/,
52105 text: edit(inline.text)
52106 .replace(']|', '~]|')
52107 .replace('|', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|')
52112 * GFM + Line Breaks Inline Grammar
52115 inline.breaks = merge({}, inline.gfm, {
52116 br: edit(inline.br).replace('{2,}', '*').getRegex(),
52117 text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
52121 * Inline Lexer & Compiler
52124 function InlineLexer(links, options) {
52125 this.options = options || marked.defaults;
52126 this.links = links;
52127 this.rules = inline.normal;
52128 this.renderer = this.options.renderer || new Renderer();
52129 this.renderer.options = this.options;
52132 throw new Error('Tokens array requires a `links` property.');
52135 if (this.options.pedantic) {
52136 this.rules = inline.pedantic;
52137 } else if (this.options.gfm) {
52138 if (this.options.breaks) {
52139 this.rules = inline.breaks;
52141 this.rules = inline.gfm;
52147 * Expose Inline Rules
52150 InlineLexer.rules = inline;
52153 * Static Lexing/Compiling Method
52156 InlineLexer.output = function(src, links, options) {
52157 var inline = new InlineLexer(links, options);
52158 return inline.output(src);
52165 InlineLexer.prototype.output = function(src) {
52175 if (cap = this.rules.escape.exec(src)) {
52176 src = src.substring(cap[0].length);
52182 if (cap = this.rules.autolink.exec(src)) {
52183 src = src.substring(cap[0].length);
52184 if (cap[2] === '@') {
52185 text = escape(this.mangle(cap[1]));
52186 href = 'mailto:' + text;
52188 text = escape(cap[1]);
52191 out += this.renderer.link(href, null, text);
52196 if (!this.inLink && (cap = this.rules.url.exec(src))) {
52197 cap[0] = this.rules._backpedal.exec(cap[0])[0];
52198 src = src.substring(cap[0].length);
52199 if (cap[2] === '@') {
52200 text = escape(cap[0]);
52201 href = 'mailto:' + text;
52203 text = escape(cap[0]);
52204 if (cap[1] === 'www.') {
52205 href = 'http://' + text;
52210 out += this.renderer.link(href, null, text);
52215 if (cap = this.rules.tag.exec(src)) {
52216 if (!this.inLink && /^<a /i.test(cap[0])) {
52217 this.inLink = true;
52218 } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
52219 this.inLink = false;
52221 src = src.substring(cap[0].length);
52222 out += this.options.sanitize
52223 ? this.options.sanitizer
52224 ? this.options.sanitizer(cap[0])
52231 if (cap = this.rules.link.exec(src)) {
52232 src = src.substring(cap[0].length);
52233 this.inLink = true;
52235 if (this.options.pedantic) {
52236 link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
52245 title = cap[3] ? cap[3].slice(1, -1) : '';
52247 href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
52248 out += this.outputLink(cap, {
52249 href: InlineLexer.escapes(href),
52250 title: InlineLexer.escapes(title)
52252 this.inLink = false;
52257 if ((cap = this.rules.reflink.exec(src))
52258 || (cap = this.rules.nolink.exec(src))) {
52259 src = src.substring(cap[0].length);
52260 link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
52261 link = this.links[link.toLowerCase()];
52262 if (!link || !link.href) {
52263 out += cap[0].charAt(0);
52264 src = cap[0].substring(1) + src;
52267 this.inLink = true;
52268 out += this.outputLink(cap, link);
52269 this.inLink = false;
52274 if (cap = this.rules.strong.exec(src)) {
52275 src = src.substring(cap[0].length);
52276 out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
52281 if (cap = this.rules.em.exec(src)) {
52282 src = src.substring(cap[0].length);
52283 out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
52288 if (cap = this.rules.code.exec(src)) {
52289 src = src.substring(cap[0].length);
52290 out += this.renderer.codespan(escape(cap[2].trim(), true));
52295 if (cap = this.rules.br.exec(src)) {
52296 src = src.substring(cap[0].length);
52297 out += this.renderer.br();
52302 if (cap = this.rules.del.exec(src)) {
52303 src = src.substring(cap[0].length);
52304 out += this.renderer.del(this.output(cap[1]));
52309 if (cap = this.rules.text.exec(src)) {
52310 src = src.substring(cap[0].length);
52311 out += this.renderer.text(escape(this.smartypants(cap[0])));
52316 throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
52323 InlineLexer.escapes = function(text) {
52324 return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
52331 InlineLexer.prototype.outputLink = function(cap, link) {
52332 var href = link.href,
52333 title = link.title ? escape(link.title) : null;
52335 return cap[0].charAt(0) !== '!'
52336 ? this.renderer.link(href, title, this.output(cap[1]))
52337 : this.renderer.image(href, title, escape(cap[1]));
52341 * Smartypants Transformations
52344 InlineLexer.prototype.smartypants = function(text) {
52345 if (!this.options.smartypants) return text;
52348 .replace(/---/g, '\u2014')
52350 .replace(/--/g, '\u2013')
52352 .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
52353 // closing singles & apostrophes
52354 .replace(/'/g, '\u2019')
52356 .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
52358 .replace(/"/g, '\u201d')
52360 .replace(/\.{3}/g, '\u2026');
52367 InlineLexer.prototype.mangle = function(text) {
52368 if (!this.options.mangle) return text;
52374 for (; i < l; i++) {
52375 ch = text.charCodeAt(i);
52376 if (Math.random() > 0.5) {
52377 ch = 'x' + ch.toString(16);
52379 out += '&#' + ch + ';';
52389 function Renderer(options) {
52390 this.options = options || marked.defaults;
52393 Renderer.prototype.code = function(code, lang, escaped) {
52394 if (this.options.highlight) {
52395 var out = this.options.highlight(code, lang);
52396 if (out != null && out !== code) {
52403 return '<pre><code>'
52404 + (escaped ? code : escape(code, true))
52408 return '<pre><code class="'
52409 + this.options.langPrefix
52410 + escape(lang, true)
52412 + (escaped ? code : escape(code, true))
52413 + '</code></pre>\n';
52416 Renderer.prototype.blockquote = function(quote) {
52417 return '<blockquote>\n' + quote + '</blockquote>\n';
52420 Renderer.prototype.html = function(html) {
52424 Renderer.prototype.heading = function(text, level, raw) {
52425 if (this.options.headerIds) {
52429 + this.options.headerPrefix
52430 + raw.toLowerCase().replace(/[^\w]+/g, '-')
52438 return '<h' + level + '>' + text + '</h' + level + '>\n';
52441 Renderer.prototype.hr = function() {
52442 return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
52445 Renderer.prototype.list = function(body, ordered, start) {
52446 var type = ordered ? 'ol' : 'ul',
52447 startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
52448 return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
52451 Renderer.prototype.listitem = function(text) {
52452 return '<li>' + text + '</li>\n';
52455 Renderer.prototype.checkbox = function(checked) {
52457 + (checked ? 'checked="" ' : '')
52458 + 'disabled="" type="checkbox"'
52459 + (this.options.xhtml ? ' /' : '')
52463 Renderer.prototype.paragraph = function(text) {
52464 return '<p>' + text + '</p>\n';
52467 Renderer.prototype.table = function(header, body) {
52468 if (body) body = '<tbody>' + body + '</tbody>';
52478 Renderer.prototype.tablerow = function(content) {
52479 return '<tr>\n' + content + '</tr>\n';
52482 Renderer.prototype.tablecell = function(content, flags) {
52483 var type = flags.header ? 'th' : 'td';
52484 var tag = flags.align
52485 ? '<' + type + ' align="' + flags.align + '">'
52486 : '<' + type + '>';
52487 return tag + content + '</' + type + '>\n';
52490 // span level renderer
52491 Renderer.prototype.strong = function(text) {
52492 return '<strong>' + text + '</strong>';
52495 Renderer.prototype.em = function(text) {
52496 return '<em>' + text + '</em>';
52499 Renderer.prototype.codespan = function(text) {
52500 return '<code>' + text + '</code>';
52503 Renderer.prototype.br = function() {
52504 return this.options.xhtml ? '<br/>' : '<br>';
52507 Renderer.prototype.del = function(text) {
52508 return '<del>' + text + '</del>';
52511 Renderer.prototype.link = function(href, title, text) {
52512 if (this.options.sanitize) {
52514 var prot = decodeURIComponent(unescape(href))
52515 .replace(/[^\w:]/g, '')
52520 if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
52524 if (this.options.baseUrl && !originIndependentUrl.test(href)) {
52525 href = resolveUrl(this.options.baseUrl, href);
52528 href = encodeURI(href).replace(/%25/g, '%');
52532 var out = '<a href="' + escape(href) + '"';
52534 out += ' title="' + title + '"';
52536 out += '>' + text + '</a>';
52540 Renderer.prototype.image = function(href, title, text) {
52541 if (this.options.baseUrl && !originIndependentUrl.test(href)) {
52542 href = resolveUrl(this.options.baseUrl, href);
52544 var out = '<img src="' + href + '" alt="' + text + '"';
52546 out += ' title="' + title + '"';
52548 out += this.options.xhtml ? '/>' : '>';
52552 Renderer.prototype.text = function(text) {
52558 * returns only the textual part of the token
52561 function TextRenderer() {}
52563 // no need for block level renderers
52565 TextRenderer.prototype.strong =
52566 TextRenderer.prototype.em =
52567 TextRenderer.prototype.codespan =
52568 TextRenderer.prototype.del =
52569 TextRenderer.prototype.text = function (text) {
52573 TextRenderer.prototype.link =
52574 TextRenderer.prototype.image = function(href, title, text) {
52578 TextRenderer.prototype.br = function() {
52583 * Parsing & Compiling
52586 function Parser(options) {
52589 this.options = options || marked.defaults;
52590 this.options.renderer = this.options.renderer || new Renderer();
52591 this.renderer = this.options.renderer;
52592 this.renderer.options = this.options;
52596 * Static Parse Method
52599 Parser.parse = function(src, options) {
52600 var parser = new Parser(options);
52601 return parser.parse(src);
52608 Parser.prototype.parse = function(src) {
52609 this.inline = new InlineLexer(src.links, this.options);
52610 // use an InlineLexer with a TextRenderer to extract pure text
52611 this.inlineText = new InlineLexer(
52613 merge({}, this.options, {renderer: new TextRenderer()})
52615 this.tokens = src.reverse();
52618 while (this.next()) {
52629 Parser.prototype.next = function() {
52630 return this.token = this.tokens.pop();
52634 * Preview Next Token
52637 Parser.prototype.peek = function() {
52638 return this.tokens[this.tokens.length - 1] || 0;
52642 * Parse Text Tokens
52645 Parser.prototype.parseText = function() {
52646 var body = this.token.text;
52648 while (this.peek().type === 'text') {
52649 body += '\n' + this.next().text;
52652 return this.inline.output(body);
52656 * Parse Current Token
52659 Parser.prototype.tok = function() {
52660 switch (this.token.type) {
52665 return this.renderer.hr();
52668 return this.renderer.heading(
52669 this.inline.output(this.token.text),
52671 unescape(this.inlineText.output(this.token.text)));
52674 return this.renderer.code(this.token.text,
52676 this.token.escaped);
52688 for (i = 0; i < this.token.header.length; i++) {
52689 cell += this.renderer.tablecell(
52690 this.inline.output(this.token.header[i]),
52691 { header: true, align: this.token.align[i] }
52694 header += this.renderer.tablerow(cell);
52696 for (i = 0; i < this.token.cells.length; i++) {
52697 row = this.token.cells[i];
52700 for (j = 0; j < row.length; j++) {
52701 cell += this.renderer.tablecell(
52702 this.inline.output(row[j]),
52703 { header: false, align: this.token.align[j] }
52707 body += this.renderer.tablerow(cell);
52709 return this.renderer.table(header, body);
52711 case 'blockquote_start': {
52714 while (this.next().type !== 'blockquote_end') {
52715 body += this.tok();
52718 return this.renderer.blockquote(body);
52720 case 'list_start': {
52722 var ordered = this.token.ordered,
52723 start = this.token.start;
52725 while (this.next().type !== 'list_end') {
52726 body += this.tok();
52729 return this.renderer.list(body, ordered, start);
52731 case 'list_item_start': {
52734 if (this.token.task) {
52735 body += this.renderer.checkbox(this.token.checked);
52738 while (this.next().type !== 'list_item_end') {
52739 body += this.token.type === 'text'
52744 return this.renderer.listitem(body);
52746 case 'loose_item_start': {
52749 while (this.next().type !== 'list_item_end') {
52750 body += this.tok();
52753 return this.renderer.listitem(body);
52756 // TODO parse inline content if parameter markdown=1
52757 return this.renderer.html(this.token.text);
52759 case 'paragraph': {
52760 return this.renderer.paragraph(this.inline.output(this.token.text));
52763 return this.renderer.paragraph(this.parseText());
52772 function escape(html, encode) {
52774 .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&')
52775 .replace(/</g, '<')
52776 .replace(/>/g, '>')
52777 .replace(/"/g, '"')
52778 .replace(/'/g, ''');
52781 function unescape(html) {
52782 // explicitly match decimal, hex, and named HTML entities
52783 return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
52784 n = n.toLowerCase();
52785 if (n === 'colon') return ':';
52786 if (n.charAt(0) === '#') {
52787 return n.charAt(1) === 'x'
52788 ? String.fromCharCode(parseInt(n.substring(2), 16))
52789 : String.fromCharCode(+n.substring(1));
52795 function edit(regex, opt) {
52796 regex = regex.source || regex;
52799 replace: function(name, val) {
52800 val = val.source || val;
52801 val = val.replace(/(^|[^\[])\^/g, '$1');
52802 regex = regex.replace(name, val);
52805 getRegex: function() {
52806 return new RegExp(regex, opt);
52811 function resolveUrl(base, href) {
52812 if (!baseUrls[' ' + base]) {
52813 // we can ignore everything in base after the last slash of its path component,
52814 // but we might need to add _that_
52815 // https://tools.ietf.org/html/rfc3986#section-3
52816 if (/^[^:]+:\/*[^/]*$/.test(base)) {
52817 baseUrls[' ' + base] = base + '/';
52819 baseUrls[' ' + base] = base.replace(/[^/]*$/, '');
52822 base = baseUrls[' ' + base];
52824 if (href.slice(0, 2) === '//') {
52825 return base.replace(/:[\s\S]*/, ':') + href;
52826 } else if (href.charAt(0) === '/') {
52827 return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
52829 return base + href;
52833 var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
52838 function merge(obj) {
52843 for (; i < arguments.length; i++) {
52844 target = arguments[i];
52845 for (key in target) {
52846 if (Object.prototype.hasOwnProperty.call(target, key)) {
52847 obj[key] = target[key];
52855 function splitCells(tableRow, count) {
52856 var cells = tableRow.replace(/([^\\])\|/g, '$1 |').split(/ +\| */),
52859 if (cells.length > count) {
52860 cells.splice(count);
52862 while (cells.length < count) cells.push('');
52865 for (; i < cells.length; i++) {
52866 cells[i] = cells[i].replace(/\\\|/g, '|');
52875 function marked(src, opt, callback) {
52876 // throw error in case of non string input
52877 if (typeof src === 'undefined' || src === null) {
52878 throw new Error('marked(): input parameter is undefined or null');
52880 if (typeof src !== 'string') {
52881 throw new Error('marked(): input parameter is of type '
52882 + Object.prototype.toString.call(src) + ', string expected');
52885 if (callback || typeof opt === 'function') {
52891 opt = merge({}, marked.defaults, opt || {});
52893 var highlight = opt.highlight,
52899 tokens = Lexer.lex(src, opt);
52901 return callback(e);
52904 pending = tokens.length;
52906 var done = function(err) {
52908 opt.highlight = highlight;
52909 return callback(err);
52915 out = Parser.parse(tokens, opt);
52920 opt.highlight = highlight;
52924 : callback(null, out);
52927 if (!highlight || highlight.length < 3) {
52931 delete opt.highlight;
52933 if (!pending) return done();
52935 for (; i < tokens.length; i++) {
52937 if (token.type !== 'code') {
52938 return --pending || done();
52940 return highlight(token.text, token.lang, function(err, code) {
52941 if (err) return done(err);
52942 if (code == null || code === token.text) {
52943 return --pending || done();
52946 token.escaped = true;
52947 --pending || done();
52955 if (opt) opt = merge({}, marked.defaults, opt);
52956 return Parser.parse(Lexer.lex(src, opt), opt);
52958 e.message += '\nPlease report this to https://github.com/markedjs/marked.';
52959 if ((opt || marked.defaults).silent) {
52960 return '<p>An error occurred:</p><pre>'
52961 + escape(e.message + '', true)
52973 marked.setOptions = function(opt) {
52974 merge(marked.defaults, opt);
52978 marked.getDefaults = function () {
52986 langPrefix: 'language-',
52989 renderer: new Renderer(),
52994 smartypants: false,
53000 marked.defaults = marked.getDefaults();
53006 marked.Parser = Parser;
53007 marked.parser = Parser.parse;
53009 marked.Renderer = Renderer;
53010 marked.TextRenderer = TextRenderer;
53012 marked.Lexer = Lexer;
53013 marked.lexer = Lexer.lex;
53015 marked.InlineLexer = InlineLexer;
53016 marked.inlineLexer = InlineLexer.output;
53018 marked.parse = marked;
53021 module.exports = marked;
53023 })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
53026 function pointBox(loc, context) {
53027 var rect = context.surfaceRect();
53028 var point$$1 = context.curtainProjection(loc);
53030 left: point$$1[0] + rect.left - 40,
53031 top: point$$1[1] + rect.top - 60,
53038 function pad$1(locOrBox, padding, context) {
53040 if (locOrBox instanceof Array) {
53041 var rect = context.surfaceRect();
53042 var point$$1 = context.curtainProjection(locOrBox);
53044 left: point$$1[0] + rect.left,
53045 top: point$$1[1] + rect.top
53052 left: box.left - padding,
53053 top: box.top - padding,
53054 width: (box.width || 0) + 2 * padding,
53055 height: (box.width || 0) + 2 * padding
53060 function icon(name, svgklass, useklass) {
53061 return '<svg class="icon ' + (svgklass || '') + '">' +
53062 '<use xlink:href="' + name + '"' +
53063 (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
53067 function slugify(text) {
53068 return text.toString().toLowerCase()
53069 .replace(/\s+/g, '-') // Replace spaces with -
53070 .replace(/[^\w\-]+/g, '') // Remove all non-word chars
53071 .replace(/\-\-+/g, '-') // Replace multiple - with single -
53072 .replace(/^-+/, '') // Trim - from start of text
53073 .replace(/-+$/, ''); // Trim - from end of text
53077 // console warning for missing walkthrough names
53078 var missingStrings = {};
53079 function checkKey(key, text) {
53080 if (t(key, { default: undefined}) === undefined) {
53081 if (missingStrings.hasOwnProperty(key)) return; // warn once
53082 missingStrings[key] = text;
53083 var missing = key + ': ' + text;
53084 if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
53089 function localize(obj) {
53092 // Assign name if entity has one..
53093 var name = obj.tags && obj.tags.name;
53095 key = 'intro.graph.name.' + slugify(name);
53096 obj.tags.name = t(key, { default: name });
53097 checkKey(key, name);
53100 // Assign street name if entity has one..
53101 var street = obj.tags && obj.tags['addr:street'];
53103 key = 'intro.graph.name.' + slugify(street);
53104 obj.tags['addr:street'] = t(key, { default: street });
53105 checkKey(key, street);
53107 // Add address details common across walkthrough..
53109 'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
53110 'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
53112 addrTags.forEach(function(k) {
53113 var key = 'intro.graph.' + k,
53115 val = obj.tags && obj.tags[tag],
53116 str = t(key, { default: val });
53119 if (str.match(/^<.*>$/) !== null) {
53120 delete obj.tags[tag];
53122 obj.tags[tag] = str;
53132 // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
53133 function isMostlySquare(points) {
53134 // note: uses 15 here instead of the 12 from actionOrthogonalize because
53135 // actionOrthogonalize can actually straighten some larger angles as it iterates
53136 var threshold = 15, // degrees within right or straight
53137 lowerBound = Math.cos((90 - threshold) * Math.PI / 180), // near right
53138 upperBound = Math.cos(threshold * Math.PI / 180), // near straight
53141 for (var i = 0; i < points.length; i++) {
53142 mag = Math.abs(normalizedDotProduct(i, points));
53143 if (mag > lowerBound && mag < upperBound) {
53151 function normalizedDotProduct(i, points) {
53152 var a = points[(i - 1 + points.length) % points.length],
53154 c = points[(i + 1) % points.length],
53155 p = subtractPoints(a, b),
53156 q = subtractPoints(c, b);
53158 p = normalizePoint(p);
53159 q = normalizePoint(q);
53161 return p[0] * q[0] + p[1] * q[1];
53164 function subtractPoints(a, b) {
53165 return [a[0] - b[0], a[1] - b[1]];
53168 function normalizePoint(point$$1) {
53169 var vector = [0, 0];
53170 var length = Math.sqrt(point$$1[0] * point$$1[0] + point$$1[1] * point$$1[1]);
53171 if (length !== 0) {
53172 vector[0] = point$$1[0] / length;
53173 vector[1] = point$$1[1] / length;
53181 function selectMenuItem(operation) {
53182 var selector$$1 = '.edit-menu .edit-menu-item-' + operation +
53183 ', .radial-menu .radial-menu-item-' + operation;
53184 return select(selector$$1);
53188 function transitionTime(point1, point2) {
53189 var distance = geoSphericalDistance(point1, point2);
53190 if (distance === 0)
53192 else if (distance < 80)
53198 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]}};
53200 // Tooltips and svg mask used to highlight certain features
53201 function uiCurtain() {
53203 var surface = select(null),
53204 tooltip = select(null),
53205 darkness = select(null);
53207 function curtain(selection$$1) {
53208 surface = selection$$1
53210 .attr('id', 'curtain')
53211 .style('z-index', 1000)
53212 .style('pointer-events', 'none')
53213 .style('position', 'absolute')
53217 darkness = surface.append('path')
53220 .attr('class', 'curtain-darkness');
53222 select(window).on('resize.curtain', resize);
53224 tooltip = selection$$1.append('div')
53225 .attr('class', 'tooltip')
53226 .style('z-index', 1002);
53230 .attr('class', 'tooltip-arrow');
53234 .attr('class', 'tooltip-inner');
53239 function resize() {
53241 .attr('width', window.innerWidth)
53242 .attr('height', window.innerHeight);
53243 curtain.cut(darkness.datum());
53249 * Reveal cuts the curtain to highlight the given box,
53250 * and shows a tooltip with instructions next to the box.
53252 * @param {String|ClientRect} [box] box used to cut the curtain
53253 * @param {String} [text] text for a tooltip
53254 * @param {Object} [options]
53255 * @param {string} [options.tooltipClass] optional class to add to the tooltip
53256 * @param {integer} [options.duration] transition time in milliseconds
53257 * @param {string} [options.buttonText] if set, create a button with this text label
53258 * @param {function} [options.buttonCallback] if set, the callback for the button
53259 * @param {String|ClientRect} [options.tooltipBox] box for tooltip position, if different from box for the curtain
53261 curtain.reveal = function(box, text, options) {
53262 if (typeof box === 'string') {
53263 box = select(box).node();
53265 if (box && box.getBoundingClientRect) {
53266 box = copyBox(box.getBoundingClientRect());
53269 options = options || {};
53272 if (options.tooltipBox) {
53273 tooltipBox = options.tooltipBox;
53274 if (typeof tooltipBox === 'string') {
53275 tooltipBox = select(tooltipBox).node();
53277 if (tooltipBox && tooltipBox.getBoundingClientRect) {
53278 tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
53284 if (tooltipBox && text) {
53285 // pseudo markdown bold text for the instruction section..
53286 var parts = text.split('**');
53287 var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
53289 html += '<span class="instruction">' + parts[1] + '</span>';
53292 html = html.replace(/\*(.*?)\*/g, '<em>$1</em>'); // emphasis
53293 html = html.replace(/\{br\}/g, '<br/><br/>'); // linebreak
53295 if (options.buttonText && options.buttonCallback) {
53296 html += '<div class="button-section">' +
53297 '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
53300 var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
53302 .classed(classes, true)
53303 .selectAll('.tooltip-inner')
53306 if (options.buttonText && options.buttonCallback) {
53307 var button = tooltip.selectAll('.button-section .button.action');
53309 .on('click', function() {
53310 event.preventDefault();
53311 options.buttonCallback();
53315 var tip = copyBox(tooltip.node().getBoundingClientRect()),
53316 w = window.innerWidth,
53317 h = window.innerHeight,
53318 tooltipWidth = 200,
53323 // hack: this will have bottom placement,
53324 // so need to reserve extra space for the tooltip illustration.
53325 if (options.tooltipClass === 'intro-mouse') {
53329 // trim box dimensions to just the portion that fits in the window..
53330 if (tooltipBox.top + tooltipBox.height > h) {
53331 tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
53333 if (tooltipBox.left + tooltipBox.width > w) {
53334 tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
53337 // determine tooltip placement..
53339 if (tooltipBox.top + tooltipBox.height < 100) {
53340 // tooltip below box..
53343 tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
53344 tooltipBox.top + tooltipBox.height
53347 } else if (tooltipBox.top > h - 140) {
53348 // tooltip above box..
53351 tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
53352 tooltipBox.top - tip.height
53356 // tooltip to the side of the tooltipBox..
53357 var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
53359 if (textDirection === 'rtl') {
53360 if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
53362 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
53366 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
53370 if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
53372 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
53376 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
53381 if (options.duration !== 0 || !tooltip.classed(side)) {
53382 tooltip.call(uiToggle(true));
53386 .style('top', pos[1] + 'px')
53387 .style('left', pos[0] + 'px')
53388 .attr('class', classes + ' ' + side);
53391 // shift tooltip-inner if it is very close to the top or bottom edge
53392 // (doesn't affect the placement of the tooltip-arrow)
53394 if (side === 'left' || side === 'right') {
53396 shiftY = 60 - pos[1];
53398 else if (pos[1] + tip.height > h - 100) {
53399 shiftY = h - pos[1] - tip.height - 100;
53402 tooltip.selectAll('.tooltip-inner')
53403 .style('top', shiftY + 'px');
53407 .classed('in', false)
53408 .call(uiToggle(false));
53411 curtain.cut(box, options.duration);
53417 curtain.cut = function(datum, duration) {
53418 darkness.datum(datum)
53422 if (duration === 0) {
53423 selection$$1 = darkness;
53425 selection$$1 = darkness
53427 .duration(duration || 600)
53432 .attr('d', function(d) {
53433 var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
53434 window.innerWidth + ',' + window.innerHeight + 'L' +
53435 window.innerWidth + ',0 Z';
53437 if (!d) return string;
53438 return string + 'M' +
53439 d.left + ',' + d.top + 'L' +
53440 d.left + ',' + (d.top + d.height) + 'L' +
53441 (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
53442 (d.left + d.width) + ',' + (d.top) + 'Z';
53448 curtain.remove = function() {
53451 select(window).on('resize.curtain', null);
53455 // ClientRects are immutable, so copy them to an object,
53456 // in case we need to trim the height/width.
53457 function copyBox(src) {
53461 bottom: src.bottom,
53472 function uiIntroWelcome(context, reveal) {
53473 var dispatch$$1 = dispatch('done'),
53474 listener = clickListener();
53477 title: 'intro.welcome.title'
53481 function welcome() {
53482 context.map().centerZoom([-85.63591, 41.94285], 19);
53483 reveal('.intro-nav-wrap .chapter-welcome',
53484 t('intro.welcome.welcome'),
53485 { buttonText: t('intro.ok'), buttonCallback: practice }
53489 function practice() {
53490 reveal('.intro-nav-wrap .chapter-welcome',
53491 t('intro.welcome.practice'),
53492 { buttonText: t('intro.ok'), buttonCallback: words }
53497 reveal('.intro-nav-wrap .chapter-welcome',
53498 t('intro.welcome.words'),
53499 { buttonText: t('intro.ok'), buttonCallback: mouse$$1 }
53504 function mouse$$1() {
53505 reveal('.intro-nav-wrap .chapter-welcome',
53506 t('intro.welcome.mouse'),
53507 { buttonText: t('intro.ok'), buttonCallback: leftClick }
53512 function leftClick() {
53516 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
53517 t('intro.welcome.leftclick', { num: times }),
53518 { tooltipClass: 'intro-mouse' }
53521 tooltip.selectAll('.tooltip-inner')
53522 .insert('svg', 'span')
53523 .attr('class', 'tooltip-illustration')
53525 .attr('xlink:href', '#iD-walkthrough-mouse');
53529 .attr('class', 'counter');
53531 tooltip.call(listener);
53533 listener.on('click', function(which) {
53534 if (which === 'left') {
53535 select('.curtain-tooltip.intro-mouse .counter')
53536 .text(String(++counter));
53538 if (counter === times) {
53539 window.setTimeout(function() { continueTo(rightClick); }, 1000);
53544 function continueTo(nextStep) {
53545 listener.on('click', null);
53546 tooltip.call(listener.off);
53547 tooltip.select('.counter').remove();
53553 function rightClick() {
53557 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
53558 t('intro.welcome.rightclick', { num: times }),
53559 { tooltipClass: 'intro-mouse' }
53562 tooltip.selectAll('.tooltip-inner')
53563 .insert('svg', 'span')
53564 .attr('class', 'tooltip-illustration')
53566 .attr('xlink:href', '#iD-walkthrough-mouse');
53570 .attr('class', 'counter');
53572 tooltip.call(listener);
53574 listener.on('click', function(which) {
53575 if (which === 'right') {
53576 select('.curtain-tooltip.intro-mouse .counter')
53577 .text(String(++counter));
53579 if (counter === times) {
53580 window.setTimeout(function() { continueTo(chapters); }, 1000);
53585 function continueTo(nextStep) {
53586 listener.on('click', null);
53587 tooltip.call(listener.off);
53588 tooltip.select('.counter').remove();
53594 function chapters() {
53595 dispatch$$1.call('done');
53596 reveal('.intro-nav-wrap .chapter-navigation',
53597 t('intro.welcome.chapters', { next: t('intro.navigation.title') })
53602 chapter.enter = function() {
53607 chapter.exit = function() {
53609 select('.curtain-tooltip.intro-mouse')
53610 .selectAll('.counter')
53615 chapter.restart = function() {
53621 return utilRebind(chapter, dispatch$$1, 'on');
53626 function clickListener() {
53627 var dispatch$$1 = dispatch('click'),
53629 tooltip = select(null),
53632 // `down` keeps track of which buttons/keys are down.
53633 // Setting a property in `down` happens immediately.
53634 // Unsetting a property in `down` is delayed because
53635 // on Windows a contextmenu event happens after keyup/mouseup
53637 function keydown() {
53638 if (event.keyCode === 93) { // context menu
53639 event.preventDefault();
53640 event.stopPropagation();
53641 down.menu = event.timeStamp;
53642 tooltip.classed('rightclick', true);
53648 if (event.keyCode === 93) { // context menu
53649 event.preventDefault();
53650 event.stopPropagation();
53651 var endTime = event.timeStamp,
53652 startTime = down.menu || endTime,
53653 delay = (endTime - startTime < minTime) ? minTime : 0;
53655 window.setTimeout(function() {
53656 tooltip.classed('rightclick', false);
53657 down.menu = undefined; // delayed, for Windows
53660 dispatch$$1.call('click', this, 'right');
53665 function mousedown() {
53666 var button = event.button;
53667 if (button === 0 && !event.ctrlKey) {
53668 tooltip.classed('leftclick', true);
53669 } else if (button === 2) {
53670 tooltip.classed('rightclick', true);
53672 down[button] = event.timeStamp;
53676 function mouseup() {
53677 var button = event.button,
53678 endTime = event.timeStamp,
53679 startTime = down[button] || endTime,
53680 delay = (endTime - startTime < minTime) ? minTime : 0;
53682 if (button === 0 && !event.ctrlKey) {
53683 window.setTimeout(function() {
53684 tooltip.classed('leftclick', false);
53685 down[button] = undefined; // delayed, for Windows
53688 dispatch$$1.call('click', this, 'left');
53690 } else if (button === 2) {
53691 window.setTimeout(function() {
53692 tooltip.classed('rightclick', false);
53693 down[button] = undefined; // delayed, for Windows
53696 dispatch$$1.call('click', this, 'right');
53699 window.setTimeout(function() {
53700 down[button] = undefined; // delayed, for Windows
53706 function contextmenu() {
53707 event.preventDefault();
53708 event.stopPropagation();
53709 if (!down[2] && !down.menu) {
53710 tooltip.classed('rightclick', true);
53711 window.setTimeout(function() {
53712 tooltip.classed('rightclick', false);
53714 dispatch$$1.call('click', this, 'right');
53719 var behavior = function(selection$$1) {
53720 tooltip = selection$$1;
53724 .on('keydown.intro', keydown)
53725 .on('keyup.intro', keyup)
53726 .on('mousedown.intro', mousedown)
53727 .on('mouseup.intro', mouseup)
53728 .on('contextmenu.intro', contextmenu);
53732 behavior.off = function() {
53734 .on('keydown.intro', null)
53735 .on('keyup.intro', null)
53736 .on('mousedown.intro', null)
53737 .on('mouseup.intro', null)
53738 .on('contextmenu.intro', null);
53741 .classed('leftclick', false)
53742 .classed('rightclick', false);
53745 return utilRebind(behavior, dispatch$$1, 'on');
53748 function uiIntroNavigation(context, reveal) {
53749 var dispatch$$1 = dispatch('done'),
53752 townHall = [-85.63591, 41.94285],
53753 springStreetId = 'w397',
53754 springStreetEndId = 'n1834',
53755 springStreet = [-85.63582, 41.94255],
53756 onewayField = context.presets().field('oneway'),
53757 maxspeedField = context.presets().field('maxspeed');
53761 title: 'intro.navigation.title'
53765 function timeout(f, t$$1) {
53766 timeouts.push(window.setTimeout(f, t$$1));
53770 function eventCancel() {
53771 event.stopPropagation();
53772 event.preventDefault();
53776 function isTownHallSelected() {
53777 var ids = context.selectedIDs();
53778 return ids.length === 1 && ids[0] === hallId;
53782 function dragMap() {
53783 context.enter(modeBrowse(context));
53784 context.history().reset('initial');
53786 var msec = transitionTime(townHall, context.map().center());
53787 if (msec) { reveal(null, null, { duration: 0 }); }
53788 context.map().zoom(19).centerEase(townHall, msec);
53790 timeout(function() {
53791 var centerStart = context.map().center();
53793 reveal('#surface', t('intro.navigation.drag'));
53794 context.map().on('drawn.intro', function() {
53795 reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
53798 context.map().on('move.intro', function() {
53799 var centerNow = context.map().center();
53800 if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
53801 context.map().on('move.intro', null);
53802 timeout(function() { continueTo(zoomMap); }, 3000);
53808 function continueTo(nextStep) {
53809 context.map().on('move.intro drawn.intro', null);
53815 function zoomMap() {
53816 var zoomStart = context.map().zoom();
53819 t('intro.navigation.zoom', {
53820 plus: icon('#iD-icon-plus', 'pre-text'),
53821 minus: icon('#iD-icon-minus', 'pre-text')
53825 context.map().on('drawn.intro', function() {
53827 t('intro.navigation.zoom', {
53828 plus: icon('#iD-icon-plus', 'pre-text'),
53829 minus: icon('#iD-icon-minus', 'pre-text')
53830 }), { duration: 0 }
53834 context.map().on('move.intro', function() {
53835 if (context.map().zoom() !== zoomStart) {
53836 context.map().on('move.intro', null);
53837 timeout(function() { continueTo(features); }, 3000);
53841 function continueTo(nextStep) {
53842 context.map().on('move.intro drawn.intro', null);
53848 function features() {
53849 var onClick = function() { continueTo(pointsLinesAreas); };
53851 reveal('#surface', t('intro.navigation.features'),
53852 { buttonText: t('intro.ok'), buttonCallback: onClick }
53855 context.map().on('drawn.intro', function() {
53856 reveal('#surface', t('intro.navigation.features'),
53857 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
53861 function continueTo(nextStep) {
53862 context.map().on('drawn.intro', null);
53867 function pointsLinesAreas() {
53868 var onClick = function() { continueTo(nodesWays); };
53870 reveal('#surface', t('intro.navigation.points_lines_areas'),
53871 { buttonText: t('intro.ok'), buttonCallback: onClick }
53874 context.map().on('drawn.intro', function() {
53875 reveal('#surface', t('intro.navigation.points_lines_areas'),
53876 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
53880 function continueTo(nextStep) {
53881 context.map().on('drawn.intro', null);
53886 function nodesWays() {
53887 var onClick = function() { continueTo(clickTownHall); };
53889 reveal('#surface', t('intro.navigation.nodes_ways'),
53890 { buttonText: t('intro.ok'), buttonCallback: onClick }
53893 context.map().on('drawn.intro', function() {
53894 reveal('#surface', t('intro.navigation.nodes_ways'),
53895 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
53899 function continueTo(nextStep) {
53900 context.map().on('drawn.intro', null);
53905 function clickTownHall() {
53906 context.enter(modeBrowse(context));
53907 context.history().reset('initial');
53909 reveal(null, null, { duration: 0 });
53910 context.map().zoomEase(19, 500);
53912 timeout(function() {
53913 var entity = context.hasEntity(hallId);
53914 if (!entity) return;
53915 context.map().centerEase(entity.loc, 500);
53917 timeout(function() {
53918 var entity = context.hasEntity(hallId);
53919 if (!entity) return;
53920 var box = pointBox(entity.loc, context);
53921 reveal(box, t('intro.navigation.click_townhall'));
53923 context.map().on('move.intro drawn.intro', function() {
53924 var entity = context.hasEntity(hallId);
53925 if (!entity) return;
53926 var box = pointBox(entity.loc, context);
53927 reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
53930 context.on('enter.intro', function() {
53931 if (isTownHallSelected()) continueTo(selectedTownHall);
53934 }, 550); // after centerEase
53936 }, 550); // after zoomEase
53938 context.history().on('change.intro', function() {
53939 if (!context.hasEntity(hallId)) {
53940 continueTo(clickTownHall);
53944 function continueTo(nextStep) {
53945 context.on('enter.intro', null);
53946 context.map().on('move.intro drawn.intro', null);
53947 context.history().on('change.intro', null);
53953 function selectedTownHall() {
53954 if (!isTownHallSelected()) return clickTownHall();
53956 var entity = context.hasEntity(hallId);
53957 if (!entity) return clickTownHall();
53959 var box = pointBox(entity.loc, context);
53960 var onClick = function() { continueTo(editorTownHall); };
53962 reveal(box, t('intro.navigation.selected_townhall'),
53963 { buttonText: t('intro.ok'), buttonCallback: onClick }
53966 context.map().on('move.intro drawn.intro', function() {
53967 var entity = context.hasEntity(hallId);
53968 if (!entity) return;
53969 var box = pointBox(entity.loc, context);
53970 reveal(box, t('intro.navigation.selected_townhall'),
53971 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
53975 context.history().on('change.intro', function() {
53976 if (!context.hasEntity(hallId)) {
53977 continueTo(clickTownHall);
53981 function continueTo(nextStep) {
53982 context.map().on('move.intro drawn.intro', null);
53983 context.history().on('change.intro', null);
53989 function editorTownHall() {
53990 if (!isTownHallSelected()) return clickTownHall();
53992 // disallow scrolling
53993 select('.inspector-wrap').on('wheel.intro', eventCancel);
53995 var onClick = function() { continueTo(presetTownHall); };
53997 reveal('.entity-editor-pane',
53998 t('intro.navigation.editor_townhall'),
53999 { buttonText: t('intro.ok'), buttonCallback: onClick }
54002 context.on('exit.intro', function() {
54003 continueTo(clickTownHall);
54006 context.history().on('change.intro', function() {
54007 if (!context.hasEntity(hallId)) {
54008 continueTo(clickTownHall);
54012 function continueTo(nextStep) {
54013 context.on('exit.intro', null);
54014 context.history().on('change.intro', null);
54015 select('.inspector-wrap').on('wheel.intro', null);
54021 function presetTownHall() {
54022 if (!isTownHallSelected()) return clickTownHall();
54024 // reset pane, in case user happened to change it..
54025 select('.inspector-wrap .panewrap').style('right', '0%');
54026 // disallow scrolling
54027 select('.inspector-wrap').on('wheel.intro', eventCancel);
54029 // preset match, in case the user happened to change it.
54030 var entity = context.entity(context.selectedIDs()[0]);
54031 var preset = context.presets().match(entity, context.graph());
54033 var onClick = function() { continueTo(fieldsTownHall); };
54035 context.on('exit.intro', function() {
54036 continueTo(clickTownHall);
54039 context.history().on('change.intro', function() {
54040 if (!context.hasEntity(hallId)) {
54041 continueTo(clickTownHall);
54045 reveal('.inspector-body .preset-list-item.inspector-inner',
54046 t('intro.navigation.preset_townhall', { preset: preset.name() }),
54047 { buttonText: t('intro.ok'), buttonCallback: onClick }
54050 function continueTo(nextStep) {
54051 context.on('exit.intro', null);
54052 context.history().on('change.intro', null);
54053 select('.inspector-wrap').on('wheel.intro', null);
54059 function fieldsTownHall() {
54060 if (!isTownHallSelected()) return clickTownHall();
54062 // reset pane, in case user happened to change it..
54063 select('.inspector-wrap .panewrap').style('right', '0%');
54064 // disallow scrolling
54065 select('.inspector-wrap').on('wheel.intro', eventCancel);
54067 var onClick = function() { continueTo(closeTownHall); };
54069 reveal('.inspector-body .preset-editor',
54070 t('intro.navigation.fields_townhall'),
54071 { buttonText: t('intro.ok'), buttonCallback: onClick }
54074 context.on('exit.intro', function() {
54075 continueTo(clickTownHall);
54078 context.history().on('change.intro', function() {
54079 if (!context.hasEntity(hallId)) {
54080 continueTo(clickTownHall);
54084 function continueTo(nextStep) {
54085 context.on('exit.intro', null);
54086 context.history().on('change.intro', null);
54087 select('.inspector-wrap').on('wheel.intro', null);
54093 function closeTownHall() {
54094 if (!isTownHallSelected()) return clickTownHall();
54096 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
54097 var href = select(selector$$1).attr('href') || '#iD-icon-close';
54099 reveal('.entity-editor-pane',
54100 t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
54103 context.on('exit.intro', function() {
54104 continueTo(searchStreet);
54107 context.history().on('change.intro', function() {
54108 // update the close icon in the tooltip if the user edits something.
54109 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
54110 var href = select(selector$$1).attr('href') || '#iD-icon-close';
54112 reveal('.entity-editor-pane',
54113 t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
54118 function continueTo(nextStep) {
54119 context.on('exit.intro', null);
54120 context.history().on('change.intro', null);
54126 function searchStreet() {
54127 context.enter(modeBrowse(context));
54128 context.history().reset('initial'); // ensure spring street exists
54130 var msec = transitionTime(springStreet, context.map().center());
54131 if (msec) { reveal(null, null, { duration: 0 }); }
54132 context.map().zoom(19).centerEase(springStreet, msec); // ..and user can see it
54134 timeout(function() {
54135 reveal('.search-header input',
54136 t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
54139 select('.search-header input')
54140 .on('keyup.intro', checkSearchResult);
54145 function checkSearchResult() {
54146 var first = select('.feature-list-item:nth-child(0n+2)'), // skip "No Results" item
54147 firstName = first.select('.entity-name'),
54148 name = t('intro.graph.name.spring-street');
54150 if (!firstName.empty() && firstName.text() === name) {
54151 reveal(first.node(),
54152 t('intro.navigation.choose_street', { name: name }),
54156 context.on('exit.intro', function() {
54157 continueTo(selectedStreet);
54160 select('.search-header input')
54161 .on('keydown.intro', eventCancel, true)
54162 .on('keyup.intro', null);
54165 function continueTo(nextStep) {
54166 context.on('exit.intro', null);
54167 select('.search-header input')
54168 .on('keydown.intro', null)
54169 .on('keyup.intro', null);
54175 function selectedStreet() {
54176 if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
54177 return searchStreet();
54180 var onClick = function() { continueTo(editorStreet); };
54181 var entity = context.entity(springStreetEndId);
54182 var box = pointBox(entity.loc, context);
54186 t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
54187 { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
54190 timeout(function() {
54191 context.map().on('move.intro drawn.intro', function() {
54192 var entity = context.hasEntity(springStreetEndId);
54193 if (!entity) return;
54194 var box = pointBox(entity.loc, context);
54197 t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
54198 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
54201 }, 600); // after reveal.
54203 context.on('enter.intro', function(mode) {
54204 if (!context.hasEntity(springStreetId)) {
54205 return continueTo(searchStreet);
54207 var ids = context.selectedIDs();
54208 if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
54209 // keep Spring Street selected..
54210 context.enter(modeSelect(context, [springStreetId]));
54214 context.history().on('change.intro', function() {
54215 if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
54216 timeout(function() {
54217 continueTo(searchStreet);
54218 }, 300); // after any transition (e.g. if user deleted intersection)
54222 function continueTo(nextStep) {
54223 context.map().on('move.intro drawn.intro', null);
54224 context.on('enter.intro', null);
54225 context.history().on('change.intro', null);
54231 function editorStreet() {
54232 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
54233 var href = select(selector$$1).attr('href') || '#iD-icon-close';
54235 reveal('.entity-editor-pane',
54236 t('intro.navigation.editor_street', {
54237 button: icon(href, 'pre-text'),
54238 field1: onewayField.label(),
54239 field2: maxspeedField.label()
54243 context.on('exit.intro', function() {
54247 context.history().on('change.intro', function() {
54248 // update the close icon in the tooltip if the user edits something.
54249 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
54250 var href = select(selector$$1).attr('href') || '#iD-icon-close';
54252 reveal('.entity-editor-pane',
54253 t('intro.navigation.editor_street', {
54254 button: icon(href, 'pre-text'),
54255 field1: onewayField.label().toLowerCase(),
54256 field2: maxspeedField.label().toLowerCase()
54257 }), { duration: 0 }
54261 function continueTo(nextStep) {
54262 context.on('exit.intro', null);
54263 context.history().on('change.intro', null);
54270 dispatch$$1.call('done');
54271 reveal('#id-container',
54272 t('intro.navigation.play', { next: t('intro.points.title') }), {
54273 tooltipBox: '.intro-nav-wrap .chapter-point',
54274 buttonText: t('intro.ok'),
54275 buttonCallback: function() { reveal('#id-container'); }
54281 chapter.enter = function() {
54286 chapter.exit = function() {
54287 timeouts.forEach(window.clearTimeout);
54288 context.on('enter.intro exit.intro', null);
54289 context.map().on('move.intro drawn.intro', null);
54290 context.history().on('change.intro', null);
54291 select('.inspector-wrap').on('wheel.intro', null);
54292 select('.search-header input').on('keydown.intro keyup.intro', null);
54296 chapter.restart = function() {
54302 return utilRebind(chapter, dispatch$$1, 'on');
54305 function uiIntroPoint(context, reveal) {
54306 var dispatch$$1 = dispatch('done'),
54308 intersection = [-85.63279, 41.94394],
54309 building = [-85.632422, 41.944045],
54310 cafePreset = context.presets().item('amenity/cafe'),
54315 title: 'intro.points.title'
54319 function timeout(f, t$$1) {
54320 timeouts.push(window.setTimeout(f, t$$1));
54324 function revealEditMenu(loc, text, options) {
54325 var rect = context.surfaceRect();
54326 var point$$1 = context.curtainProjection(loc);
54328 var width = 250 + (2 * pad);
54330 var startX = rect.left + point$$1[0];
54331 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
54334 top: point$$1[1] + rect.top - 60,
54338 reveal(box, text, options);
54342 function eventCancel() {
54343 event.stopPropagation();
54344 event.preventDefault();
54348 function addPoint() {
54349 context.enter(modeBrowse(context));
54350 context.history().reset('initial');
54352 var msec = transitionTime(intersection, context.map().center());
54353 if (msec) { reveal(null, null, { duration: 0 }); }
54354 context.map().zoom(19).centerEase(intersection, msec);
54356 timeout(function() {
54357 var tooltip = reveal('button.add-point',
54358 t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') }));
54362 tooltip.selectAll('.tooltip-inner')
54363 .insert('svg', 'span')
54364 .attr('class', 'tooltip-illustration')
54366 .attr('xlink:href', '#iD-graphic-points');
54368 context.on('enter.intro', function(mode) {
54369 if (mode.id !== 'add-point') return;
54370 continueTo(placePoint);
54374 function continueTo(nextStep) {
54375 context.on('enter.intro', null);
54381 function placePoint() {
54382 if (context.mode().id !== 'add-point') {
54383 return chapter.restart();
54386 var pointBox$$1 = pad$1(building, 150, context);
54387 reveal(pointBox$$1, t('intro.points.place_point'));
54389 context.map().on('move.intro drawn.intro', function() {
54390 pointBox$$1 = pad$1(building, 150, context);
54391 reveal(pointBox$$1, t('intro.points.place_point'), { duration: 0 });
54394 context.on('enter.intro', function(mode) {
54395 if (mode.id !== 'select') return chapter.restart();
54396 pointId = context.mode().selectedIDs()[0];
54397 continueTo(searchPreset);
54400 function continueTo(nextStep) {
54401 context.map().on('move.intro drawn.intro', null);
54402 context.on('enter.intro', null);
54408 function searchPreset() {
54409 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
54413 // disallow scrolling
54414 select('.inspector-wrap').on('wheel.intro', eventCancel);
54416 select('.preset-search-input')
54417 .on('keydown.intro', null)
54418 .on('keyup.intro', checkPresetSearch);
54420 reveal('.preset-search-input',
54421 t('intro.points.search_cafe', { preset: cafePreset.name() })
54424 context.on('enter.intro', function(mode) {
54425 if (!pointId || !context.hasEntity(pointId)) {
54426 return continueTo(addPoint);
54429 var ids = context.selectedIDs();
54430 if (mode.id !== 'select' || !ids.length || ids[0] !== pointId) {
54431 // keep the user's point selected..
54432 context.enter(modeSelect(context, [pointId]));
54434 // disallow scrolling
54435 select('.inspector-wrap').on('wheel.intro', eventCancel);
54437 select('.preset-search-input')
54438 .on('keydown.intro', null)
54439 .on('keyup.intro', checkPresetSearch);
54441 reveal('.preset-search-input',
54442 t('intro.points.search_cafe', { preset: cafePreset.name() })
54445 context.history().on('change.intro', null);
54450 function checkPresetSearch() {
54451 var first = select('.preset-list-item:first-child');
54453 if (first.classed('preset-amenity-cafe')) {
54454 select('.preset-search-input')
54455 .on('keydown.intro', eventCancel, true)
54456 .on('keyup.intro', null);
54458 reveal(first.select('.preset-list-button').node(),
54459 t('intro.points.choose_cafe', { preset: cafePreset.name() }),
54463 context.history().on('change.intro', function() {
54464 continueTo(aboutFeatureEditor);
54469 function continueTo(nextStep) {
54470 context.on('enter.intro', null);
54471 context.history().on('change.intro', null);
54472 select('.inspector-wrap').on('wheel.intro', null);
54473 select('.preset-search-input').on('keydown.intro keyup.intro', null);
54479 function aboutFeatureEditor() {
54480 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
54484 timeout(function() {
54485 reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
54486 tooltipClass: 'intro-points-describe',
54487 buttonText: t('intro.ok'),
54488 buttonCallback: function() { continueTo(addName); }
54492 context.on('exit.intro', function() {
54493 // if user leaves select mode here, just continue with the tutorial.
54494 continueTo(reselectPoint);
54497 function continueTo(nextStep) {
54498 context.on('exit.intro', null);
54504 function addName() {
54505 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
54509 // reset pane, in case user happened to change it..
54510 select('.inspector-wrap .panewrap').style('right', '0%');
54512 timeout(function() {
54513 // It's possible for the user to add a name in a previous step..
54514 // If so, don't tell them to add the name in this step.
54515 // Give them an OK button instead.
54516 var entity = context.entity(pointId);
54517 if (entity.tags.name) {
54518 var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
54519 tooltipClass: 'intro-points-describe',
54520 buttonText: t('intro.ok'),
54521 buttonCallback: function() { continueTo(addCloseEditor); }
54523 tooltip.select('.instruction').style('display', 'none');
54526 reveal('.entity-editor-pane', t('intro.points.add_name'),
54527 { tooltipClass: 'intro-points-describe' }
54532 context.history().on('change.intro', function() {
54533 continueTo(addCloseEditor);
54536 context.on('exit.intro', function() {
54537 // if user leaves select mode here, just continue with the tutorial.
54538 continueTo(reselectPoint);
54541 function continueTo(nextStep) {
54542 context.on('exit.intro', null);
54543 context.history().on('change.intro', null);
54549 function addCloseEditor() {
54550 // reset pane, in case user happened to change it..
54551 select('.inspector-wrap .panewrap').style('right', '0%');
54553 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
54554 var href = select(selector$$1).attr('href') || '#iD-icon-close';
54556 context.on('exit.intro', function() {
54557 continueTo(reselectPoint);
54560 reveal('.entity-editor-pane',
54561 t('intro.points.add_close', { button: icon(href, 'pre-text') })
54564 function continueTo(nextStep) {
54565 context.on('exit.intro', null);
54571 function reselectPoint() {
54572 if (!pointId) return chapter.restart();
54573 var entity = context.hasEntity(pointId);
54574 if (!entity) return chapter.restart();
54576 // make sure it's still a cafe, in case user somehow changed it..
54577 var oldPreset = context.presets().match(entity, context.graph());
54578 context.replace(actionChangePreset(pointId, oldPreset, cafePreset));
54580 context.enter(modeBrowse(context));
54582 var msec = transitionTime(entity.loc, context.map().center());
54583 if (msec) { reveal(null, null, { duration: 0 }); }
54584 context.map().centerEase(entity.loc, msec);
54586 timeout(function() {
54587 var box = pointBox(entity.loc, context);
54588 reveal(box, t('intro.points.reselect'), { duration: 600 });
54590 timeout(function() {
54591 context.map().on('move.intro drawn.intro', function() {
54592 var entity = context.hasEntity(pointId);
54593 if (!entity) return chapter.restart();
54594 var box = pointBox(entity.loc, context);
54595 reveal(box, t('intro.points.reselect'), { duration: 0 });
54597 }, 600); // after reveal..
54599 context.on('enter.intro', function(mode) {
54600 if (mode.id !== 'select') return;
54601 continueTo(updatePoint);
54606 function continueTo(nextStep) {
54607 context.map().on('move.intro drawn.intro', null);
54608 context.on('enter.intro', null);
54614 function updatePoint() {
54615 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
54616 return continueTo(reselectPoint);
54619 // reset pane, in case user happened to untag the point..
54620 select('.inspector-wrap .panewrap').style('right', '0%');
54622 context.on('exit.intro', function() {
54623 continueTo(reselectPoint);
54626 context.history().on('change.intro', function() {
54627 continueTo(updateCloseEditor);
54630 timeout(function() {
54631 reveal('.entity-editor-pane', t('intro.points.update'),
54632 { tooltipClass: 'intro-points-describe' }
54636 function continueTo(nextStep) {
54637 context.on('exit.intro', null);
54638 context.history().on('change.intro', null);
54644 function updateCloseEditor() {
54645 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
54646 return continueTo(reselectPoint);
54649 // reset pane, in case user happened to change it..
54650 select('.inspector-wrap .panewrap').style('right', '0%');
54652 context.on('exit.intro', function() {
54653 continueTo(rightClickPoint);
54656 timeout(function() {
54657 reveal('.entity-editor-pane',
54658 t('intro.points.update_close', { button: icon('#iD-icon-apply', 'pre-text') })
54662 function continueTo(nextStep) {
54663 context.on('exit.intro', null);
54669 function rightClickPoint() {
54670 if (!pointId) return chapter.restart();
54671 var entity = context.hasEntity(pointId);
54672 if (!entity) return chapter.restart();
54674 context.enter(modeBrowse(context));
54676 var box = pointBox(entity.loc, context);
54677 reveal(box, t('intro.points.rightclick'), { duration: 600 });
54679 timeout(function() {
54680 context.map().on('move.intro drawn.intro', function() {
54681 var entity = context.hasEntity(pointId);
54682 if (!entity) return chapter.restart();
54683 var box = pointBox(entity.loc, context);
54684 reveal(box, t('intro.points.rightclick'), { duration: 0 });
54686 }, 600); // after reveal
54688 context.on('enter.intro', function(mode) {
54689 if (mode.id !== 'select') return;
54690 var ids = context.selectedIDs();
54691 if (ids.length !== 1 || ids[0] !== pointId) return;
54693 timeout(function() {
54694 var node = selectMenuItem('delete').node();
54696 continueTo(enterDelete);
54697 }, 300); // after menu visible
54700 function continueTo(nextStep) {
54701 context.on('enter.intro', null);
54702 context.map().on('move.intro drawn.intro', null);
54708 function enterDelete() {
54709 if (!pointId) return chapter.restart();
54710 var entity = context.hasEntity(pointId);
54711 if (!entity) return chapter.restart();
54713 var node = selectMenuItem('delete').node();
54714 if (!node) { return continueTo(rightClickPoint); }
54716 revealEditMenu(entity.loc,
54717 t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') })
54720 timeout(function() {
54721 context.map().on('move.intro drawn.intro', function() {
54722 revealEditMenu(entity.loc,
54723 t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') }),
54727 }, 300); // after menu visible
54729 context.on('exit.intro', function() {
54730 if (!pointId) return chapter.restart();
54731 var entity = context.hasEntity(pointId);
54732 if (entity) return continueTo(rightClickPoint); // point still exists
54735 context.history().on('change.intro', function(changed) {
54736 if (changed.deleted().length) {
54741 function continueTo(nextStep) {
54742 context.map().on('move.intro drawn.intro', null);
54743 context.history().on('change.intro', null);
54744 context.on('exit.intro', null);
54751 context.history().on('change.intro', function() {
54755 var iconName = '#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
54756 reveal('#bar button.undo-button',
54757 t('intro.points.undo', { button: icon(iconName, 'pre-text') })
54760 function continueTo(nextStep) {
54761 context.history().on('change.intro', null);
54768 dispatch$$1.call('done');
54769 reveal('#id-container',
54770 t('intro.points.play', { next: t('intro.areas.title') }), {
54771 tooltipBox: '.intro-nav-wrap .chapter-area',
54772 buttonText: t('intro.ok'),
54773 buttonCallback: function() { reveal('#id-container'); }
54779 chapter.enter = function() {
54784 chapter.exit = function() {
54785 timeouts.forEach(window.clearTimeout);
54786 context.on('enter.intro exit.intro', null);
54787 context.map().on('move.intro drawn.intro', null);
54788 context.history().on('change.intro', null);
54789 select('.inspector-wrap').on('wheel.intro', eventCancel);
54790 select('.preset-search-input').on('keydown.intro keyup.intro', null);
54794 chapter.restart = function() {
54800 return utilRebind(chapter, dispatch$$1, 'on');
54803 function uiIntroArea(context, reveal) {
54804 var dispatch$$1 = dispatch('done'),
54805 playground = [-85.63552, 41.94159],
54806 playgroundPreset = context.presets().item('leisure/playground'),
54807 descriptionField = context.presets().field('description'),
54813 title: 'intro.areas.title'
54817 function timeout(f, t$$1) {
54818 timeouts.push(window.setTimeout(f, t$$1));
54822 function eventCancel() {
54823 event.stopPropagation();
54824 event.preventDefault();
54828 function revealPlayground(center, text, options) {
54829 var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
54830 var box = pad$1(center, padding, context);
54831 reveal(box, text, options);
54835 function addArea() {
54836 context.enter(modeBrowse(context));
54837 context.history().reset('initial');
54840 var msec = transitionTime(playground, context.map().center());
54841 if (msec) { reveal(null, null, { duration: 0 }); }
54842 context.map().zoom(19).centerEase(playground, msec);
54844 timeout(function() {
54845 var tooltip = reveal('button.add-area',
54846 t('intro.areas.add_playground', { button: icon('#iD-icon-area', 'pre-text') }));
54848 tooltip.selectAll('.tooltip-inner')
54849 .insert('svg', 'span')
54850 .attr('class', 'tooltip-illustration')
54852 .attr('xlink:href', '#iD-graphic-areas');
54854 context.on('enter.intro', function(mode) {
54855 if (mode.id !== 'add-area') return;
54856 continueTo(startPlayground);
54860 function continueTo(nextStep) {
54861 context.on('enter.intro', null);
54867 function startPlayground() {
54868 if (context.mode().id !== 'add-area') {
54869 return chapter.restart();
54873 context.map().zoomEase(19.5, 500);
54875 timeout(function() {
54876 revealPlayground(playground,
54877 t('intro.areas.start_playground'), { duration: 250 }
54880 timeout(function() {
54881 context.map().on('move.intro drawn.intro', function() {
54882 revealPlayground(playground,
54883 t('intro.areas.start_playground'), { duration: 0 }
54886 context.on('enter.intro', function(mode) {
54887 if (mode.id !== 'draw-area') return chapter.restart();
54888 continueTo(continuePlayground);
54890 }, 250); // after reveal
54892 }, 550); // after easing
54894 function continueTo(nextStep) {
54895 context.map().on('move.intro drawn.intro', null);
54896 context.on('enter.intro', null);
54902 function continuePlayground() {
54903 if (context.mode().id !== 'draw-area') {
54904 return chapter.restart();
54908 revealPlayground(playground,
54909 t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
54913 timeout(function() {
54914 context.map().on('move.intro drawn.intro', function() {
54915 revealPlayground(playground,
54916 t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
54920 }, 250); // after reveal
54922 context.on('enter.intro', function(mode) {
54923 if (mode.id === 'draw-area') {
54924 var entity = context.hasEntity(context.selectedIDs()[0]);
54925 if (entity && entity.nodes.length >= 6) {
54926 return continueTo(finishPlayground);
54930 } else if (mode.id === 'select') {
54931 areaId = context.selectedIDs()[0];
54932 return continueTo(searchPresets);
54934 return chapter.restart();
54938 function continueTo(nextStep) {
54939 context.map().on('move.intro drawn.intro', null);
54940 context.on('enter.intro', null);
54946 function finishPlayground() {
54947 if (context.mode().id !== 'draw-area') {
54948 return chapter.restart();
54952 revealPlayground(playground,
54953 t('intro.areas.finish_playground'), { duration: 250 }
54956 timeout(function() {
54957 context.map().on('move.intro drawn.intro', function() {
54958 revealPlayground(playground,
54959 t('intro.areas.finish_playground'), { duration: 0 }
54962 }, 250); // after reveal
54964 context.on('enter.intro', function(mode) {
54965 if (mode.id === 'draw-area') {
54967 } else if (mode.id === 'select') {
54968 areaId = context.selectedIDs()[0];
54969 return continueTo(searchPresets);
54971 return chapter.restart();
54975 function continueTo(nextStep) {
54976 context.map().on('move.intro drawn.intro', null);
54977 context.on('enter.intro', null);
54983 function searchPresets() {
54984 if (!areaId || !context.hasEntity(areaId)) {
54987 var ids = context.selectedIDs();
54988 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
54989 context.enter(modeSelect(context, [areaId]));
54992 // disallow scrolling
54993 select('.inspector-wrap').on('wheel.intro', eventCancel);
54995 timeout(function() {
54996 // reset pane, in case user somehow happened to change it..
54997 select('.inspector-wrap .panewrap').style('right', '-100%');
54999 select('.preset-search-input')
55000 .on('keydown.intro', null)
55001 .on('keyup.intro', checkPresetSearch);
55003 reveal('.preset-search-input',
55004 t('intro.areas.search_playground', { preset: playgroundPreset.name() })
55006 }, 400); // after preset list pane visible..
55008 context.on('enter.intro', function(mode) {
55009 if (!areaId || !context.hasEntity(areaId)) {
55010 return continueTo(addArea);
55013 var ids = context.selectedIDs();
55014 if (mode.id !== 'select' || !ids.length || ids[0] !== areaId) {
55015 // keep the user's area selected..
55016 context.enter(modeSelect(context, [areaId]));
55018 // reset pane, in case user somehow happened to change it..
55019 select('.inspector-wrap .panewrap').style('right', '-100%');
55020 // disallow scrolling
55021 select('.inspector-wrap').on('wheel.intro', eventCancel);
55023 select('.preset-search-input')
55024 .on('keydown.intro', null)
55025 .on('keyup.intro', checkPresetSearch);
55027 reveal('.preset-search-input',
55028 t('intro.areas.search_playground', { preset: playgroundPreset.name() })
55031 context.history().on('change.intro', null);
55035 function checkPresetSearch() {
55036 var first = select('.preset-list-item:first-child');
55038 if (first.classed('preset-leisure-playground')) {
55039 reveal(first.select('.preset-list-button').node(),
55040 t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
55044 select('.preset-search-input')
55045 .on('keydown.intro', eventCancel, true)
55046 .on('keyup.intro', null);
55048 context.history().on('change.intro', function() {
55049 continueTo(clickAddField);
55054 function continueTo(nextStep) {
55055 select('.inspector-wrap').on('wheel.intro', null);
55056 context.on('enter.intro', null);
55057 context.history().on('change.intro', null);
55058 select('.preset-search-input').on('keydown.intro keyup.intro', null);
55064 function clickAddField() {
55065 if (!areaId || !context.hasEntity(areaId)) {
55068 var ids = context.selectedIDs();
55069 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
55070 return searchPresets();
55073 if (!select('.form-field-description').empty()) {
55074 return continueTo(describePlayground);
55077 // disallow scrolling
55078 select('.inspector-wrap').on('wheel.intro', eventCancel);
55080 timeout(function() {
55081 // reset pane, in case user somehow happened to change it..
55082 select('.inspector-wrap .panewrap').style('right', '0%');
55084 // It's possible for the user to add a description in a previous step..
55085 // If they did this already, just continue to next step.
55086 var entity = context.entity(areaId);
55087 if (entity.tags.description) {
55088 return continueTo(play);
55091 // scroll "Add field" into view
55092 var box = select('.more-fields').node().getBoundingClientRect();
55093 if (box.top > 300) {
55094 var pane = select('.entity-editor-pane .inspector-body');
55095 var start = pane.node().scrollTop;
55096 var end = start + (box.top - 300);
55101 .tween('scroll.inspector', function() {
55103 var i = interpolateNumber(start, end);
55104 return function(t$$1) {
55105 node.scrollTop = i(t$$1);
55110 timeout(function() {
55111 reveal('.more-fields .combobox-input',
55112 t('intro.areas.add_field'),
55116 select('.more-fields .combobox-input')
55117 .on('click.intro', function() {
55118 continueTo(chooseDescriptionField);
55120 }, 300); // after "Add Field" visible
55122 }, 400); // after editor pane visible
55124 context.on('exit.intro', function() {
55125 return continueTo(searchPresets);
55128 function continueTo(nextStep) {
55129 select('.inspector-wrap').on('wheel.intro', null);
55130 select('.more-fields .combobox-input').on('click.intro', null);
55131 context.on('exit.intro', null);
55137 function chooseDescriptionField() {
55138 if (!areaId || !context.hasEntity(areaId)) {
55141 var ids = context.selectedIDs();
55142 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
55143 return searchPresets();
55146 if (!select('.form-field-description').empty()) {
55147 return continueTo(describePlayground);
55150 // Make sure combobox is ready..
55151 if (select('div.combobox').empty()) {
55152 return continueTo(clickAddField);
55154 // Watch for the combobox to go away..
55156 watcher = window.setInterval(function() {
55157 if (select('div.combobox').empty()) {
55158 window.clearInterval(watcher);
55159 timeout(function() {
55160 if (select('.form-field-description').empty()) {
55161 continueTo(retryChooseDescription);
55163 continueTo(describePlayground);
55165 }, 300); // after description field added.
55169 reveal('div.combobox',
55170 t('intro.areas.choose_field', { field: descriptionField.label() }),
55174 context.on('exit.intro', function() {
55175 return continueTo(searchPresets);
55178 function continueTo(nextStep) {
55179 if (watcher) window.clearInterval(watcher);
55180 context.on('exit.intro', null);
55186 function describePlayground() {
55187 if (!areaId || !context.hasEntity(areaId)) {
55190 var ids = context.selectedIDs();
55191 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
55192 return searchPresets();
55195 // reset pane, in case user happened to change it..
55196 select('.inspector-wrap .panewrap').style('right', '0%');
55198 if (select('.form-field-description').empty()) {
55199 return continueTo(retryChooseDescription);
55202 context.on('exit.intro', function() {
55206 reveal('.entity-editor-pane',
55207 t('intro.areas.describe_playground', { button: icon('#iD-icon-apply', 'pre-text') }),
55211 function continueTo(nextStep) {
55212 context.on('exit.intro', null);
55218 function retryChooseDescription() {
55219 if (!areaId || !context.hasEntity(areaId)) {
55222 var ids = context.selectedIDs();
55223 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
55224 return searchPresets();
55227 // reset pane, in case user happened to change it..
55228 select('.inspector-wrap .panewrap').style('right', '0%');
55230 reveal('.entity-editor-pane',
55231 t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
55232 buttonText: t('intro.ok'),
55233 buttonCallback: function() { continueTo(clickAddField); }
55236 context.on('exit.intro', function() {
55237 return continueTo(searchPresets);
55240 function continueTo(nextStep) {
55241 context.on('exit.intro', null);
55248 dispatch$$1.call('done');
55249 reveal('#id-container',
55250 t('intro.areas.play', { next: t('intro.lines.title') }), {
55251 tooltipBox: '.intro-nav-wrap .chapter-line',
55252 buttonText: t('intro.ok'),
55253 buttonCallback: function() { reveal('#id-container'); }
55259 chapter.enter = function() {
55264 chapter.exit = function() {
55265 timeouts.forEach(window.clearTimeout);
55266 context.on('enter.intro exit.intro', null);
55267 context.map().on('move.intro drawn.intro', null);
55268 context.history().on('change.intro', null);
55269 select('.inspector-wrap').on('wheel.intro', null);
55270 select('.preset-search-input').on('keydown.intro keyup.intro', null);
55271 select('.more-fields .combobox-input').on('click.intro', null);
55275 chapter.restart = function() {
55281 return utilRebind(chapter, dispatch$$1, 'on');
55284 function uiIntroLine(context, reveal) {
55285 var dispatch$$1 = dispatch('done'),
55287 tulipRoadId = null,
55288 flowerRoadId = 'w646',
55289 tulipRoadStart = [-85.6297754121684, 41.95805253325314],
55290 tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204],
55291 tulipRoadIntersection = [-85.62974496187628, 41.95742515554585],
55292 roadCategory = context.presets().item('category-road'),
55293 residentialPreset = context.presets().item('highway/residential'),
55294 woodRoadId = 'w525',
55295 woodRoadEndId = 'n2862',
55296 woodRoadAddNode = [-85.62390110349587, 41.95397111462291],
55297 woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487],
55298 woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872],
55299 washingtonStreetId = 'w522',
55300 twelfthAvenueId = 'w1',
55301 eleventhAvenueEndId = 'n3550',
55302 twelfthAvenueEndId = 'n5',
55303 washingtonSegmentId = null,
55304 eleventhAvenueEnd = context.entity(eleventhAvenueEndId).loc,
55305 twelfthAvenueEnd = context.entity(twelfthAvenueEndId).loc,
55306 deleteLinesLoc = [-85.6219395542764, 41.95228033922477],
55307 twelfthAvenue = [-85.62219310052491, 41.952505413152956];
55311 title: 'intro.lines.title'
55315 function timeout(f, t$$1) {
55316 timeouts.push(window.setTimeout(f, t$$1));
55320 function eventCancel() {
55321 event.stopPropagation();
55322 event.preventDefault();
55326 function revealEditMenu(loc, text, options) {
55327 var rect = context.surfaceRect();
55328 var point$$1 = context.curtainProjection(loc);
55330 var width = 250 + (2 * pad);
55332 var startX = rect.left + point$$1[0];
55333 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
55336 top: point$$1[1] + rect.top - 60,
55340 reveal(box, text, options);
55344 function addLine() {
55345 context.enter(modeBrowse(context));
55346 context.history().reset('initial');
55348 var msec = transitionTime(tulipRoadStart, context.map().center());
55349 if (msec) { reveal(null, null, { duration: 0 }); }
55350 context.map().zoom(18.5).centerEase(tulipRoadStart, msec);
55352 timeout(function() {
55353 var tooltip = reveal('button.add-line',
55354 t('intro.lines.add_line', { button: icon('#iD-icon-line', 'pre-text') }));
55356 tooltip.selectAll('.tooltip-inner')
55357 .insert('svg', 'span')
55358 .attr('class', 'tooltip-illustration')
55360 .attr('xlink:href', '#iD-graphic-lines');
55362 context.on('enter.intro', function(mode) {
55363 if (mode.id !== 'add-line') return;
55364 continueTo(startLine);
55368 function continueTo(nextStep) {
55369 context.on('enter.intro', null);
55375 function startLine() {
55376 if (context.mode().id !== 'add-line') {
55377 return chapter.restart();
55380 tulipRoadId = null;
55382 var padding = 70 * Math.pow(2, context.map().zoom() - 18);
55383 var box = pad$1(tulipRoadStart, padding, context);
55384 box.height = box.height + 100;
55385 reveal(box, t('intro.lines.start_line'));
55387 context.map().on('move.intro drawn.intro', function() {
55388 padding = 70 * Math.pow(2, context.map().zoom() - 18);
55389 box = pad$1(tulipRoadStart, padding, context);
55390 box.height = box.height + 100;
55391 reveal(box, t('intro.lines.start_line'), { duration: 0 });
55394 context.on('enter.intro', function(mode) {
55395 if (mode.id !== 'draw-line') return chapter.restart();
55396 continueTo(drawLine);
55399 function continueTo(nextStep) {
55400 context.map().on('move.intro drawn.intro', null);
55401 context.on('enter.intro', null);
55407 function drawLine() {
55408 if (context.mode().id !== 'draw-line') {
55409 return chapter.restart();
55412 tulipRoadId = context.mode().selectedIDs()[0];
55413 context.map().centerEase(tulipRoadMidpoint, 500);
55415 timeout(function() {
55416 var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
55417 var box = pad$1(tulipRoadMidpoint, padding, context);
55418 box.height = box.height * 2;
55420 t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
55423 context.map().on('move.intro drawn.intro', function() {
55424 padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
55425 box = pad$1(tulipRoadMidpoint, padding, context);
55426 box.height = box.height * 2;
55428 t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
55432 }, 550); // after easing..
55434 context.history().on('change.intro', function() {
55435 var entity = tulipRoadId && context.hasEntity(tulipRoadId);
55436 if (!entity) return chapter.restart();
55438 if (isLineConnected()) {
55439 continueTo(continueLine);
55443 context.on('enter.intro', function(mode) {
55444 if (mode.id === 'draw-line')
55446 else if (mode.id === 'select') {
55447 continueTo(retryIntersect);
55451 return chapter.restart();
55454 function continueTo(nextStep) {
55455 context.map().on('move.intro drawn.intro', null);
55456 context.history().on('change.intro', null);
55457 context.on('enter.intro', null);
55463 function isLineConnected() {
55464 var entity = tulipRoadId && context.hasEntity(tulipRoadId);
55465 if (!entity) return false;
55467 var drawNodes = context.graph().childNodes(entity);
55468 return some(drawNodes, function(node) {
55469 return some(context.graph().parentWays(node), function(parent) {
55470 return parent.id === flowerRoadId;
55476 function retryIntersect() {
55477 select(window).on('mousedown.intro', eventCancel, true);
55479 var box = pad$1(tulipRoadIntersection, 80, context);
55481 t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
55484 timeout(chapter.restart, 3000);
55488 function continueLine() {
55489 if (context.mode().id !== 'draw-line') return chapter.restart();
55490 var entity = tulipRoadId && context.hasEntity(tulipRoadId);
55491 if (!entity) return chapter.restart();
55493 context.map().centerEase(tulipRoadIntersection, 500);
55495 reveal('#surface', t('intro.lines.continue_line'));
55497 context.on('enter.intro', function(mode) {
55498 if (mode.id === 'draw-line')
55500 else if (mode.id === 'select')
55501 return continueTo(chooseCategoryRoad);
55503 return chapter.restart();
55506 function continueTo(nextStep) {
55507 context.on('enter.intro', null);
55513 function chooseCategoryRoad() {
55514 if (context.mode().id !== 'select') {
55515 return chapter.restart();
55518 context.on('exit.intro', function() {
55519 return chapter.restart();
55522 var button = select('.preset-category-road .preset-list-button');
55523 if (button.empty()) return chapter.restart();
55525 // disallow scrolling
55526 select('.inspector-wrap').on('wheel.intro', eventCancel);
55528 timeout(function() {
55529 // reset pane, in case user somehow happened to change it..
55530 select('.inspector-wrap .panewrap').style('right', '-100%');
55532 reveal(button.node(),
55533 t('intro.lines.choose_category_road', { category: roadCategory.name() })
55536 button.on('click.intro', function() {
55537 continueTo(choosePresetResidential);
55540 }, 400); // after editor pane visible
55542 function continueTo(nextStep) {
55543 select('.inspector-wrap').on('wheel.intro', null);
55544 select('.preset-list-button').on('click.intro', null);
55545 context.on('exit.intro', null);
55551 function choosePresetResidential() {
55552 if (context.mode().id !== 'select') {
55553 return chapter.restart();
55556 context.on('exit.intro', function() {
55557 return chapter.restart();
55560 var subgrid = select('.preset-category-road .subgrid');
55561 if (subgrid.empty()) return chapter.restart();
55563 subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
55564 .on('click.intro', function() {
55565 continueTo(retryPresetResidential);
55568 subgrid.selectAll('.preset-highway-residential .preset-list-button')
55569 .on('click.intro', function() {
55570 continueTo(nameRoad);
55573 timeout(function() {
55574 reveal(subgrid.node(),
55575 t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
55576 { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
55580 function continueTo(nextStep) {
55581 select('.preset-list-button').on('click.intro', null);
55582 context.on('exit.intro', null);
55588 // selected wrong road type
55589 function retryPresetResidential() {
55590 if (context.mode().id !== 'select') {
55591 return chapter.restart();
55594 context.on('exit.intro', function() {
55595 return chapter.restart();
55598 // disallow scrolling
55599 select('.inspector-wrap').on('wheel.intro', eventCancel);
55601 timeout(function() {
55602 var button = select('.entity-editor-pane .preset-list-button');
55604 reveal(button.node(),
55605 t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
55608 button.on('click.intro', function() {
55609 continueTo(chooseCategoryRoad);
55614 function continueTo(nextStep) {
55615 select('.inspector-wrap').on('wheel.intro', null);
55616 select('.preset-list-button').on('click.intro', null);
55617 context.on('exit.intro', null);
55623 function nameRoad() {
55624 context.on('exit.intro', function() {
55625 continueTo(didNameRoad);
55628 timeout(function() {
55629 reveal('.entity-editor-pane',
55630 t('intro.lines.name_road', { button: icon('#iD-icon-apply', 'pre-text') }),
55631 { tooltipClass: 'intro-lines-name_road' }
55635 function continueTo(nextStep) {
55636 context.on('exit.intro', null);
55642 function didNameRoad() {
55643 context.history().checkpoint('doneAddLine');
55645 timeout(function() {
55646 reveal('#surface', t('intro.lines.did_name_road'), {
55647 buttonText: t('intro.ok'),
55648 buttonCallback: function() { continueTo(updateLine); }
55652 function continueTo(nextStep) {
55658 function updateLine() {
55659 context.history().reset('doneAddLine');
55660 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55661 return chapter.restart();
55664 var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
55665 if (msec) { reveal(null, null, { duration: 0 }); }
55666 context.map().zoom(19).centerEase(woodRoadDragMidpoint, msec);
55668 timeout(function() {
55669 var padding = 250 * Math.pow(2, context.map().zoom() - 19);
55670 var box = pad$1(woodRoadDragMidpoint, padding, context);
55671 var advance = function() { continueTo(addNode); };
55673 reveal(box, t('intro.lines.update_line'),
55674 { buttonText: t('intro.ok'), buttonCallback: advance }
55677 context.map().on('move.intro drawn.intro', function() {
55678 var padding = 250 * Math.pow(2, context.map().zoom() - 19);
55679 var box = pad$1(woodRoadDragMidpoint, padding, context);
55680 reveal(box, t('intro.lines.update_line'),
55681 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
55686 function continueTo(nextStep) {
55687 context.map().on('move.intro drawn.intro', null);
55693 function addNode() {
55694 context.history().reset('doneAddLine');
55695 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55696 return chapter.restart();
55699 var padding = 40 * Math.pow(2, context.map().zoom() - 19);
55700 var box = pad$1(woodRoadAddNode, padding, context);
55701 reveal(box, t('intro.lines.add_node'));
55703 context.map().on('move.intro drawn.intro', function() {
55704 var padding = 40 * Math.pow(2, context.map().zoom() - 19);
55705 var box = pad$1(woodRoadAddNode, padding, context);
55706 reveal(box, t('intro.lines.add_node'), { duration: 0 });
55709 context.history().on('change.intro', function(changed) {
55710 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55711 return continueTo(updateLine);
55713 if (changed.created().length === 1) {
55714 timeout(function() { continueTo(startDragEndpoint); }, 500);
55718 context.on('enter.intro', function(mode) {
55719 if (mode.id !== 'select') {
55720 continueTo(updateLine);
55724 function continueTo(nextStep) {
55725 context.map().on('move.intro drawn.intro', null);
55726 context.history().on('change.intro', null);
55727 context.on('enter.intro', null);
55733 function startDragEndpoint() {
55734 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55735 return continueTo(updateLine);
55737 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
55738 var box = pad$1(woodRoadDragEndpoint, padding, context);
55739 reveal(box, t('intro.lines.start_drag_endpoint'));
55741 context.map().on('move.intro drawn.intro', function() {
55742 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55743 return continueTo(updateLine);
55745 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
55746 var box = pad$1(woodRoadDragEndpoint, padding, context);
55747 reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
55749 var entity = context.entity(woodRoadEndId);
55750 if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
55751 continueTo(finishDragEndpoint);
55755 function continueTo(nextStep) {
55756 context.map().on('move.intro drawn.intro', null);
55762 function finishDragEndpoint() {
55763 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55764 return continueTo(updateLine);
55767 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
55768 var box = pad$1(woodRoadDragEndpoint, padding, context);
55769 reveal(box, t('intro.lines.finish_drag_endpoint'));
55771 context.map().on('move.intro drawn.intro', function() {
55772 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55773 return continueTo(updateLine);
55775 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
55776 var box = pad$1(woodRoadDragEndpoint, padding, context);
55777 reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
55779 var entity = context.entity(woodRoadEndId);
55780 if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
55781 continueTo(startDragEndpoint);
55785 context.on('enter.intro', function() {
55786 continueTo(startDragMidpoint);
55789 function continueTo(nextStep) {
55790 context.map().on('move.intro drawn.intro', null);
55791 context.on('enter.intro', null);
55797 function startDragMidpoint() {
55798 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55799 return continueTo(updateLine);
55801 if (context.selectedIDs().indexOf(woodRoadId) === -1) {
55802 context.enter(modeSelect(context, [woodRoadId]));
55805 var padding = 80 * Math.pow(2, context.map().zoom() - 19);
55806 var box = pad$1(woodRoadDragMidpoint, padding, context);
55807 reveal(box, t('intro.lines.start_drag_midpoint'));
55809 context.map().on('move.intro drawn.intro', function() {
55810 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55811 return continueTo(updateLine);
55813 var padding = 80 * Math.pow(2, context.map().zoom() - 19);
55814 var box = pad$1(woodRoadDragMidpoint, padding, context);
55815 reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
55818 context.history().on('change.intro', function(changed) {
55819 if (changed.created().length === 1) {
55820 continueTo(continueDragMidpoint);
55824 context.on('enter.intro', function(mode) {
55825 if (mode.id !== 'select') {
55826 // keep Wood Road selected so midpoint triangles are drawn..
55827 context.enter(modeSelect(context, [woodRoadId]));
55831 function continueTo(nextStep) {
55832 context.map().on('move.intro drawn.intro', null);
55833 context.history().on('change.intro', null);
55834 context.on('enter.intro', null);
55840 function continueDragMidpoint() {
55841 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55842 return continueTo(updateLine);
55845 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
55846 var box = pad$1(woodRoadDragEndpoint, padding, context);
55849 var advance = function() {
55850 context.history().checkpoint('doneUpdateLine');
55851 continueTo(deleteLines);
55854 reveal(box, t('intro.lines.continue_drag_midpoint'),
55855 { buttonText: t('intro.ok'), buttonCallback: advance }
55858 context.map().on('move.intro drawn.intro', function() {
55859 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55860 return continueTo(updateLine);
55862 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
55863 var box = pad$1(woodRoadDragEndpoint, padding, context);
55865 reveal(box, t('intro.lines.continue_drag_midpoint'),
55866 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
55870 function continueTo(nextStep) {
55871 context.map().on('move.intro drawn.intro', null);
55877 function deleteLines() {
55878 context.history().reset('doneUpdateLine');
55879 context.enter(modeBrowse(context));
55881 if (!context.hasEntity(washingtonStreetId) ||
55882 !context.hasEntity(twelfthAvenueId) ||
55883 !context.hasEntity(eleventhAvenueEndId)) {
55884 return chapter.restart();
55887 var msec = transitionTime(deleteLinesLoc, context.map().center());
55888 if (msec) { reveal(null, null, { duration: 0 }); }
55889 context.map().zoom(18).centerEase(deleteLinesLoc, msec);
55891 timeout(function() {
55892 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
55893 var box = pad$1(deleteLinesLoc, padding, context);
55896 var advance = function() { continueTo(rightClickIntersection); };
55898 reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
55899 { buttonText: t('intro.ok'), buttonCallback: advance }
55902 context.map().on('move.intro drawn.intro', function() {
55903 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
55904 var box = pad$1(deleteLinesLoc, padding, context);
55907 reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
55908 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
55912 context.history().on('change.intro', function() {
55913 timeout(function() {
55914 continueTo(deleteLines);
55915 }, 500); // after any transition (e.g. if user deleted intersection)
55920 function continueTo(nextStep) {
55921 context.map().on('move.intro drawn.intro', null);
55922 context.history().on('change.intro', null);
55928 function rightClickIntersection() {
55929 context.history().reset('doneUpdateLine');
55930 context.enter(modeBrowse(context));
55932 context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
55934 timeout(function() {
55935 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
55936 var box = pad$1(eleventhAvenueEnd, padding, context);
55937 reveal(box, t('intro.lines.rightclick_intersection',
55938 { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
55941 context.map().on('move.intro drawn.intro', function() {
55942 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
55943 var box = pad$1(eleventhAvenueEnd, padding, context);
55944 reveal(box, t('intro.lines.rightclick_intersection',
55945 { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
55950 context.on('enter.intro', function(mode) {
55951 if (mode.id !== 'select') return;
55952 var ids = context.selectedIDs();
55953 if (ids.length !== 1 || ids[0] !== eleventhAvenueEndId) return;
55955 timeout(function() {
55956 var node = selectMenuItem('split').node();
55958 continueTo(splitIntersection);
55959 }, 300); // after menu visible
55962 context.history().on('change.intro', function() {
55963 timeout(function() {
55964 continueTo(deleteLines);
55965 }, 300); // after any transition (e.g. if user deleted intersection)
55970 function continueTo(nextStep) {
55971 context.map().on('move.intro drawn.intro', null);
55972 context.on('enter.intro', null);
55973 context.history().on('change.intro', null);
55979 function splitIntersection() {
55980 if (!context.hasEntity(washingtonStreetId) ||
55981 !context.hasEntity(twelfthAvenueId) ||
55982 !context.hasEntity(eleventhAvenueEndId)) {
55983 return continueTo(deleteLines);
55986 var node = selectMenuItem('split').node();
55987 if (!node) { return continueTo(rightClickIntersection); }
55989 var wasChanged = false;
55990 var menuCoords = context.map().mouseCoordinates();
55991 washingtonSegmentId = null;
55993 revealEditMenu(menuCoords, t('intro.lines.split_intersection',
55994 { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
55997 context.map().on('move.intro drawn.intro', function() {
55998 var node = selectMenuItem('split').node();
55999 if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
56001 revealEditMenu(menuCoords, t('intro.lines.split_intersection',
56002 { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
56007 context.history().on('change.intro', function(changed) {
56009 timeout(function() {
56010 if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
56011 washingtonSegmentId = changed.created()[0].id;
56012 continueTo(didSplit);
56014 washingtonSegmentId = null;
56015 continueTo(retrySplit);
56017 }, 300); // after any transition (e.g. if user deleted intersection)
56020 function continueTo(nextStep) {
56021 context.map().on('move.intro drawn.intro', null);
56022 context.history().on('change.intro', null);
56028 function retrySplit() {
56029 context.enter(modeBrowse(context));
56030 context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
56031 var advance = function() { continueTo(rightClickIntersection); };
56033 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
56034 var box = pad$1(eleventhAvenueEnd, padding, context);
56035 reveal(box, t('intro.lines.retry_split'),
56036 { buttonText: t('intro.ok'), buttonCallback: advance }
56039 context.map().on('move.intro drawn.intro', function() {
56040 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
56041 var box = pad$1(eleventhAvenueEnd, padding, context);
56042 reveal(box, t('intro.lines.retry_split'),
56043 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
56047 function continueTo(nextStep) {
56048 context.map().on('move.intro drawn.intro', null);
56054 function didSplit() {
56055 if (!washingtonSegmentId ||
56056 !context.hasEntity(washingtonSegmentId) ||
56057 !context.hasEntity(washingtonStreetId) ||
56058 !context.hasEntity(twelfthAvenueId) ||
56059 !context.hasEntity(eleventhAvenueEndId)) {
56060 return continueTo(rightClickIntersection);
56063 var ids = context.selectedIDs();
56064 var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
56065 var street = t('intro.graph.name.washington-street');
56067 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
56068 var box = pad$1(twelfthAvenue, padding, context);
56069 box.width = box.width / 2;
56070 reveal(box, t(string, { street1: street, street2: street }),
56074 timeout(function() {
56075 context.map().zoom(18).centerEase(twelfthAvenue, 500);
56077 context.map().on('move.intro drawn.intro', function() {
56078 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
56079 var box = pad$1(twelfthAvenue, padding, context);
56080 box.width = box.width / 2;
56081 reveal(box, t(string, { street1: street, street2: street }),
56085 }, 600); // after initial reveal and curtain cut
56087 context.on('enter.intro', function() {
56088 var ids = context.selectedIDs();
56089 if (ids.length === 1 && ids[0] === washingtonSegmentId) {
56090 continueTo(multiSelect);
56094 context.history().on('change.intro', function() {
56095 if (!washingtonSegmentId ||
56096 !context.hasEntity(washingtonSegmentId) ||
56097 !context.hasEntity(washingtonStreetId) ||
56098 !context.hasEntity(twelfthAvenueId) ||
56099 !context.hasEntity(eleventhAvenueEndId)) {
56100 return continueTo(rightClickIntersection);
56104 function continueTo(nextStep) {
56105 context.map().on('move.intro drawn.intro', null);
56106 context.on('enter.intro', null);
56107 context.history().on('change.intro', null);
56113 function multiSelect() {
56114 if (!washingtonSegmentId ||
56115 !context.hasEntity(washingtonSegmentId) ||
56116 !context.hasEntity(washingtonStreetId) ||
56117 !context.hasEntity(twelfthAvenueId) ||
56118 !context.hasEntity(eleventhAvenueEndId)) {
56119 return continueTo(rightClickIntersection);
56122 var ids = context.selectedIDs();
56123 var hasWashington = ids.indexOf(washingtonSegmentId) !== -1;
56124 var hasTwelfth = ids.indexOf(twelfthAvenueId) !== -1;
56126 if (hasWashington && hasTwelfth) {
56127 return continueTo(multiRightClick);
56128 } else if (!hasWashington && !hasTwelfth) {
56129 return continueTo(didSplit);
56132 context.map().zoom(18).centerEase(twelfthAvenue, 500);
56134 timeout(function() {
56135 var selected, other, padding, box;
56136 if (hasWashington) {
56137 selected = t('intro.graph.name.washington-street');
56138 other = t('intro.graph.name.12th-avenue');
56139 padding = 60 * Math.pow(2, context.map().zoom() - 18);
56140 box = pad$1(twelfthAvenueEnd, padding, context);
56143 selected = t('intro.graph.name.12th-avenue');
56144 other = t('intro.graph.name.washington-street');
56145 padding = 200 * Math.pow(2, context.map().zoom() - 18);
56146 box = pad$1(twelfthAvenue, padding, context);
56151 t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
56154 context.map().on('move.intro drawn.intro', function() {
56155 if (hasWashington) {
56156 selected = t('intro.graph.name.washington-street');
56157 other = t('intro.graph.name.12th-avenue');
56158 padding = 60 * Math.pow(2, context.map().zoom() - 18);
56159 box = pad$1(twelfthAvenueEnd, padding, context);
56162 selected = t('intro.graph.name.12th-avenue');
56163 other = t('intro.graph.name.washington-street');
56164 padding = 200 * Math.pow(2, context.map().zoom() - 18);
56165 box = pad$1(twelfthAvenue, padding, context);
56170 t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
56175 context.on('enter.intro', function() {
56176 continueTo(multiSelect);
56179 context.history().on('change.intro', function() {
56180 if (!washingtonSegmentId ||
56181 !context.hasEntity(washingtonSegmentId) ||
56182 !context.hasEntity(washingtonStreetId) ||
56183 !context.hasEntity(twelfthAvenueId) ||
56184 !context.hasEntity(eleventhAvenueEndId)) {
56185 return continueTo(rightClickIntersection);
56190 function continueTo(nextStep) {
56191 context.map().on('move.intro drawn.intro', null);
56192 context.on('enter.intro', null);
56193 context.history().on('change.intro', null);
56199 function multiRightClick() {
56200 if (!washingtonSegmentId ||
56201 !context.hasEntity(washingtonSegmentId) ||
56202 !context.hasEntity(washingtonStreetId) ||
56203 !context.hasEntity(twelfthAvenueId) ||
56204 !context.hasEntity(eleventhAvenueEndId)) {
56205 return continueTo(rightClickIntersection);
56208 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
56209 var box = pad$1(twelfthAvenue, padding, context);
56210 reveal(box, t('intro.lines.multi_rightclick'));
56212 context.map().on('move.intro drawn.intro', function() {
56213 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
56214 var box = pad$1(twelfthAvenue, padding, context);
56215 reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
56218 select(window).on('click.intro contextmenu.intro', function() {
56219 timeout(function() {
56220 var ids = context.selectedIDs();
56221 if (ids.length === 2 &&
56222 ids.indexOf(twelfthAvenueId) !== -1 &&
56223 ids.indexOf(washingtonSegmentId) !== -1) {
56224 var node = selectMenuItem('delete').node();
56226 continueTo(multiDelete);
56227 } else if (ids.length === 1 &&
56228 ids.indexOf(washingtonSegmentId) !== -1) {
56229 return continueTo(multiSelect);
56231 return continueTo(didSplit);
56233 }, 300); // after edit menu visible
56236 context.history().on('change.intro', function() {
56237 if (!washingtonSegmentId ||
56238 !context.hasEntity(washingtonSegmentId) ||
56239 !context.hasEntity(washingtonStreetId) ||
56240 !context.hasEntity(twelfthAvenueId) ||
56241 !context.hasEntity(eleventhAvenueEndId)) {
56242 return continueTo(rightClickIntersection);
56246 function continueTo(nextStep) {
56247 context.map().on('move.intro drawn.intro', null);
56248 select(window).on('click.intro contextmenu.intro', null, true);
56249 context.history().on('change.intro', null);
56255 function multiDelete() {
56256 if (!washingtonSegmentId ||
56257 !context.hasEntity(washingtonSegmentId) ||
56258 !context.hasEntity(washingtonStreetId) ||
56259 !context.hasEntity(twelfthAvenueId) ||
56260 !context.hasEntity(eleventhAvenueEndId)) {
56261 return continueTo(rightClickIntersection);
56264 var node = selectMenuItem('delete').node();
56265 if (!node) return continueTo(multiRightClick);
56267 var menuCoords = context.map().mouseCoordinates();
56268 revealEditMenu(menuCoords,
56269 t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') })
56272 context.map().on('move.intro drawn.intro', function() {
56273 revealEditMenu(menuCoords,
56274 t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') }),
56279 context.on('exit.intro', function() {
56280 if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
56281 return continueTo(multiSelect); // left select mode but roads still exist
56285 context.history().on('change.intro', function() {
56286 if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
56287 continueTo(retryDelete); // changed something but roads still exist
56293 function continueTo(nextStep) {
56294 context.map().on('move.intro drawn.intro', null);
56295 context.on('exit.intro', null);
56296 context.history().on('change.intro', null);
56302 function retryDelete() {
56303 context.enter(modeBrowse(context));
56305 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
56306 var box = pad$1(twelfthAvenue, padding, context);
56307 reveal(box, t('intro.lines.retry_delete'), {
56308 buttonText: t('intro.ok'),
56309 buttonCallback: function() { continueTo(multiSelect); }
56312 function continueTo(nextStep) {
56319 dispatch$$1.call('done');
56320 reveal('#id-container',
56321 t('intro.lines.play', { next: t('intro.buildings.title') }), {
56322 tooltipBox: '.intro-nav-wrap .chapter-building',
56323 buttonText: t('intro.ok'),
56324 buttonCallback: function() { reveal('#id-container'); }
56330 chapter.enter = function() {
56335 chapter.exit = function() {
56336 timeouts.forEach(window.clearTimeout);
56337 select(window).on('mousedown.intro', null, true);
56338 context.on('enter.intro exit.intro', null);
56339 context.map().on('move.intro drawn.intro', null);
56340 context.history().on('change.intro', null);
56341 select('.inspector-wrap').on('wheel.intro', null);
56342 select('.preset-list-button').on('click.intro', null);
56346 chapter.restart = function() {
56352 return utilRebind(chapter, dispatch$$1, 'on');
56355 function uiIntroBuilding(context, reveal) {
56356 var dispatch$$1 = dispatch('done'),
56357 house = [-85.62815, 41.95638],
56358 tank = [-85.62732, 41.95347],
56359 buildingCatetory = context.presets().item('category-building'),
56360 housePreset = context.presets().item('building/house'),
56361 tankPreset = context.presets().item('man_made/storage_tank'),
56368 title: 'intro.buildings.title'
56372 function timeout(f, t$$1) {
56373 timeouts.push(window.setTimeout(f, t$$1));
56377 function eventCancel() {
56378 event.stopPropagation();
56379 event.preventDefault();
56383 function revealHouse(center, text, options) {
56384 var padding = 160 * Math.pow(2, context.map().zoom() - 20);
56385 var box = pad$1(center, padding, context);
56386 reveal(box, text, options);
56390 function revealTank(center, text, options) {
56391 var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
56392 var box = pad$1(center, padding, context);
56393 reveal(box, text, options);
56397 function revealEditMenu(loc, text, options) {
56398 var rect = context.surfaceRect();
56399 var point$$1 = context.curtainProjection(loc);
56401 var width = 250 + (2 * pad);
56403 var startX = rect.left + point$$1[0];
56404 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
56407 top: point$$1[1] + rect.top - 60,
56411 reveal(box, text, options);
56415 function addHouse() {
56416 context.enter(modeBrowse(context));
56417 context.history().reset('initial');
56420 var msec = transitionTime(house, context.map().center());
56421 if (msec) { reveal(null, null, { duration: 0 }); }
56422 context.map().zoom(19).centerEase(house, msec);
56424 timeout(function() {
56425 var tooltip = reveal('button.add-area',
56426 t('intro.buildings.add_building', { button: icon('#iD-icon-area', 'pre-text') }));
56428 tooltip.selectAll('.tooltip-inner')
56429 .insert('svg', 'span')
56430 .attr('class', 'tooltip-illustration')
56432 .attr('xlink:href', '#iD-graphic-buildings');
56434 context.on('enter.intro', function(mode) {
56435 if (mode.id !== 'add-area') return;
56436 continueTo(startHouse);
56440 function continueTo(nextStep) {
56441 context.on('enter.intro', null);
56447 function startHouse() {
56448 if (context.mode().id !== 'add-area') {
56449 return continueTo(addHouse);
56453 context.map().zoomEase(20, 500);
56455 timeout(function() {
56456 revealHouse(house, t('intro.buildings.start_building'));
56458 context.map().on('move.intro drawn.intro', function() {
56459 revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
56462 context.on('enter.intro', function(mode) {
56463 if (mode.id !== 'draw-area') return chapter.restart();
56464 continueTo(continueHouse);
56467 }, 550); // after easing
56469 function continueTo(nextStep) {
56470 context.map().on('move.intro drawn.intro', null);
56471 context.on('enter.intro', null);
56477 function continueHouse() {
56478 if (context.mode().id !== 'draw-area') {
56479 return continueTo(addHouse);
56484 revealHouse(house, t('intro.buildings.continue_building'));
56486 context.map().on('move.intro drawn.intro', function() {
56487 revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
56490 context.on('enter.intro', function(mode) {
56491 if (mode.id === 'draw-area') {
56493 } else if (mode.id === 'select') {
56494 var graph = context.graph(),
56495 way = context.entity(context.selectedIDs()[0]),
56496 nodes = graph.childNodes(way),
56497 points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
56499 if (isMostlySquare(points)) {
56501 return continueTo(chooseCategoryBuilding);
56503 return continueTo(retryHouse);
56507 return chapter.restart();
56511 function continueTo(nextStep) {
56512 context.map().on('move.intro drawn.intro', null);
56513 context.on('enter.intro', null);
56519 function retryHouse() {
56520 var onClick = function() { continueTo(addHouse); };
56522 revealHouse(house, t('intro.buildings.retry_building'),
56523 { buttonText: t('intro.ok'), buttonCallback: onClick }
56526 context.map().on('move.intro drawn.intro', function() {
56527 revealHouse(house, t('intro.buildings.retry_building'),
56528 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
56532 function continueTo(nextStep) {
56533 context.map().on('move.intro drawn.intro', null);
56539 function chooseCategoryBuilding() {
56540 if (!houseId || !context.hasEntity(houseId)) {
56543 var ids = context.selectedIDs();
56544 if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
56545 context.enter(modeSelect(context, [houseId]));
56548 // disallow scrolling
56549 select('.inspector-wrap').on('wheel.intro', eventCancel);
56551 timeout(function() {
56552 // reset pane, in case user somehow happened to change it..
56553 select('.inspector-wrap .panewrap').style('right', '-100%');
56555 var button = select('.preset-category-building .preset-list-button');
56557 reveal(button.node(),
56558 t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
56561 button.on('click.intro', function() {
56562 button.on('click.intro', null);
56563 continueTo(choosePresetHouse);
56566 }, 400); // after preset list pane visible..
56569 context.on('enter.intro', function(mode) {
56570 if (!houseId || !context.hasEntity(houseId)) {
56571 return continueTo(addHouse);
56573 var ids = context.selectedIDs();
56574 if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
56575 return continueTo(chooseCategoryBuilding);
56579 function continueTo(nextStep) {
56580 select('.inspector-wrap').on('wheel.intro', null);
56581 select('.preset-list-button').on('click.intro', null);
56582 context.on('enter.intro', null);
56588 function choosePresetHouse() {
56589 if (!houseId || !context.hasEntity(houseId)) {
56592 var ids = context.selectedIDs();
56593 if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
56594 context.enter(modeSelect(context, [houseId]));
56597 // disallow scrolling
56598 select('.inspector-wrap').on('wheel.intro', eventCancel);
56600 timeout(function() {
56601 // reset pane, in case user somehow happened to change it..
56602 select('.inspector-wrap .panewrap').style('right', '-100%');
56604 var button = select('.preset-building-house .preset-list-button');
56606 reveal(button.node(),
56607 t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
56611 button.on('click.intro', function() {
56612 button.on('click.intro', null);
56613 continueTo(closeEditorHouse);
56617 }, 400); // after preset list pane visible..
56619 context.on('enter.intro', function(mode) {
56620 if (!houseId || !context.hasEntity(houseId)) {
56621 return continueTo(addHouse);
56623 var ids = context.selectedIDs();
56624 if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
56625 return continueTo(chooseCategoryBuilding);
56629 function continueTo(nextStep) {
56630 select('.inspector-wrap').on('wheel.intro', null);
56631 select('.preset-list-button').on('click.intro', null);
56632 context.on('enter.intro', null);
56638 function closeEditorHouse() {
56639 if (!houseId || !context.hasEntity(houseId)) {
56642 var ids = context.selectedIDs();
56643 if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
56644 context.enter(modeSelect(context, [houseId]));
56647 context.history().checkpoint('hasHouse');
56649 context.on('exit.intro', function() {
56650 continueTo(rightClickHouse);
56653 timeout(function() {
56654 reveal('.entity-editor-pane',
56655 t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
56659 function continueTo(nextStep) {
56660 context.on('exit.intro', null);
56666 function rightClickHouse() {
56667 if (!houseId) return chapter.restart();
56669 context.enter(modeBrowse(context));
56670 context.history().reset('hasHouse');
56671 context.map().centerEase(house, 500);
56673 timeout(function() {
56674 if (context.map().zoom() < 20) {
56675 context.map().zoomEase(20, 500);
56679 context.on('enter.intro', function(mode) {
56680 if (mode.id !== 'select') return;
56681 var ids = context.selectedIDs();
56682 if (ids.length !== 1 || ids[0] !== houseId) return;
56684 timeout(function() {
56685 var node = selectMenuItem('orthogonalize').node();
56687 continueTo(clickSquare);
56688 }, 300); // after menu visible
56691 context.map().on('move.intro drawn.intro', function() {
56692 revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
56695 context.history().on('change.intro', function() {
56696 continueTo(rightClickHouse);
56699 function continueTo(nextStep) {
56700 context.on('enter.intro', null);
56701 context.map().on('move.intro drawn.intro', null);
56702 context.history().on('change.intro', null);
56708 function clickSquare() {
56709 if (!houseId) return chapter.restart();
56710 var entity = context.hasEntity(houseId);
56711 if (!entity) return continueTo(rightClickHouse);
56713 var node = selectMenuItem('orthogonalize').node();
56714 if (!node) { return continueTo(rightClickHouse); }
56716 var wasChanged = false;
56717 var menuCoords = context.map().mouseCoordinates();
56719 revealEditMenu(menuCoords,
56720 t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') })
56723 context.on('enter.intro', function(mode) {
56724 if (mode.id === 'browse') {
56725 continueTo(rightClickHouse);
56726 } else if (mode.id === 'move' || mode.id === 'rotate') {
56727 continueTo(retryClickSquare);
56731 context.map().on('move.intro drawn.intro', function() {
56732 var node = selectMenuItem('orthogonalize').node();
56733 if (!wasChanged && !node) { return continueTo(rightClickHouse); }
56735 revealEditMenu(menuCoords,
56736 t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') }),
56741 context.history().on('change.intro', function() {
56743 context.history().on('change.intro', null);
56745 // Something changed. Wait for transition to complete and check undo annotation.
56746 timeout(function() {
56747 if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
56748 continueTo(doneSquare);
56750 continueTo(retryClickSquare);
56752 }, 500); // after transitioned actions
56755 function continueTo(nextStep) {
56756 context.on('enter.intro', null);
56757 context.map().on('move.intro drawn.intro', null);
56758 context.history().on('change.intro', null);
56764 function retryClickSquare() {
56765 context.enter(modeBrowse(context));
56767 revealHouse(house, t('intro.buildings.retry_square'), {
56768 buttonText: t('intro.ok'),
56769 buttonCallback: function() { continueTo(rightClickHouse); }
56772 function continueTo(nextStep) {
56778 function doneSquare() {
56779 context.history().checkpoint('doneSquare');
56781 revealHouse(house, t('intro.buildings.done_square'), {
56782 buttonText: t('intro.ok'),
56783 buttonCallback: function() { continueTo(addTank); }
56786 function continueTo(nextStep) {
56792 function addTank() {
56793 context.enter(modeBrowse(context));
56794 context.history().reset('doneSquare');
56797 var msec = transitionTime(tank, context.map().center());
56798 if (msec) { reveal(null, null, { duration: 0 }); }
56799 context.map().zoom(19.5).centerEase(tank, msec);
56801 timeout(function() {
56802 reveal('button.add-area',
56803 t('intro.buildings.add_tank', { button: icon('#iD-icon-area', 'pre-text') })
56806 context.on('enter.intro', function(mode) {
56807 if (mode.id !== 'add-area') return;
56808 continueTo(startTank);
56812 function continueTo(nextStep) {
56813 context.on('enter.intro', null);
56819 function startTank() {
56820 if (context.mode().id !== 'add-area') {
56821 return continueTo(addTank);
56826 timeout(function() {
56827 revealTank(tank, t('intro.buildings.start_tank'));
56829 context.map().on('move.intro drawn.intro', function() {
56830 revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
56833 context.on('enter.intro', function(mode) {
56834 if (mode.id !== 'draw-area') return chapter.restart();
56835 continueTo(continueTank);
56838 }, 550); // after easing
56840 function continueTo(nextStep) {
56841 context.map().on('move.intro drawn.intro', null);
56842 context.on('enter.intro', null);
56848 function continueTank() {
56849 if (context.mode().id !== 'draw-area') {
56850 return continueTo(addTank);
56855 revealTank(tank, t('intro.buildings.continue_tank'));
56857 context.map().on('move.intro drawn.intro', function() {
56858 revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
56861 context.on('enter.intro', function(mode) {
56862 if (mode.id === 'draw-area') {
56864 } else if (mode.id === 'select') {
56865 tankId = context.selectedIDs()[0];
56866 return continueTo(searchPresetTank);
56868 return continueTo(addTank);
56872 function continueTo(nextStep) {
56873 context.map().on('move.intro drawn.intro', null);
56874 context.on('enter.intro', null);
56880 function searchPresetTank() {
56881 if (!tankId || !context.hasEntity(tankId)) {
56884 var ids = context.selectedIDs();
56885 if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
56886 context.enter(modeSelect(context, [tankId]));
56889 // disallow scrolling
56890 select('.inspector-wrap').on('wheel.intro', eventCancel);
56892 timeout(function() {
56893 // reset pane, in case user somehow happened to change it..
56894 select('.inspector-wrap .panewrap').style('right', '-100%');
56896 select('.preset-search-input')
56897 .on('keydown.intro', null)
56898 .on('keyup.intro', checkPresetSearch);
56900 reveal('.preset-search-input',
56901 t('intro.buildings.search_tank', { preset: tankPreset.name() })
56903 }, 400); // after preset list pane visible..
56905 context.on('enter.intro', function(mode) {
56906 if (!tankId || !context.hasEntity(tankId)) {
56907 return continueTo(addTank);
56910 var ids = context.selectedIDs();
56911 if (mode.id !== 'select' || !ids.length || ids[0] !== tankId) {
56912 // keep the user's area selected..
56913 context.enter(modeSelect(context, [tankId]));
56915 // reset pane, in case user somehow happened to change it..
56916 select('.inspector-wrap .panewrap').style('right', '-100%');
56917 // disallow scrolling
56918 select('.inspector-wrap').on('wheel.intro', eventCancel);
56920 select('.preset-search-input')
56921 .on('keydown.intro', null)
56922 .on('keyup.intro', checkPresetSearch);
56924 reveal('.preset-search-input',
56925 t('intro.buildings.search_tank', { preset: tankPreset.name() })
56928 context.history().on('change.intro', null);
56932 function checkPresetSearch() {
56933 var first = select('.preset-list-item:first-child');
56935 if (first.classed('preset-man_made-storage_tank')) {
56936 reveal(first.select('.preset-list-button').node(),
56937 t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
56941 select('.preset-search-input')
56942 .on('keydown.intro', eventCancel, true)
56943 .on('keyup.intro', null);
56945 context.history().on('change.intro', function() {
56946 continueTo(closeEditorTank);
56951 function continueTo(nextStep) {
56952 select('.inspector-wrap').on('wheel.intro', null);
56953 context.on('enter.intro', null);
56954 context.history().on('change.intro', null);
56955 select('.preset-search-input').on('keydown.intro keyup.intro', null);
56961 function closeEditorTank() {
56962 if (!tankId || !context.hasEntity(tankId)) {
56965 var ids = context.selectedIDs();
56966 if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
56967 context.enter(modeSelect(context, [tankId]));
56970 context.history().checkpoint('hasTank');
56972 context.on('exit.intro', function() {
56973 continueTo(rightClickTank);
56976 timeout(function() {
56977 reveal('.entity-editor-pane',
56978 t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
56982 function continueTo(nextStep) {
56983 context.on('exit.intro', null);
56989 function rightClickTank() {
56990 if (!tankId) return continueTo(addTank);
56992 context.enter(modeBrowse(context));
56993 context.history().reset('hasTank');
56994 context.map().centerEase(tank, 500);
56996 timeout(function() {
56997 context.on('enter.intro', function(mode) {
56998 if (mode.id !== 'select') return;
56999 var ids = context.selectedIDs();
57000 if (ids.length !== 1 || ids[0] !== tankId) return;
57002 timeout(function() {
57003 var node = selectMenuItem('circularize').node();
57005 continueTo(clickCircle);
57006 }, 300); // after menu visible
57009 revealTank(tank, t('intro.buildings.rightclick_tank'));
57011 context.map().on('move.intro drawn.intro', function() {
57012 revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
57015 context.history().on('change.intro', function() {
57016 continueTo(rightClickTank);
57021 function continueTo(nextStep) {
57022 context.on('enter.intro', null);
57023 context.map().on('move.intro drawn.intro', null);
57024 context.history().on('change.intro', null);
57030 function clickCircle() {
57031 if (!tankId) return chapter.restart();
57032 var entity = context.hasEntity(tankId);
57033 if (!entity) return continueTo(rightClickTank);
57035 var node = selectMenuItem('circularize').node();
57036 if (!node) { return continueTo(rightClickTank); }
57038 var wasChanged = false;
57039 var menuCoords = context.map().mouseCoordinates();
57041 revealEditMenu(menuCoords,
57042 t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') })
57045 context.on('enter.intro', function(mode) {
57046 if (mode.id === 'browse') {
57047 continueTo(rightClickTank);
57048 } else if (mode.id === 'move' || mode.id === 'rotate') {
57049 continueTo(retryClickCircle);
57053 context.map().on('move.intro drawn.intro', function() {
57054 var node = selectMenuItem('circularize').node();
57055 if (!wasChanged && !node) { return continueTo(rightClickTank); }
57057 revealEditMenu(menuCoords,
57058 t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') }),
57063 context.history().on('change.intro', function() {
57065 context.history().on('change.intro', null);
57067 // Something changed. Wait for transition to complete and check undo annotation.
57068 timeout(function() {
57069 if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
57072 continueTo(retryClickCircle);
57074 }, 500); // after transitioned actions
57077 function continueTo(nextStep) {
57078 context.on('enter.intro', null);
57079 context.map().on('move.intro drawn.intro', null);
57080 context.history().on('change.intro', null);
57086 function retryClickCircle() {
57087 context.enter(modeBrowse(context));
57089 revealTank(tank, t('intro.buildings.retry_circle'), {
57090 buttonText: t('intro.ok'),
57091 buttonCallback: function() { continueTo(rightClickTank); }
57094 function continueTo(nextStep) {
57101 dispatch$$1.call('done');
57102 reveal('#id-container',
57103 t('intro.buildings.play', { next: t('intro.startediting.title') }), {
57104 tooltipBox: '.intro-nav-wrap .chapter-startEditing',
57105 buttonText: t('intro.ok'),
57106 buttonCallback: function() { reveal('#id-container'); }
57112 chapter.enter = function() {
57117 chapter.exit = function() {
57118 timeouts.forEach(window.clearTimeout);
57119 context.on('enter.intro exit.intro', null);
57120 context.map().on('move.intro drawn.intro', null);
57121 context.history().on('change.intro', null);
57122 select('.inspector-wrap').on('wheel.intro', null);
57123 select('.preset-search-input').on('keydown.intro keyup.intro', null);
57124 select('.more-fields .combobox-input').on('click.intro', null);
57128 chapter.restart = function() {
57134 return utilRebind(chapter, dispatch$$1, 'on');
57137 function uiModal(selection$$1, blocking) {
57138 var keybinding = d3keybinding('modal');
57139 var previous = selection$$1.select('div.modal');
57140 var animate = previous.empty();
57142 previous.transition()
57144 .style('opacity', 0)
57147 var shaded = selection$$1
57149 .attr('class', 'shaded')
57150 .style('opacity', 0);
57152 shaded.close = function() {
57156 .style('opacity',0)
57162 .style('top','0px');
57170 .attr('class', 'modal fillL col6');
57173 shaded.on('click.remove-modal', function() {
57174 if (event.target === this) {
57179 modal.append('button')
57180 .attr('class', 'close')
57181 .on('click', shaded.close)
57182 .call(svgIcon('#iD-icon-close'));
57185 .on('⌫', shaded.close)
57186 .on('⎋', shaded.close);
57194 .attr('class', 'content');
57197 shaded.transition().style('opacity', 1);
57199 shaded.style('opacity', 1);
57206 function uiIntroStartEditing(context, reveal) {
57207 var dispatch$$1 = dispatch('done', 'startEditing');
57208 var modalSelection = select(null);
57212 title: 'intro.startediting.title'
57215 function showHelp() {
57216 reveal('.map-control.help-control',
57217 t('intro.startediting.help', { button: icon('#iD-icon-help', 'pre-text'), key: t('help.key') }), {
57218 buttonText: t('intro.ok'),
57219 buttonCallback: function() { shortcuts(); }
57224 function shortcuts() {
57225 reveal('.map-control.help-control',
57226 t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
57227 buttonText: t('intro.ok'),
57228 buttonCallback: function() { showSave(); }
57233 function showSave() {
57234 d3_selectAll('.shaded').remove(); // in case user opened keyboard shortcuts
57235 reveal('#bar button.save',
57236 t('intro.startediting.save'), {
57237 buttonText: t('intro.ok'),
57238 buttonCallback: function() { showStart(); }
57243 function showStart() {
57244 d3_selectAll('.shaded').remove(); // in case user opened keyboard shortcuts
57246 modalSelection = uiModal(context.container());
57248 modalSelection.select('.modal')
57249 .attr('class', 'modal-splash modal col6');
57251 modalSelection.selectAll('.close').remove();
57253 var startbutton = modalSelection.select('.content')
57254 .attr('class', 'fillL')
57256 .attr('class', 'modal-section huge-modal-button')
57257 .on('click', function() {
57258 modalSelection.remove();
57263 .attr('class', 'illustration')
57265 .attr('xlink:href', '#iD-logo-walkthrough');
57269 .text(t('intro.startediting.start'));
57271 dispatch$$1.call('startEditing');
57275 chapter.enter = function() {
57280 chapter.exit = function() {
57281 modalSelection.remove();
57282 d3_selectAll('.shaded').remove(); // in case user opened keyboard shortcuts
57286 return utilRebind(chapter, dispatch$$1, 'on');
57290 welcome: uiIntroWelcome,
57291 navigation: uiIntroNavigation,
57292 point: uiIntroPoint,
57295 building: uiIntroBuilding,
57296 startEditing: uiIntroStartEditing
57299 var chapterFlow = [
57310 function uiIntro(context) {
57311 var INTRO_IMAGERY = 'EsriWorldImageryClarity';
57312 var introGraph = {};
57315 // create entities for intro graph and localize names
57316 for (var id in dataIntroGraph) {
57317 introGraph[id] = osmEntity$$1(localize(dataIntroGraph[id]));
57321 function intro(selection$$1) {
57322 context.enter(modeBrowse(context));
57324 // Save current map state
57325 var osm = context.connection();
57326 var history = context.history().toJSON();
57327 var hash = window.location.hash;
57328 var center = context.map().center();
57329 var zoom = context.map().zoom();
57330 var background = context.background().baseLayerSource();
57331 var overlays = context.background().overlayLayerSources();
57332 var opacity = d3_selectAll('#map .layer-background').style('opacity');
57333 var loadedTiles = osm && osm.loadedTiles();
57334 var baseEntities = context.history().graph().base().entities;
57335 var countryCode = services.geocoder.countryCode;
57338 context.inIntro(true);
57340 // Load semi-real data used in intro
57341 if (osm) { osm.toggle(false).reset(); }
57342 context.history().reset();
57343 context.history().merge(values$1(coreGraph$$1().load(introGraph).entities));
57344 context.history().checkpoint('initial');
57346 var imagery = context.background().findSource(INTRO_IMAGERY);
57348 context.background().baseLayerSource(imagery);
57350 context.background().bing();
57352 overlays.forEach(function (d) {
57353 context.background().toggleOverlayLayer(d);
57357 services.geocoder.countryCode = function(location, callback) {
57358 callback(null, t('intro.graph.countrycode'));
57361 d3_selectAll('#map .layer-background').style('opacity', 1);
57363 var curtain = uiCurtain();
57364 selection$$1.call(curtain);
57366 // store that the user started the walkthrough..
57367 context.storage('walkthrough_started', 'yes');
57369 // restore previous walkthrough progress..
57370 var storedProgress = context.storage('walkthrough_progress') || '';
57371 var progress = storedProgress.split(';').filter(Boolean);
57373 var chapters = chapterFlow.map(function(chapter, i) {
57374 var s = chapterUi[chapter](context, curtain.reveal)
57375 .on('done', function() {
57376 context.presets().init(); // clear away "recent" presets
57378 buttons.filter(function(d) {
57379 return d.title === s.title;
57380 }).classed('finished', true);
57382 if (i < chapterFlow.length - 1) {
57383 var next = chapterFlow[i + 1];
57384 select('button.chapter-' + next)
57385 .classed('next', true);
57388 // store walkthrough progress..
57389 progress.push(chapter);
57390 context.storage('walkthrough_progress', uniq(progress).join(';'));
57395 chapters[chapters.length - 1].on('startEditing', function() {
57396 // store walkthrough progress..
57397 progress.push('startEditing');
57398 context.storage('walkthrough_progress', uniq(progress).join(';'));
57400 // store if walkthrough is completed..
57401 var incomplete = difference(chapterFlow, progress);
57402 if (!incomplete.length) {
57403 context.storage('walkthrough_completed', 'yes');
57408 d3_selectAll('#map .layer-background').style('opacity', opacity);
57409 if (osm) { osm.toggle(true).reset().loadedTiles(loadedTiles); }
57410 context.history().reset().merge(values$1(baseEntities));
57411 context.background().baseLayerSource(background);
57412 overlays.forEach(function (d) { context.background().toggleOverlayLayer(d); });
57413 if (history) { context.history().fromJSON(history, false); }
57414 context.map().centerZoom(center, zoom);
57415 window.location.replace(hash);
57416 services.geocoder.countryCode = countryCode;
57417 context.inIntro(false);
57420 var navwrap = selection$$1
57422 .attr('class', 'intro-nav-wrap fillD');
57426 .attr('class', 'intro-nav-wrap-logo')
57428 .attr('xlink:href', '#iD-logo-walkthrough');
57430 var buttonwrap = navwrap
57432 .attr('class', 'joined')
57433 .selectAll('button.chapter');
57435 var buttons = buttonwrap
57439 .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
57440 .on('click', enterChapter);
57444 .text(function(d) { return t(d.title); });
57448 .attr('class', 'status')
57449 .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
57451 enterChapter(chapters[0]);
57454 function enterChapter(newChapter) {
57455 if (_currChapter) { _currChapter.exit(); }
57456 context.enter(modeBrowse(context));
57458 _currChapter = newChapter;
57459 _currChapter.enter();
57462 .classed('next', false)
57463 .classed('active', function(d) {
57464 return d.title === _currChapter.title;
57473 function uiTooltipHtml(text, key, heading) {
57477 s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
57480 s += '<div class="tooltip-text"><span>' + text + '</span></div>';
57483 s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
57484 '<span class="keyhint">' + key + '</span></div>';
57490 function uiMapData(context) {
57491 var key = t('map_data.key');
57492 var features = context.features().keys();
57493 var layers = context.layers();
57494 var fills = ['wireframe', 'partial', 'full'];
57496 var _fillSelected = context.storage('area-fill') || 'partial';
57497 var _shown = false;
57498 var _dataLayerContainer = select(null);
57499 var _fillList = select(null);
57500 var _featureList = select(null);
57503 function showsFeature(d) {
57504 return context.features().enabled(d);
57508 function autoHiddenFeature(d) {
57509 return context.features().autoHidden(d);
57513 function clickFeature(d) {
57514 context.features().toggle(d);
57519 function showsFill(d) {
57520 return _fillSelected === d;
57524 function setFill(d) {
57525 fills.forEach(function(opt) {
57526 context.surface().classed('fill-' + opt, Boolean(opt === d));
57530 context.storage('area-fill', d);
57531 if (d !== 'wireframe') {
57532 context.storage('area-fill-toggle', d);
57538 function showsLayer(which) {
57539 var layer = layers.layer(which);
57541 return layer.enabled();
57547 function setLayer(which, enabled) {
57548 var layer = layers.layer(which);
57550 layer.enabled(enabled);
57556 function toggleLayer(which) {
57557 setLayer(which, !showsLayer(which));
57561 function drawPhotoItems(selection$$1) {
57562 var photoKeys = ['streetside','mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
57563 var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
57564 var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
57566 function layerSupported(d) {
57567 return d.layer && d.layer.supported();
57569 function layerEnabled(d) {
57570 return layerSupported(d) && d.layer.enabled();
57573 var ul = selection$$1
57574 .selectAll('.layer-list-photos')
57579 .attr('class', 'layer-list layer-list-photos')
57582 var li = ul.selectAll('.list-item-photos')
57588 var liEnter = li.enter()
57590 .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
57592 var labelEnter = liEnter
57594 .each(function(d) {
57597 .title(t(d.id.replace('-', '_') + '.tooltip'))
57604 .attr('type', 'checkbox')
57605 .on('change', function(d) { toggleLayer(d.id); });
57609 .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
57617 .classed('active', layerEnabled)
57618 .selectAll('input')
57619 .property('checked', layerEnabled);
57623 function drawOsmItem(selection$$1) {
57624 var osm = layers.layer('osm'),
57625 showsOsm = osm.enabled();
57627 var ul = selection$$1
57628 .selectAll('.layer-list-osm')
57629 .data(osm ? [0] : []);
57636 var ulEnter = ul.enter()
57638 .attr('class', 'layer-list layer-list-osm');
57640 var liEnter = ulEnter
57642 .attr('class', 'list-item-osm');
57644 var labelEnter = liEnter
57647 .title(t('map_data.layers.osm.tooltip'))
57648 .placement('bottom')
57653 .attr('type', 'checkbox')
57654 .on('change', function() { toggleLayer('osm'); });
57658 .text(t('map_data.layers.osm.title'));
57664 ul.selectAll('.list-item-osm')
57665 .classed('active', showsOsm)
57666 .selectAll('input')
57667 .property('checked', showsOsm);
57671 function drawGpxItem(selection$$1) {
57672 var gpx = layers.layer('gpx'),
57673 hasGpx = gpx && gpx.hasGpx(),
57674 showsGpx = hasGpx && gpx.enabled();
57676 var ul = selection$$1
57677 .selectAll('.layer-list-gpx')
57678 .data(gpx ? [0] : []);
57685 var ulEnter = ul.enter()
57687 .attr('class', 'layer-list layer-list-gpx');
57689 var liEnter = ulEnter
57691 .attr('class', 'list-item-gpx');
57695 .attr('class', 'list-item-gpx-extent')
57697 .title(t('gpx.zoom'))
57698 .placement((textDirection === 'rtl') ? 'right' : 'left')
57700 .on('click', function() {
57701 event.preventDefault();
57702 event.stopPropagation();
57705 .call(svgIcon('#iD-icon-search'));
57709 .attr('class', 'list-item-gpx-browse')
57711 .title(t('gpx.browse'))
57712 .placement((textDirection === 'rtl') ? 'right' : 'left')
57714 .on('click', function() {
57715 select(document.createElement('input'))
57716 .attr('type', 'file')
57717 .on('change', function() {
57718 gpx.files(event.target.files);
57722 .call(svgIcon('#iD-icon-geolocate'));
57724 var labelEnter = liEnter
57727 .title(t('gpx.drag_drop'))
57733 .attr('type', 'checkbox')
57734 .on('change', function() { toggleLayer('gpx'); });
57738 .text(t('gpx.local_layer'));
57744 ul.selectAll('.list-item-gpx')
57745 .classed('active', showsGpx)
57746 .selectAll('label')
57747 .classed('deemphasize', !hasGpx)
57748 .selectAll('input')
57749 .property('disabled', !hasGpx)
57750 .property('checked', showsGpx);
57754 function drawListItems(selection$$1, data, type, name, change, active) {
57755 var items = selection$$1.selectAll('li')
57763 var enter = items.enter()
57765 .attr('class', 'layer')
57768 .title(function(d) {
57769 var tip = t(name + '.' + d + '.tooltip'),
57770 key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
57772 if (name === 'feature' && autoHiddenFeature(d)) {
57773 var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
57774 tip += '<div>' + msg + '</div>';
57776 return uiTooltipHtml(tip, key);
57786 .attr('type', type)
57787 .attr('name', name)
57788 .on('change', change);
57792 .text(function(d) { return t(name + '.' + d + '.description'); });
57799 .classed('active', active)
57800 .selectAll('input')
57801 .property('checked', active)
57802 .property('indeterminate', function(d) {
57803 return (name === 'feature' && autoHiddenFeature(d));
57808 function renderDataLayers(selection$$1) {
57809 var container = selection$$1.selectAll('data-layer-container')
57812 _dataLayerContainer = container.enter()
57814 .attr('class', 'data-layer-container')
57819 function renderFillList(selection$$1) {
57820 var container = selection$$1.selectAll('layer-fill-list')
57823 _fillList = container.enter()
57825 .attr('class', 'layer-list layer-fill-list')
57830 function renderFeatureList(selection$$1) {
57831 var container = selection$$1.selectAll('layer-feature-list')
57834 _featureList = container.enter()
57836 .attr('class', 'layer-list layer-feature-list')
57841 function update() {
57842 _dataLayerContainer
57844 .call(drawPhotoItems)
57845 .call(drawGpxItem);
57848 .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
57851 .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
57855 function toggleWireframe() {
57857 event.preventDefault();
57858 event.stopPropagation();
57861 if (_fillSelected === 'wireframe') {
57862 _fillSelected = context.storage('area-fill-toggle') || 'partial';
57864 _fillSelected = 'wireframe';
57867 setFill(_fillSelected);
57868 context.map().pan([0,0]); // trigger a redraw
57872 function mapData(selection$$1) {
57874 function hidePane() {
57878 function togglePane() {
57879 if (event) event.preventDefault();
57880 paneTooltip.hide(button);
57881 setVisible(!button.classed('active'));
57884 function setVisible(show) {
57885 if (show !== _shown) {
57886 button.classed('active', show);
57890 uiBackground.hidePane();
57895 .style('display', 'block')
57896 .style('right', '-300px')
57899 .style('right', '0px');
57903 .style('display', 'block')
57904 .style('right', '0px')
57907 .style('right', '-300px')
57908 .on('end', function() {
57909 select(this).style('display', 'none');
57916 var pane = selection$$1
57918 .attr('class', 'fillL map-pane col4 hide');
57920 var paneTooltip = tooltip()
57921 .placement((textDirection === 'rtl') ? 'right' : 'left')
57923 .title(uiTooltipHtml(t('map_data.description'), key));
57925 var button = selection$$1
57927 .attr('tabindex', -1)
57928 .on('click', togglePane)
57929 .call(svgIcon('#iD-icon-data', 'light'))
57930 .call(paneTooltip);
57935 .attr('class', 'pane-heading');
57939 .text(t('map_data.title'));
57943 .on('click', function() { uiMapData.hidePane(); })
57944 .call(svgIcon('#iD-icon-close'));
57949 .attr('class', 'pane-content');
57954 .attr('class', 'map-data-data-layers')
57955 .call(uiDisclosure(context, 'data_layers', true)
57956 .title(t('map_data.data_layers'))
57957 .content(renderDataLayers)
57963 .attr('class', 'map-data-area-fills')
57964 .call(uiDisclosure(context, 'fill_area', false)
57965 .title(t('map_data.fill_area'))
57966 .content(renderFillList)
57972 .attr('class', 'map-data-feature-filters')
57973 .call(uiDisclosure(context, 'map_features', false)
57974 .title(t('map_data.map_features'))
57975 .content(renderFeatureList)
57981 .on('change.map_data-update', update);
57984 setFill(_fillSelected);
57986 var keybinding = d3keybinding('features')
57987 .on(key, togglePane)
57988 .on(t('area_fill.wireframe.key'), toggleWireframe)
57989 .on([t('background.key'), t('help.key')], hidePane);
57994 uiMapData.hidePane = hidePane;
57995 uiMapData.togglePane = togglePane;
57996 uiMapData.setVisible = setVisible;
58002 function uiShortcuts() {
58003 var detected = utilDetect();
58005 var modalSelection;
58006 var savedSelection;
58009 var keybinding = d3keybinding('shortcuts')
58010 .on(t('shortcuts.toggle.key'), function () {
58011 if (d3_selectAll('.modal-shortcuts').size()) { // already showing
58012 if (modalSelection) {
58013 modalSelection.close();
58014 modalSelection = null;
58017 modalSelection = uiModal(savedSelection);
58018 shortcutsModal(modalSelection);
58027 function shortcutsModal(modalSelection) {
58028 modalSelection.select('.modal')
58029 .classed('modal-shortcuts', true);
58031 var shortcutsModal = modalSelection.select('.content');
58035 .attr('class', 'modal-section')
58037 .text(t('shortcuts.title'));
58044 function render(selection$$1) {
58045 var wrapper = selection$$1
58046 .selectAll('.wrapper')
58049 var wrapperEnter = wrapper
58052 .attr('class', 'wrapper modal-section');
58054 var tabsBar = wrapperEnter
58056 .attr('class', 'tabs-bar');
58058 var shortcutsList = wrapperEnter
58060 .attr('class', 'shortcuts-list');
58062 wrapper = wrapper.merge(wrapperEnter);
58066 .data(dataShortcuts);
58068 var tabsEnter = tabs
58071 .attr('class', 'tab')
58072 .on('click', function (d, i) {
58074 render(selection$$1);
58079 .text(function (d) { return t(d.text); });
58085 wrapper.selectAll('.tab')
58086 .classed('active', function (d, i) {
58087 return i === activeTab;
58091 var shortcuts = shortcutsList
58092 .selectAll('.shortcut-tab')
58093 .data(dataShortcuts);
58095 var shortcutsEnter = shortcuts
58098 .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
58100 var columnsEnter = shortcutsEnter
58101 .selectAll('.shortcut-column')
58102 .data(function (d) { return d.columns; })
58105 .attr('class', 'shortcut-column');
58107 var rowsEnter = columnsEnter
58108 .selectAll('.shortcut-row')
58109 .data(function (d) { return d.rows; })
58112 .attr('class', 'shortcut-row');
58115 var sectionRows = rowsEnter
58116 .filter(function (d) { return !d.shortcuts; });
58123 .attr('class', 'shortcut-section')
58125 .text(function (d) { return t(d.text); });
58128 var shortcutRows = rowsEnter
58129 .filter(function (d) { return d.shortcuts; });
58131 var shortcutKeys = shortcutRows
58133 .attr('class', 'shortcut-keys');
58135 var modifierKeys = shortcutKeys
58136 .filter(function (d) { return d.modifiers; });
58139 .selectAll('kbd.modifier')
58140 .data(function (d) {
58141 if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
58143 } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
58146 return d.modifiers;
58150 .each(function () {
58151 var selection$$1 = select(this);
58155 .attr('class', 'modifier')
58156 .text(function (d) { return uiCmd.display(d); });
58165 .selectAll('kbd.shortcut')
58166 .data(function (d) {
58167 var arr = d.shortcuts;
58168 if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
58170 } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
58174 return arr.map(function(s) {
58177 separator: d.separator
58182 .each(function (d, i, nodes) {
58183 var selection$$1 = select(this);
58184 var click = d.shortcut.toLowerCase().match(/(.*).click/);
58186 if (click && click[1]) {
58188 .call(svgIcon('#iD-walkthrough-mouse', 'mouseclick', click[1]));
58192 .attr('class', 'shortcut')
58193 .text(function (d) {
58194 var key = d.shortcut;
58195 return key.indexOf('.') !== -1 ? uiCmd.display(t(key)) : uiCmd.display(key);
58199 if (i < nodes.length - 1) {
58202 .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
58208 .filter(function(d) { return d.gesture; })
58209 .each(function () {
58210 var selection$$1 = select(this);
58218 .attr('class', 'gesture')
58219 .text(function (d) { return t(d.gesture); });
58225 .attr('class', 'shortcut-desc')
58226 .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
58229 shortcuts = shortcuts
58230 .merge(shortcutsEnter);
58233 wrapper.selectAll('.shortcut-tab')
58234 .style('display', function (d, i) {
58235 return i === activeTab ? 'flex' : 'none';
58240 return function(selection$$1, show) {
58241 savedSelection = selection$$1;
58243 modalSelection = uiModal(selection$$1);
58244 shortcutsModal(modalSelection);
58249 function uiHelp(context) {
58250 var key = t('help.key');
58273 'select_left_click',
58274 'select_right_click',
58276 'multiselect_shift_click',
58277 'multiselect_lasso',
58290 ['feature_editor', [
58297 'fields_all_fields',
58299 'fields_add_field',
58308 'add_point_finish',
58313 'delete_point_command'
58322 'modify_line_dragnode',
58323 'modify_line_addnode',
58326 'connect_line_display',
58327 'connect_line_drag',
58328 'connect_line_tag',
58329 'disconnect_line_h',
58330 'disconnect_line_command',
58332 'move_line_command',
58333 'move_line_connected',
58336 'delete_line_command'
58343 'add_area_command',
58347 'square_area_command',
58349 'modify_area_dragnode',
58350 'modify_area_addnode',
58353 'delete_area_command'
58359 'edit_relation_add',
58360 'edit_relation_delete',
58361 'maintain_relation_h',
58362 'maintain_relation',
58363 'relation_types_h',
58366 'multipolygon_create',
58367 'multipolygon_merge',
58368 'turn_restriction_h',
58369 'turn_restriction',
58370 'turn_restriction_field',
58371 'turn_restriction_editing',
58406 'help.help.open_data_h': 3,
58407 'help.help.before_start_h': 3,
58408 'help.help.open_source_h': 3,
58409 'help.overview.navigation_h': 3,
58410 'help.overview.features_h': 3,
58411 'help.editing.select_h': 3,
58412 'help.editing.multiselect_h': 3,
58413 'help.editing.undo_redo_h': 3,
58414 'help.editing.save_h': 3,
58415 'help.editing.upload_h': 3,
58416 'help.editing.backups_h': 3,
58417 'help.editing.keyboard_h': 3,
58418 'help.feature_editor.type_h': 3,
58419 'help.feature_editor.fields_h': 3,
58420 'help.feature_editor.tags_h': 3,
58421 'help.points.add_point_h': 3,
58422 'help.points.move_point_h': 3,
58423 'help.points.delete_point_h': 3,
58424 'help.lines.add_line_h': 3,
58425 'help.lines.modify_line_h': 3,
58426 'help.lines.connect_line_h': 3,
58427 'help.lines.disconnect_line_h': 3,
58428 'help.lines.move_line_h': 3,
58429 'help.lines.delete_line_h': 3,
58430 'help.areas.point_or_area_h': 3,
58431 'help.areas.add_area_h': 3,
58432 'help.areas.square_area_h': 3,
58433 'help.areas.modify_area_h': 3,
58434 'help.areas.delete_area_h': 3,
58435 'help.relations.edit_relation_h': 3,
58436 'help.relations.maintain_relation_h': 3,
58437 'help.relations.relation_types_h': 2,
58438 'help.relations.multipolygon_h': 3,
58439 'help.relations.turn_restriction_h': 3,
58440 'help.relations.route_h': 3,
58441 'help.relations.boundary_h': 3,
58442 'help.imagery.sources_h': 3,
58443 'help.imagery.offsets_h': 3,
58444 'help.streetlevel.using_h': 3,
58445 'help.gps.using_h': 3,
58448 var replacements = {
58449 point: icon('#iD-icon-point', 'pre-text'),
58450 line: icon('#iD-icon-line', 'pre-text'),
58451 area: icon('#iD-icon-area', 'pre-text'),
58452 plus: icon('#iD-icon-plus', 'pre-text'),
58453 minus: icon('#iD-icon-minus', 'pre-text'),
58454 orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'),
58455 disconnect: icon('#iD-operation-disconnect', 'pre-text'),
58456 layers: icon('#iD-icon-layers', 'pre-text'),
58457 data: icon('#iD-icon-data', 'pre-text'),
58458 inspect: icon('#iD-icon-inspect', 'pre-text'),
58459 move: icon('#iD-operation-move', 'pre-text'),
58460 merge: icon('#iD-operation-merge', 'pre-text'),
58461 delete: icon('#iD-operation-delete', 'pre-text'),
58462 close: icon('#iD-icon-close', 'pre-text'),
58463 undo: icon(textDirection === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo', 'pre-text'),
58464 redo: icon(textDirection === 'rtl' ? '#iD-icon-undo' : '#iD-icon-redo', 'pre-text'),
58465 save: icon('#iD-icon-save', 'pre-text'),
58466 leftclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'left'),
58467 rightclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'right'),
58468 shift: uiCmd.display('⇧'),
58469 alt: uiCmd.display('⌥'),
58470 return: uiCmd.display('↵'),
58471 version: context.version
58474 // For each section, squash all the texts into a single markdown document
58475 var docs = docKeys.map(function(key) {
58476 var helpkey = 'help.' + key[0];
58477 var text = key[1].reduce(function(all, part) {
58478 var subkey = helpkey + '.' + part;
58479 var depth = headings[subkey]; // is this subkey a heading?
58480 var hhh = depth ? Array(depth + 1).join('#') + ' ' : ''; // if so, prepend with some ##'s
58481 return all + hhh + t(subkey, replacements) + '\n\n';
58485 title: t(helpkey + '.title'),
58486 html: marked(text.trim())
58491 function help(selection$$1) {
58493 function hidePane() {
58498 function togglePane() {
58499 if (event) event.preventDefault();
58500 tooltipBehavior.hide(button);
58501 setVisible(!button.classed('active'));
58505 function setVisible(show) {
58506 if (show !== shown) {
58507 button.classed('active', show);
58511 uiBackground.hidePane();
58512 uiMapData.hidePane();
58514 pane.style('display', 'block')
58515 .style('right', '-500px')
58518 .style('right', '0px');
58521 pane.style('right', '0px')
58524 .style('right', '-500px')
58525 .on('end', function() {
58526 select(this).style('display', 'none');
58533 function clickHelp(d, i) {
58534 var rtl = (textDirection === 'rtl');
58535 pane.property('scrollTop', 0);
58536 doctitle.html(d.title);
58539 body.selectAll('a')
58540 .attr('target', '_blank');
58541 menuItems.classed('selected', function(m) {
58542 return m.title === d.title;
58547 nav.call(drawNext).call(drawPrevious);
58549 nav.call(drawPrevious).call(drawNext);
58553 function drawNext(selection$$1) {
58554 if (i < docs.length - 1) {
58555 var nextLink = selection$$1
58557 .attr('class', 'next')
58558 .on('click', function() {
58559 clickHelp(docs[i + 1], i + 1);
58564 .text(docs[i + 1].title)
58565 .call(svgIcon((rtl ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
58570 function drawPrevious(selection$$1) {
58572 var prevLink = selection$$1
58574 .attr('class', 'previous')
58575 .on('click', function() {
58576 clickHelp(docs[i - 1], i - 1);
58580 .call(svgIcon((rtl ? '#iD-icon-forward' : '#iD-icon-backward'), 'inline'))
58582 .text(docs[i - 1].title);
58588 function clickWalkthrough() {
58589 if (context.inIntro()) return;
58590 context.container().call(uiIntro(context));
58595 function clickShortcuts() {
58596 context.container().call(uiShortcuts(context), true);
58600 var pane = selection$$1.append('div')
58601 .attr('class', 'help-wrap map-pane fillL col6 hide');
58603 var tooltipBehavior = tooltip()
58604 .placement((textDirection === 'rtl') ? 'right' : 'left')
58606 .title(uiTooltipHtml(t('help.title'), key));
58608 var button = selection$$1.append('button')
58609 .attr('tabindex', -1)
58610 .on('click', togglePane)
58611 .call(svgIcon('#iD-icon-help', 'light'))
58612 .call(tooltipBehavior);
58619 .attr('class', 'pane-heading');
58621 var doctitle = heading
58623 .text(t('help.title'));
58627 .on('click', function() { uiHelp.hidePane(); })
58628 .call(svgIcon('#iD-icon-close'));
58633 .attr('class', 'pane-content');
58637 .attr('class', 'toc');
58639 var menuItems = toc.selectAll('li')
58644 .html(function(d) { return d.title; })
58645 .on('click', clickHelp);
58647 var shortcuts = toc
58649 .attr('class', 'shortcuts')
58652 .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
58656 .on('click', clickShortcuts);
58660 .text(t('shortcuts.title'));
58662 var walkthrough = toc
58664 .attr('class', 'walkthrough')
58666 .on('click', clickWalkthrough);
58670 .attr('class', 'logo logo-walkthrough')
58672 .attr('xlink:href', '#iD-logo-walkthrough');
58676 .text(t('splash.walkthrough'));
58679 var helpContent = content
58681 .attr('class', 'left-content');
58683 var body = helpContent
58685 .attr('class', 'body');
58687 var nav = helpContent
58689 .attr('class', 'nav');
58691 clickHelp(docs[0], 0);
58693 var keybinding = d3keybinding('help')
58694 .on(key, togglePane)
58695 .on([t('background.key'), t('map_data.key')], hidePane);
58700 uiHelp.hidePane = hidePane;
58701 uiHelp.togglePane = togglePane;
58702 uiHelp.setVisible = setVisible;
58708 function localeDateString(s) {
58709 if (!s) return null;
58710 var detected = utilDetect();
58711 var options = { day: 'numeric', month: 'short', year: 'numeric' };
58712 var d = new Date(s);
58713 if (isNaN(d.getTime())) return null;
58714 return d.toLocaleDateString(detected.locale, options);
58717 function vintageRange(vintage) {
58719 if (vintage.start || vintage.end) {
58720 s = (vintage.start || '?');
58721 if (vintage.start !== vintage.end) {
58722 s += ' - ' + (vintage.end || '?');
58729 function rendererBackgroundSource(data) {
58730 var source = clone(data);
58731 var offset = [0, 0];
58732 var name = source.name;
58733 var description = source.description;
58734 var best = !!source.best;
58735 var template = source.template;
58737 source.scaleExtent = data.scaleExtent || [0, 22];
58738 source.overzoom = data.overzoom !== false;
58741 source.offset = function(_) {
58742 if (!arguments.length) return offset;
58748 source.nudge = function(_, zoomlevel) {
58749 offset[0] += _[0] / Math.pow(2, zoomlevel);
58750 offset[1] += _[1] / Math.pow(2, zoomlevel);
58755 source.name = function() {
58756 var id_safe = source.id.replace('.', '<TX_DOT>');
58757 return t('imagery.' + id_safe + '.name', { default: name });
58761 source.description = function() {
58762 var id_safe = source.id.replace('.', '<TX_DOT>');
58763 return t('imagery.' + id_safe + '.description', { default: description });
58767 source.best = function() {
58772 source.area = function() {
58773 if (!data.polygon) return Number.MAX_VALUE; // worldwide
58774 var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
58775 return isNaN(area) ? 0 : area;
58779 source.imageryUsed = function() {
58780 return name || source.id;
58784 source.template = function(_) {
58785 if (!arguments.length) return template;
58786 if (source.id === 'custom') template = _;
58791 source.url = function(coord) {
58792 if (this.type === 'wms') {
58793 var tileToProjectedCoords = (function(x, y, z) {
58794 //polyfill for IE11, PhantomJS
58795 var sinh = Math.sinh || function(x) {
58796 var y = Math.exp(x);
58797 return (y - 1 / y) / 2;
58800 var zoomSize = Math.pow(2, z);
58801 var lon = x / zoomSize * Math.PI * 2 - Math.PI;
58802 var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
58804 switch (this.projection) {
58805 case 'EPSG:4326': // todo: alternative codes of WGS 84?
58807 x: lon * 180 / Math.PI,
58808 y: lat * 180 / Math.PI
58810 default: // EPSG:3857 and synonyms
58811 var mercCoords = mercatorRaw(lon, lat);
58813 x: 20037508.34 / Math.PI * mercCoords[0],
58814 y: 20037508.34 / Math.PI * mercCoords[1]
58818 var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
58819 var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
58821 .replace('{width}', 256)
58822 .replace('{height}', 256)
58823 .replace('{proj}', this.projection)
58824 .replace('{bbox}', minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y);
58827 .replace('{x}', coord[0])
58828 .replace('{y}', coord[1])
58829 // TMS-flipped y coordinate
58830 .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
58831 .replace(/\{z(oom)?\}/, coord[2])
58832 .replace(/\{switch:([^}]+)\}/, function(s, r) {
58833 var subdomains = r.split(',');
58834 return subdomains[(coord[0] + coord[1]) % subdomains.length];
58836 .replace('{u}', function() {
58838 for (var zoom = coord[2]; zoom > 0; zoom--) {
58840 var mask = 1 << (zoom - 1);
58841 if ((coord[0] & mask) !== 0) b++;
58842 if ((coord[1] & mask) !== 0) b += 2;
58850 source.intersects = function(extent) {
58851 extent = extent.polygon();
58852 return !data.polygon || data.polygon.some(function(polygon) {
58853 return geoPolygonIntersectsPolygon(polygon, extent, true);
58858 source.validZoom = function(z) {
58859 return source.scaleExtent[0] <= z &&
58860 (source.overzoom || source.scaleExtent[1] > z);
58864 source.isLocatorOverlay = function() {
58865 return source.id === 'mapbox_locator_overlay';
58869 /* hides a source from the list, but leaves it available for use */
58870 source.isHidden = function() {
58871 return source.id === 'DigitalGlobe-Premium-vintage' ||
58872 source.id === 'DigitalGlobe-Standard-vintage';
58876 source.copyrightNotices = function() {};
58879 source.getMetadata = function(center, tileCoord, callback) {
58881 start: localeDateString(source.startDate),
58882 end: localeDateString(source.endDate)
58884 vintage.range = vintageRange(vintage);
58886 var metadata = { vintage: vintage };
58887 callback(null, metadata);
58895 rendererBackgroundSource.Bing = function(data, dispatch) {
58896 // http://msdn.microsoft.com/en-us/library/ff701716.aspx
58897 // http://msdn.microsoft.com/en-us/library/ff701701.aspx
58899 data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
58901 var bing = rendererBackgroundSource(data),
58902 key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU', // Same as P2 and JOSM
58903 url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
58904 key + '&jsonp={callback}',
58909 jsonpRequest(url, function(json) {
58910 providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
58912 attribution: provider.attribution,
58913 areas: provider.coverageAreas.map(function(area) {
58915 zoom: [area.zoomMin, area.zoomMax],
58916 extent: geoExtent$$1([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
58921 dispatch.call('change');
58925 bing.copyrightNotices = function(zoom, extent) {
58926 zoom = Math.min(zoom, 21);
58927 return providers.filter(function(provider) {
58928 return some(provider.areas, function(area) {
58929 return extent.intersects(area.extent) &&
58930 area.zoom[0] <= zoom &&
58931 area.zoom[1] >= zoom;
58933 }).map(function(provider) {
58934 return provider.attribution;
58939 bing.getMetadata = function(center, tileCoord, callback) {
58940 var tileId = tileCoord.slice(0, 3).join('/'),
58941 zoom = Math.min(tileCoord[2], 21),
58942 centerPoint = center[1] + ',' + center[0], // lat,lng
58943 url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
58944 '?zl=' + zoom + '&key=' + key + '&jsonp={callback}';
58946 if (inflight[tileId]) return;
58948 if (!cache[tileId]) {
58949 cache[tileId] = {};
58951 if (cache[tileId] && cache[tileId].metadata) {
58952 return callback(null, cache[tileId].metadata);
58955 inflight[tileId] = true;
58956 jsonpRequest(url, function(result) {
58957 delete inflight[tileId];
58959 var err = (!result && 'Unknown Error') || result.errorDetails;
58961 return callback(err);
58964 start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
58965 end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
58967 vintage.range = vintageRange(vintage);
58969 var metadata = { vintage: vintage };
58970 cache[tileId].metadata = metadata;
58971 return callback(null, metadata);
58977 bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
58985 rendererBackgroundSource.Esri = function(data) {
58987 // don't request blank tiles, instead overzoom real tiles - #4327
58988 // deprecated technique, but it works (for now)
58989 if (data.template.match(/blankTile/) === null) {
58990 data.template = data.template + '?blankTile=false';
58993 var esri = rendererBackgroundSource(data),
58997 esri.getMetadata = function(center, tileCoord, callback) {
58998 var tileId = tileCoord.slice(0, 3).join('/'),
58999 zoom = Math.min(tileCoord[2], esri.scaleExtent[1]),
59000 centerPoint = center[0] + ',' + center[1], // long, lat (as it should be)
59001 unknown = t('info_panels.background.unknown'),
59006 if (inflight[tileId]) return;
59009 case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
59022 metadataLayer = 99;
59026 // build up query using the layer appropriate to the current zoom
59027 if (esri.id === 'EsriWorldImagery') {
59028 url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
59029 } else if (esri.id === 'EsriWorldImageryClarity') {
59030 url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
59033 url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json&callback={callback}';
59035 if (!cache[tileId]) {
59036 cache[tileId] = {};
59038 if (cache[tileId] && cache[tileId].metadata) {
59039 return callback(null, cache[tileId].metadata);
59042 // accurate metadata is only available >= 13
59043 if (metadataLayer === 99) {
59052 description: unknown,
59053 resolution: unknown,
59057 callback(null, metadata);
59060 inflight[tileId] = true;
59061 jsonpRequest(url, function(result) {
59062 delete inflight[tileId];
59066 err = 'Unknown Error';
59067 } else if (result.features && result.features.length < 1) {
59068 err = 'No Results';
59069 } else if (result.error && result.error.message) {
59070 err = result.error.message;
59074 return callback(err);
59076 // pass through the discrete capture date from metadata
59077 var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
59079 start: captureDate,
59085 source: clean(result.features[0].attributes.NICE_NAME),
59086 description: clean(result.features[0].attributes.NICE_DESC),
59087 resolution: clean(result.features[0].attributes.SRC_RES),
59088 accuracy: clean(result.features[0].attributes.SRC_ACC)
59091 // append units - meters
59092 if (isFinite(metadata.resolution)) {
59093 metadata.resolution += ' m';
59095 if (isFinite(metadata.accuracy)) {
59096 metadata.accuracy += ' m';
59099 cache[tileId].metadata = metadata;
59100 return callback(null, metadata);
59106 function clean(val) {
59107 return String(val).trim() || unknown;
59115 rendererBackgroundSource.None = function() {
59116 var source = rendererBackgroundSource({ id: 'none', template: '' });
59119 source.name = function() {
59120 return t('background.none');
59124 source.imageryUsed = function() {
59129 source.area = function() {
59130 return -1; // sources in background pane are sorted by area
59138 rendererBackgroundSource.Custom = function(template) {
59139 var source = rendererBackgroundSource({ id: 'custom', template: template });
59142 source.name = function() {
59143 return t('background.custom');
59147 source.imageryUsed = function() {
59148 return 'Custom (' + source.template() + ')';
59152 source.area = function() {
59153 return -2; // sources in background pane are sorted by area
59160 function rendererTileLayer(context) {
59161 var tileSize = 256;
59162 var transformProp = utilPrefixCSSProperty('Transform');
59163 var geotile = d3geoTile();
59172 // blacklist overlay tiles around Null Island..
59173 function nearNullIsland(x, y, z) {
59175 var center = Math.pow(2, z - 1);
59176 var width = Math.pow(2, z - 6);
59177 var min = center - (width / 2);
59178 var max = center + (width / 2) - 1;
59179 return x >= min && x <= max && y >= min && y <= max;
59185 function tileSizeAtZoom(d, z) {
59186 var EPSILON = 0.002;
59187 return ((tileSize * Math.pow(2, z - d[2])) / tileSize) + EPSILON;
59191 function atZoom(t$$1, distance) {
59192 var power = Math.pow(2, distance);
59194 Math.floor(t$$1[0] * power),
59195 Math.floor(t$$1[1] * power),
59201 function lookUp(d) {
59202 for (var up = -1; up > -d[2]; up--) {
59203 var tile = atZoom(d, up);
59204 if (_cache[_source.url(tile)] !== false) {
59211 function uniqueBy(a, n) {
59214 for (var i = 0; i < a.length; i++) {
59215 if (seen[a[i][n]] === undefined) {
59217 seen[a[i][n]] = true;
59224 function addSource(d) {
59225 d.push(_source.url(d));
59230 // Update tiles based on current state of `projection`.
59231 function background(selection$$1) {
59232 _zoom = geoScaleToZoom(_projection.scale(), tileSize);
59237 _source.offset()[0] * Math.pow(2, _zoom),
59238 _source.offset()[1] * Math.pow(2, _zoom)
59241 pixelOffset = [0, 0];
59245 _projection.translate()[0] + pixelOffset[0],
59246 _projection.translate()[1] + pixelOffset[1]
59250 .scale(_projection.scale() * 2 * Math.PI)
59251 .translate(translate);
59254 _projection.scale() * Math.PI - translate[0],
59255 _projection.scale() * Math.PI - translate[1]
59258 render(selection$$1);
59262 // Derive the tiles onscreen, remove those offscreen and position them.
59263 // Important that this part not depend on `_projection` because it's
59264 // rentered when tiles load/error (see #644).
59265 function render(selection$$1) {
59266 if (!_source) return;
59268 var showDebug = context.getDebug('tile') && !_source.overlay;
59270 if (_source.validZoom(_zoom)) {
59271 geotile().forEach(function(d) {
59273 if (d[3] === '') return;
59274 if (typeof d[3] !== 'string') return; // Workaround for #2295
59276 if (_cache[d[3]] === false && lookUp(d)) {
59277 requests.push(addSource(lookUp(d)));
59281 requests = uniqueBy(requests, 3).filter(function(r) {
59282 if (!!_source.overlay && nearNullIsland(r[0], r[1], r[2])) {
59285 // don't re-request tiles which have failed in the past
59286 return _cache[r[3]] !== false;
59292 _cache[d[3]] = true;
59296 .classed('tile-loaded', true);
59297 render(selection$$1);
59300 function error(d) {
59301 _cache[d[3]] = false;
59306 render(selection$$1);
59309 function imageTransform(d) {
59310 var ts = tileSize * Math.pow(2, _zoom - d[2]);
59311 var scale = tileSizeAtZoom(d, _zoom);
59312 return 'translate(' +
59313 ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
59314 ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
59315 'scale(' + scale + ',' + scale + ')';
59318 function tileCenter(d) {
59319 var ts = tileSize * Math.pow(2, _zoom - d[2]);
59321 ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
59322 ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
59326 function debugTransform(d) {
59327 var coord = tileCenter(d);
59328 return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
59332 // Pick a representative tile near the center of the viewport
59333 // (This is useful for sampling the imagery vintage)
59334 var dims = geotile.size();
59335 var mapCenter = [dims[0] / 2, dims[1] / 2];
59336 var minDist = Math.max(dims[0], dims[1]);
59339 requests.forEach(function(d) {
59340 var c = tileCenter(d);
59341 var dist = geoVecLength(c, mapCenter);
59342 if (dist < minDist) {
59349 var image = selection$$1.selectAll('img')
59350 .data(requests, function(d) { return d[3]; });
59353 .style(transformProp, imageTransform)
59354 .classed('tile-removing', true)
59355 .classed('tile-center', false)
59357 var tile = select(this);
59358 window.setTimeout(function() {
59359 if (tile.classed('tile-removing')) {
59367 .attr('class', 'tile')
59368 .attr('src', function(d) { return d[3]; })
59369 .on('error', error)
59372 .style(transformProp, imageTransform)
59373 .classed('tile-debug', showDebug)
59374 .classed('tile-removing', false)
59375 .classed('tile-center', function(d) { return d === nearCenter; });
59379 var debug = selection$$1.selectAll('.tile-label-debug')
59380 .data(showDebug ? requests : [], function(d) { return d[3]; });
59386 var debugEnter = debug.enter()
59388 .attr('class', 'tile-label-debug');
59392 .attr('class', 'tile-label-debug-coord');
59396 .attr('class', 'tile-label-debug-vintage');
59398 debug = debug.merge(debugEnter);
59401 .style(transformProp, debugTransform);
59404 .selectAll('.tile-label-debug-coord')
59405 .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
59408 .selectAll('.tile-label-debug-vintage')
59409 .each(function(d) {
59410 var span = select(this);
59411 var center = context.projection.invert(tileCenter(d));
59412 _source.getMetadata(center, d, function(err, result) {
59413 span.text((result && result.vintage && result.vintage.range) ||
59414 t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
59423 background.projection = function(_) {
59424 if (!arguments.length) return _projection;
59430 background.dimensions = function(_) {
59431 if (!arguments.length) return geotile.size();
59437 background.source = function(_) {
59438 if (!arguments.length) return _source;
59441 geotile.scaleExtent(_source.scaleExtent);
59449 function rendererBackground(context) {
59450 var dispatch$$1 = dispatch('change');
59451 var detected = utilDetect();
59452 var baseLayer = rendererTileLayer(context).projection(context.projection);
59453 var _overlayLayers = [];
59454 var _backgroundSources = [];
59455 var _brightness = 1;
59457 var _saturation = 1;
59458 var _sharpness = 1;
59461 function background(selection$$1) {
59463 var baseFilter = '';
59464 if (detected.cssfilters) {
59465 if (_brightness !== 1) {
59466 baseFilter += 'brightness(' + _brightness + ')';
59468 if (_contrast !== 1) {
59469 baseFilter += 'contrast(' + _contrast + ')';
59471 if (_saturation !== 1) {
59472 baseFilter += 'saturate(' + _saturation + ')';
59474 if (_sharpness < 1) { // gaussian blur
59475 var blur = interpolateNumber(0.5, 5)(1 - _sharpness);
59476 baseFilter += 'blur(' + blur + 'px)';
59480 var base = selection$$1.selectAll('.layer-background')
59483 base = base.enter()
59484 .insert('div', '.layer-data')
59485 .attr('class', 'layer layer-background')
59488 if (detected.cssfilters) {
59489 base.style('filter', baseFilter || null);
59491 base.style('opacity', _brightness);
59495 var imagery = base.selectAll('.layer-imagery')
59500 .attr('class', 'layer layer-imagery')
59505 var maskFilter = '';
59506 var mixBlendMode = '';
59507 if (detected.cssfilters && _sharpness > 1) { // apply unsharp mask
59508 mixBlendMode = 'overlay';
59509 maskFilter = 'saturate(0) blur(3px) invert(1)';
59511 var contrast = _sharpness - 1;
59512 maskFilter += ' contrast(' + contrast + ')';
59514 var brightness = interpolateNumber(1, 0.85)(_sharpness - 1);
59515 maskFilter += ' brightness(' + brightness + ')';
59518 var mask = base.selectAll('.layer-unsharp-mask')
59519 .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
59526 .attr('class', 'layer layer-mask layer-unsharp-mask')
59529 .style('filter', maskFilter || null)
59530 .style('mix-blend-mode', mixBlendMode || null);
59533 var overlays = selection$$1.selectAll('.layer-overlay')
59534 .data(_overlayLayers, function(d) { return d.source().name(); });
59540 .insert('div', '.layer-data')
59541 .attr('class', 'layer layer-overlay')
59543 .each(function(layer) { select(this).call(layer); });
59547 background.updateImagery = function() {
59548 if (context.inIntro()) return;
59550 var b = background.baseLayerSource(),
59552 .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
59553 .map(function (d) { return d.source().id; })
59555 meters = geoOffsetToMeters(b.offset()),
59557 x = +meters[0].toFixed(2),
59558 y = +meters[1].toFixed(2),
59559 q = utilStringQs(window.location.hash.substring(1));
59562 if (id === 'custom') {
59563 id = 'custom:' + b.template();
59569 delete q.background;
59578 if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
59579 q.offset = x + ',' + y;
59584 if (!window.mocha) {
59585 window.location.replace('#' + utilQsString(q, true));
59588 var imageryUsed = [b.imageryUsed()];
59591 .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
59592 .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
59594 var gpx = context.layers().layer('gpx');
59595 if (gpx && gpx.enabled() && gpx.hasGpx()) {
59596 // Include a string like '.gpx data file' or '.geojson data file'
59597 var match = gpx.getSrc().match(/(kml|gpx|(?:geo)?json)$/i);
59598 var extension = match ? ('.' + match[0].toLowerCase() + ' ') : '';
59599 imageryUsed.push(extension + 'data file');
59602 var streetside = context.layers().layer('streetside');
59603 if (streetside && streetside.enabled()) {
59604 imageryUsed.push('Bing Streetside');
59607 var mapillary_images = context.layers().layer('mapillary-images');
59608 if (mapillary_images && mapillary_images.enabled()) {
59609 imageryUsed.push('Mapillary Images');
59612 var mapillary_signs = context.layers().layer('mapillary-signs');
59613 if (mapillary_signs && mapillary_signs.enabled()) {
59614 imageryUsed.push('Mapillary Signs');
59617 var openstreetcam_images = context.layers().layer('openstreetcam-images');
59618 if (openstreetcam_images && openstreetcam_images.enabled()) {
59619 imageryUsed.push('OpenStreetCam Images');
59622 context.history().imageryUsed(imageryUsed);
59626 background.sources = function(extent) {
59627 return _backgroundSources.filter(function(source) {
59628 return source.intersects(extent);
59633 background.dimensions = function(_) {
59635 baseLayer.dimensions(_);
59637 _overlayLayers.forEach(function(layer) {
59638 layer.dimensions(_);
59643 background.baseLayerSource = function(d) {
59644 if (!arguments.length) return baseLayer.source();
59646 // test source against OSM imagery blacklists..
59647 var osm = context.connection();
59648 if (!osm) return background;
59650 var blacklists = context.connection().imageryBlacklists();
59652 var template = d.template(),
59657 for (i = 0; i < blacklists.length; i++) {
59659 regex = new RegExp(blacklists[i]);
59660 fail = regex.test(template);
59668 // ensure at least one test was run.
59670 regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
59671 fail = regex.test(template);
59674 baseLayer.source(!fail ? d : background.findSource('none'));
59675 dispatch$$1.call('change');
59676 background.updateImagery();
59681 background.findSource = function(id) {
59682 return find$1(_backgroundSources, function(d) {
59683 return d.id && d.id === id;
59688 background.bing = function() {
59689 background.baseLayerSource(background.findSource('Bing'));
59693 background.showsLayer = function(d) {
59694 return d.id === baseLayer.source().id ||
59695 _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
59699 background.overlayLayerSources = function() {
59700 return _overlayLayers.map(function (l) { return l.source(); });
59704 background.toggleOverlayLayer = function(d) {
59707 for (var i = 0; i < _overlayLayers.length; i++) {
59708 layer = _overlayLayers[i];
59709 if (layer.source() === d) {
59710 _overlayLayers.splice(i, 1);
59711 dispatch$$1.call('change');
59712 background.updateImagery();
59717 layer = rendererTileLayer(context)
59719 .projection(context.projection)
59720 .dimensions(baseLayer.dimensions()
59723 _overlayLayers.push(layer);
59724 dispatch$$1.call('change');
59725 background.updateImagery();
59729 background.nudge = function(d, zoom) {
59730 baseLayer.source().nudge(d, zoom);
59731 dispatch$$1.call('change');
59732 background.updateImagery();
59737 background.offset = function(d) {
59738 if (!arguments.length) return baseLayer.source().offset();
59739 baseLayer.source().offset(d);
59740 dispatch$$1.call('change');
59741 background.updateImagery();
59746 background.brightness = function(d) {
59747 if (!arguments.length) return _brightness;
59749 if (context.mode()) dispatch$$1.call('change');
59754 background.contrast = function(d) {
59755 if (!arguments.length) return _contrast;
59757 if (context.mode()) dispatch$$1.call('change');
59762 background.saturation = function(d) {
59763 if (!arguments.length) return _saturation;
59765 if (context.mode()) dispatch$$1.call('change');
59770 background.sharpness = function(d) {
59771 if (!arguments.length) return _sharpness;
59773 if (context.mode()) dispatch$$1.call('change');
59778 background.init = function() {
59779 function parseMap(qmap) {
59780 if (!qmap) return false;
59781 var args = qmap.split('/').map(Number);
59782 if (args.length < 3 || args.some(isNaN)) return false;
59783 return geoExtent$$1([args[2], args[1]]);
59786 var dataImagery = data.imagery || [],
59787 q = utilStringQs(window.location.hash.substring(1)),
59788 requested = q.background || q.layer,
59789 extent = parseMap(q.map),
59793 // Add all the available imagery sources
59794 _backgroundSources = dataImagery.map(function(source) {
59795 if (source.type === 'bing') {
59796 return rendererBackgroundSource.Bing(source, dispatch$$1);
59797 } else if (/^EsriWorldImagery/.test(source.id)) {
59798 return rendererBackgroundSource.Esri(source);
59800 return rendererBackgroundSource(source);
59804 first = _backgroundSources.length && _backgroundSources[0];
59807 _backgroundSources.unshift(rendererBackgroundSource.None());
59810 var template = context.storage('background-custom-template') || '';
59811 var custom = rendererBackgroundSource.Custom(template);
59812 _backgroundSources.unshift(custom);
59815 // Decide which background layer to display
59816 if (!requested && extent) {
59817 best = find$1(this.sources(extent), function(s) { return s.best(); });
59819 if (requested && requested.indexOf('custom:') === 0) {
59820 template = requested.replace(/^custom:/, '');
59821 background.baseLayerSource(custom.template(template));
59822 context.storage('background-custom-template', template);
59824 background.baseLayerSource(
59825 background.findSource(requested) ||
59827 background.findSource(context.storage('background-last-used')) ||
59828 background.findSource('Bing') ||
59830 background.findSource('none')
59834 var locator = find$1(_backgroundSources, function(d) {
59835 return d.overlay && d.default;
59839 background.toggleOverlayLayer(locator);
59842 var overlays = (q.overlays || '').split(',');
59843 overlays.forEach(function(overlay) {
59844 overlay = background.findSource(overlay);
59846 background.toggleOverlayLayer(overlay);
59851 var gpx = context.layers().layer('gpx');
59858 var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
59859 return !isNaN(n) && n;
59862 if (offset.length === 2) {
59863 background.offset(geoMetersToOffset(offset));
59869 return utilRebind(background, dispatch$$1, 'on');
59872 function rendererFeatures(context) {
59873 var traffic_roads = {
59875 'motorway_link': true,
59877 'trunk_link': true,
59879 'primary_link': true,
59881 'secondary_link': true,
59883 'tertiary_link': true,
59884 'residential': true,
59885 'unclassified': true,
59886 'living_street': true
59889 var service_roads = {
59901 'pedestrian': true,
59905 var past_futures = {
59907 'construction': true,
59909 'dismantled': true,
59912 'demolished': true,
59913 'obliterated': true
59916 var dispatch$$1 = dispatch('change', 'redraw'),
59925 function update() {
59926 if (!window.mocha) {
59927 var q = utilStringQs(window.location.hash.substring(1));
59928 var disabled = features.disabled();
59929 if (disabled.length) {
59930 q.disable_features = disabled.join(',');
59932 delete q.disable_features;
59934 window.location.replace('#' + utilQsString(q, true));
59935 context.storage('disabled-features', disabled.join(','));
59937 _hidden = features.hidden();
59938 dispatch$$1.call('change');
59939 dispatch$$1.call('redraw');
59943 function defineFeature(k, filter, max) {
59944 var isEnabled = true;
59949 enabled: isEnabled, // whether the user wants it enabled..
59951 currentMax: (max || Infinity),
59952 defaultMax: (max || Infinity),
59953 enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
59954 disable: function() { this.enabled = false; this.currentMax = 0; },
59955 hidden: function() { return !context.editable() || this.count > this.currentMax * _cullFactor; },
59956 autoHidden: function() { return this.hidden() && this.currentMax > 0; }
59961 defineFeature('points', function isPoint(entity, resolver, geometry) {
59962 return geometry === 'point';
59965 defineFeature('traffic_roads', function isTrafficRoad(entity) {
59966 return traffic_roads[entity.tags.highway];
59969 defineFeature('service_roads', function isServiceRoad(entity) {
59970 return service_roads[entity.tags.highway];
59973 defineFeature('paths', function isPath(entity) {
59974 return paths[entity.tags.highway];
59977 defineFeature('buildings', function isBuilding(entity) {
59979 !!entity.tags['building:part'] ||
59980 (!!entity.tags.building && entity.tags.building !== 'no') ||
59981 entity.tags.parking === 'multi-storey' ||
59982 entity.tags.parking === 'sheds' ||
59983 entity.tags.parking === 'carports' ||
59984 entity.tags.parking === 'garage_boxes'
59988 defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
59989 return geometry === 'area' &&
59990 !_features.buildings.filter(entity) &&
59991 !_features.water.filter(entity);
59994 defineFeature('boundaries', function isBoundary(entity) {
59996 !!entity.tags.boundary
59998 traffic_roads[entity.tags.highway] ||
59999 service_roads[entity.tags.highway] ||
60000 paths[entity.tags.highway]
60004 defineFeature('water', function isWater(entity) {
60006 !!entity.tags.waterway ||
60007 entity.tags.natural === 'water' ||
60008 entity.tags.natural === 'coastline' ||
60009 entity.tags.natural === 'bay' ||
60010 entity.tags.landuse === 'pond' ||
60011 entity.tags.landuse === 'basin' ||
60012 entity.tags.landuse === 'reservoir' ||
60013 entity.tags.landuse === 'salt_pond'
60017 defineFeature('rail', function isRail(entity) {
60019 !!entity.tags.railway ||
60020 entity.tags.landuse === 'railway'
60022 traffic_roads[entity.tags.highway] ||
60023 service_roads[entity.tags.highway] ||
60024 paths[entity.tags.highway]
60028 defineFeature('power', function isPower(entity) {
60029 return !!entity.tags.power;
60032 // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
60033 defineFeature('past_future', function isPastFuture(entity) {
60035 traffic_roads[entity.tags.highway] ||
60036 service_roads[entity.tags.highway] ||
60037 paths[entity.tags.highway]
60038 ) { return false; }
60040 var strings = Object.keys(entity.tags);
60042 for (var i = 0; i < strings.length; i++) {
60043 var s = strings[i];
60044 if (past_futures[s] || past_futures[entity.tags[s]]) { return true; }
60049 // Lines or areas that don't match another feature filter.
60050 // IMPORTANT: The 'others' feature must be the last one defined,
60051 // so that code in getMatches can skip this test if `hasMatch = true`
60052 defineFeature('others', function isOther(entity, resolver, geometry) {
60053 return (geometry === 'line' || geometry === 'area');
60057 function features() {}
60060 features.features = function() {
60065 features.keys = function() {
60070 features.enabled = function(k) {
60071 if (!arguments.length) {
60072 return _keys.filter(function(k) { return _features[k].enabled; });
60074 return _features[k] && _features[k].enabled;
60078 features.disabled = function(k) {
60079 if (!arguments.length) {
60080 return _keys.filter(function(k) { return !_features[k].enabled; });
60082 return _features[k] && !_features[k].enabled;
60086 features.hidden = function(k) {
60087 if (!arguments.length) {
60088 return _keys.filter(function(k) { return _features[k].hidden(); });
60090 return _features[k] && _features[k].hidden();
60094 features.autoHidden = function(k) {
60095 if (!arguments.length) {
60096 return _keys.filter(function(k) { return _features[k].autoHidden(); });
60098 return _features[k] && _features[k].autoHidden();
60102 features.enable = function(k) {
60103 if (_features[k] && !_features[k].enabled) {
60104 _features[k].enable();
60110 features.disable = function(k) {
60111 if (_features[k] && _features[k].enabled) {
60112 _features[k].disable();
60118 features.toggle = function(k) {
60119 if (_features[k]) {
60120 (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
60126 features.resetStats = function() {
60127 for (var i = 0; i < _keys.length; i++) {
60128 _features[_keys[i]].count = 0;
60130 dispatch$$1.call('change');
60134 features.gatherStats = function(d, resolver, dimensions) {
60135 var needsRedraw = false,
60136 type = groupBy(d, function(ent) { return ent.type; }),
60137 entities = [].concat(type.relation || [], type.way || [], type.node || []),
60138 currHidden, geometry, matches, i, j;
60140 for (i = 0; i < _keys.length; i++) {
60141 _features[_keys[i]].count = 0;
60144 // adjust the threshold for point/building culling based on viewport size..
60145 // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
60146 _cullFactor = dimensions[0] * dimensions[1] / 1000000;
60148 for (i = 0; i < entities.length; i++) {
60149 geometry = entities[i].geometry(resolver);
60150 if (!(geometry === 'vertex' || geometry === 'relation')) {
60151 matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
60152 for (j = 0; j < matches.length; j++) {
60153 _features[matches[j]].count++;
60158 currHidden = features.hidden();
60159 if (currHidden !== _hidden) {
60160 _hidden = currHidden;
60161 needsRedraw = true;
60162 dispatch$$1.call('change');
60165 return needsRedraw;
60169 features.stats = function() {
60170 for (var i = 0; i < _keys.length; i++) {
60171 _stats[_keys[i]] = _features[_keys[i]].count;
60178 features.clear = function(d) {
60179 for (var i = 0; i < d.length; i++) {
60180 features.clearEntity(d[i]);
60185 features.clearEntity = function(entity) {
60186 delete _cache[osmEntity$$1.key(entity)];
60190 features.reset = function() {
60195 features.getMatches = function(entity, resolver, geometry) {
60196 if (geometry === 'vertex' || geometry === 'relation') return {};
60198 var ent = osmEntity$$1.key(entity);
60199 if (!_cache[ent]) {
60203 if (!_cache[ent].matches) {
60207 for (var i = 0; i < _keys.length; i++) {
60208 if (_keys[i] === 'others') {
60209 if (hasMatch) continue;
60211 // Multipolygon members:
60213 // 1. is a way that hasn't matched other 'interesting' feature rules,
60214 // 2. and it belongs to a single parent multipolygon relation
60215 // ...then match whatever feature rules the parent multipolygon has matched.
60216 // see #2548, #2887
60219 // For this to work, getMatches must be called on relations before ways.
60221 if (entity.type === 'way') {
60222 var parents = features.getParents(entity, resolver, geometry);
60223 if (parents.length === 1 && parents[0].isMultipolygon()) {
60224 var pkey = osmEntity$$1.key(parents[0]);
60225 if (_cache[pkey] && _cache[pkey].matches) {
60226 matches = clone(_cache[pkey].matches);
60233 if (_features[_keys[i]].filter(entity, resolver, geometry)) {
60234 matches[_keys[i]] = hasMatch = true;
60237 _cache[ent].matches = matches;
60240 return _cache[ent].matches;
60244 features.getParents = function(entity, resolver, geometry) {
60245 if (geometry === 'point') return [];
60247 var ent = osmEntity$$1.key(entity);
60248 if (!_cache[ent]) {
60252 if (!_cache[ent].parents) {
60254 if (geometry === 'vertex') {
60255 parents = resolver.parentWays(entity);
60256 } else { // 'line', 'area', 'relation'
60257 parents = resolver.parentRelations(entity);
60259 _cache[ent].parents = parents;
60261 return _cache[ent].parents;
60265 features.isHiddenFeature = function(entity, resolver, geometry) {
60266 if (!_hidden.length) return false;
60267 if (!entity.version) return false;
60269 var matches = features.getMatches(entity, resolver, geometry);
60271 for (var i = 0; i < _hidden.length; i++) {
60272 if (matches[_hidden[i]]) return true;
60278 features.isHiddenChild = function(entity, resolver, geometry) {
60279 if (!_hidden.length) return false;
60280 if (!entity.version || geometry === 'point') return false;
60282 var parents = features.getParents(entity, resolver, geometry);
60283 if (!parents.length) return false;
60285 for (var i = 0; i < parents.length; i++) {
60286 if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
60294 features.hasHiddenConnections = function(entity, resolver) {
60295 if (!_hidden.length) return false;
60296 var childNodes, connections;
60298 if (entity.type === 'midpoint') {
60299 childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
60302 childNodes = entity.nodes ? resolver.childNodes(entity) : [];
60303 connections = features.getParents(entity, resolver, entity.geometry(resolver));
60306 // gather ways connected to child nodes..
60307 connections = reduce(childNodes, function(result, e) {
60308 return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
60311 return connections.length ? some(connections, function(e) {
60312 return features.isHidden(e, resolver, e.geometry(resolver));
60317 features.isHidden = function(entity, resolver, geometry) {
60318 if (!_hidden.length) return false;
60319 if (!entity.version) return false;
60321 var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
60322 return fn(entity, resolver, geometry);
60326 features.filter = function(d, resolver) {
60327 if (!_hidden.length) return d;
60330 for (var i = 0; i < d.length; i++) {
60332 if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
60333 result.push(entity);
60340 features.init = function() {
60341 var storage = context.storage('disabled-features');
60343 var storageDisabled = storage.replace(/;/g, ',').split(',');
60344 storageDisabled.forEach(features.disable);
60347 var q = utilStringQs(window.location.hash.substring(1));
60348 if (q.disable_features) {
60349 var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
60350 hashDisabled.forEach(features.disable);
60354 return utilRebind(features, dispatch$$1, 'on');
60357 function utilBindOnce(target, type, listener, capture) {
60358 var typeOnce = type + '.once';
60360 target.on(typeOnce, null);
60361 listener.apply(this, arguments);
60363 target.on(typeOnce, one, capture);
60368 var TAU$1 = 2 * Math.PI;
60369 var TILESIZE = 256;
60370 var kMin = geoZoomToScale(2, TILESIZE);
60371 var kMax = geoZoomToScale(24, TILESIZE);
60374 function rendererMap(context) {
60375 var dispatch$$1 = dispatch('move', 'drawn');
60376 var projection = context.projection;
60377 var curtainProjection = context.curtainProjection;
60378 var drawLayers = svgLayers(projection, context);
60379 var drawPoints = svgPoints$$1(projection, context);
60380 var drawVertices = svgVertices$$1(projection, context);
60381 var drawLines = svgLines$$1(projection, context);
60382 var drawAreas = svgAreas$$1(projection, context);
60383 var drawMidpoints = svgMidpoints$$1(projection, context);
60384 var drawLabels = svgLabels(projection, context);
60386 var _selection = select(null);
60387 var supersurface = select(null);
60388 var wrapper = select(null);
60389 var surface = select(null);
60391 var dimensions = [1, 1];
60392 var _dblClickEnabled = true;
60393 var _redrawEnabled = true;
60394 var _transformStart = projection.transform();
60395 var _transformLast;
60396 var _transformed = false;
60401 var zoom$$1 = d3_zoom()
60402 .scaleExtent([kMin, kMax])
60403 .interpolate(interpolate)
60404 .filter(zoomEventFilter)
60405 .on('zoom', zoomPan);
60407 var scheduleRedraw = throttle(redraw, 750);
60408 // var isRedrawScheduled = false;
60409 // var pendingRedrawCall;
60410 // function scheduleRedraw() {
60411 // // Only schedule the redraw if one has not already been set.
60412 // if (isRedrawScheduled) return;
60413 // isRedrawScheduled = true;
60414 // var that = this;
60415 // var args = arguments;
60416 // pendingRedrawCall = window.requestIdleCallback(function () {
60417 // // Reset the boolean so future redraws can be set.
60418 // isRedrawScheduled = false;
60419 // redraw.apply(that, args);
60420 // }, { timeout: 1400 });
60423 function cancelPendingRedraw() {
60424 scheduleRedraw.cancel();
60425 // isRedrawScheduled = false;
60426 // window.cancelIdleCallback(pendingRedrawCall);
60430 function map(selection$$1) {
60431 _selection = selection$$1;
60434 .on('change.map', immediateRedraw);
60436 var osm = context.connection();
60438 osm.on('change.map', immediateRedraw);
60442 .on('change.map', immediateRedraw)
60443 .on('undone.map redone.map', function(stack) {
60444 var mode = context.mode().id;
60445 if (mode !== 'browse' && mode !== 'select') return;
60447 var followSelected = false;
60448 if (Array.isArray(stack.selectedIDs)) {
60449 followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
60451 modeSelect(context, stack.selectedIDs).follow(followSelected)
60454 if (!followSelected && stack.transform) {
60455 map.transformEase(stack.transform);
60459 context.background()
60460 .on('change.map', immediateRedraw);
60463 .on('redraw.map', immediateRedraw);
60466 .on('change.map', function() {
60467 context.background().updateImagery();
60472 .on('dblclick.map', dblClick)
60474 .call(zoom$$1.transform, projection.transform());
60476 supersurface = selection$$1.append('div')
60477 .attr('id', 'supersurface')
60478 .call(utilSetTransform, 0, 0);
60480 // Need a wrapper div because Opera can't cope with an absolutely positioned
60481 // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
60482 wrapper = supersurface
60484 .attr('class', 'layer layer-data');
60486 map.surface = surface = wrapper
60488 .selectAll('.surface')
60489 .attr('id', 'surface');
60492 .call(drawLabels.observe)
60493 .on('mousedown.zoom', function() {
60494 if (event.button === 2) {
60495 event.stopPropagation();
60498 .on('mouseup.zoom', function() {
60499 if (resetTransform()) immediateRedraw();
60501 .on('mousemove.map', function() {
60504 .on('mouseover.vertices', function() {
60505 if (map.editable() && !_transformed) {
60506 var hover = event.target.__data__;
60507 surface.selectAll('.data-layer-osm')
60508 .call(drawVertices.drawHover, context.graph(), hover, map.extent());
60509 dispatch$$1.call('drawn', this, { full: false });
60512 .on('mouseout.vertices', function() {
60513 if (map.editable() && !_transformed) {
60514 var hover = event.relatedTarget && event.relatedTarget.__data__;
60515 surface.selectAll('.data-layer-osm')
60516 .call(drawVertices.drawHover, context.graph(), hover, map.extent());
60517 dispatch$$1.call('drawn', this, { full: false });
60522 .call(context.background());
60524 context.on('enter.map', function() {
60525 if (map.editable() && !_transformed) {
60527 // redraw immediately any objects affected by a change in selectedIDs.
60528 var graph = context.graph();
60529 var selectedAndParents = {};
60530 context.selectedIDs().forEach(function(id) {
60531 var entity = graph.hasEntity(id);
60533 selectedAndParents[entity.id] = entity;
60534 if (entity.type === 'node') {
60535 graph.parentWays(entity).forEach(function(parent) {
60536 selectedAndParents[parent.id] = parent;
60541 var data = values$1(selectedAndParents);
60542 var filter = function(d) { return d.id in selectedAndParents; };
60544 data = context.features().filter(data, graph);
60546 surface.selectAll('.data-layer-osm')
60547 .call(drawVertices.drawSelected, graph, map.extent())
60548 .call(drawLines, graph, data, filter)
60549 .call(drawAreas, graph, data, filter)
60550 .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
60552 dispatch$$1.call('drawn', this, { full: false });
60555 // redraw everything else later
60560 map.dimensions(utilGetDimensions(selection$$1));
60564 function zoomEventFilter() {
60565 // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
60566 // Intercept `mousedown` and check if there is an orphaned zoom gesture.
60567 // This can happen if a previous `mousedown` occurred without a `mouseup`.
60568 // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
60569 // so that d3-zoom won't stop propagation of new `mousedown` events.
60570 if (event.type === 'mousedown') {
60571 var hasOrphan = false;
60572 var listeners = window.__on;
60573 for (var i = 0; i < listeners.length; i++) {
60574 var listener = listeners[i];
60575 if (listener.name === 'zoom' && listener.type === 'mouseup') {
60581 var event$$1 = window.CustomEvent;
60583 event$$1 = new event$$1('mouseup');
60585 event$$1 = window.document.createEvent('Event');
60586 event$$1.initEvent('mouseup', false, false);
60588 // Event needs to be dispatched with an event.view property.
60589 event$$1.view = window;
60590 window.dispatchEvent(event$$1);
60594 return event.button !== 2; // ignore right clicks
60598 function pxCenter() {
60599 return [dimensions[0] / 2, dimensions[1] / 2];
60603 function drawVector(difference, extent) {
60604 var mode = context.mode();
60605 var graph = context.graph();
60606 var features = context.features();
60607 var all = context.intersects(map.extent());
60608 var fullRedraw = false;
60613 var complete = difference.complete(map.extent());
60614 data = compact(values$1(complete));
60615 filter = function(d) { return d.id in complete; };
60616 features.clear(data);
60619 // force a full redraw if gatherStats detects that a feature
60620 // should be auto-hidden (e.g. points or buildings)..
60621 if (features.gatherStats(all, graph, dimensions)) {
60622 extent = undefined;
60626 data = context.intersects(map.extent().intersection(extent));
60627 var set$$1 = set$2(map$3(data, 'id'));
60628 filter = function(d) { return set$$1.has(d.id); };
60633 filter = utilFunctor(true);
60637 data = features.filter(data, graph);
60639 if (mode && mode.id === 'select') {
60640 // update selected vertices - the user might have just double-clicked a way,
60641 // creating a new vertex, triggering a partial redraw without a mode change
60642 surface.selectAll('.data-layer-osm')
60643 .call(drawVertices.drawSelected, graph, map.extent());
60646 surface.selectAll('.data-layer-osm')
60647 .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
60648 .call(drawLines, graph, data, filter)
60649 .call(drawAreas, graph, data, filter)
60650 .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
60651 .call(drawLabels, graph, data, filter, dimensions, fullRedraw)
60652 .call(drawPoints, graph, data, filter);
60654 dispatch$$1.call('drawn', this, {full: true});
60658 function editOff() {
60659 context.features().resetStats();
60660 surface.selectAll('.layer-osm *').remove();
60662 var mode = context.mode();
60663 if (mode && mode.id !== 'save') {
60664 context.enter(modeBrowse(context));
60667 dispatch$$1.call('drawn', this, {full: true});
60671 function dblClick() {
60672 if (!_dblClickEnabled) {
60673 event.preventDefault();
60674 event.stopImmediatePropagation();
60679 function zoomPan(manualEvent) {
60680 var event$$1 = (manualEvent || event);
60681 var source = event$$1.sourceEvent;
60682 var eventTransform = event$$1.transform;
60684 if (_transformStart.x === eventTransform.x &&
60685 _transformStart.y === eventTransform.y &&
60686 _transformStart.k === eventTransform.k) {
60687 return; // no change
60690 // Normalize mousewheel - #3029
60691 // If wheel delta is provided in LINE units, recalculate it in PIXEL units
60692 // We are essentially redoing the calculations that occur here:
60693 // https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
60694 // See this for more info:
60695 // https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
60696 if (source && source.type === 'wheel' && source.deltaMode === 1 /* LINE */) {
60697 // pick sensible scroll amount if user scrolling fast or slow..
60698 var lines = Math.abs(source.deltaY);
60699 var scroll = lines > 2 ? 40 : lines * 10;
60701 var t0 = _transformed ? _transformLast : _transformStart;
60702 var p0 = mouse$$1(source);
60703 var p1 = t0.invert(p0);
60704 var k2 = t0.k * Math.pow(2, -source.deltaY * scroll / 500);
60705 var x2 = p0[0] - p1[0] * k2;
60706 var y2 = p0[1] - p1[1] * k2;
60708 eventTransform = identity$7.translate(x2,y2).scale(k2);
60709 _selection.node().__zoom = eventTransform;
60712 if (geoScaleToZoom(eventTransform.k, TILESIZE) < minzoom) {
60713 surface.interrupt();
60714 uiFlash().text(t('cannot_zoom'))();
60715 setZoom(context.minEditableZoom(), true);
60717 dispatch$$1.call('move', this, map);
60721 projection.transform(eventTransform);
60723 var scale = eventTransform.k / _transformStart.k;
60724 var tX = (eventTransform.x / scale - _transformStart.x) * scale;
60725 var tY = (eventTransform.y / scale - _transformStart.y) * scale;
60727 if (context.inIntro()) {
60728 curtainProjection.transform({
60729 x: eventTransform.x - tX,
60730 y: eventTransform.y - tY,
60731 k: eventTransform.k
60735 if (source) mousemove = event$$1;
60736 _transformed = true;
60737 _transformLast = eventTransform;
60738 utilSetTransform(supersurface, tX, tY, scale);
60741 dispatch$$1.call('move', this, map);
60745 function resetTransform() {
60746 if (!_transformed) return false;
60748 // deprecation warning - Radial Menu to be removed in iD v3
60749 surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
60750 utilSetTransform(supersurface, 0, 0);
60751 _transformed = false;
60752 if (context.inIntro()) {
60753 curtainProjection.transform(projection.transform());
60759 function redraw(difference, extent) {
60760 if (surface.empty() || !_redrawEnabled) return;
60762 // If we are in the middle of a zoom/pan, we can't do differenced redraws.
60763 // It would result in artifacts where differenced entities are redrawn with
60764 // one transform and unchanged entities with another.
60765 if (resetTransform()) {
60766 difference = extent = undefined;
60769 var zoom$$1 = map.zoom();
60770 var z = String(~~zoom$$1);
60772 if (surface.attr('data-zoom') !== z) {
60773 surface.attr('data-zoom', z);
60776 // class surface as `lowzoom` around z17-z18.5 (based on latitude)
60777 var lat = map.center()[1];
60778 var lowzoom = linear$2()
60779 .domain([-60, 0, 60])
60780 .range([17, 18.5, 17])
60784 .classed('low-zoom', zoom$$1 <= lowzoom(lat));
60788 supersurface.call(context.background());
60795 if (map.editable()) {
60796 context.loadTiles(projection, dimensions);
60797 drawVector(difference, extent);
60802 _transformStart = projection.transform();
60809 var immediateRedraw = function(difference, extent) {
60810 if (!difference && !extent) cancelPendingRedraw();
60811 redraw(difference, extent);
60815 map.mouse = function() {
60816 var event$$1 = mousemove || event;
60819 while ((s = event$$1.sourceEvent)) { event$$1 = s; }
60820 return mouse$$1(event$$1);
60827 map.mouseCoordinates = function() {
60828 var coord = map.mouse() || pxCenter();
60829 return projection.invert(coord);
60833 map.dblclickEnable = function(_) {
60834 if (!arguments.length) return _dblClickEnabled;
60835 _dblClickEnabled = _;
60840 map.redrawEnable = function(_) {
60841 if (!arguments.length) return _redrawEnabled;
60842 _redrawEnabled = _;
60847 map.isTransformed = function() {
60848 return _transformed;
60852 function setTransform(t2, duration, force) {
60853 var t$$1 = projection.transform();
60854 if (!force && t2.k === t$$1.k && t2.x === t$$1.x && t2.y === t$$1.y) {
60861 .duration(duration)
60862 .on('start', function() { map.startEase(); })
60863 .call(zoom$$1.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
60865 projection.transform(t2);
60866 _transformStart = t2;
60867 _selection.call(zoom$$1.transform, _transformStart);
60872 function setZoom(z2, force, duration) {
60873 if (z2 === map.zoom() && !force) {
60877 var k = projection.scale();
60878 var k2 = Math.max(kMin, Math.min(kMax, geoZoomToScale(z2, TILESIZE)));
60879 var center = pxCenter();
60880 var l = pointLocation(center);
60882 projection.scale(k2);
60884 var t$$1 = projection.translate();
60885 l = locationPoint(l);
60887 t$$1[0] += center[0] - l[0];
60888 t$$1[1] += center[1] - l[1];
60891 projection.scale(k); // reset scale
60894 .duration(duration)
60895 .on('start', function() { map.startEase(); })
60896 .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k2));
60898 projection.translate(t$$1);
60899 _transformStart = projection.transform();
60900 _selection.call(zoom$$1.transform, _transformStart);
60906 function locationPoint(l) {
60907 var translate = projection.translate();
60908 var scale = projection.scale() * TAU$1;
60909 return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
60912 function pointLocation(p) {
60913 var translate = projection.translate();
60914 var scale = projection.scale() * TAU$1;
60915 return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
60920 function setCenter(loc2, duration) {
60921 var c = map.center();
60922 if (loc2[0] === c[0] && loc2[1] === c[1]) {
60926 var t$$1 = projection.translate();
60927 var k = projection.scale();
60928 var pxC = pxCenter();
60929 var ll = projection(loc2);
60931 t$$1[0] = t$$1[0] - ll[0] + pxC[0];
60932 t$$1[1] = t$$1[1] - ll[1] + pxC[1];
60937 .duration(duration)
60938 .on('start', function() { map.startEase(); })
60939 .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
60941 projection.translate(t$$1);
60942 _transformStart = projection.transform();
60943 _selection.call(zoom$$1.transform, _transformStart);
60950 map.pan = function(delta, duration) {
60951 var t$$1 = projection.translate();
60952 var k = projection.scale();
60954 t$$1[0] += delta[0];
60955 t$$1[1] += delta[1];
60960 .duration(duration)
60961 .on('start', function() { map.startEase(); })
60962 .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
60964 projection.translate(t$$1);
60965 _transformStart = projection.transform();
60966 _selection.call(zoom$$1.transform, _transformStart);
60967 dispatch$$1.call('move', this, map);
60975 map.dimensions = function(_) {
60976 if (!arguments.length) return dimensions;
60977 var center = map.center();
60979 drawLayers.dimensions(dimensions);
60980 context.background().dimensions(dimensions);
60981 projection.clipExtent([[0, 0], dimensions]);
60982 mouse$$1 = utilFastMouse(supersurface.node());
60990 function zoomIn(delta) {
60991 setZoom(~~map.zoom() + delta, true, 250);
60994 function zoomOut(delta) {
60995 setZoom(~~map.zoom() - delta, true, 250);
60998 map.zoomIn = function() { zoomIn(1); };
60999 map.zoomInFurther = function() { zoomIn(4); };
61001 map.zoomOut = function() { zoomOut(1); };
61002 map.zoomOutFurther = function() { zoomOut(4); };
61005 map.center = function(loc2) {
61006 if (!arguments.length) {
61007 return projection.invert(pxCenter());
61010 if (setCenter(loc2)) {
61011 dispatch$$1.call('move', this, map);
61019 map.zoom = function(z2) {
61020 if (!arguments.length) {
61021 return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
61024 if (z2 < minzoom) {
61025 surface.interrupt();
61026 uiFlash().text(t('cannot_zoom'))();
61027 z2 = context.minEditableZoom();
61031 dispatch$$1.call('move', this, map);
61039 map.zoomTo = function(entity, zoomLimits) {
61040 var extent = entity.extent(context.graph());
61041 if (!isFinite(extent.area())) return;
61043 var z2 = map.trimmedExtentZoom(extent);
61044 zoomLimits = zoomLimits || [context.minEditableZoom(), 19];
61045 map.centerZoom(extent.center(), Math.min(Math.max(z2, zoomLimits[0]), zoomLimits[1]));
61049 map.centerZoom = function(loc2, z2) {
61050 var centered = setCenter(loc2);
61051 var zoomed = setZoom(z2);
61053 if (centered || zoomed) {
61054 dispatch$$1.call('move', this, map);
61062 map.centerEase = function(loc2, duration) {
61063 duration = duration || 250;
61064 setCenter(loc2, duration);
61069 map.zoomEase = function(z2, duration) {
61070 duration = duration || 250;
61071 setZoom(z2, false, duration);
61076 map.transformEase = function(t2, duration) {
61077 duration = duration || 250;
61078 setTransform(t2, duration, false);
61083 map.startEase = function() {
61084 utilBindOnce(surface, 'mousedown.ease', function() {
61091 map.cancelEase = function() {
61092 _selection.interrupt();
61097 map.extent = function(_) {
61098 if (!arguments.length) {
61099 return new geoExtent$$1(
61100 projection.invert([0, dimensions[1]]),
61101 projection.invert([dimensions[0], 0])
61104 var extent = geoExtent$$1(_);
61105 map.centerZoom(extent.center(), map.extentZoom(extent));
61110 map.trimmedExtent = function(_) {
61111 if (!arguments.length) {
61115 return new geoExtent$$1(
61116 projection.invert([pad, dimensions[1] - footerY - pad]),
61117 projection.invert([dimensions[0] - pad, headerY + pad])
61120 var extent = geoExtent$$1(_);
61121 map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
61126 function calcZoom(extent, dim) {
61127 var tl = projection([extent[0][0], extent[1][1]]);
61128 var br = projection([extent[1][0], extent[0][1]]);
61130 // Calculate maximum zoom that fits extent
61131 var hFactor = (br[0] - tl[0]) / dim[0];
61132 var vFactor = (br[1] - tl[1]) / dim[1];
61133 var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
61134 var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
61135 var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
61141 map.extentZoom = function(_) {
61142 return calcZoom(geoExtent$$1(_), dimensions);
61146 map.trimmedExtentZoom = function(_) {
61149 var trimmed = [dimensions[0] - trimX, dimensions[1] - trimY];
61150 return calcZoom(geoExtent$$1(_), trimmed);
61154 map.editable = function() {
61155 var osmLayer = surface.selectAll('.data-layer-osm');
61156 if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
61158 return map.zoom() >= context.minEditableZoom();
61162 map.minzoom = function(_) {
61163 if (!arguments.length) return minzoom;
61169 map.layers = drawLayers;
61172 return utilRebind(map, dispatch$$1, 'on');
61175 function uiMapInMap(context) {
61177 function map_in_map(selection$$1) {
61178 var backgroundLayer = rendererTileLayer(context);
61179 var overlayLayers = {};
61180 var projection$$1 = geoRawMercator();
61181 var gpxLayer = svgGpx$$1(projection$$1, context).showLabels(false);
61182 var debugLayer = svgDebug$$1(projection$$1, context);
61183 var zoom$$1 = d3_zoom()
61184 .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
61185 .on('start', zoomStarted)
61186 .on('zoom', zoomed)
61187 .on('end', zoomEnded);
61188 var isTransformed = false;
61189 var isHidden = true;
61190 var skipEvents = false;
61191 var gesture = null;
61192 var zDiff = 6; // by default, minimap renders at (main zoom - 6)
61193 var wrap = select(null);
61194 var tiles = select(null);
61195 var viewport = select(null);
61196 var tStart; // transform at start of gesture
61197 var tCurr; // transform at most recent event
61201 function zoomStarted() {
61202 if (skipEvents) return;
61203 tStart = tCurr = projection$$1.transform();
61208 function zoomed() {
61209 if (skipEvents) return;
61211 var x = event.transform.x;
61212 var y = event.transform.y;
61213 var k = event.transform.k;
61214 var isZooming = (k !== tStart.k);
61215 var isPanning = (x !== tStart.x || y !== tStart.y);
61217 if (!isZooming && !isPanning) {
61218 return; // no change
61221 // lock in either zooming or panning, don't allow both in minimap.
61223 gesture = isZooming ? 'zoom' : 'pan';
61226 var tMini = projection$$1.transform();
61229 if (gesture === 'zoom') {
61230 var dMini = utilGetDimensions(wrap);
61231 var cMini = geoVecScale(dMini, 0.5);
61232 scale = k / tMini.k;
61233 tX = (cMini[0] / scale - cMini[0]) * scale;
61234 tY = (cMini[1] / scale - cMini[1]) * scale;
61242 utilSetTransform(tiles, tX, tY, scale);
61243 utilSetTransform(viewport, 0, 0, scale);
61244 isTransformed = true;
61245 tCurr = identity$7.translate(x, y).scale(k);
61247 var zMain = geoScaleToZoom(context.projection.scale());
61248 var zMini = geoScaleToZoom(k);
61250 zDiff = zMain - zMini;
61256 function zoomEnded() {
61257 if (skipEvents) return;
61258 if (gesture !== 'pan') return;
61260 updateProjection();
61262 var dMini = utilGetDimensions(wrap);
61263 var cMini = geoVecScale(dMini, 0.5);
61264 context.map().center(projection$$1.invert(cMini)); // recenter main map..
61268 function updateProjection() {
61269 var loc = context.map().center();
61270 var dMini = utilGetDimensions(wrap);
61271 var cMini = geoVecScale(dMini, 0.5);
61272 var tMain = context.projection.transform();
61273 var zMain = geoScaleToZoom(tMain.k);
61274 var zMini = Math.max(zMain - zDiff, 0.5);
61275 var kMini = geoZoomToScale(zMini);
61278 .translate([tMain.x, tMain.y])
61281 var point$$1 = projection$$1(loc);
61282 var mouse$$1 = (gesture === 'pan') ? geoVecSubtract([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0];
61283 var xMini = cMini[0] - point$$1[0] + tMain.x + mouse$$1[0];
61284 var yMini = cMini[1] - point$$1[1] + tMain.y + mouse$$1[1];
61287 .translate([xMini, yMini])
61288 .clipExtent([[0, 0], dMini]);
61290 tCurr = projection$$1.transform();
61292 if (isTransformed) {
61293 utilSetTransform(tiles, 0, 0);
61294 utilSetTransform(viewport, 0, 0);
61295 isTransformed = false;
61299 .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
61302 wrap.call(zoom$$1.transform, tCurr);
61303 skipEvents = false;
61307 function redraw() {
61308 clearTimeout(timeoutId);
61309 if (isHidden) return;
61311 updateProjection();
61313 var dMini = utilGetDimensions(wrap);
61314 var zMini = geoScaleToZoom(projection$$1.scale());
61316 // setup tile container
61318 .selectAll('.map-in-map-tiles')
61321 tiles = tiles.enter()
61323 .attr('class', 'map-in-map-tiles')
61326 // redraw background
61328 .source(context.background().baseLayerSource())
61329 .projection(projection$$1)
61330 .dimensions(dMini);
61332 var background = tiles
61333 .selectAll('.map-in-map-background')
61338 .attr('class', 'map-in-map-background')
61340 .call(backgroundLayer);
61344 var overlaySources = context.background().overlayLayerSources();
61345 var activeOverlayLayers = [];
61346 for (var i = 0; i < overlaySources.length; i++) {
61347 if (overlaySources[i].validZoom(zMini)) {
61348 if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
61349 activeOverlayLayers.push(overlayLayers[i]
61350 .source(overlaySources[i])
61351 .projection(projection$$1)
61352 .dimensions(dMini));
61356 var overlay = tiles
61357 .selectAll('.map-in-map-overlay')
61360 overlay = overlay.enter()
61362 .attr('class', 'map-in-map-overlay')
61366 var overlays = overlay
61368 .data(activeOverlayLayers, function(d) { return d.source().name(); });
61373 overlays = overlays.enter()
61376 .each(function(layer) { select(this).call(layer); });
61379 var dataLayers = tiles
61380 .selectAll('.map-in-map-data')
61386 dataLayers = dataLayers.enter()
61388 .attr('class', 'map-in-map-data')
61394 // redraw viewport bounding box
61395 if (gesture !== 'pan') {
61396 var getPath = d3_geoPath(projection$$1);
61397 var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
61399 viewport = wrap.selectAll('.map-in-map-viewport')
61402 viewport = viewport.enter()
61404 .attr('class', 'map-in-map-viewport')
61408 var path = viewport.selectAll('.map-in-map-bbox')
61413 .attr('class', 'map-in-map-bbox')
61415 .attr('d', getPath)
61416 .classed('thick', function(d) { return getPath.area(d) < 30; });
61421 function queueRedraw() {
61422 clearTimeout(timeoutId);
61423 timeoutId = setTimeout(function() { redraw(); }, 750);
61427 function toggle() {
61428 if (event) event.preventDefault();
61430 isHidden = !isHidden;
61432 select('.minimap-toggle-item')
61433 .classed('active', !isHidden)
61435 .property('checked', !isHidden);
61439 .style('display', 'block')
61440 .style('opacity', '1')
61443 .style('opacity', '0')
61444 .on('end', function() {
61445 selection$$1.selectAll('.map-in-map')
61446 .style('display', 'none');
61450 .style('display', 'block')
61451 .style('opacity', '0')
61454 .style('opacity', '1')
61455 .on('end', function() {
61462 uiMapInMap.toggle = toggle;
61464 wrap = selection$$1.selectAll('.map-in-map')
61467 wrap = wrap.enter()
61469 .attr('class', 'map-in-map')
61470 .style('display', (isHidden ? 'none' : 'block'))
61472 .on('dblclick.zoom', null)
61476 .on('drawn.map-in-map', function(drawn) {
61477 if (drawn.full === true) {
61484 var keybinding = d3keybinding('map-in-map')
61485 .on(t('background.minimap.key'), toggle);
61494 function uiBackground(context) {
61495 var key = t('background.key');
61497 var _customSource = context.background().findSource('custom');
61498 var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
61499 var _shown = false;
61501 var _backgroundList = select(null);
61502 var _overlayList = select(null);
61503 var _displayOptionsContainer = select(null);
61504 var _offsetContainer = select(null);
61506 var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
61507 var backgroundOffset = uiBackgroundOffset(context);
61510 function setTooltips(selection$$1) {
61511 selection$$1.each(function(d, i, nodes) {
61512 var item = select(this).select('label');
61513 var span = item.select('span');
61514 var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
61515 var description = d.description();
61516 var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
61518 if (d === _previousBackground) {
61519 item.call(tooltip()
61520 .placement(placement)
61522 .title(function() {
61523 var tip = '<div>' + t('background.switch') + '</div>';
61524 return uiTooltipHtml(tip, uiCmd('⌘' + key));
61527 } else if (description || isOverflowing) {
61528 item.call(tooltip()
61529 .placement(placement)
61530 .title(description || d.name())
61533 item.call(tooltip().destroy);
61539 function updateLayerSelections(selection$$1) {
61540 function active(d) {
61541 return context.background().showsLayer(d);
61544 selection$$1.selectAll('.layer')
61545 .classed('active', active)
61546 .classed('switch', function(d) { return d === _previousBackground; })
61548 .selectAll('input')
61549 .property('checked', active);
61553 function chooseBackground(d) {
61554 if (d.id === 'custom' && !d.template()) {
61555 return editCustom();
61558 event.preventDefault();
61559 _previousBackground = context.background().baseLayerSource();
61560 context.storage('background-last-used-toggle', _previousBackground.id);
61561 context.storage('background-last-used', d.id);
61562 context.background().baseLayerSource(d);
61563 _backgroundList.call(updateLayerSelections);
61564 document.activeElement.blur();
61568 function editCustom() {
61569 event.preventDefault();
61570 var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
61571 var template = window.prompt(
61572 t('background.custom_prompt', { example: example }),
61573 _customSource.template() || example
61577 context.storage('background-custom-template', template);
61578 _customSource.template(template);
61579 chooseBackground(_customSource);
61581 _backgroundList.call(updateLayerSelections);
61586 function chooseOverlay(d) {
61587 event.preventDefault();
61588 context.background().toggleOverlayLayer(d);
61589 _overlayList.call(updateLayerSelections);
61590 document.activeElement.blur();
61594 function drawListItems(layerList, type, change, filter) {
61595 var sources = context.background()
61596 .sources(context.map().extent())
61599 var layerLinks = layerList.selectAll('li.layer')
61600 .data(sources, function(d) { return d.name(); });
61605 var enter = layerLinks.enter()
61607 .attr('class', 'layer')
61608 .classed('layer-custom', function(d) { return d.id === 'custom'; })
61609 .classed('best', function(d) { return d.best(); });
61611 enter.filter(function(d) { return d.id === 'custom'; })
61613 .attr('class', 'layer-browse')
61615 .title(t('background.custom_button'))
61616 .placement((textDirection === 'rtl') ? 'right' : 'left')
61618 .on('click', editCustom)
61619 .call(svgIcon('#iD-icon-edit'));
61621 enter.filter(function(d) { return d.best(); })
61623 .attr('class', 'best')
61625 .title(t('background.best_imagery'))
61626 .placement((textDirection === 'rtl') ? 'right' : 'left')
61636 .attr('type', type)
61637 .attr('name', 'layers')
61638 .on('change', change);
61642 .text(function(d) { return d.name(); });
61645 layerList.selectAll('li.layer')
61647 .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
61650 .call(updateLayerSelections);
61653 function sortSources(a, b) {
61654 return a.best() && !b.best() ? -1
61655 : b.best() && !a.best() ? 1
61656 : d3_descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0;
61661 function renderBackgroundList(selection$$1) {
61663 // the background list
61664 var container = selection$$1.selectAll('.layer-background-list')
61667 _backgroundList = container.enter()
61669 .attr('class', 'layer-list layer-background-list')
61670 .attr('dir', 'auto')
61674 // add minimap toggle below list
61675 var minimapEnter = selection$$1.selectAll('.minimap-toggle-list')
61679 .attr('class', 'layer-list minimap-toggle-list')
61681 .attr('class', 'layer minimap-toggle-item');
61683 var minimapLabelEnter = minimapEnter
61687 .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
61693 .attr('type', 'checkbox')
61694 .on('change', function() {
61695 event.preventDefault();
61696 uiMapInMap.toggle();
61701 .text(t('background.minimap.description'));
61704 // "Info / Report a Problem" link
61705 selection$$1.selectAll('.imagery-faq')
61709 .attr('class', 'imagery-faq')
61711 .attr('target', '_blank')
61712 .attr('tabindex', -1)
61713 .call(svgIcon('#iD-icon-out-link', 'inline'))
61714 .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
61716 .text(t('background.imagery_source_faq'));
61720 function renderOverlayList(selection$$1) {
61721 var container = selection$$1.selectAll('.layer-overlay-list')
61724 _overlayList = container.enter()
61726 .attr('class', 'layer-list layer-overlay-list')
61727 .attr('dir', 'auto')
61732 function update() {
61734 .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
61737 .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
61739 _displayOptionsContainer
61740 .call(backgroundDisplayOptions);
61743 .call(backgroundOffset);
61747 function quickSwitch() {
61749 event.stopImmediatePropagation();
61750 event.preventDefault();
61752 if (_previousBackground) {
61753 chooseBackground(_previousBackground);
61758 function background(selection$$1) {
61760 function hidePane() {
61764 function togglePane() {
61765 if (event) event.preventDefault();
61766 paneTooltip.hide(button);
61767 setVisible(!button.classed('active'));
61770 function setVisible(show) {
61771 if (show !== _shown) {
61772 button.classed('active', show);
61776 uiMapData.hidePane();
61781 .style('display', 'block')
61782 .style('right', '-300px')
61785 .style('right', '0px');
61789 .style('display', 'block')
61790 .style('right', '0px')
61793 .style('right', '-300px')
61794 .on('end', function() {
61795 select(this).style('display', 'none');
61802 var pane = selection$$1
61804 .attr('class', 'fillL map-pane col4 hide');
61806 var paneTooltip = tooltip()
61807 .placement((textDirection === 'rtl') ? 'right' : 'left')
61809 .title(uiTooltipHtml(t('background.description'), key));
61811 var button = selection$$1
61813 .attr('tabindex', -1)
61814 .on('click', togglePane)
61815 .call(svgIcon('#iD-icon-layers', 'light'))
61816 .call(paneTooltip);
61821 .attr('class', 'pane-heading');
61825 .text(t('background.title'));
61829 .on('click', function() { uiBackground.hidePane(); })
61830 .call(svgIcon('#iD-icon-close'));
61835 .attr('class', 'pane-content');
61840 .attr('class', 'background-background-list-container')
61841 .call(uiDisclosure(context, 'background_list', true)
61842 .title(t('background.backgrounds'))
61843 .content(renderBackgroundList)
61849 .attr('class', 'background-overlay-list-container')
61850 .call(uiDisclosure(context, 'overlay_list', true)
61851 .title(t('background.overlays'))
61852 .content(renderOverlayList)
61856 _displayOptionsContainer = content
61858 .attr('class', 'background-display-options');
61861 _offsetContainer = content
61863 .attr('class', 'background-offset');
61868 .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
61870 context.background()
61871 .on('change.background-update', update);
61876 var keybinding = d3keybinding('background')
61877 .on(key, togglePane)
61878 .on(uiCmd('⌘' + key), quickSwitch)
61879 .on([t('map_data.key'), t('help.key')], hidePane);
61884 uiBackground.hidePane = hidePane;
61885 uiBackground.togglePane = togglePane;
61886 uiBackground.setVisible = setVisible;
61892 function uiContributors(context) {
61893 var osm = context.connection(),
61894 debouncedUpdate = debounce(function() { update(); }, 1000),
61897 wrap = select(null);
61900 function update() {
61904 entities = context.intersects(context.map().extent());
61906 entities.forEach(function(entity) {
61907 if (entity && entity.user) users[entity.user] = true;
61910 var u = Object.keys(users),
61911 subset = u.slice(0, u.length > limit ? limit - 1 : limit);
61914 .call(svgIcon('#iD-icon-nearby', 'pre-text light'));
61916 var userList = select(document.createElement('span'));
61918 userList.selectAll()
61922 .attr('class', 'user-link')
61923 .attr('href', function(d) { return osm.userURL(d); })
61924 .attr('target', '_blank')
61925 .attr('tabindex', -1)
61928 if (u.length > limit) {
61929 var count = select(document.createElement('span'));
61932 .attr('target', '_blank')
61933 .attr('tabindex', -1)
61934 .attr('href', function() {
61935 return osm.changesetsURL(context.map().center(), context.map().zoom());
61937 .text(u.length - limit + 1);
61939 wrap.append('span')
61940 .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
61943 wrap.append('span')
61944 .html(t('contributors.list', { users: userList.html() }));
61951 .style('opacity', 0);
61953 } else if (hidden) {
61956 .style('opacity', 1);
61961 return function(selection$$1) {
61963 wrap = selection$$1;
61966 osm.on('loaded.contributors', debouncedUpdate);
61967 context.map().on('move.contributors', debouncedUpdate);
61971 function uiFeatureInfo(context) {
61972 function update(selection$$1) {
61973 var features = context.features(),
61974 stats = features.stats(),
61976 hiddenList = compact(map$3(features.hidden(), function(k) {
61979 return String(stats[k]) + ' ' + t('feature.' + k + '.description');
61983 selection$$1.html('');
61985 if (hiddenList.length) {
61986 var tooltipBehavior = tooltip()
61989 .title(function() {
61990 return uiTooltipHtml(hiddenList.join('<br/>'));
61993 var warning = selection$$1.append('a')
61995 .attr('tabindex', -1)
61996 .html(t('feature_info.hidden_warning', { count: count }))
61997 .call(tooltipBehavior)
61998 .on('click', function() {
61999 tooltipBehavior.hide(warning);
62000 // open map data panel?
62001 event.preventDefault();
62006 .classed('hide', !hiddenList.length);
62010 return function(selection$$1) {
62011 update(selection$$1);
62013 context.features().on('change.feature_info', function() {
62014 update(selection$$1);
62019 function uiFullScreen(context) {
62020 var element = context.container().node(),
62021 keybinding = d3keybinding('full-screen');
62025 function getFullScreenFn() {
62026 if (element.requestFullscreen) {
62027 return element.requestFullscreen;
62028 } else if (element.msRequestFullscreen) {
62029 return element.msRequestFullscreen;
62030 } else if (element.mozRequestFullScreen) {
62031 return element.mozRequestFullScreen;
62032 } else if (element.webkitRequestFullscreen) {
62033 return element.webkitRequestFullscreen;
62038 function getExitFullScreenFn() {
62039 if (document.exitFullscreen) {
62040 return document.exitFullscreen;
62041 } else if (document.msExitFullscreen) {
62042 return document.msExitFullscreen;
62043 } else if (document.mozCancelFullScreen) {
62044 return document.mozCancelFullScreen;
62045 } else if (document.webkitExitFullscreen) {
62046 return document.webkitExitFullscreen;
62051 function isFullScreen() {
62052 return document.fullscreenElement ||
62053 document.mozFullScreenElement ||
62054 document.webkitFullscreenElement ||
62055 document.msFullscreenElement;
62059 function isSupported() {
62060 return !!getFullScreenFn();
62064 function fullScreen() {
62065 event.preventDefault();
62066 if (!isFullScreen()) {
62067 // button.classed('active', true);
62068 getFullScreenFn().apply(element);
62070 // button.classed('active', false);
62071 getExitFullScreenFn().apply(document);
62076 return function() { // selection) {
62077 if (!isSupported())
62080 // button = selection.append('button')
62081 // .attr('title', t('full_screen'))
62082 // .attr('tabindex', -1)
62083 // .on('click', fullScreen)
62086 // button.append('span')
62087 // .attr('class', 'icon full-screen');
62089 var detected = utilDetect();
62090 var keys = detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11'];
62091 keybinding.on(keys, fullScreen);
62098 function uiLoading(context) {
62099 var _modalSelection = select(null);
62101 var _blocking = false;
62104 var loading = function(selection$$1) {
62105 _modalSelection = uiModal(selection$$1, _blocking);
62107 var loadertext = _modalSelection.select('.content')
62108 .classed('loading-modal', true)
62110 .attr('class', 'modal-section fillL');
62114 .attr('class', 'loader')
62115 .attr('src', context.imagePath('loader-white.gif'));
62121 _modalSelection.select('button.close')
62122 .attr('class', 'hide');
62128 loading.message = function(_) {
62129 if (!arguments.length) return _message;
62135 loading.blocking = function(_) {
62136 if (!arguments.length) return _blocking;
62142 loading.close = function() {
62143 _modalSelection.remove();
62150 function uiGeolocate(context) {
62151 var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ },
62152 locating = uiLoading(context).message(t('geolocate.locating')).blocking(true),
62157 if (context.inIntro()) return;
62158 context.enter(modeBrowse(context));
62159 context.container().call(locating);
62160 navigator.geolocation.getCurrentPosition(success, error, geoOptions);
62162 // This timeout ensures that we still call finish() even if
62163 // the user declines to share their location in Firefox
62164 timeoutId = setTimeout(finish, 10000 /* 10sec */ );
62168 function success(position) {
62169 var map = context.map(),
62170 extent = geoExtent$$1([position.coords.longitude, position.coords.latitude])
62171 .padByMeters(position.coords.accuracy);
62173 map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
62183 function finish() {
62184 locating.close(); // unblock ui
62185 if (timeoutId) { clearTimeout(timeoutId); }
62186 timeoutId = undefined;
62190 return function(selection) {
62191 if (!navigator.geolocation) return;
62195 .attr('tabindex', -1)
62196 .attr('title', t('geolocate.title'))
62197 .on('click', click)
62198 .call(svgIcon('#iD-icon-geolocate', 'light'))
62200 .placement((textDirection === 'rtl') ? 'right' : 'left'));
62204 function uiPanelBackground(context) {
62205 var background = context.background();
62206 var currSourceName = null;
62208 var metadataKeys = [
62209 'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
62212 var debouncedRedraw = debounce(redraw, 250);
62214 function redraw(selection$$1) {
62215 var source = background.baseLayerSource(),
62216 isDG = (source.id.match(/^DigitalGlobe/i) !== null);
62218 if (currSourceName !== source.name()) {
62219 currSourceName = source.name();
62223 selection$$1.html('');
62225 var list = selection$$1
62227 .attr('class', 'background-info');
62231 .text(currSourceName);
62233 metadataKeys.forEach(function(k) {
62234 // DigitalGlobe vintage is available in raster layers for now.
62235 if (isDG && k === 'vintage') return;
62239 .attr('class', 'background-info-list-' + k)
62240 .classed('hide', !metadata[k])
62241 .text(t('info_panels.background.' + k) + ':')
62243 .attr('class', 'background-info-span-' + k)
62244 .text(metadata[k]);
62247 debouncedGetMetadata(selection$$1);
62249 var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
62253 .text(t('info_panels.background.' + toggleTiles))
62255 .attr('class', 'button button-toggle-tiles')
62256 .on('click', function() {
62257 event.preventDefault();
62258 context.setDebug('tile', !context.getDebug('tile'));
62259 selection$$1.call(redraw);
62263 var key = source.id + '-vintage';
62264 var sourceVintage = context.background().findSource(key);
62265 var showsVintage = context.background().showsLayer(sourceVintage);
62266 var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
62269 .text(t('info_panels.background.' + toggleVintage))
62271 .attr('class', 'button button-toggle-vintage')
62272 .on('click', function() {
62273 event.preventDefault();
62274 context.background().toggleOverlayLayer(sourceVintage);
62275 selection$$1.call(redraw);
62279 // disable if necessary
62280 ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
62281 if (source.id !== layerId) {
62282 var key = layerId + '-vintage';
62283 var sourceVintage = context.background().findSource(key);
62284 if (context.background().showsLayer(sourceVintage)) {
62285 context.background().toggleOverlayLayer(sourceVintage);
62292 var debouncedGetMetadata = debounce(getMetadata, 250);
62294 function getMetadata(selection$$1) {
62295 var tile = select('.layer-background img.tile-center'); // tile near viewport center
62296 if (tile.empty()) return;
62298 var sourceName = currSourceName,
62300 zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
62301 center = context.map().center();
62304 metadata.zoom = String(zoom);
62305 selection$$1.selectAll('.background-info-list-zoom')
62306 .classed('hide', false)
62307 .selectAll('.background-info-span-zoom')
62308 .text(metadata.zoom);
62310 if (!d || !d.length >= 3) return;
62312 background.baseLayerSource().getMetadata(center, d, function(err, result) {
62313 if (err || currSourceName !== sourceName) return;
62316 var vintage = result.vintage;
62317 metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
62318 selection$$1.selectAll('.background-info-list-vintage')
62319 .classed('hide', false)
62320 .selectAll('.background-info-span-vintage')
62321 .text(metadata.vintage);
62323 // update other metdata
62324 without(metadataKeys, 'zoom', 'vintage')
62325 .forEach(function(k) {
62326 var val = result[k];
62328 selection$$1.selectAll('.background-info-list-' + k)
62329 .classed('hide', !val)
62330 .selectAll('.background-info-span-' + k)
62337 var panel = function(selection$$1) {
62338 selection$$1.call(redraw);
62341 .on('drawn.info-background', function() {
62342 selection$$1.call(debouncedRedraw);
62344 .on('move.info-background', function() {
62345 selection$$1.call(debouncedGetMetadata);
62350 panel.off = function() {
62352 .on('drawn.info-background', null)
62353 .on('move.info-background', null);
62356 panel.id = 'background';
62357 panel.title = t('info_panels.background.title');
62358 panel.key = t('info_panels.background.key');
62364 function uiPanelHistory(context) {
62367 function displayTimestamp(entity) {
62368 if (!entity.timestamp) return t('info_panels.history.unknown');
62369 var detected = utilDetect();
62371 day: 'numeric', month: 'short', year: 'numeric',
62372 hour: 'numeric', minute: 'numeric', second: 'numeric'
62374 var d = new Date(entity.timestamp);
62375 if (isNaN(d.getTime())) return t('info_panels.history.unknown');
62376 return d.toLocaleString(detected.locale, options);
62380 function displayUser(selection, entity) {
62381 if (!entity.user) {
62384 .text(t('info_panels.history.unknown'));
62390 .attr('class', 'user-name')
62391 .text(entity.user);
62393 var links = selection
62395 .attr('class', 'links');
62400 .attr('class', 'user-osm-link')
62401 .attr('href', osm.userURL(entity.user))
62402 .attr('target', '_blank')
62403 .attr('tabindex', -1)
62409 .attr('class', 'user-hdyc-link')
62410 .attr('href', 'https://hdyc.neis-one.org/?' + entity.user)
62411 .attr('target', '_blank')
62412 .attr('tabindex', -1)
62417 function displayChangeset(selection, entity) {
62418 if (!entity.changeset) {
62421 .text(t('info_panels.history.unknown'));
62427 .attr('class', 'changeset-id')
62428 .text(entity.changeset);
62430 var links = selection
62432 .attr('class', 'links');
62437 .attr('class', 'changeset-osm-link')
62438 .attr('href', osm.changesetURL(entity.changeset))
62439 .attr('target', '_blank')
62440 .attr('tabindex', -1)
62446 .attr('class', 'changeset-osmcha-link')
62447 .attr('href', 'https://osmcha.mapbox.com/changesets/' + entity.changeset)
62448 .attr('target', '_blank')
62449 .attr('tabindex', -1)
62454 function redraw(selection) {
62455 var selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
62456 var singular = selected.length === 1 ? selected[0] : null;
62458 osm = context.connection();
62460 selection.html('');
62464 .attr('class', 'history-heading')
62465 .text(singular || t('info_panels.history.selected', { n: selected.length }));
62467 if (!singular) return;
62469 var entity = context.entity(singular);
62471 if (!entity.version) {
62474 .text(t('info_panels.history.no_history'));
62478 var list = selection
62483 .text(t('info_panels.history.version') + ':')
62485 .text(entity.version);
62489 .text(t('info_panels.history.last_edit') + ':')
62491 .text(displayTimestamp(entity));
62495 .text(t('info_panels.history.edited_by') + ':')
62496 .call(displayUser, entity);
62500 .text(t('info_panels.history.changeset') + ':')
62501 .call(displayChangeset, entity);
62506 .attr('class', 'view-history-on-osm')
62507 .attr('target', '_blank')
62508 .attr('tabindex', -1)
62509 .attr('href', osm.historyURL(entity))
62510 .call(svgIcon('#iD-icon-out-link', 'inline'))
62512 .text(t('info_panels.history.link_text'));
62517 var panel = function(selection) {
62518 selection.call(redraw);
62521 .on('drawn.info-history', function() {
62522 selection.call(redraw);
62526 panel.off = function() {
62528 .on('drawn.info-history', null);
62531 panel.id = 'history';
62532 panel.title = t('info_panels.history.title');
62533 panel.key = t('info_panels.history.key');
62539 var OSM_PRECISION = 7;
62540 var locale$2 = utilDetect().locale;
62543 * Returns a localized representation of the given length measurement.
62545 * @param {Number} m area in meters
62546 * @param {Boolean} isImperial true for U.S. customary units; false for metric
62548 function displayLength(m, isImperial) {
62549 var d = m * (isImperial ? 3.28084 : 1);
62562 unit = 'kilometers';
62568 return t('units.' + unit, {
62569 quantity: d.toLocaleString(locale$2, {
62570 maximumSignificantDigits: 4
62576 * Returns a localized representation of the given area measurement.
62578 * @param {Number} m2 area in square meters
62579 * @param {Boolean} isImperial true for U.S. customary units; false for metric
62581 function displayArea(m2, isImperial) {
62582 var d = m2 * (isImperial ? 10.7639111056 : 1);
62588 if (d >= 6969600) { // > 0.25mi² show mi²
62590 unit1 = 'square_miles';
62593 unit1 = 'square_feet';
62596 if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
62602 if (d >= 250000) { // > 0.25km² show km²
62604 unit1 = 'square_kilometers';
62607 unit1 = 'square_meters';
62610 if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
62612 unit2 = 'hectares';
62616 area = t('units.' + unit1, {
62617 quantity: d1.toLocaleString(locale$2, {
62618 maximumSignificantDigits: 4
62623 return t('units.area_pair', {
62625 area2: t('units.' + unit2, {
62626 quantity: d2.toLocaleString(locale$2, {
62627 maximumSignificantDigits: 2
62636 function wrap(x, min, max) {
62638 return ((x - min) % d + d) % d + min;
62641 function clamp(x, min, max) {
62642 return Math.max(min, Math.min(x, max));
62645 function displayCoordinate(deg, pos, neg) {
62646 var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
62647 var sec = (min - Math.floor(min)) * 60;
62648 var displayDegrees = t('units.arcdegrees', {
62649 quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
62651 var displayCoordinate;
62653 if (Math.floor(sec) > 0) {
62654 displayCoordinate = displayDegrees +
62655 t('units.arcminutes', {
62656 quantity: Math.floor(min).toLocaleString(locale$2)
62658 t('units.arcseconds', {
62659 quantity: Math.round(sec).toLocaleString(locale$2)
62661 } else if (Math.floor(min) > 0) {
62662 displayCoordinate = displayDegrees +
62663 t('units.arcminutes', {
62664 quantity: Math.round(min).toLocaleString(locale$2)
62667 displayCoordinate = t('units.arcdegrees', {
62668 quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
62673 return displayCoordinate;
62675 return t('units.coordinate', {
62676 coordinate: displayCoordinate,
62677 direction: t('units.' + (deg > 0 ? pos : neg))
62683 * Returns given coordinate pair in degree-minute-second format.
62685 * @param {Array<Number>} coord longitude and latitude
62687 function dmsCoordinatePair(coord) {
62688 return t('units.coordinate_pair', {
62689 latitude: displayCoordinate(clamp(coord[1], -90, 90), 'north', 'south'),
62690 longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
62695 * Returns the given coordinate pair in decimal format.
62696 * note: unlocalized to avoid comma ambiguity - see #4765
62698 * @param {Array<Number>} coord longitude and latitude
62700 function decimalCoordinatePair(coord) {
62701 return t('units.coordinate_pair', {
62702 latitude: clamp(coord[1], -90, 90).toFixed(OSM_PRECISION),
62703 longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
62707 function uiPanelLocation(context) {
62708 var currLocation = '';
62711 function redraw(selection) {
62712 selection.html('');
62714 var list = selection
62717 // Mouse coordinates
62718 var coord = context.map().mouseCoordinates();
62719 if (coord.some(isNaN)) {
62720 coord = context.map().center();
62725 .text(dmsCoordinatePair(coord))
62727 .text(decimalCoordinatePair(coord));
62732 .attr('class', 'location-info')
62733 .text(currLocation || ' ');
62735 debouncedGetLocation(selection, coord);
62739 var debouncedGetLocation = debounce(getLocation, 250);
62740 function getLocation(selection, coord) {
62741 if (!services.geocoder) {
62742 currLocation = t('info_panels.location.unknown_location');
62743 selection.selectAll('.location-info')
62744 .text(currLocation);
62746 services.geocoder.reverse(coord, function(err, result) {
62747 currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
62748 selection.selectAll('.location-info')
62749 .text(currLocation);
62755 var panel = function(selection) {
62756 selection.call(redraw);
62759 .on('mousemove.info-location', function() {
62760 selection.call(redraw);
62764 panel.off = function() {
62766 .on('mousemove.info-location', null);
62769 panel.id = 'location';
62770 panel.title = t('info_panels.location.title');
62771 panel.key = t('info_panels.location.key');
62777 function uiPanelMeasurement(context) {
62778 var locale = utilDetect().locale,
62779 isImperial = (locale.toLowerCase() === 'en-us');
62782 function radiansToMeters(r) {
62783 // using WGS84 authalic radius (6371007.1809 m)
62784 return r * 6371007.1809;
62787 function steradiansToSqmeters(r) {
62788 // http://gis.stackexchange.com/a/124857/40446
62789 return r / (4 * Math.PI) * 510065621724000;
62793 function toLineString(feature) {
62794 if (feature.type === 'LineString') return feature;
62796 var result = { type: 'LineString', coordinates: [] };
62797 if (feature.type === 'Polygon') {
62798 result.coordinates = feature.coordinates[0];
62799 } else if (feature.type === 'MultiPolygon') {
62800 result.coordinates = feature.coordinates[0][0];
62806 function nodeCount(feature) {
62807 if (feature.type === 'LineString') return feature.coordinates.length;
62809 if (feature.type === 'Polygon') {
62810 return feature.coordinates[0].length - 1;
62815 function redraw(selection$$1) {
62816 var resolver = context.graph();
62817 var selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
62818 var singular = selected.length === 1 ? selected[0] : null;
62819 var extent = geoExtent$$1();
62822 selection$$1.html('');
62826 .attr('class', 'measurement-heading')
62827 .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
62829 if (!selected.length) return;
62832 for (var i = 0; i < selected.length; i++) {
62833 entity = context.entity(selected[i]);
62834 extent._extend(entity.extent(resolver));
62836 center = extent.center();
62839 var list = selection$$1
62843 // multiple features, just display extent center..
62847 .text(t('info_panels.measurement.center') + ':');
62848 coordItem.append('span')
62849 .text(dmsCoordinatePair(center));
62850 coordItem.append('span')
62851 .text(decimalCoordinatePair(center));
62855 // single feature, display details..
62856 if (!entity) return;
62857 var geometry = entity.geometry(resolver);
62859 if (geometry === 'line' || geometry === 'area') {
62860 var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate()),
62861 feature = entity.asGeoJSON(resolver),
62862 length = radiansToMeters(length$1(toLineString(feature))),
62863 lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length')),
62864 centroid = d3_geoCentroid(feature);
62868 .text(t('info_panels.measurement.geometry') + ':')
62871 closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
62874 if (entity.type !== 'relation') {
62877 .text(t('info_panels.measurement.node_count') + ':')
62879 .text(nodeCount(feature).toLocaleString(locale));
62883 var area = steradiansToSqmeters(entity.area(resolver));
62886 .text(t('info_panels.measurement.area') + ':')
62888 .text(displayArea(area, isImperial));
62894 .text(lengthLabel + ':')
62896 .text(displayLength(length, isImperial));
62900 .text(t('info_panels.measurement.centroid') + ':');
62901 coordItem.append('span')
62902 .text(dmsCoordinatePair(centroid));
62903 coordItem.append('span')
62904 .text(decimalCoordinatePair(centroid));
62906 var toggle = isImperial ? 'imperial' : 'metric';
62910 .text(t('info_panels.measurement.' + toggle))
62912 .attr('class', 'button button-toggle-units')
62913 .on('click', function() {
62914 event.preventDefault();
62915 isImperial = !isImperial;
62916 selection$$1.call(redraw);
62920 var centerLabel = t('info_panels.measurement.' + (entity.type === 'node' ? 'location' : 'center'));
62924 .text(t('info_panels.measurement.geometry') + ':')
62926 .text(t('geometry.' + geometry));
62930 .text(centerLabel + ':');
62931 coordItem.append('span')
62932 .text(dmsCoordinatePair(center));
62933 coordItem.append('span')
62934 .text(decimalCoordinatePair(center));
62939 var panel = function(selection$$1) {
62940 selection$$1.call(redraw);
62943 .on('drawn.info-measurement', function() {
62944 selection$$1.call(redraw);
62948 panel.off = function() {
62950 .on('drawn.info-measurement', null);
62953 panel.id = 'measurement';
62954 panel.title = t('info_panels.measurement.title');
62955 panel.key = t('info_panels.measurement.key');
62961 var uiInfoPanels = {
62962 background: uiPanelBackground,
62963 history: uiPanelHistory,
62964 location: uiPanelLocation,
62965 measurement: uiPanelMeasurement,
62968 function uiInfo(context) {
62969 var ids = Object.keys(uiInfoPanels),
62970 wasActive = ['measurement'],
62975 ids.forEach(function(k) {
62977 panels[k] = uiInfoPanels[k](context);
62983 function info(selection$$1) {
62985 function redraw() {
62986 var activeids = ids.filter(function(k) { return active[k]; }).sort();
62988 var containers = infoPanels.selectAll('.panel-container')
62989 .data(activeids, function(k) { return k; });
62992 .style('opacity', 1)
62995 .style('opacity', 0)
62996 .on('end', function(d) {
62998 .call(panels[d].off)
63002 var enter = containers.enter()
63004 .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
63007 .style('opacity', 0)
63010 .style('opacity', 1);
63014 .attr('class', 'panel-title fillD2');
63018 .text(function(d) { return panels[d].title; });
63022 .attr('class', 'close')
63023 .on('click', function (d) { toggle(d); })
63024 .call(svgIcon('#iD-icon-close'));
63028 .attr('class', function(d) { return 'panel-content panel-content-' + d; });
63031 // redraw the panels
63032 infoPanels.selectAll('.panel-content')
63033 .each(function(d) {
63034 select(this).call(panels[d]);
63039 function toggle(which) {
63041 event.stopImmediatePropagation();
63042 event.preventDefault();
63045 var activeids = ids.filter(function(k) { return active[k]; });
63047 if (which) { // toggle one
63048 active[which] = !active[which];
63049 if (activeids.length === 1 && activeids[0] === which) { // none active anymore
63050 wasActive = [which];
63052 } else { // toggle all
63053 if (activeids.length) {
63054 wasActive = activeids;
63055 activeids.forEach(function(k) { active[k] = false; });
63057 wasActive.forEach(function(k) { active[k] = true; });
63065 var infoPanels = selection$$1.selectAll('.info-panels')
63068 infoPanels = infoPanels.enter()
63070 .attr('class', 'info-panels')
63071 .merge(infoPanels);
63075 var keybinding = d3keybinding('info')
63076 .on(uiCmd('⌘' + t('info_panels.key')), toggle);
63078 ids.forEach(function(k) {
63079 var key = t('info_panels.' + k + '.key', { default: null });
63082 .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
63092 function uiModes(context) {
63094 modeAddPoint$$1(context),
63095 modeAddLine$$1(context),
63096 modeAddArea$$1(context)
63100 function editable() {
63101 var mode = context.mode();
63102 return context.editable() && mode && mode.id !== 'save';
63106 return function(selection$$1) {
63107 var buttons = selection$$1.selectAll('button.add-button')
63110 buttons = buttons.enter()
63112 .attr('tabindex', -1)
63113 .attr('class', function(mode) { return mode.id + ' add-button col4'; })
63114 .on('click.mode-buttons', function(mode) {
63115 // When drawing, ignore accidental clicks on mode buttons - #4042
63116 var currMode = context.mode().id;
63117 if (currMode.match(/^draw/) !== null) return;
63119 if (mode.id === currMode) {
63120 context.enter(modeBrowse(context));
63122 context.enter(mode);
63126 .placement('bottom')
63128 .title(function(mode) {
63129 return uiTooltipHtml(mode.description, mode.key);
63134 .each(function(d) {
63136 .call(svgIcon('#iD-icon-' + d.button, 'pre-text'));
63141 .attr('class', 'label')
63142 .text(function(mode) { return mode.title; });
63145 .on('enter.editor', function(entered) {
63146 selection$$1.selectAll('button.add-button')
63147 .classed('active', function(mode) { return entered.button === mode.button; });
63148 context.container()
63149 .classed('mode-' + entered.id, true);
63153 .on('exit.editor', function(exited) {
63154 context.container()
63155 .classed('mode-' + exited.id, false);
63158 var keybinding = d3keybinding('mode-buttons');
63160 modes.forEach(function(mode) {
63161 keybinding.on(mode.key, function() {
63163 if (mode.id === context.mode().id) {
63164 context.enter(modeBrowse(context));
63166 context.enter(mode);
63176 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
63179 .on('move.modes', debouncedUpdate)
63180 .on('drawn.modes', debouncedUpdate);
63183 .on('enter.modes', update);
63187 function update() {
63188 selection$$1.selectAll('button.add-button')
63189 .property('disabled', !editable());
63194 function uiNotice(context) {
63196 return function(selection$$1) {
63197 var div = selection$$1
63199 .attr('class', 'notice');
63203 .attr('class', 'zoom-to notice fillD')
63204 .on('click', function() {
63205 context.map().zoomEase(context.minEditableZoom());
63207 .on('wheel', function() { // let wheel events pass through #4482
63208 var e2 = new WheelEvent(event.type, event);
63209 context.surface().node().dispatchEvent(e2);
63213 .call(svgIcon('#iD-icon-plus', 'pre-text'))
63215 .attr('class', 'label')
63216 .text(t('zoom_in_edit'));
63219 function disableTooHigh() {
63220 var canEdit = context.map().zoom() >= context.minEditableZoom();
63221 div.style('display', canEdit ? 'none' : 'block');
63225 .on('move.notice', debounce(disableTooHigh, 500));
63231 function uiRestore(context) {
63233 return function(selection) {
63234 if (!context.history().lock() || !context.history().restorableChanges())
63237 var modalSelection = uiModal(selection, true);
63239 modalSelection.select('.modal')
63240 .attr('class', 'modal fillL col6');
63242 var introModal = modalSelection.select('.content');
63245 .attr('class','cf');
63249 .attr('class', 'modal-section')
63251 .text(t('restore.heading'));
63255 .attr('class','modal-section')
63257 .text(t('restore.description'));
63259 var buttonWrap = introModal
63261 .attr('class', 'modal-actions cf');
63263 var restore = buttonWrap
63265 .attr('class', 'restore col6')
63266 .on('click', function() {
63267 context.history().restore();
63268 modalSelection.remove();
63273 .attr('class', 'logo logo-restore')
63275 .attr('xlink:href', '#iD-logo-restore');
63279 .text(t('restore.restore'));
63281 var reset = buttonWrap
63283 .attr('class', 'reset col6')
63284 .on('click', function() {
63285 context.history().clearSaved();
63286 modalSelection.remove();
63291 .attr('class', 'logo logo-reset')
63293 .attr('xlink:href', '#iD-logo-reset');
63297 .text(t('restore.reset'));
63299 restore.node().focus();
63303 function uiSave(context) {
63304 var history = context.history();
63305 var key = uiCmd('⌘S');
63308 function saving() {
63309 var mode = context.mode();
63310 return mode && mode.id === 'save';
63315 event.preventDefault();
63316 if (!context.inIntro() && !saving() && history.hasChanges()) {
63317 context.enter(modeSave$$1(context));
63322 function getBackground(numChanges) {
63324 if (numChanges === 0) {
63326 } else if (numChanges <= 50) {
63327 step = numChanges / 50;
63328 return interpolateRgb('#fff', '#ff8')(step); // white -> yellow
63330 step = Math.min((numChanges - 50) / 50, 1.0);
63331 return interpolateRgb('#ff8', '#f88')(step); // yellow -> red
63336 return function(selection$$1) {
63337 var numChanges = 0;
63339 function updateCount() {
63340 var _ = history.difference().summary().length;
63341 if (_ === numChanges) return;
63345 .title(uiTooltipHtml(
63346 t(numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
63349 var background = getBackground(numChanges);
63352 .classed('disabled', numChanges === 0)
63353 .classed('has-count', numChanges > 0)
63354 .style('background', background);
63356 button.select('span.count')
63358 .style('background', background)
63359 .style('border-color', background);
63363 var tooltipBehavior = tooltip()
63364 .placement('bottom')
63366 .title(uiTooltipHtml(t('save.no_changes'), key));
63368 var button = selection$$1
63370 .attr('class', 'save col12 disabled')
63371 .attr('tabindex', -1)
63373 .call(tooltipBehavior);
63376 .call(svgIcon('#iD-icon-save', 'pre-text'))
63378 .attr('class', 'label')
63379 .text(t('save.title'));
63383 .attr('class', 'count')
63389 var keybinding = d3keybinding('uiSave')
63390 .on(key, save, true);
63396 .on('change.save', updateCount);
63399 .on('enter.save', function() {
63400 button.property('disabled', saving());
63401 if (saving()) button.call(tooltipBehavior.hide);
63406 function uiScale(context) {
63407 var projection = context.projection,
63408 isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
63413 function scaleDefs(loc1, loc2) {
63414 var lat = (loc2[1] + loc1[1]) / 2,
63415 conversion = (isImperial ? 3.28084 : 1),
63416 dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
63417 scale = { dist: 0, px: 0, text: '' },
63418 buckets, i, val, dLon;
63421 buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
63423 buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
63426 // determine a user-friendly endpoint for the scale
63427 for (i = 0; i < buckets.length; i++) {
63430 scale.dist = Math.floor(dist / val) * val;
63433 scale.dist = +dist.toFixed(2);
63437 dLon = geoMetersToLon(scale.dist / conversion, lat);
63438 scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
63440 scale.text = displayLength(scale.dist / conversion, isImperial);
63446 function update(selection) {
63447 // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
63448 var dims = context.map().dimensions(),
63449 loc1 = projection.invert([0, dims[1]]),
63450 loc2 = projection.invert([maxLength, dims[1]]),
63451 scale = scaleDefs(loc1, loc2);
63453 selection.select('#scale-path')
63454 .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
63456 selection.select('#scale-textgroup')
63457 .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
63459 selection.select('#scale-text')
63464 return function(selection) {
63465 function switchUnits() {
63466 isImperial = !isImperial;
63467 selection.call(update);
63470 var scalegroup = selection.append('svg')
63471 .attr('id', 'scale')
63472 .on('click', switchUnits)
63474 .attr('transform', 'translate(10,11)');
63478 .attr('id', 'scale-path');
63482 .attr('id', 'scale-textgroup')
63484 .attr('id', 'scale-text');
63486 selection.call(update);
63488 context.map().on('move.scale', function() {
63494 var pair_1 = pair$1;
63496 function search(x, dims, r) {
63497 if (!dims) dims = 'NSEW';
63498 if (typeof x !== 'string') return { val: null, regex: r };
63500 r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
63503 if (!m) return { val: null, regex: r };
63505 var dim = m[1] || m[5];
63506 if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
63509 val: (((m[2]) ? parseFloat(m[2]) : 0) +
63510 ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
63511 ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
63512 ((dim === 'S' || dim === 'W') ? -1 : 1),
63519 function pair$1(x, dims) {
63521 var one = search(x, dims);
63522 if (one.val === null) return null;
63523 var two = search(x, dims, one.regex);
63524 if (two.val === null) return null;
63525 // null if one/two are not contiguous.
63526 if (one.raw + two.raw !== x) return null;
63528 return swapdim(one.val, two.val, one.dim);
63530 return [one.val, two.val];
63534 function swapdim(a, b, dim) {
63535 if (dim === 'N' || dim === 'S') return [a, b];
63536 if (dim === 'W' || dim === 'E') return [b, a];
63539 function uiFeatureList(context) {
63540 var keybinding = d3keybinding('uiFeatureList');
63541 var _geocodeResults;
63544 function featureList(selection$$1) {
63545 var header = selection$$1
63547 .attr('class', 'header fillL cf');
63551 .text(t('inspector.feature_list'));
63553 var searchWrap = selection$$1
63555 .attr('class', 'search-header');
63557 var search = searchWrap
63559 .attr('placeholder', t('inspector.search'))
63560 .attr('type', 'search')
63562 .on('keypress', keypress)
63563 .on('keydown', keydown)
63564 .on('input', inputevent);
63567 .call(svgIcon('#iD-icon-search', 'pre-text'));
63569 var listWrap = selection$$1
63571 .attr('class', 'inspector-body');
63573 var list = listWrap
63575 .attr('class', 'feature-list cf');
63578 .on('exit.feature-list', clearSearch);
63580 .on('drawn.feature-list', mapDrawn);
63583 .on(uiCmd('⌘F'), focusSearch);
63589 function focusSearch() {
63590 var mode = context.mode() && context.mode().id;
63591 if (mode !== 'browse') return;
63593 event.preventDefault();
63594 search.node().focus();
63598 function keydown() {
63599 if (event.keyCode === 27) { // escape
63600 search.node().blur();
63605 function keypress() {
63606 var q = search.property('value'),
63607 items = list.selectAll('.feature-list-item');
63608 if (event.keyCode === 13 && q.length && items.size()) { // return
63609 click(items.datum());
63614 function inputevent() {
63615 _geocodeResults = undefined;
63620 function clearSearch() {
63621 search.property('value', '');
63626 function mapDrawn(e) {
63633 function features() {
63636 var graph = context.graph();
63637 var q = search.property('value').toLowerCase();
63639 if (!q) return result;
63641 var idMatch = q.match(/^([nwr])([0-9]+)$/);
63646 geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
63647 type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
63652 var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
63654 if (locationMatch) {
63655 var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
63659 type: t('inspector.location'),
63660 name: dmsCoordinatePair([loc[1], loc[0]]),
63665 function addEntity(entity) {
63666 if (entity.id in entities || result.length > 200)
63669 entities[entity.id] = true;
63671 var name = utilDisplayName(entity) || '';
63672 if (name.toLowerCase().indexOf(q) >= 0) {
63673 var matched = context.presets().match(entity, graph);
63674 var type = (matched && matched.name()) || utilDisplayType(entity.id);
63679 geometry: context.geometry(entity.id),
63685 graph.parentRelations(entity).forEach(function(parent) {
63690 var visible = context.surface().selectAll('.point, .line, .area').nodes();
63691 for (var i = 0; i < visible.length && result.length <= 200; i++) {
63692 var datum = visible[i].__data__;
63693 var entity = datum && datum.properties && datum.properties.entity;
63694 if (entity) { addEntity(entity); }
63697 (_geocodeResults || []).forEach(function(d) {
63698 if (d.osm_type && d.osm_id) { // some results may be missing these - #1890
63700 // Make a temporary osmEntity so we can preset match
63701 // and better localize the search result - #4725
63702 var id = osmEntity$$1.id.fromOSM(d.osm_type, d.osm_id);
63704 tags[d.class] = d.type;
63706 var attrs = { id: id, type: d.osm_type, tags: tags };
63707 if (d.osm_type === 'way') { // for ways, add some fake closed nodes
63708 attrs.nodes = ['a','a']; // so that geometry area is possible
63711 var tempEntity = osmEntity$$1(attrs);
63712 var tempGraph = coreGraph$$1([tempEntity]);
63713 var matched = context.presets().match(tempEntity, tempGraph);
63714 var type = (matched && matched.name()) || utilDisplayType(id);
63718 geometry: tempEntity.geometry(tempGraph),
63720 name: d.display_name,
63721 extent: new geoExtent$$1(
63722 [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
63723 [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
63732 function drawList() {
63733 var value = search.property('value');
63734 var results = features();
63736 list.classed('filtered', value.length);
63738 var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
63740 var resultsIndicator = list.selectAll('.no-results-item')
63744 .property('disabled', true)
63745 .attr('class', 'no-results-item')
63746 .call(svgIcon('#iD-icon-alert', 'pre-text'));
63748 resultsIndicator.append('span')
63749 .attr('class', 'entity-name');
63751 list.selectAll('.no-results-item .entity-name')
63752 .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
63754 if (services.geocoder) {
63755 list.selectAll('.geocode-item')
63759 .attr('class', 'geocode-item')
63760 .on('click', geocoderSearch)
63762 .attr('class', 'label')
63764 .attr('class', 'entity-name')
63765 .text(t('geocoder.search'));
63768 list.selectAll('.no-results-item')
63769 .style('display', (value.length && !results.length) ? 'block' : 'none');
63771 list.selectAll('.geocode-item')
63772 .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
63774 list.selectAll('.feature-list-item')
63778 var items = list.selectAll('.feature-list-item')
63779 .data(results, function(d) { return d.id; });
63781 var enter = items.enter()
63782 .insert('button', '.geocode-item')
63783 .attr('class', 'feature-list-item')
63784 .on('mouseover', mouseover)
63785 .on('mouseout', mouseout)
63786 .on('click', click);
63790 .attr('class', 'label');
63793 .each(function(d) {
63795 .call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
63800 .attr('class', 'entity-type')
63801 .text(function(d) { return d.type; });
63805 .attr('class', 'entity-name')
63806 .text(function(d) { return d.name; });
63809 .style('opacity', 0)
63811 .style('opacity', 1);
63820 function mouseover(d) {
63821 if (d.id === -1) return;
63823 context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
63824 .classed('hover', true);
63828 function mouseout() {
63829 context.surface().selectAll('.hover')
63830 .classed('hover', false);
63834 function click(d) {
63835 event.preventDefault();
63837 context.map().centerZoom([d.location[1], d.location[0]], 19);
63839 else if (d.entity) {
63840 if (d.entity.type === 'node') {
63841 context.map().center(d.entity.loc);
63842 } else if (d.entity.type === 'way') {
63843 var center = context.projection(context.map().center());
63844 var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
63845 context.map().center(edge.loc);
63847 context.enter(modeSelect(context, [d.entity.id]));
63849 context.zoomToEntity(d.id);
63854 function geocoderSearch() {
63855 services.geocoder.search(search.property('value'), function (err, resp) {
63856 _geocodeResults = resp || [];
63863 return featureList;
63866 function uiPresetIcon() {
63867 var preset, geometry;
63870 function presetIcon(selection$$1) {
63871 selection$$1.each(render);
63875 function getIcon(p, geom) {
63878 else if (geom === 'line')
63879 return 'iD-other-line';
63880 else if (geom === 'vertex')
63881 return p.isFallback() ? '' : 'temaki-vertex';
63883 return 'maki-marker-stroked';
63887 function render() {
63888 var selection$$1 = select(this);
63889 var p = preset.apply(this, arguments);
63890 var geom = geometry.apply(this, arguments);
63891 var picon = getIcon(p, geom);
63892 var isMaki = /^maki-/.test(picon);
63893 var isTemaki = /^temaki-/.test(picon);
63894 var isFa = /^fa[srb]-/.test(picon);
63895 var isPOI = isMaki || isTemaki || isFa;
63896 var isFramed = (geom === 'area' || geom === 'vertex');
63899 function tag_classes(p) {
63901 for (var i in p.tags) {
63903 if (p.tags[i] !== '*') {
63904 s += ' tag-' + i + '-' + p.tags[i];
63911 var fill = selection$$1.selectAll('.preset-icon-fill')
63914 fill = fill.enter()
63919 .attr('class', function() {
63920 return 'preset-icon-fill preset-icon-fill-' + geom + tag_classes(p);
63924 var areaFrame = selection$$1.selectAll('.preset-icon-frame')
63925 .data((geom === 'area') ? [0] : []);
63930 areaFrame = areaFrame.enter()
63932 .attr('class', 'preset-icon-frame')
63933 .call(svgIcon('#iD-preset-icon-frame'));
63936 var icon = selection$$1.selectAll('.preset-icon')
63939 icon = icon.enter()
63941 .attr('class', 'preset-icon')
63946 .attr('class', 'preset-icon preset-icon-' +
63947 (isPOI ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
63950 icon.selectAll('svg')
63951 .attr('class', function() {
63952 return 'icon ' + picon + (isPOI ? '' : tag_classes(p));
63955 icon.selectAll('use')
63956 .attr('href', '#' + picon + (isMaki ? '-15' : ''));
63960 presetIcon.preset = function(_) {
63961 if (!arguments.length) return preset;
63962 preset = utilFunctor(_);
63967 presetIcon.geometry = function(_) {
63968 if (!arguments.length) return geometry;
63969 geometry = utilFunctor(_);
63976 function d3combobox() {
63977 var dispatch$$1 = dispatch('accept');
63978 var _container = select(document.body);
63980 var _suggestions = [];
63982 var _caseSensitive = false;
63984 var _fetcher = function(val, cb) {
63985 cb(_data.filter(function(d) {
63989 .indexOf(val.toLowerCase()) !== -1;
63993 var combobox = function(input, attachTo) {
63995 var wrapper = _container
63996 .selectAll('div.combobox')
63997 .filter(function(d) { return d === input.node(); });
63998 var shown = !wrapper.empty();
63999 var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
64002 .classed('combobox-input', true)
64003 .on('focus.typeahead', focus)
64004 .on('blur.typeahead', blur)
64005 .on('keydown.typeahead', keydown)
64006 .on('keyup.typeahead', keyup)
64007 .on('input.typeahead', change)
64009 var parent = this.parentNode;
64010 var sibling = this.nextSibling;
64012 var caret = select(parent).selectAll('.combobox-caret')
64013 .filter(function(d) { return d === input.node(); })
64014 .data([input.node()]);
64016 caret = caret.enter()
64017 .insert('div', function() { return sibling; })
64018 .attr('class', 'combobox-caret')
64022 .on('mousedown', function () {
64023 // prevent the form element from blurring. it blurs
64025 event.stopPropagation();
64026 event.preventDefault();
64028 input.node().focus();
64037 fetch(value(), render);
64041 window.setTimeout(hide, 150);
64046 wrapper = _container
64047 .insert('div', ':first-child')
64048 .datum(input.node())
64049 .attr('class', 'combobox')
64050 .style('position', 'absolute')
64051 .style('display', 'block')
64052 .style('left', '0px')
64053 .on('mousedown', function () {
64054 // prevent moving focus out of the text field
64055 event.preventDefault();
64059 .on('scroll.combobox', render, true);
64071 .on('scroll.combobox', null);
64077 function keydown() {
64078 switch (event.keyCode) {
64079 // backspace, delete
64082 input.on('input.typeahead', function() {
64085 var start = input.property('selectionStart');
64086 input.node().setSelectionRange(start, start);
64087 input.on('input.typeahead', change);
64092 wrapper.selectAll('a.selected').each(function (d) {
64093 dispatch$$1.call('accept', this, d);
64099 event.preventDefault();
64103 if (tagName === 'textarea' && !shown) return;
64105 event.preventDefault();
64109 if (tagName === 'textarea' && !shown) return;
64111 event.preventDefault();
64114 event.stopPropagation();
64118 switch (event.keyCode) {
64125 wrapper.selectAll('a.selected').each(function (d) {
64126 dispatch$$1.call('accept', this, d);
64133 function change() {
64134 fetch(value(), function() {
64135 if (input.property('selectionEnd') === input.property('value').length) {
64142 function nav(dir) {
64143 if (!_suggestions.length) return;
64144 idx = Math.max(Math.min(idx + dir, _suggestions.length - 1), 0);
64145 input.property('value', _suggestions[idx].value);
64151 var value = input.property('value');
64152 var start = input.property('selectionStart');
64153 var end = input.property('selectionEnd');
64155 if (start && end) {
64156 value = value.substring(0, start);
64162 function fetch(v, cb) {
64163 _fetcher.call(input, v, function(_) {
64169 function autocomplete() {
64170 var v = _caseSensitive ? value() : value().toLowerCase();
64174 // Don't autocomplete if user is typing a number - #4935
64175 if (!isNaN(parseFloat(v)) && isFinite(v)) return;
64178 var suggestion, compare;
64180 for (var i = 0; i < _suggestions.length; i++) {
64181 suggestion = _suggestions[i].value;
64182 compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
64184 // if search string matches suggestion exactly, pick it..
64185 if (compare === v) {
64189 // otherwise lock in the first result that starts with the search string..
64190 } else if (best === -1 && compare.indexOf(v) === 0) {
64197 suggestion = _suggestions[best].value;
64198 input.property('value', suggestion);
64199 input.node().setSelectionRange(v.length, suggestion.length);
64203 function render() {
64204 if (_suggestions.length >= _minItems && document.activeElement === input.node()) {
64211 var options = wrapper
64212 .selectAll('a.combobox-option')
64213 .data(_suggestions, function(d) { return d.value; });
64220 .attr('class', 'combobox-option')
64221 .text(function(d) { return d.value; })
64223 .attr('title', function(d) { return d.title; })
64224 .classed('selected', function(d, i) { return i === idx; })
64225 .on('mouseover', select$$1)
64226 .on('click', accept)
64230 var node = attachTo ? attachTo.node() : input.node();
64231 var rect = node.getBoundingClientRect();
64234 .style('left', (rect.left + 5) + 'px')
64235 .style('width', (rect.width - 10) + 'px')
64236 .style('top', rect.height + rect.top + 'px');
64239 function select$$1(d, i) {
64244 function ensureVisible() {
64245 var node = wrapper.selectAll('a.selected').node();
64246 if (node) node.scrollIntoView();
64249 function accept(d) {
64250 if (!shown) return;
64251 input.property('value', d.value);
64252 utilTriggerEvent(input, 'change');
64253 dispatch$$1.call('accept', this, d);
64258 combobox.fetcher = function(_) {
64259 if (!arguments.length) return _fetcher;
64264 combobox.data = function(_) {
64265 if (!arguments.length) return _data;
64270 combobox.minItems = function(_) {
64271 if (!arguments.length) return _minItems;
64276 combobox.caseSensitive = function(_) {
64277 if (!arguments.length) return _caseSensitive;
64278 _caseSensitive = _;
64282 combobox.container = function(_) {
64283 if (!arguments.length) return _container;
64288 return utilRebind(combobox, dispatch$$1, 'on');
64292 d3combobox.off = function(input) {
64294 .on('focus.typeahead', null)
64295 .on('blur.typeahead', null)
64296 .on('keydown.typeahead', null)
64297 .on('keyup.typeahead', null)
64298 .on('input.typeahead', null)
64300 select(this.parentNode).selectAll('.combobox-caret')
64301 .filter(function(d) { return d === input.node(); })
64302 .on('mousedown', null);
64306 .on('scroll.combobox', null);
64309 function uiRawMemberEditor(context) {
64310 var taginfo = services.taginfo,
64314 function selectMember(d) {
64315 event.preventDefault();
64316 context.enter(modeSelect(context, [d.id]));
64320 function changeRole(d) {
64321 var role = select(this).property('value');
64322 var member = { id: d.id, type: d.type, role: role };
64324 actionChangeMember(d.relation.id, member, d.index),
64325 t('operations.change_role.annotation')
64330 function deleteMember(d) {
64332 actionDeleteMember(d.relation.id, d.index),
64333 t('operations.delete_member.annotation')
64336 if (!context.hasEntity(d.relation.id)) {
64337 context.enter(modeBrowse(context));
64342 function rawMemberEditor(selection$$1) {
64343 var entity = context.entity(_entityID),
64346 entity.members.slice(0, 1000).forEach(function(member, index) {
64353 member: context.hasEntity(member.id)
64357 var gt = entity.members.length > 1000 ? '>' : '';
64358 selection$$1.call(uiDisclosure(context, 'raw_member_editor', true)
64359 .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
64361 .updatePreference(false)
64362 .on('toggled', function(expanded) {
64363 if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
64369 function content(wrap) {
64370 var list = wrap.selectAll('.member-list')
64373 list = list.enter()
64375 .attr('class', 'member-list')
64379 var items = list.selectAll('li')
64380 .data(memberships, function(d) {
64381 return osmEntity$$1.key(d.relation) + ',' + d.index + ',' +
64382 (d.member ? osmEntity$$1.key(d.member) : 'incomplete');
64389 var enter = items.enter()
64391 .attr('class', 'member-row form-field')
64392 .classed('member-incomplete', function(d) { return !d.member; });
64395 .each(function(d) {
64397 var label = select(this).append('label')
64398 .attr('class', 'form-label')
64401 .on('click', selectMember);
64403 label.append('span')
64404 .attr('class', 'member-entity-type')
64405 .text(function(d) {
64406 var matched = context.presets().match(d.member, context.graph());
64407 return (matched && matched.name()) || utilDisplayType(d.member.id);
64410 label.append('span')
64411 .attr('class', 'member-entity-name')
64412 .text(function(d) { return utilDisplayName(d.member); });
64415 select(this).append('label')
64416 .attr('class', 'form-label')
64417 .text(t('inspector.incomplete', { id: d.id }));
64423 .attr('class', 'member-role')
64424 .property('type', 'text')
64425 .attr('maxlength', 255)
64426 .attr('placeholder', t('inspector.role'))
64428 .property('value', function(d) { return d.role; })
64429 .on('change', changeRole);
64433 .attr('tabindex', -1)
64434 .attr('class', 'remove button-input-action member-delete minor')
64435 .on('click', deleteMember)
64436 .call(svgIcon('#iD-operation-delete'));
64439 enter.each(bindTypeahead);
64443 function bindTypeahead(d) {
64444 var row = select(this),
64445 role = row.selectAll('input.member-role');
64447 function sort(value, data) {
64448 var sameletter = [],
64450 for (var i = 0; i < data.length; i++) {
64451 if (data[i].value.substring(0, value.length) === value) {
64452 sameletter.push(data[i]);
64454 other.push(data[i]);
64457 return sameletter.concat(other);
64460 role.call(d3combobox()
64461 .container(context.container())
64462 .fetcher(function(role, callback) {
64463 var rtype = entity.tags.type;
64466 rtype: rtype || '',
64467 geometry: context.geometry(d.member.id),
64469 }, function(err, data) {
64470 if (!err) callback(sort(role, data));
64476 function unbind() {
64477 var row = select(this);
64479 row.selectAll('input.member-role')
64480 .call(d3combobox.off);
64486 rawMemberEditor.entityID = function(_) {
64487 if (!arguments.length) return _entityID;
64489 return rawMemberEditor;
64493 return rawMemberEditor;
64496 function uiRawMembershipEditor(context) {
64497 var taginfo = services.taginfo,
64502 function selectRelation(d) {
64503 event.preventDefault();
64504 context.enter(modeSelect(context, [d.relation.id]));
64508 function changeRole(d) {
64509 var role = select(this).property('value');
64511 actionChangeMember(d.relation.id, assignIn({}, d.member, { role: role }), d.index),
64512 t('operations.change_role.annotation')
64517 function addMembership(d, role) {
64518 _showBlank = false;
64520 var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
64524 actionAddMember(d.relation.id, member),
64525 t('operations.add_member.annotation')
64529 var relation = osmRelation();
64531 actionAddEntity(relation),
64532 actionAddMember(relation.id, member),
64533 t('operations.add.annotation.relation')
64536 context.enter(modeSelect(context, [relation.id]));
64541 function deleteMembership(d) {
64543 actionDeleteMember(d.relation.id, d.index),
64544 t('operations.delete_member.annotation')
64549 function relations(q) {
64550 var newRelation = { relation: null, value: t('inspector.new_relation') };
64552 var graph = context.graph();
64554 context.intersects(context.extent()).forEach(function(entity) {
64555 if (entity.type !== 'relation' || entity.id === _entityID)
64558 var matched = context.presets().match(entity, graph),
64559 presetName = (matched && matched.name()) || t('inspector.relation'),
64560 entityName = utilDisplayName(entity) || '';
64562 var value = presetName + ' ' + entityName;
64563 if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1)
64566 result.push({ relation: entity, value: value });
64569 result.sort(function(a, b) {
64570 return osmRelation.creationOrder(a.relation, b.relation);
64573 // Dedupe identical names by appending relation id - see #2891
64574 var dupeGroups = filter(
64575 groupBy(result, 'value'),
64576 function(v) { return v.length > 1; }
64579 dupeGroups.forEach(function(group) {
64580 group.forEach(function(obj) {
64581 obj.value += ' ' + obj.relation.id;
64585 forEach(result, function(obj) {
64586 obj.title = obj.value;
64589 result.unshift(newRelation);
64594 function rawMembershipEditor(selection$$1) {
64595 var entity = context.entity(_entityID),
64596 parents = context.graph().parentRelations(entity),
64599 parents.slice(0, 1000).forEach(function(relation) {
64600 relation.members.forEach(function(member, index) {
64601 if (member.id === entity.id) {
64602 memberships.push({ relation: relation, member: member, index: index });
64607 var gt = parents.length > 1000 ? '>' : '';
64608 selection$$1.call(uiDisclosure(context, 'raw_membership_editor', true)
64609 .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
64611 .updatePreference(false)
64612 .on('toggled', function(expanded) {
64613 if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
64619 function content(wrap) {
64620 var list = wrap.selectAll('.member-list')
64623 list = list.enter()
64625 .attr('class', 'member-list')
64629 var items = list.selectAll('li.member-row-normal')
64630 .data(memberships, function(d) {
64631 return osmEntity$$1.key(d.relation) + ',' + d.index;
64638 var enter = items.enter()
64640 .attr('class', 'member-row member-row-normal form-field');
64644 .attr('class', 'form-label')
64647 .on('click', selectRelation);
64651 .attr('class', 'member-entity-type')
64652 .text(function(d) {
64653 var matched = context.presets().match(d.relation, context.graph());
64654 return (matched && matched.name()) || t('inspector.relation');
64659 .attr('class', 'member-entity-name')
64660 .text(function(d) { return utilDisplayName(d.relation); });
64664 .attr('class', 'member-role')
64665 .property('type', 'text')
64666 .attr('maxlength', 255)
64667 .attr('placeholder', t('inspector.role'))
64669 .property('value', function(d) { return d.member.role; })
64670 .on('change', changeRole);
64674 .attr('tabindex', -1)
64675 .attr('class', 'remove button-input-action member-delete minor')
64676 .on('click', deleteMembership)
64677 .call(svgIcon('#iD-operation-delete'));
64680 enter.each(bindTypeahead);
64684 var newrow = list.selectAll('.member-row-new')
64685 .data(_showBlank ? [0] : []);
64690 enter = newrow.enter()
64692 .attr('class', 'member-row member-row-new form-field');
64696 .attr('type', 'text')
64697 .attr('class', 'member-entity-input')
64702 .attr('class', 'member-role')
64703 .property('type', 'text')
64704 .attr('maxlength', 255)
64705 .attr('placeholder', t('inspector.role'))
64707 .on('change', changeRole);
64711 .attr('tabindex', -1)
64712 .attr('class', 'remove button-input-action member-delete minor')
64713 .on('click', deleteMembership)
64714 .call(svgIcon('#iD-operation-delete'));
64719 newrow.selectAll('.member-entity-input')
64721 .container(context.container())
64723 .fetcher(function(value, callback) { callback(relations(value)); })
64724 .on('accept', onAccept)
64728 var addrel = wrap.selectAll('.add-relation')
64731 addrel = addrel.enter()
64733 .attr('class', 'add-relation')
64737 .call(svgIcon('#iD-icon-plus', 'light'))
64738 .on('click', function() {
64741 list.selectAll('.member-entity-input').node().focus();
64745 function onAccept(d) {
64746 var role = list.selectAll('.member-row-new .member-role').property('value');
64747 addMembership(d, role);
64751 function bindTypeahead(d) {
64752 var row = select(this),
64753 role = row.selectAll('input.member-role');
64755 function sort(value, data) {
64756 var sameletter = [],
64758 for (var i = 0; i < data.length; i++) {
64759 if (data[i].value.substring(0, value.length) === value) {
64760 sameletter.push(data[i]);
64762 other.push(data[i]);
64765 return sameletter.concat(other);
64768 role.call(d3combobox()
64769 .container(context.container())
64770 .fetcher(function(role, callback) {
64771 var rtype = d.relation.tags.type;
64774 rtype: rtype || '',
64775 geometry: context.geometry(_entityID),
64777 }, function(err, data) {
64778 if (!err) callback(sort(role, data));
64784 function unbind() {
64785 var row = select(this);
64787 row.selectAll('input.member-role')
64788 .call(d3combobox.off);
64794 rawMembershipEditor.entityID = function(_) {
64795 if (!arguments.length) return _entityID;
64797 return rawMembershipEditor;
64801 return rawMembershipEditor;
64804 function uiTagReference(tag) {
64805 var taginfo = services.taginfo;
64806 var tagReference = {};
64808 var _button = select(null);
64809 var _body = select(null);
64814 function findLocal(data) {
64815 var locale = utilDetect().locale.toLowerCase();
64818 if (locale !== 'pt-br') { // see #3776, prefer 'pt' over 'pt-br'
64819 localized = find$1(data, function(d) {
64820 return d.lang.toLowerCase() === locale;
64822 if (localized) return localized;
64825 // try the non-regional version of a language, like
64826 // 'en' if the language is 'en-US'
64827 if (locale.indexOf('-') !== -1) {
64828 var first = locale.split('-')[0];
64829 localized = find$1(data, function(d) {
64830 return d.lang.toLowerCase() === first;
64832 if (localized) return localized;
64835 // finally fall back to english
64836 return find$1(data, function(d) {
64837 return d.lang.toLowerCase() === 'en';
64842 function load(param) {
64843 if (!taginfo) return;
64846 .classed('tag-reference-loading', true);
64848 taginfo.docs(param, function show(err, data) {
64850 if (!err && data) {
64851 docs = findLocal(data);
64856 if (!docs || !docs.title) {
64857 if (param.hasOwnProperty('value')) {
64858 load(omit(param, 'value')); // retry with key only
64862 .attr('class', 'tag-reference-description')
64863 .text(t('inspector.no_documentation_key'));
64869 if (docs.image && docs.image.thumb_url_prefix) {
64872 .attr('class', 'tag-reference-wiki-image')
64873 .attr('src', docs.image.thumb_url_prefix + '100' + docs.image.thumb_url_suffix)
64874 .on('load', function() { done(); })
64875 .on('error', function() { select(this).remove(); done(); });
64882 .attr('class', 'tag-reference-description')
64883 .text(docs.description || t('inspector.documentation_redirect'));
64887 .attr('class', 'tag-reference-link')
64888 .attr('target', '_blank')
64889 .attr('tabindex', -1)
64890 .attr('href', 'https://wiki.openstreetmap.org/wiki/' + docs.title)
64891 .call(svgIcon('#iD-icon-out-link', 'inline'))
64893 .text(t('inspector.reference'));
64895 // Add link to info about "good changeset comments" - #2923
64896 if (param.key === 'comment') {
64899 .attr('class', 'tag-reference-comment-link')
64900 .attr('target', '_blank')
64901 .attr('tabindex', -1)
64902 .call(svgIcon('#iD-icon-out-link', 'inline'))
64903 .attr('href', t('commit.about_changeset_comments_link'))
64905 .text(t('commit.about_changeset_comments'));
64915 .classed('tag-reference-loading', false);
64918 .classed('expanded', true)
64921 .style('max-height', '200px')
64922 .style('opacity', '1');
64932 .style('max-height', '0px')
64933 .style('opacity', '0')
64934 .on('end', function () {
64935 _body.classed('expanded', false);
64942 tagReference.button = function(selection$$1) {
64943 _button = selection$$1.selectAll('.tag-reference-button')
64946 _button = _button.enter()
64948 .attr('class', 'tag-reference-button')
64949 .attr('title', t('icons.information'))
64950 .attr('tabindex', -1)
64951 .call(svgIcon('#iD-icon-inspect'))
64955 .on('click', function () {
64956 event.stopPropagation();
64957 event.preventDefault();
64960 } else if (_loaded) {
64969 tagReference.body = function(selection$$1) {
64970 var tagid = tag.rtype || (tag.key + '-' + tag.value);
64971 _body = selection$$1.selectAll('.tag-reference-body')
64972 .data([tagid], function(d) { return d; });
64977 _body = _body.enter()
64979 .attr('class', 'tag-reference-body cf')
64980 .style('max-height', '0')
64981 .style('opacity', '0')
64984 if (_showing === false) {
64990 tagReference.showing = function(_) {
64991 if (!arguments.length) return _showing;
64993 return tagReference;
64997 return tagReference;
65000 function uiRawTagEditor(context) {
65001 var taginfo = services.taginfo,
65002 dispatch$$1 = dispatch('change'),
65003 _readOnlyTags = [],
65004 _showBlank = false,
65005 _updatePreference = true,
65014 function rawTagEditor(selection$$1) {
65015 var count = Object.keys(_tags).filter(function(d) { return d; }).length;
65017 var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
65018 .title(t('inspector.all_tags') + ' (' + count + ')')
65019 .on('toggled', toggled)
65020 .updatePreference(_updatePreference)
65023 // Sometimes we want to force the raw_tag_editor to be opened/closed..
65024 // When undefined, uiDisclosure will use the user's stored preference.
65025 if (_expanded !== undefined) {
65026 disclosure.expanded(_expanded);
65029 selection$$1.call(disclosure);
65031 function toggled(expanded) {
65032 _expanded = expanded;
65034 selection$$1.node().parentNode.scrollTop += 200;
65040 function content(wrap) {
65041 var entries = map$3(_tags, function(v, k) {
65042 return { key: k, value: v };
65045 if (!entries.length || _showBlank) {
65046 _showBlank = false;
65047 entries.push({key: '', value: ''});
65051 var list = wrap.selectAll('.tag-list')
65054 list = list.enter()
65056 .attr('class', 'tag-list')
65059 var newTag = wrap.selectAll('.add-tag')
65064 .attr('class', 'add-tag')
65065 .on('click', addTag)
65066 .call(svgIcon('#iD-icon-plus', 'light'));
65069 var items = list.selectAll('.tag-row')
65070 .data(entries, function(d) { return d.key; });
65078 var enter = items.enter()
65080 .attr('class', 'tag-row cf')
65081 .classed('readonly', isReadOnly);
65085 .attr('class', 'key-wrap')
65087 .property('type', 'text')
65088 .attr('class', 'key')
65089 .attr('maxlength', 255)
65091 .on('blur', keyChange)
65092 .on('change', keyChange);
65096 .attr('class', 'input-wrap-position')
65098 .property('type', 'text')
65099 .attr('class', 'value')
65100 .attr('maxlength', 255)
65102 .on('blur', valueChange)
65103 .on('change', valueChange)
65104 .on('keydown.push-more', pushMore);
65108 .attr('tabindex', -1)
65109 .attr('class', 'remove minor')
65110 .call(svgIcon('#iD-operation-delete'));
65117 .sort(function(a, b) {
65118 return (a.key === _newRow && b.key !== _newRow) ? 1
65119 : (a.key !== _newRow && b.key === _newRow) ? -1
65120 : ascending(a.key, b.key);
65124 .each(function(tag) {
65125 var row = select(this),
65126 key = row.select('input.key'), // propagate bound data to child
65127 value = row.select('input.value'); // propagate bound data to child
65129 if (_entityID && taginfo) {
65130 bindTypeahead(key, value);
65133 var isRelation = (_entityID && context.entity(_entityID).type === 'relation'),
65136 if (isRelation && tag.key === 'type') {
65137 reference = uiTagReference({ rtype: tag.value }, context);
65139 reference = uiTagReference({ key: tag.key, value: tag.value }, context);
65142 if (_state === 'hover') {
65143 reference.showing(false);
65147 .call(reference.button)
65148 .call(reference.body);
65151 items.selectAll('input.key')
65152 .attr('title', function(d) { return d.key; })
65153 .call(utilGetSetValue, function(d) { return d.key; })
65154 .property('disabled', isReadOnly);
65156 items.selectAll('input.value')
65157 .attr('title', function(d) { return d.value; })
65158 .call(utilGetSetValue, function(d) { return d.value; })
65159 .property('disabled', isReadOnly);
65161 items.selectAll('button.remove')
65162 .on('click', removeTag);
65166 function isReadOnly(d) {
65167 for (var i = 0; i < _readOnlyTags.length; i++) {
65168 if (d.key.match(_readOnlyTags[i]) !== null) {
65176 function pushMore() {
65177 if (event.keyCode === 9 && !event.shiftKey &&
65178 list.selectAll('li:last-child input.value').node() === this) {
65184 function bindTypeahead(key, value) {
65185 if (isReadOnly(key.datum())) return;
65187 var geometry = context.geometry(_entityID);
65189 key.call(d3combobox()
65190 .container(context.container())
65191 .fetcher(function(value, callback) {
65194 geometry: geometry,
65196 }, function(err, data) {
65197 if (!err) callback(sort(value, data));
65201 value.call(d3combobox()
65202 .container(context.container())
65203 .fetcher(function(value, callback) {
65206 key: utilGetSetValue(key),
65207 geometry: geometry,
65209 }, function(err, data) {
65210 if (!err) callback(sort(value, data));
65215 function sort(value, data) {
65216 var sameletter = [],
65218 for (var i = 0; i < data.length; i++) {
65219 if (data[i].value.substring(0, value.length) === value) {
65220 sameletter.push(data[i]);
65222 other.push(data[i]);
65225 return sameletter.concat(other);
65230 function unbind() {
65231 var row = select(this);
65233 row.selectAll('input.key')
65234 .call(d3combobox.off);
65236 row.selectAll('input.value')
65237 .call(d3combobox.off);
65241 function keyChange(d) {
65243 kNew = this.value.trim(),
65247 if (isReadOnly({ key: kNew })) {
65252 if (kNew && kNew !== kOld) {
65253 var match = kNew.match(/^(.*?)(?:_(\d+))?$/),
65255 suffix = +(match[2] || 1);
65256 while (_tags[kNew]) { // rename key if already in use
65257 kNew = base + '_' + suffix++;
65260 if (includes(kNew, '=')) {
65261 var splitStr = kNew.split('=').map(function(str) { return str.trim(); }),
65263 value = splitStr[1];
65269 tag[kOld] = undefined;
65270 tag[kNew] = d.value;
65272 d.key = kNew; // Maintain DOM identity through the subsequent update.
65274 if (_newRow === kOld) { // see if this row is still a new row
65275 _newRow = ((d.value === '' || kNew === '') ? kNew : undefined);
65279 dispatch$$1.call('change', this, tag);
65283 function valueChange(d) {
65284 if (isReadOnly(d)) return;
65286 tag[d.key] = this.value;
65288 if (_newRow === d.key && d.key !== '' && d.value !== '') { // not a new row anymore
65289 _newRow = undefined;
65292 dispatch$$1.call('change', this, tag);
65296 function removeTag(d) {
65297 if (isReadOnly(d)) return;
65299 tag[d.key] = undefined;
65300 dispatch$$1.call('change', this, tag);
65301 select(this.parentNode).remove();
65305 function addTag() {
65306 // Wrapped in a setTimeout in case it's being called from a blur
65307 // handler. Without the setTimeout, the call to `content` would
65308 // wipe out the pending value change.
65309 window.setTimeout(function() {
65312 list.selectAll('li:last-child input.key').node().focus();
65318 rawTagEditor.state = function(_) {
65319 if (!arguments.length) return _state;
65321 return rawTagEditor;
65325 rawTagEditor.preset = function(_) {
65326 if (!arguments.length) return _preset;
65328 if (_preset.isFallback()) {
65330 _updatePreference = false;
65332 _expanded = undefined;
65333 _updatePreference = true;
65335 return rawTagEditor;
65339 rawTagEditor.tags = function(_) {
65340 if (!arguments.length) return _tags;
65342 return rawTagEditor;
65346 rawTagEditor.entityID = function(_) {
65347 if (!arguments.length) return _entityID;
65349 return rawTagEditor;
65353 rawTagEditor.expanded = function(_) {
65354 if (!arguments.length) return _expanded;
65356 _updatePreference = false;
65357 return rawTagEditor;
65361 rawTagEditor.readOnlyTags = function(_) {
65362 if (!arguments.length) return _readOnlyTags;
65364 return rawTagEditor;
65368 return utilRebind(rawTagEditor, dispatch$$1, 'on');
65371 // This currently only works with the 'restrictions' field
65372 // It borrows some code from uiHelp
65374 function uiFieldHelp(context, fieldName) {
65375 var fieldHelp = {};
65376 var _inspector = select(null);
65377 var _wrap = select(null);
65378 var _body = select(null);
65380 var fieldHelpKeys = {
65408 'indirect_example',
65414 var fieldHelpHeadings = {};
65416 var replacements = {
65417 distField: t('restriction.controls.distance'),
65418 viaField: t('restriction.controls.via'),
65419 fromShadow: icon('#iD-turn-shadow', 'pre-text shadow from'),
65420 allowShadow: icon('#iD-turn-shadow', 'pre-text shadow allow'),
65421 restrictShadow: icon('#iD-turn-shadow', 'pre-text shadow restrict'),
65422 onlyShadow: icon('#iD-turn-shadow', 'pre-text shadow only'),
65423 allowTurn: icon('#iD-turn-yes', 'pre-text turn'),
65424 restrictTurn: icon('#iD-turn-no', 'pre-text turn'),
65425 onlyTurn: icon('#iD-turn-only', 'pre-text turn')
65429 // For each section, squash all the texts into a single markdown document
65430 var docs = fieldHelpKeys[fieldName].map(function(key) {
65431 var helpkey = 'help.field.' + fieldName + '.' + key[0];
65432 var text = key[1].reduce(function(all, part) {
65433 var subkey = helpkey + '.' + part;
65434 var depth = fieldHelpHeadings[subkey]; // is this subkey a heading?
65435 var hhh = depth ? Array(depth + 1).join('#') + ' ' : ''; // if so, prepend with some ##'s
65436 return all + hhh + t(subkey, replacements) + '\n\n';
65441 title: t(helpkey + '.title'),
65442 html: marked(text.trim())
65451 .classed('hide', false)
65452 .style('opacity', '0')
65455 .style('opacity', '1');
65461 .classed('hide', true)
65464 .style('opacity', '0')
65465 .on('end', function () {
65466 _body.classed('hide', true);
65471 function clickHelp(index) {
65472 var d = docs[index];
65473 var tkeys = fieldHelpKeys[fieldName][index][1];
65475 _body.selectAll('.field-help-nav-item')
65476 .classed('active', function(d, i) { return i === index; });
65478 var content = _body.selectAll('.field-help-content')
65481 // class the paragraphs so we can find and style them
65482 content.selectAll('p')
65483 .attr('class', function(d, i) { return tkeys[i]; });
65485 // insert special content for certain help sections
65486 if (d.key === 'help.field.restrictions.inspecting') {
65488 .insert('img', 'p.from_shadow')
65489 .attr('class', 'field-help-image cf')
65490 .attr('src', context.imagePath('tr_inspect.gif'));
65492 } else if (d.key === 'help.field.restrictions.modifying') {
65494 .insert('img', 'p.allow_turn')
65495 .attr('class', 'field-help-image cf')
65496 .attr('src', context.imagePath('tr_modify.gif'));
65501 fieldHelp.button = function(selection$$1) {
65502 if (_body.empty()) return;
65504 var button = selection$$1.selectAll('.field-help-button')
65510 .attr('class', 'field-help-button')
65511 .attr('tabindex', -1)
65512 .call(svgIcon('#iD-icon-help'))
65514 .on('click', function () {
65515 event.stopPropagation();
65516 event.preventDefault();
65517 if (_body.classed('hide')) {
65526 function updatePosition() {
65527 var wrap = _wrap.node();
65528 var inspector = _inspector.node();
65529 var wRect = wrap.getBoundingClientRect();
65530 var iRect = inspector.getBoundingClientRect();
65533 .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
65537 fieldHelp.body = function(selection$$1) {
65538 // This control expects the field to have a preset-input-wrap div
65539 _wrap = selection$$1.selectAll('.preset-input-wrap');
65540 if (_wrap.empty()) return;
65542 // absolute position relative to the inspector, so it "floats" above the fields
65543 _inspector = select('#sidebar .entity-editor-pane .inspector-body');
65544 if (_inspector.empty()) return;
65546 _body = _inspector.selectAll('.field-help-body')
65549 var enter = _body.enter()
65551 .attr('class', 'field-help-body hide'); // initially hidden
65553 var titleEnter = enter
65555 .attr('class', 'field-help-title cf');
65559 .attr('class', 'fl')
65560 .text(t('help.field.' + fieldName + '.title'));
65564 .attr('class', 'fr close')
65565 .on('click', function() {
65566 event.stopPropagation();
65567 event.preventDefault();
65570 .call(svgIcon('#iD-icon-close'));
65572 var navEnter = enter
65574 .attr('class', 'field-help-nav cf');
65576 var titles = docs.map(function(d) { return d.title; });
65577 navEnter.selectAll('.field-help-nav-item')
65581 .attr('class', 'field-help-nav-item')
65582 .text(function(d) { return d; })
65583 .on('click', function(d, i) {
65584 event.stopPropagation();
65585 event.preventDefault();
65591 .attr('class', 'field-help-content');
65603 function uiFieldCheck(field, context) {
65604 var dispatch$$1 = dispatch('change');
65605 var options = field.strings && field.strings.options;
65609 var input = select(null);
65610 var text = select(null);
65611 var label = select(null);
65612 var reverser = select(null);
65620 for (var k in options) {
65621 values.push(k === 'undefined' ? undefined : k);
65622 texts.push(field.t('options.' + k, { 'default': options[k] }));
65625 values = [undefined, 'yes'];
65626 texts = [t('inspector.unknown'), t('inspector.check.yes')];
65627 if (field.type !== 'defaultCheck') {
65629 texts.push(t('inspector.check.no'));
65634 // Checks tags to see whether an undefined value is "Assumed to be Yes"
65635 function checkImpliedYes() {
65636 _impliedYes = (field.id === 'oneway_yes');
65638 // hack: pretend `oneway` field is a `oneway_yes` field
65639 // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
65640 if (field.id === 'oneway') {
65641 var entity = context.entity(_entityID);
65642 for (var key in entity.tags) {
65643 if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
65644 _impliedYes = true;
65645 texts[0] = t('presets.fields.oneway_yes.options.undefined');
65653 function reverserHidden() {
65654 if (!select('div.inspector-hover').empty()) return true;
65655 return !(_value === 'yes' || (_impliedYes && !_value));
65659 function reverserSetText(selection$$1) {
65660 var entity = context.hasEntity(_entityID);
65661 if (reverserHidden() || !entity) return selection$$1;
65663 var first = entity.first();
65664 var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
65665 var pseudoDirection = first < last;
65666 var icon = pseudoDirection ? '#iD-icon-forward' : '#iD-icon-backward';
65668 selection$$1.selectAll('.reverser-span')
65669 .text(t('inspector.check.reverser'))
65670 .call(svgIcon(icon, 'inline'));
65672 return selection$$1;
65676 var check = function(selection$$1) {
65678 selection$$1.classed('checkselect', 'true');
65680 label = selection$$1.selectAll('.preset-input-wrap')
65683 var enter = label.enter()
65685 .attr('class', 'preset-input-wrap');
65689 .property('indeterminate', field.type !== 'defaultCheck')
65690 .attr('type', 'checkbox')
65691 .attr('id', 'preset-input-' + field.safeid);
65696 .attr('class', 'value');
65698 if (field.type === 'onewayCheck') {
65701 .attr('id', 'preset-input-' + field.safeid + '-reverser')
65702 .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
65705 .attr('class', 'reverser-span');
65708 label = label.merge(enter);
65709 input = label.selectAll('input');
65710 text = label.selectAll('span.value');
65713 .on('click', function() {
65714 event.stopPropagation();
65716 t$$1[field.key] = values[(values.indexOf(_value) + 1) % values.length];
65718 // Don't cycle through `alternating` or `reversible` states - #4970
65719 // (They are supported as translated strings, but should not toggle with clicks)
65720 if (t$$1[field.key] === 'reversible' || t$$1[field.key] === 'alternating') {
65721 t$$1[field.key] = values[0];
65724 dispatch$$1.call('change', this, t$$1);
65727 if (field.type === 'onewayCheck') {
65728 reverser = label.selectAll('.reverser');
65731 .call(reverserSetText)
65732 .on('click', function() {
65733 event.preventDefault();
65734 event.stopPropagation();
65736 actionReverse(_entityID),
65737 t('operations.reverse.annotation')
65740 .call(reverserSetText);
65746 check.entity = function(_) {
65747 if (!arguments.length) return context.hasEntity(_entityID);
65753 check.tags = function(tags) {
65755 function isChecked(val) {
65756 return val !== 'no' && val !== '' && val !== undefined && val !== null;
65759 function textFor(val) {
65760 if (val === '') val = undefined;
65761 var index = values.indexOf(val);
65762 return (index !== -1 ? texts[index] : ('"' + val + '"'));
65766 _value = tags[field.key] && tags[field.key].toLowerCase();
65768 if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
65773 .property('indeterminate', field.type !== 'defaultCheck' && !_value)
65774 .property('checked', isChecked(_value));
65777 .text(textFor(_value));
65780 .classed('set', !!_value);
65782 if (field.type === 'onewayCheck') {
65784 .classed('hide', reverserHidden())
65785 .call(reverserSetText);
65790 check.focus = function() {
65791 input.node().focus();
65794 return utilRebind(check, dispatch$$1, 'on');
65797 /** Used for built-in method references. */
65798 var arrayProto$1 = Array.prototype;
65800 /** Built-in value references. */
65801 var splice$1 = arrayProto$1.splice;
65804 * The base implementation of `_.pullAt` without support for individual
65805 * indexes or capturing the removed elements.
65808 * @param {Array} array The array to modify.
65809 * @param {number[]} indexes The indexes of elements to remove.
65810 * @returns {Array} Returns `array`.
65812 function basePullAt(array, indexes) {
65813 var length = array ? indexes.length : 0,
65814 lastIndex = length - 1;
65817 var index = indexes[length];
65818 if (length == lastIndex || index !== previous) {
65819 var previous = index;
65820 if (isIndex(index)) {
65821 splice$1.call(array, index, 1);
65823 baseUnset(array, index);
65831 * Removes all elements from `array` that `predicate` returns truthy for
65832 * and returns an array of the removed elements. The predicate is invoked
65833 * with three arguments: (value, index, array).
65835 * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
65836 * to pull elements from an array by value.
65842 * @param {Array} array The array to modify.
65843 * @param {Function} [predicate=_.identity] The function invoked per iteration.
65844 * @returns {Array} Returns the new array of removed elements.
65847 * var array = [1, 2, 3, 4];
65848 * var evens = _.remove(array, function(n) {
65849 * return n % 2 == 0;
65852 * console.log(array);
65855 * console.log(evens);
65858 function remove$8(array, predicate) {
65860 if (!(array && array.length)) {
65865 length = array.length;
65867 predicate = baseIteratee(predicate, 3);
65868 while (++index < length) {
65869 var value = array[index];
65870 if (predicate(value, index, array)) {
65871 result.push(value);
65872 indexes.push(index);
65875 basePullAt(array, indexes);
65879 function uiFieldCombo(field, context) {
65880 var dispatch$$1 = dispatch('change'),
65881 nominatim = services.geocoder,
65882 taginfo = services.taginfo,
65883 isMulti = (field.type === 'multiCombo'),
65884 isNetwork = (field.type === 'networkCombo'),
65885 isSemi = (field.type === 'semiCombo'),
65886 optstrings = field.strings && field.strings.options,
65887 optarray = field.options,
65888 snake_case = (field.snake_case || (field.snake_case === undefined)),
65889 caseSensitive = field.caseSensitive,
65890 combobox = d3combobox()
65891 .container(context.container())
65892 .caseSensitive(caseSensitive)
65893 .minItems(isMulti || isSemi ? 1 : 2),
65901 // ensure multiCombo field.key ends with a ':'
65902 if (isMulti && field.key.match(/:$/) === null) {
65907 function snake(s) {
65908 return s.replace(/\s+/g, '_');
65911 function unsnake(s) {
65912 return s.replace(/_+/g, ' ');
65915 function clean(s) {
65916 return s.split(';')
65917 .map(function(s) { return s.trim(); })
65922 // returns the tag value for a display value
65923 // (for multiCombo, dval should be the key suffix, not the entire key)
65924 function tagValue(dval) {
65925 dval = clean(dval || '');
65928 var match = find$1(comboData, function(o) {
65929 return o.key && clean(o.value) === dval;
65936 if (field.type === 'typeCombo' && !dval) {
65940 return (snake_case ? snake(dval) : dval) || undefined;
65944 // returns the display value for a tag value
65945 // (for multiCombo, tval should be the key suffix, not the entire key)
65946 function displayValue(tval) {
65950 var match = find$1(comboData, function(o) { return o.key === tval && o.value; });
65952 return match.value;
65956 if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
65960 return snake_case ? unsnake(tval) : tval;
65964 function objectDifference(a, b) {
65965 return reject(a, function(d1) {
65966 return some(b, function(d2) { return d1.value === d2.value; });
65971 function initCombo(selection$$1, attachTo) {
65973 selection$$1.attr('readonly', 'readonly');
65974 selection$$1.call(combobox, attachTo);
65975 setStaticValues(setPlaceholder);
65977 } else if (optarray) {
65978 selection$$1.call(combobox, attachTo);
65979 setStaticValues(setPlaceholder);
65981 } else if (taginfo) {
65982 selection$$1.call(combobox.fetcher(setTaginfoValues), attachTo);
65983 setTaginfoValues('', setPlaceholder);
65988 function setStaticValues(callback) {
65989 if (!(optstrings || optarray)) return;
65992 comboData = Object.keys(optstrings).map(function(k) {
65993 var v = field.t('options.' + k, { 'default': optstrings[k] });
66001 } else if (optarray) {
66002 comboData = optarray.map(function(k) {
66003 var v = snake_case ? unsnake(k) : k;
66012 combobox.data(objectDifference(comboData, multiData));
66013 if (callback) callback(comboData);
66017 function setTaginfoValues(q, callback) {
66018 var fn = isMulti ? 'multikeys' : 'values';
66019 var query = (isMulti ? field.key : '') + q;
66020 var hasCountryPrefix = isNetwork && country && country.indexOf(q.toLowerCase()) === 0;
66021 if (hasCountryPrefix) {
66022 query = country + ':';
66026 debounce: (q !== ''),
66032 params.geometry = context.geometry(entity.id);
66035 taginfo[fn](params, function(err, data) {
66037 if (hasCountryPrefix) {
66038 data = filter(data, function(d) {
66039 return d.value.toLowerCase().indexOf(country + ':') === 0;
66043 comboData = map$3(data, function(d) {
66045 if (isMulti) k = k.replace(field.key, '');
66046 var v = snake_case ? unsnake(k) : k;
66050 title: isMulti ? v : d.title
66054 comboData = objectDifference(comboData, multiData);
66055 if (callback) callback(comboData);
66060 function setPlaceholder(d) {
66063 if (isMulti || isSemi) {
66064 ph = field.placeholder() || t('inspector.add');
66066 var vals = map$3(d, 'value').filter(function(s) { return s.length < 20; }),
66067 placeholders = vals.length > 1 ? vals : map$3(d, 'key');
66068 ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
66071 if (ph.match(/(…|\.\.\.)$/) === null) {
66075 container.selectAll('input')
66076 .attr('placeholder', ph);
66080 function change() {
66081 var val = tagValue(utilGetSetValue(input)),
66084 if (isMulti || isSemi) {
66086 container.classed('active', false);
66087 utilGetSetValue(input, '');
66089 field.keys.push(field.key + val);
66090 t$$1[field.key + val] = 'yes';
66091 } else if (isSemi) {
66092 var arr = multiData.map(function(d) { return d.key; });
66094 t$$1[field.key] = compact(uniq(arr)).join(';');
66096 window.setTimeout(function() { input.node().focus(); }, 10);
66099 t$$1[field.key] = val;
66102 dispatch$$1.call('change', this, t$$1);
66106 function removeMultikey(d) {
66107 event.stopPropagation();
66110 t$$1[d.key] = undefined;
66111 } else if (isSemi) {
66112 remove$8(multiData, function(md) { return md.key === d.key; });
66113 var arr = multiData.map(function(md) { return md.key; });
66114 arr = compact(uniq(arr));
66115 t$$1[field.key] = arr.length ? arr.join(';') : undefined;
66117 dispatch$$1.call('change', this, t$$1);
66121 function combo(selection$$1) {
66122 if (isMulti || isSemi) {
66123 container = selection$$1.selectAll('ul').data([0]);
66125 container = container.enter()
66127 .attr('class', 'form-field-multicombo')
66128 .on('click', function() {
66129 window.setTimeout(function() { input.node().focus(); }, 10);
66134 container = selection$$1;
66137 input = container.selectAll('input')
66140 input = input.enter()
66142 .attr('type', 'text')
66143 .attr('id', 'preset-input-' + field.safeid)
66145 .call(initCombo, selection$$1)
66148 if (isNetwork && nominatim && entity) {
66149 var center = entity.extent(context.graph()).center();
66150 nominatim.countryCode(center, function (err, code) {
66156 .on('change', change)
66157 .on('blur', change);
66159 if (isMulti || isSemi) {
66161 .on('accept', function() {
66162 input.node().blur();
66163 input.node().focus();
66167 .on('focus', function() { container.classed('active', true); });
66172 combo.tags = function(tags) {
66173 if (isMulti || isSemi) {
66177 // Build multiData array containing keys already set..
66178 Object.keys(tags).forEach(function(key) {
66179 if (key.indexOf(field.key) !== 0 || tags[key].toLowerCase() !== 'yes') return;
66181 var suffix = key.substring(field.key.length);
66184 value: displayValue(suffix)
66188 // Set keys for form-field modified (needed for undo and reset buttons)..
66189 field.keys = map$3(multiData, 'key');
66191 } else if (isSemi) {
66192 var arr = compact(uniq((tags[field.key] || '').split(';')));
66193 multiData = arr.map(function(key) {
66196 value: displayValue(key)
66201 // Exclude existing multikeys from combo options..
66202 var available = objectDifference(comboData, multiData);
66203 combobox.data(available);
66205 // Hide 'Add' button if this field uses fixed set of
66206 // translateable optstrings and they're all currently used..
66207 container.selectAll('.combobox-input, .combobox-caret')
66208 .classed('hide', optstrings && !available.length);
66212 var chips = container.selectAll('.chips')
66218 var enter = chips.enter()
66219 .insert('li', 'input')
66220 .attr('class', 'chips');
66222 enter.append('span');
66225 chips = chips.merge(enter);
66227 chips.select('span')
66228 .text(function(d) { return d.value; });
66231 .on('click', removeMultikey)
66232 .attr('class', 'remove')
66236 utilGetSetValue(input, displayValue(tags[field.key]));
66241 combo.focus = function() {
66242 input.node().focus();
66246 combo.entity = function(_) {
66247 if (!arguments.length) return entity;
66253 return utilRebind(combo, dispatch$$1, 'on');
66256 function uiFieldText(field, context) {
66257 var dispatch$$1 = dispatch('change');
66258 var nominatim = services.geocoder;
66263 function i(selection$$1) {
66264 var fieldId = 'preset-input-' + field.safeid;
66266 input = selection$$1.selectAll('input')
66269 input = input.enter()
66271 .attr('type', field.type)
66272 .attr('id', fieldId)
66273 .attr('placeholder', field.placeholder() || t('inspector.unknown'))
66278 .on('input', change(true))
66279 .on('blur', change())
66280 .on('change', change());
66282 if (field.type === 'tel' && nominatim && entity) {
66283 var center = entity.extent(context.graph()).center();
66284 nominatim.countryCode(center, function (err, countryCode) {
66285 if (err || !dataPhoneFormats[countryCode]) return;
66286 selection$$1.selectAll('#' + fieldId)
66287 .attr('placeholder', dataPhoneFormats[countryCode]);
66290 } else if (field.type === 'number') {
66291 var rtl = (textDirection === 'rtl');
66293 input.attr('type', 'text');
66295 var spinControl = selection$$1.selectAll('.spin-control')
66298 var enter = spinControl.enter()
66300 .attr('class', 'spin-control');
66304 .datum(rtl ? 1 : -1)
66305 .attr('class', rtl ? 'increment' : 'decrement')
66306 .attr('tabindex', -1);
66310 .datum(rtl ? -1 : 1)
66311 .attr('class', rtl ? 'decrement' : 'increment')
66312 .attr('tabindex', -1);
66314 spinControl = spinControl
66317 spinControl.selectAll('button')
66318 .on('click', function(d) {
66319 event.preventDefault();
66320 input.node().value = parsed(input.node().value) + d;
66327 // parse as a number
66328 function parsed(val) {
66329 return parseInt(val || 0, 10) || 0;
66332 // clamp number to min/max
66333 function clamped(num) {
66334 if (field.minValue !== undefined) {
66335 num = Math.max(num, field.minValue);
66337 if (field.maxValue !== undefined) {
66338 num = Math.min(num, field.maxValue);
66344 function change(onInput) {
66345 return function() {
66347 var val = utilGetSetValue(input).trim() || undefined;
66350 if (field.type === 'number' && val !== undefined) {
66351 val = clamped(parsed(val)) + '';
66353 utilGetSetValue(input, val || '');
66355 t$$1[field.key] = val;
66356 dispatch$$1.call('change', this, t$$1, onInput);
66361 i.entity = function(_) {
66362 if (!arguments.length) return entity;
66368 i.tags = function(tags) {
66369 utilGetSetValue(input, tags[field.key] || '');
66373 i.focus = function() {
66374 var node = input.node();
66375 if (node) node.focus();
66378 return utilRebind(i, dispatch$$1, 'on');
66381 function uiFieldAccess(field, context) {
66382 var dispatch$$1 = dispatch('change'),
66385 function access(selection$$1) {
66386 var wrap = selection$$1.selectAll('.preset-input-wrap')
66389 wrap = wrap.enter()
66391 .attr('class', 'cf preset-input-wrap')
66395 var list = wrap.selectAll('ul')
66398 list = list.enter()
66403 items = list.selectAll('li')
66407 var enter = items.enter()
66409 .attr('class', function(d) { return 'cf preset-access-' + d; });
66413 .attr('class', 'col6 label preset-label-access')
66414 .attr('for', function(d) { return 'preset-input-access-' + d; })
66415 .text(function(d) { return field.t('types.' + d); });
66419 .attr('class', 'col6 preset-input-access-wrap')
66421 .attr('type', 'text')
66422 .attr('class', 'preset-input-access')
66423 .attr('id', function(d) { return 'preset-input-access-' + d; })
66425 .each(function(d) {
66428 .container(context.container())
66429 .data(access.options(d))
66435 items = items.merge(enter);
66437 wrap.selectAll('.preset-input-access')
66438 .on('change', change)
66439 .on('blur', change);
66443 function change(d) {
66445 tag[d] = utilGetSetValue(select(this)) || undefined;
66446 dispatch$$1.call('change', this, tag);
66450 access.options = function(type) {
66451 var options = ['no', 'permissive', 'private', 'destination'];
66453 if (type !== 'access') {
66454 options.unshift('yes');
66455 options.push('designated');
66457 if (type === 'bicycle') {
66458 options.push('dismount');
66462 return options.map(function(option) {
66464 title: field.t('options.' + option + '.description'),
66471 var placeholders = {
66473 foot: 'designated',
66474 motor_vehicle: 'no'
66478 motor_vehicle: 'no',
66484 motor_vehicle: 'no'
66487 motor_vehicle: 'no',
66488 bicycle: 'designated'
66491 motor_vehicle: 'no',
66492 horse: 'designated'
66496 motor_vehicle: 'no',
66502 motor_vehicle: 'yes',
66507 motor_vehicle: 'yes'
66511 motor_vehicle: 'yes',
66517 motor_vehicle: 'yes',
66523 motor_vehicle: 'yes',
66529 motor_vehicle: 'yes',
66535 motor_vehicle: 'yes',
66541 motor_vehicle: 'yes',
66547 motor_vehicle: 'yes',
66552 motor_vehicle: 'yes'
66556 motor_vehicle: 'yes',
66562 motor_vehicle: 'yes',
66568 motor_vehicle: 'yes',
66575 access.tags = function(tags) {
66576 utilGetSetValue(items.selectAll('.preset-input-access'),
66577 function(d) { return tags[d] || ''; })
66578 .attr('placeholder', function() {
66579 return tags.access ? tags.access : field.placeholder();
66582 items.selectAll('#preset-input-access-access')
66583 .attr('placeholder', 'yes');
66585 forEach(placeholders[tags.highway], function(v, k) {
66586 items.selectAll('#preset-input-access-' + k)
66587 .attr('placeholder', function() { return (tags.access || v); });
66592 access.focus = function() {
66593 items.selectAll('.preset-input-access')
66598 return utilRebind(access, dispatch$$1, 'on');
66601 function uiFieldAddress(field, context) {
66602 var dispatch$$1 = dispatch('init', 'change'),
66603 nominatim = services.geocoder,
66604 wrap = select(null),
66605 isInitialized = false,
66608 function getNearStreets() {
66609 var extent = entity.extent(context.graph()),
66610 l = extent.center(),
66611 box = geoExtent$$1(l).padByMeters(200);
66613 var streets = context.intersects(box)
66614 .filter(isAddressable)
66616 var loc = context.projection([
66617 (extent[0][0] + extent[1][0]) / 2,
66618 (extent[0][1] + extent[1][1]) / 2]),
66619 choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
66621 title: d.tags.name,
66622 value: d.tags.name,
66623 dist: choice.distance
66626 .sort(function(a, b) {
66627 return a.dist - b.dist;
66630 return uniqBy(streets, 'value');
66632 function isAddressable(d) {
66633 return d.tags.highway && d.tags.name && d.type === 'way';
66638 function getNearCities() {
66639 var extent = entity.extent(context.graph()),
66640 l = extent.center(),
66641 box = geoExtent$$1(l).padByMeters(200);
66643 var cities = context.intersects(box)
66644 .filter(isAddressable)
66647 title: d.tags['addr:city'] || d.tags.name,
66648 value: d.tags['addr:city'] || d.tags.name,
66649 dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
66652 .sort(function(a, b) {
66653 return a.dist - b.dist;
66656 return uniqBy(cities, 'value');
66659 function isAddressable(d) {
66661 if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative')
66663 if (d.tags.border_type === 'city')
66665 if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village')
66669 if (d.tags['addr:city'])
66676 function getNearValues(key) {
66677 var extent = entity.extent(context.graph()),
66678 l = extent.center(),
66679 box = geoExtent$$1(l).padByMeters(200);
66681 var results = context.intersects(box)
66682 .filter(function hasTag(d) {
66683 return d.tags[key];
66687 title: d.tags[key],
66688 value: d.tags[key],
66689 dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
66692 .sort(function(a, b) {
66693 return a.dist - b.dist;
66696 return uniqBy(results, 'value');
66700 function initCallback(err, countryCode) {
66703 var addressFormat = find$1(dataAddressFormats, function (a) {
66704 return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
66705 }) || dataAddressFormats[0];
66707 var widths = addressFormat.widths || {
66708 housenumber: 1/3, street: 2/3,
66709 city: 2/3, state: 1/4, postcode: 1/3
66713 // Normalize widths.
66714 var total = reduce(r, function(sum, field) {
66715 return sum + (widths[field] || 0.5);
66718 return r.map(function (field) {
66721 width: (widths[field] || 0.5) / total
66726 wrap.selectAll('div.addr-row')
66727 .data(addressFormat.format)
66730 .attr('class', 'addr-row')
66731 .selectAll('input')
66735 .property('type', 'text')
66736 .attr('placeholder', function (d) {
66737 var localkey = d.id + '!' + countryCode.toLowerCase(),
66738 tkey = field.strings.placeholders[localkey] ? localkey : d.id;
66739 return field.t('placeholders.' + tkey);
66741 .attr('class', function (d) { return 'addr-' + d.id; })
66743 .style('width', function (d) { return d.width * 100 + '%'; });
66747 // setup dropdowns for common address tags
66748 var dropdowns = addressFormat.dropdowns || [
66749 'city', 'county', 'country', 'district', 'hamlet',
66750 'neighbourhood', 'place', 'postcode', 'province',
66751 'quarter', 'state', 'street', 'subdistrict', 'suburb'
66754 // If fields exist for any of these tags, create dropdowns to pick nearby values..
66755 dropdowns.forEach(function(tag) {
66756 var nearValues = (tag === 'street') ? getNearStreets
66757 : (tag === 'city') ? getNearCities
66760 wrap.selectAll('input.addr-' + tag)
66762 .container(context.container())
66764 .fetcher(function(value, callback) {
66765 callback(nearValues('addr:' + tag));
66770 wrap.selectAll('input')
66771 .on('blur', change())
66772 .on('change', change());
66774 wrap.selectAll('input:not(.combobox-input)')
66775 .on('input', change(true));
66777 dispatch$$1.call('init');
66778 isInitialized = true;
66782 function address(selection$$1) {
66783 isInitialized = false;
66785 wrap = selection$$1.selectAll('.preset-input-wrap')
66788 wrap = wrap.enter()
66790 .attr('class', 'preset-input-wrap')
66793 if (nominatim && entity) {
66794 var center = entity.extent(context.graph()).center();
66795 nominatim.countryCode(center, initCallback);
66800 function change(onInput) {
66801 return function() {
66804 wrap.selectAll('input')
66805 .each(function (field) {
66806 tags['addr:' + field.id] = this.value || undefined;
66809 dispatch$$1.call('change', this, tags, onInput);
66814 function updateTags(tags) {
66815 utilGetSetValue(wrap.selectAll('input'), function (field) {
66816 return tags['addr:' + field.id] || '';
66821 address.entity = function(_) {
66822 if (!arguments.length) return entity;
66828 address.tags = function(tags) {
66829 if (isInitialized) {
66832 dispatch$$1.on('init', function () {
66833 dispatch$$1.on('init', null);
66840 address.focus = function() {
66841 var node = wrap.selectAll('input').node();
66842 if (node) node.focus();
66846 return utilRebind(address, dispatch$$1, 'on');
66849 function uiFieldCycleway(field, context) {
66850 var dispatch$$1 = dispatch('change'),
66851 items = select(null);
66854 function cycleway(selection$$1) {
66856 function stripcolon(s) {
66857 return s.replace(':', '');
66861 var wrap = selection$$1.selectAll('.preset-input-wrap')
66864 wrap = wrap.enter()
66866 .attr('class', 'cf preset-input-wrap')
66870 var div = wrap.selectAll('ul')
66878 items = div.selectAll('li')
66881 var enter = items.enter()
66883 .attr('class', function(d) { return 'cf preset-cycleway-' + stripcolon(d); });
66887 .attr('class', 'col6 label preset-label-cycleway')
66888 .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
66889 .text(function(d) { return field.t('types.' + d); });
66893 .attr('class', 'col6 preset-input-cycleway-wrap')
66895 .attr('type', 'text')
66896 .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
66898 .each(function(d) {
66901 .container(context.container())
66902 .data(cycleway.options(d))
66908 wrap.selectAll('.preset-input-cycleway')
66909 .on('change', change)
66910 .on('blur', change);
66914 function change() {
66915 var left = utilGetSetValue(select('.preset-input-cyclewayleft')),
66916 right = utilGetSetValue(select('.preset-input-cyclewayright')),
66919 if (left === 'none' || left === '') { left = undefined; }
66920 if (right === 'none' || right === '') { right = undefined; }
66922 // Always set both left and right as changing one can affect the other
66924 cycleway: undefined,
66925 'cycleway:left': left,
66926 'cycleway:right': right
66929 // If the left and right tags match, use the cycleway tag to tag both
66930 // sides the same way
66931 if (left === right) {
66934 'cycleway:left': undefined,
66935 'cycleway:right': undefined
66939 dispatch$$1.call('change', this, tag);
66943 cycleway.options = function() {
66944 return keys$1(field.strings.options).map(function(option) {
66946 title: field.t('options.' + option + '.description'),
66953 cycleway.tags = function(tags) {
66954 utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
66955 // If cycleway is set, always return that
66956 if (tags.cycleway) {
66957 return tags.cycleway;
66959 return tags[d] || '';
66961 .attr('placeholder', field.placeholder());
66965 cycleway.focus = function() {
66966 items.selectAll('.preset-input-cycleway')
66971 return utilRebind(cycleway, dispatch$$1, 'on');
66974 function uiFieldLanes(field, context) {
66975 var dispatch$$1 = dispatch('change'),
66981 function lanes(selection$$1) {
66982 lanesData = context.entity(wayID).lanes();
66984 if (!select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
66985 selection$$1.call(lanes.off);
66989 var wrap = selection$$1.selectAll('.preset-input-wrap')
66992 wrap = wrap.enter()
66994 .attr('class', 'preset-input-wrap')
66997 var surface = wrap.selectAll('.surface')
67000 var d = utilGetDimensions(wrap);
67001 var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
67003 surface = surface.enter()
67005 .attr('width', d[0])
67006 .attr('height', 300)
67007 .attr('class', 'surface')
67011 var lanesSelection = surface.selectAll('.lanes')
67014 lanesSelection = lanesSelection.enter()
67016 .attr('class', 'lanes')
67017 .merge(lanesSelection);
67020 .attr('transform', function () {
67021 return 'translate(' + (freeSpace / 2) + ', 0)';
67025 var lane = lanesSelection.selectAll('.lane')
67026 .data(lanesData.lanes);
67031 var enter = lane.enter()
67033 .attr('class', 'lane');
67039 .attr('width', LANE_WIDTH)
67040 .attr('height', LANE_HEIGHT);
67044 .attr('class', 'forward')
67052 .attr('class', 'bothways')
67060 .attr('class', 'backward')
67071 .attr('transform', function(d) {
67072 return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
67075 lane.select('.forward')
67076 .style('visibility', function(d) {
67077 return d.direction === 'forward' ? 'visible' : 'hidden';
67080 lane.select('.bothways')
67081 .style('visibility', function(d) {
67082 return d.direction === 'bothways' ? 'visible' : 'hidden';
67085 lane.select('.backward')
67086 .style('visibility', function(d) {
67087 return d.direction === 'backward' ? 'visible' : 'hidden';
67092 lanes.entity = function(_) {
67093 if (!wayID || wayID !== _.id) {
67098 lanes.tags = function() {};
67099 lanes.focus = function() {};
67100 lanes.off = function() {};
67102 return utilRebind(lanes, dispatch$$1, 'on');
67105 function uiFieldLocalized(field, context) {
67106 var dispatch$$1 = dispatch('change', 'input'),
67107 wikipedia = services.wikipedia,
67108 input = select(null),
67109 localizedInputs = select(null),
67114 function localized(selection$$1) {
67115 input = selection$$1.selectAll('.localized-main')
67118 input = input.enter()
67120 .attr('type', 'text')
67121 .attr('id', 'preset-input-' + field.safeid)
67122 .attr('class', 'localized-main')
67123 .attr('placeholder', field.placeholder())
67127 if (field.id === 'name') {
67128 var preset = context.presets().match(entity, context.graph());
67131 .container(context.container())
67132 .fetcher(utilSuggestNames(preset, dataSuggestions))
67137 .on('input', change(true))
67138 .on('blur', change())
67139 .on('change', change());
67142 var translateButton = selection$$1.selectAll('.localized-add')
67145 translateButton = translateButton.enter()
67147 .attr('class', 'button-input-action localized-add minor')
67148 .attr('tabindex', -1)
67149 .call(svgIcon('#iD-icon-plus'))
67151 .title(t('translate.translate'))
67152 .placement('left'))
67153 .merge(translateButton);
67156 .on('click', addNew);
67159 localizedInputs = selection$$1.selectAll('.localized-wrap')
67162 localizedInputs = localizedInputs.enter().append('div')
67163 .attr('class', 'localized-wrap')
67164 .merge(localizedInputs);
67168 function addNew() {
67169 event.preventDefault();
67170 var data$$1 = localizedInputs.selectAll('div.entry').data();
67171 var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
67172 var langExists = find$1(data$$1, function(datum) { return datum.lang === defaultLang;});
67173 var isLangEn = defaultLang.indexOf('en') > -1;
67174 if (isLangEn || langExists) {
67177 data$$1.push({ lang: defaultLang, value: '' });
67178 localizedInputs.call(render, data$$1);
67182 function change(onInput) {
67183 return function() {
67185 t$$1[field.key] = utilGetSetValue(select(this)) || undefined;
67186 dispatch$$1.call('change', this, t$$1, onInput);
67191 function key(lang) {
67192 return field.key + ':' + lang;
67196 function changeLang(d) {
67197 var lang = utilGetSetValue(select(this)),
67199 language = find$1(wikipedia$2, function(d) {
67200 return d[0].toLowerCase() === lang.toLowerCase() ||
67201 d[1].toLowerCase() === lang.toLowerCase();
67204 if (language) lang = language[2];
67206 if (d.lang && d.lang !== lang) {
67207 t$$1[key(d.lang)] = undefined;
67210 var value = utilGetSetValue(select(this.parentNode)
67211 .selectAll('.localized-value'));
67213 if (lang && value) {
67214 t$$1[key(lang)] = value;
67215 } else if (lang && wikiTitles && wikiTitles[d.lang]) {
67216 t$$1[key(lang)] = wikiTitles[d.lang];
67220 dispatch$$1.call('change', this, t$$1);
67224 function changeValue(d) {
67225 if (!d.lang) return;
67227 t$$1[key(d.lang)] = utilGetSetValue(select(this)) || undefined;
67228 dispatch$$1.call('change', this, t$$1);
67232 function fetcher(value, cb) {
67233 var v = value.toLowerCase();
67235 cb(wikipedia$2.filter(function(d) {
67236 return d[0].toLowerCase().indexOf(v) >= 0 ||
67237 d[1].toLowerCase().indexOf(v) >= 0 ||
67238 d[2].toLowerCase().indexOf(v) >= 0;
67239 }).map(function(d) {
67240 return { value: d[1] };
67245 function render(selection$$1, data$$1) {
67246 var wraps = selection$$1.selectAll('div.entry').
67247 data(data$$1, function(d) { return d.lang; });
67252 .style('max-height','0px')
67253 .style('opacity', '0')
67254 .style('top','-10px')
67257 var innerWrap = wraps.enter()
67258 .insert('div', ':first-child');
67260 innerWrap.attr('class', 'entry')
67262 var wrap = select(this);
67263 var langcombo = d3combobox()
67264 .container(context.container())
67270 .attr('class','form-label')
67271 .text(t('translate.localized_translation_label'))
67272 .attr('for','localized-lang');
67276 .attr('class', 'minor remove')
67277 .on('click', function(d){
67278 event.preventDefault();
67280 t$$1[key(d.lang)] = undefined;
67281 dispatch$$1.call('change', this, t$$1);
67282 select(this.parentNode.parentNode)
67284 .style('max-height','240px')
67286 .style('opacity', '0')
67287 .style('max-height','0px')
67290 .call(svgIcon('#iD-operation-delete'));
67294 .attr('class', 'localized-lang')
67295 .attr('type', 'text')
67296 .attr('placeholder',t('translate.localized_translation_language'))
67297 .on('blur', changeLang)
67298 .on('change', changeLang)
67303 .on('blur', changeValue)
67304 .on('change', changeValue)
67305 .attr('type', 'text')
67306 .attr('placeholder', t('translate.localized_translation_name'))
67307 .attr('class', 'localized-value');
67311 .style('margin-top', '0px')
67312 .style('max-height', '0px')
67313 .style('opacity', '0')
67316 .style('margin-top', '10px')
67317 .style('max-height', '240px')
67318 .style('opacity', '1')
67319 .on('end', function() {
67321 .style('max-height', '')
67322 .style('overflow', 'visible');
67326 var entry = selection$$1.selectAll('.entry');
67328 utilGetSetValue(entry.select('.localized-lang'), function(d) {
67329 var lang = find$1(wikipedia$2, function(lang) { return lang[2] === d.lang; });
67330 return lang ? lang[1] : d.lang;
67333 utilGetSetValue(entry.select('.localized-value'),
67334 function(d) { return d.value; });
67338 localized.tags = function(tags) {
67339 // Fetch translations from wikipedia
67340 if (tags.wikipedia && !wikiTitles) {
67342 var wm = tags.wikipedia.match(/([^:]+):(.+)/);
67343 if (wm && wm[0] && wm[1]) {
67344 wikipedia.translations(wm[1], wm[2], function(d) {
67350 utilGetSetValue(input, tags[field.key] || '');
67352 var postfixed = [], k, m;
67354 m = k.match(/^(.*):([a-zA-Z_-]+)$/);
67355 if (m && m[1] === field.key && m[2]) {
67356 postfixed.push({ lang: m[2], value: tags[k] });
67360 localizedInputs.call(render, postfixed.reverse());
67364 localized.focus = function() {
67365 input.node().focus();
67369 localized.entity = function(_) {
67370 if (!arguments.length) return entity;
67375 return utilRebind(localized, dispatch$$1, 'on');
67378 function uiFieldMaxspeed(field, context) {
67379 var dispatch$$1 = dispatch('change'),
67382 unitInput = select(null),
67383 input = select(null),
67386 var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
67387 imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
67390 function maxspeed(selection$$1) {
67391 combobox = d3combobox()
67392 .container(context.container());
67394 var unitCombobox = d3combobox()
67395 .container(context.container())
67396 .data(['km/h', 'mph'].map(comboValues));
67398 input = selection$$1.selectAll('#preset-input-' + field.safeid)
67401 input = input.enter()
67403 .attr('type', 'text')
67404 .attr('id', 'preset-input-' + field.safeid)
67405 .attr('placeholder', field.placeholder())
67411 .on('change', change)
67412 .on('blur', change);
67414 var childNodes = context.graph().childNodes(context.entity(entity.id)),
67415 loc = childNodes[~~(childNodes.length/2)].loc;
67417 isImperial = some(dataImperial.features, function(f) {
67418 return some(f.geometry.coordinates, function(d) {
67419 return geoPointInPolygon(loc, d);
67423 unitInput = selection$$1.selectAll('input.maxspeed-unit')
67426 unitInput = unitInput.enter()
67428 .attr('type', 'text')
67429 .attr('class', 'maxspeed-unit')
67430 .call(unitCombobox)
67434 .on('blur', changeUnits)
67435 .on('change', changeUnits);
67438 function changeUnits() {
67439 isImperial = utilGetSetValue(unitInput) === 'mph';
67440 utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
67447 function setSuggestions() {
67448 combobox.data((isImperial ? imperialValues : metricValues).map(comboValues));
67449 utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
67453 function comboValues(d) {
67455 value: d.toString(),
67456 title: d.toString()
67461 function change() {
67463 value = utilGetSetValue(input);
67466 tag[field.key] = undefined;
67467 } else if (isNaN(value) || !isImperial) {
67468 tag[field.key] = value;
67470 tag[field.key] = value + ' mph';
67473 dispatch$$1.call('change', this, tag);
67477 maxspeed.tags = function(tags) {
67478 var value = tags[field.key];
67480 if (value && value.indexOf('mph') >= 0) {
67481 value = parseInt(value, 10);
67483 } else if (value) {
67484 isImperial = false;
67488 utilGetSetValue(input, value || '');
67492 maxspeed.focus = function() {
67493 input.node().focus();
67497 maxspeed.entity = function(_) {
67502 return utilRebind(maxspeed, dispatch$$1, 'on');
67506 * This function is like `baseIndexOf` except that it accepts a comparator.
67509 * @param {Array} array The array to inspect.
67510 * @param {*} value The value to search for.
67511 * @param {number} fromIndex The index to search from.
67512 * @param {Function} comparator The comparator invoked per element.
67513 * @returns {number} Returns the index of the matched value, else `-1`.
67515 function baseIndexOfWith(array, value, fromIndex, comparator) {
67516 var index = fromIndex - 1,
67517 length = array.length;
67519 while (++index < length) {
67520 if (comparator(array[index], value)) {
67527 /** Used for built-in method references. */
67528 var arrayProto$2 = Array.prototype;
67530 /** Built-in value references. */
67531 var splice$2 = arrayProto$2.splice;
67534 * The base implementation of `_.pullAllBy` without support for iteratee
67538 * @param {Array} array The array to modify.
67539 * @param {Array} values The values to remove.
67540 * @param {Function} [iteratee] The iteratee invoked per element.
67541 * @param {Function} [comparator] The comparator invoked per element.
67542 * @returns {Array} Returns `array`.
67544 function basePullAll(array, values, iteratee, comparator) {
67545 var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
67547 length = values.length,
67550 if (array === values) {
67551 values = copyArray(values);
67554 seen = arrayMap(array, baseUnary(iteratee));
67556 while (++index < length) {
67558 value = values[index],
67559 computed = iteratee ? iteratee(value) : value;
67561 while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
67562 if (seen !== array) {
67563 splice$2.call(seen, fromIndex, 1);
67565 splice$2.call(array, fromIndex, 1);
67572 * This method is like `_.pull` except that it accepts an array of values to remove.
67574 * **Note:** Unlike `_.difference`, this method mutates `array`.
67580 * @param {Array} array The array to modify.
67581 * @param {Array} values The values to remove.
67582 * @returns {Array} Returns `array`.
67585 * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
67587 * _.pullAll(array, ['a', 'c']);
67588 * console.log(array);
67591 function pullAll(array, values) {
67592 return (array && array.length && values && values.length)
67593 ? basePullAll(array, values)
67598 * Removes all given values from `array` using
67599 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
67600 * for equality comparisons.
67602 * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
67603 * to remove elements from an array by predicate.
67609 * @param {Array} array The array to modify.
67610 * @param {...*} [values] The values to remove.
67611 * @returns {Array} Returns `array`.
67614 * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
67616 * _.pull(array, 'a', 'c');
67617 * console.log(array);
67620 var pull = baseRest(pullAll);
67622 function uiFieldRadio(field, context) {
67623 var dispatch$$1 = dispatch('change'),
67624 placeholder = select(null),
67625 wrap = select(null),
67626 labels = select(null),
67627 radios = select(null),
67628 radioData = clone(field.options || field.keys),
67635 function selectedKey() {
67636 var node = wrap.selectAll('.toggle-list label.active input');
67637 return !node.empty() && node.datum();
67641 function radio(selection$$1) {
67642 selection$$1.classed('preset-radio', true);
67644 wrap = selection$$1.selectAll('.preset-input-wrap')
67647 var enter = wrap.enter()
67649 .attr('class', 'preset-input-wrap toggle-list');
67653 .attr('class', 'placeholder');
67659 placeholder = wrap.selectAll('.placeholder');
67661 labels = wrap.selectAll('label')
67664 enter = labels.enter()
67669 .attr('type', 'radio')
67670 .attr('name', field.id)
67671 .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
67672 .attr('checked', false);
67676 .text(function(d) { return field.t('options.' + d, { 'default': d }); });
67681 radios = labels.selectAll('input')
67682 .on('change', changeRadio);
67687 function structureExtras(selection$$1, tags) {
67688 var selected = selectedKey(),
67689 type = context.presets().field(selected),
67690 layer = context.presets().field('layer'),
67691 showLayer = (selected === 'bridge' || selected === 'tunnel');
67694 var extrasWrap = selection$$1.selectAll('.structure-extras-wrap')
67695 .data(selected ? [0] : []);
67700 extrasWrap = extrasWrap.enter()
67702 .attr('class', 'structure-extras-wrap')
67703 .merge(extrasWrap);
67705 var list = extrasWrap.selectAll('ul')
67708 list = list.enter()
67715 if (!typeField || typeField.id !== selected) {
67716 typeField = uiField(context, type, entity, { wrap: false })
67717 .on('change', changeType);
67719 typeField.tags(tags);
67724 var typeItem = list.selectAll('.structure-type-item')
67725 .data(typeField ? [typeField] : [], function(d) { return d.id; });
67732 var typeEnter = typeItem.enter()
67733 .insert('li', ':first-child')
67734 .attr('class', 'cf structure-type-item');
67738 .attr('class', 'col6 label structure-label-type')
67739 .attr('for', 'preset-input-' + selected)
67740 .text(t('inspector.radio.structure.type'));
67744 .attr('class', 'col6 structure-input-type-wrap');
67747 typeItem = typeItem
67751 typeItem.selectAll('.structure-input-type-wrap')
67752 .call(typeField.render);
67757 if (layer && showLayer) {
67759 layerField = uiField(context, layer, entity, { wrap: false })
67760 .on('change', changeLayer);
67762 layerField.tags(tags);
67763 field.keys = union(field.keys, ['layer']);
67766 pull(field.keys, 'layer');
67769 var layerItem = list.selectAll('.structure-layer-item')
67770 .data(layerField ? [layerField] : []);
67777 var layerEnter = layerItem.enter()
67779 .attr('class', 'cf structure-layer-item');
67783 .attr('class', 'col6 label structure-label-layer')
67784 .attr('for', 'preset-input-layer')
67785 .text(t('inspector.radio.structure.layer'));
67789 .attr('class', 'col6 structure-input-layer-wrap');
67792 layerItem = layerItem
67793 .merge(layerEnter);
67796 layerItem.selectAll('.structure-input-layer-wrap')
67797 .call(layerField.render);
67802 function changeType(t$$1, onInput) {
67803 var key = selectedKey();
67806 var val = t$$1[key];
67807 if (val !== 'no') {
67808 oldType[key] = val;
67811 if (field.type === 'structureRadio') {
67812 // remove layer if it should not be set
67813 if (val === 'no' ||
67814 (key !== 'bridge' && key !== 'tunnel') ||
67815 (key === 'tunnel' && val === 'building_passage')) {
67816 t$$1.layer = undefined;
67818 // add layer if it should be set
67819 if (t$$1.layer === undefined) {
67820 if (key === 'bridge' && val !== 'no') {
67823 if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
67829 dispatch$$1.call('change', this, t$$1, onInput);
67833 function changeLayer(t$$1, onInput) {
67834 if (t$$1.layer === '0') {
67835 t$$1.layer = undefined;
67837 dispatch$$1.call('change', this, t$$1, onInput);
67841 function changeRadio() {
67846 t$$1[field.key] = undefined;
67849 radios.each(function(d) {
67850 var active = select(this).property('checked');
67851 if (active) activeKey = d;
67854 if (active) t$$1[field.key] = d;
67856 var val = oldType[activeKey] || 'yes';
67857 t$$1[d] = active ? val : undefined;
67861 if (field.type === 'structureRadio') {
67862 if (activeKey === 'bridge') {
67864 } else if (activeKey === 'tunnel' && t$$1.tunnel !== 'building_passage') {
67867 t$$1.layer = undefined;
67871 dispatch$$1.call('change', this, t$$1);
67875 radio.tags = function(tags) {
67876 function checked(d) {
67878 return tags[field.key] === d;
67880 return !!(tags[d] && tags[d].toLowerCase() !== 'no');
67884 labels.classed('active', checked);
67885 radios.property('checked', checked);
67887 var selection$$1 = radios.filter(function() { return this.checked; });
67889 if (selection$$1.empty()) {
67890 placeholder.text(t('inspector.none'));
67892 placeholder.text(selection$$1.attr('value'));
67893 oldType[selection$$1.datum()] = tags[selection$$1.datum()];
67896 if (field.type === 'structureRadio') {
67897 // For waterways without a tunnel tag, set 'culvert' as
67898 // the oldType to default to if the user picks 'tunnel'
67899 if (!!tags.waterway && !oldType.tunnel) {
67900 oldType.tunnel = 'culvert';
67903 wrap.call(structureExtras, tags);
67908 radio.focus = function() {
67909 radios.node().focus();
67913 radio.entity = function(_) {
67914 if (!arguments.length) return entity;
67921 return utilRebind(radio, dispatch$$1, 'on');
67924 function uiFieldRestrictions(field, context) {
67925 var dispatch$$1 = dispatch('change');
67926 var breathe = behaviorBreathe(context);
67927 var storedViaWay = context.storage('turn-restriction-via-way');
67928 var storedDistance = context.storage('turn-restriction-distance');
67930 var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
67931 var _maxDistance = storedDistance ? (+storedDistance) : 30;
67932 var _initialized = false;
67933 var _parent = select(null); // the entire field
67934 var _container = select(null); // just the map
67942 function restrictions(selection$$1) {
67943 _parent = selection$$1;
67945 // try to reuse the intersection, but always rebuild it if the graph has changed
67946 if (_vertexID && (context.graph() !== _graph || !_intersection)) {
67947 _graph = context.graph();
67948 _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
67951 // It's possible for there to be no actual intersection here.
67952 // for example, a vertex of two `highway=path`
67953 // In this case, hide the field.
67956 _intersection.vertices.length && // has vertices
67957 _intersection.vertices // has the vertex that the user selected
67958 .filter(function(vertex) { return vertex.id === _vertexID; }).length &&
67959 _intersection.ways.length > 2 && // has more than 2 ways
67960 _intersection.ways // has more than 1 TO way
67961 .filter(function(way) { return way.__to; }).length > 1
67964 // Also hide in the case where
67965 select(selection$$1.node().parentNode).classed('hide', !isOK);
67967 // if form field is hidden or has detached from dom, clean up.
67969 !select('.inspector-wrap.inspector-hidden').empty() ||
67970 !selection$$1.node().parentNode ||
67971 !selection$$1.node().parentNode.parentNode) {
67972 selection$$1.call(restrictions.off);
67977 var wrap = selection$$1.selectAll('.preset-input-wrap')
67980 wrap = wrap.enter()
67982 .attr('class', 'preset-input-wrap')
67985 var container = wrap.selectAll('.restriction-container')
67989 var containerEnter = container.enter()
67991 .attr('class', 'restriction-container');
67995 .attr('class', 'restriction-help');
67998 _container = containerEnter
68000 .call(renderViewer);
68002 var controls = wrap.selectAll('.restriction-controls')
68008 .attr('class', 'restriction-controls-container')
68010 .attr('class', 'restriction-controls')
68012 .call(renderControls);
68016 function renderControls(selection$$1) {
68017 var distControl = selection$$1.selectAll('.restriction-distance')
68023 var distControlEnter = distControl.enter()
68025 .attr('class', 'restriction-control restriction-distance');
68029 .attr('class', 'restriction-control-label restriction-distance-label')
68030 .text(t('restriction.controls.distance') + ':');
68034 .attr('class', 'restriction-distance-input')
68035 .attr('type', 'range')
68038 .attr('step', '5');
68042 .attr('class', 'restriction-distance-text');
68045 selection$$1.selectAll('.restriction-distance-input')
68046 .property('value', _maxDistance)
68047 .on('input', function() {
68048 var val = select(this).property('value');
68049 _maxDistance = +val;
68050 _intersection = null;
68051 _container.selectAll('.layer-osm .layer-turns *').remove();
68052 context.storage('turn-restriction-distance', _maxDistance);
68053 _parent.call(restrictions);
68056 selection$$1.selectAll('.restriction-distance-text')
68057 .text(displayMaxDistance(_maxDistance));
68060 var viaControl = selection$$1.selectAll('.restriction-via-way')
68066 var viaControlEnter = viaControl.enter()
68068 .attr('class', 'restriction-control restriction-via-way');
68072 .attr('class', 'restriction-control-label restriction-via-way-label')
68073 .text(t('restriction.controls.via') + ':');
68077 .attr('class', 'restriction-via-way-input')
68078 .attr('type', 'range')
68081 .attr('step', '1');
68085 .attr('class', 'restriction-via-way-text');
68088 selection$$1.selectAll('.restriction-via-way-input')
68089 .property('value', _maxViaWay)
68090 .on('input', function() {
68091 var val = select(this).property('value');
68093 _container.selectAll('.layer-osm .layer-turns *').remove();
68094 context.storage('turn-restriction-via-way', _maxViaWay);
68095 _parent.call(restrictions);
68098 selection$$1.selectAll('.restriction-via-way-text')
68099 .text(displayMaxVia(_maxViaWay));
68103 function renderViewer(selection$$1) {
68104 if (!_intersection) return;
68106 var vgraph = _intersection.graph;
68107 var filter = utilFunctor(true);
68108 var projection = geoRawMercator();
68110 var d = utilGetDimensions(selection$$1);
68111 var c = geoVecScale(d, 0.5);
68114 projection.scale(geoZoomToScale(z));
68116 // Calculate extent of all key vertices
68117 var extent = geoExtent$$1();
68118 for (var i = 0; i < _intersection.vertices.length; i++) {
68119 extent._extend(_intersection.vertices[i].extent());
68122 // If this is a large intersection, adjust zoom to fit extent
68123 if (_intersection.vertices.length > 1) {
68124 var padding = 180; // in z22 pixels
68125 var tl = projection([extent[0][0], extent[1][1]]);
68126 var br = projection([extent[1][0], extent[0][1]]);
68127 var hFactor = (br[0] - tl[0]) / (d[0] - padding);
68128 var vFactor = (br[1] - tl[1]) / (d[1] - padding);
68129 var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
68130 var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
68131 z = z - Math.max(hZoomDiff, vZoomDiff);
68132 projection.scale(geoZoomToScale(z));
68135 var padTop = 35; // reserve top space for hint text
68136 var extentCenter = projection(extent.center());
68137 extentCenter[1] = extentCenter[1] - padTop;
68140 .translate(geoVecSubtract(c, extentCenter))
68141 .clipExtent([[0, 0], d]);
68143 var drawLayers = svgLayers(projection, context).only('osm').dimensions(d);
68144 var drawVertices = svgVertices$$1(projection, context);
68145 var drawLines = svgLines$$1(projection, context);
68146 var drawTurns = svgTurns(projection, context);
68148 var firstTime = selection$$1.selectAll('.surface').empty();
68153 var surface = selection$$1.selectAll('.surface')
68154 .classed('tr', true);
68157 _initialized = true;
68163 .on('resize.restrictions', function() {
68164 utilSetDimensions(_container, null);
68170 // This can happen if we've lowered the detail while a FROM way
68171 // is selected, and that way is no longer part of the intersection.
68172 if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
68178 .call(utilSetDimensions, d)
68179 .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
68180 .call(drawLines, vgraph, _intersection.ways, filter)
68181 .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
68184 .on('click.restrictions', click)
68185 .on('mouseover.restrictions', mouseover);
68188 .selectAll('.selected')
68189 .classed('selected', false);
68192 .selectAll('.related')
68193 .classed('related', false);
68196 var way = vgraph.entity(_fromWayID);
68198 .selectAll('.' + _fromWayID)
68199 .classed('selected', true)
68200 .classed('related', true);
68211 var datum = event.target.__data__;
68212 var entity = datum && datum.properties && datum.properties.entity;
68217 if (datum instanceof osmWay && (datum.__from || datum.__via)) {
68218 _fromWayID = datum.id;
68222 } else if (datum instanceof osmTurn) {
68223 var actions, extraActions, turns, i;
68224 var restrictionType = osmInferRestriction(vgraph, datum, projection);
68226 if (datum.restrictionID && !datum.direct) {
68229 } else if (datum.restrictionID && !datum.only) { // NO -> ONLY
68231 var datumOnly = cloneDeep(datum);
68232 datumOnly.only = true;
68233 restrictionType = restrictionType.replace(/^no/, 'only');
68235 // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
68236 // We will remember them in _oldTurns, and restore them if the user clicks again.
68237 turns = _intersection.turns(_fromWayID, 2);
68240 for (i = 0; i < turns.length; i++) {
68241 var turn = turns[i];
68242 if (seen[turn.restrictionID]) continue; // avoid deleting the turn twice (#4968, #4928)
68244 if (turn.direct && turn.path[1] === datum.path[1]) {
68245 seen[turns[i].restrictionID] = true;
68246 turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
68247 _oldTurns.push(turn);
68248 extraActions.push(actionUnrestrictTurn(turn));
68252 actions = _intersection.actions.concat(extraActions, [
68253 actionRestrictTurn(datumOnly, restrictionType),
68254 t('operations.restriction.annotation.create')
68257 } else if (datum.restrictionID) { // ONLY -> Allowed
68258 // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
68259 // This relies on the assumption that the intersection was already split up when we
68260 // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
68261 turns = _oldTurns || [];
68263 for (i = 0; i < turns.length; i++) {
68264 if (turns[i].key !== datum.key) {
68265 extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
68270 actions = _intersection.actions.concat(extraActions, [
68271 actionUnrestrictTurn(datum),
68272 t('operations.restriction.annotation.delete')
68275 } else { // Allowed -> NO
68276 actions = _intersection.actions.concat([
68277 actionRestrictTurn(datum, restrictionType),
68278 t('operations.restriction.annotation.create')
68282 context.perform.apply(context, actions);
68284 // At this point the datum will be changed, but will have same key..
68285 // Refresh it and update the help..
68286 var s = surface.selectAll('.' + datum.key);
68287 datum = s.empty() ? null : s.datum();
68288 updateHints(datum);
68298 function mouseover() {
68299 var datum = event.target.__data__;
68300 updateHints(datum);
68304 function redraw() {
68305 if (context.hasEntity(_vertexID)) {
68306 _container.call(renderViewer);
68311 function highlightPathsFrom(wayID) {
68312 surface.selectAll('.related')
68313 .classed('related', false)
68314 .classed('allow', false)
68315 .classed('restrict', false)
68316 .classed('only', false);
68318 surface.selectAll('.' + wayID)
68319 .classed('related', true);
68322 var turns = _intersection.turns(wayID, _maxViaWay);
68323 for (var i = 0; i < turns.length; i++) {
68324 var turn = turns[i];
68325 var ids = [turn.to.way];
68326 var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
68328 if (turn.only || turns.length === 1) {
68329 if (turn.via.ways) {
68330 ids = ids.concat(turn.via.ways);
68332 } else if (turn.to.way === wayID) {
68336 surface.selectAll(utilEntitySelector(ids))
68337 .classed('related', true)
68338 .classed('allow', (klass === 'allow'))
68339 .classed('restrict', (klass === 'restrict'))
68340 .classed('only', (klass === 'only'));
68346 function updateHints(datum) {
68347 var help = _container.selectAll('.restriction-help').html('');
68349 var placeholders = {};
68350 ['from', 'via', 'to'].forEach(function(k) {
68351 placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
68354 var entity = datum && datum.properties && datum.properties.entity;
68360 way = vgraph.entity(_fromWayID);
68362 .selectAll('.' + _fromWayID)
68363 .classed('selected', true)
68364 .classed('related', true);
68368 if (datum instanceof osmWay && datum.__from) {
68371 highlightPathsFrom(_fromWayID ? null : way.id);
68372 surface.selectAll('.' + way.id)
68373 .classed('related', true);
68375 var clickSelect = (!_fromWayID || _fromWayID !== way.id);
68377 .append('div') // "Click to select FROM {fromName}." / "FROM {fromName}"
68378 .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
68379 from: placeholders.from,
68380 fromName: displayName(way.id, vgraph)
68384 // Hovering a turn arrow
68385 } else if (datum instanceof osmTurn) {
68386 var restrictionType = osmInferRestriction(vgraph, datum, projection);
68387 var turnType = restrictionType.replace(/^(only|no)\_/, '');
68388 var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
68389 var klass, turnText, nextText;
68392 klass = 'restrict';
68393 turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
68394 nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
68395 } else if (datum.only) {
68397 turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
68398 nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
68401 turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
68402 nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
68406 .append('div') // "NO Right Turn (indirect)"
68407 .attr('class', 'qualifier ' + klass)
68411 .append('div') // "FROM {fromName} TO {toName}"
68412 .html(t('restriction.help.from_name_to_name', {
68413 from: placeholders.from,
68414 fromName: displayName(datum.from.way, vgraph),
68415 to: placeholders.to,
68416 toName: displayName(datum.to.way, vgraph)
68419 if (datum.via.ways && datum.via.ways.length) {
68421 for (var i = 0; i < datum.via.ways.length; i++) {
68422 var prev = names[names.length - 1];
68423 var curr = displayName(datum.via.ways[i], vgraph);
68424 if (!prev || curr !== prev) // collapse identical names
68429 .append('div') // "VIA {viaNames}"
68430 .html(t('restriction.help.via_names', {
68431 via: placeholders.via,
68432 viaNames: names.join(', ')
68438 .append('div') // Click for "No Right Turn"
68439 .text(t('restriction.help.toggle', { turn: nextText.trim() }));
68442 highlightPathsFrom(null);
68443 var alongIDs = datum.path.slice();
68444 surface.selectAll(utilEntitySelector(alongIDs))
68445 .classed('related', true)
68446 .classed('allow', (klass === 'allow'))
68447 .classed('restrict', (klass === 'restrict'))
68448 .classed('only', (klass === 'only'));
68451 // Hovering empty surface
68453 highlightPathsFrom(null);
68456 .append('div') // "FROM {fromName}"
68457 .html(t('restriction.help.from_name', {
68458 from: placeholders.from,
68459 fromName: displayName(_fromWayID, vgraph)
68464 .append('div') // "Click to select a FROM segment."
68465 .html(t('restriction.help.select_from', {
68466 from: placeholders.from
68474 function displayMaxDistance(maxDist) {
68475 var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
68479 var distToFeet = { // imprecise conversion for prettier display
68480 20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
68482 opts = { distance: t('units.feet', { quantity: distToFeet }) };
68484 opts = { distance: t('units.meters', { quantity: maxDist }) };
68487 return t('restriction.controls.distance_up_to', opts);
68491 function displayMaxVia(maxVia) {
68492 return maxVia === 0 ? t('restriction.controls.via_node_only')
68493 : maxVia === 1 ? t('restriction.controls.via_up_to_one')
68494 : t('restriction.controls.via_up_to_two');
68498 function displayName(entityID, graph) {
68499 var entity = graph.entity(entityID);
68500 var name = utilDisplayName(entity) || '';
68501 var matched = context.presets().match(entity, graph);
68502 var type = (matched && matched.name()) || utilDisplayType(entity.id);
68503 return name || type;
68507 restrictions.entity = function(_) {
68508 _intersection = null;
68515 restrictions.tags = function() {};
68516 restrictions.focus = function() {};
68519 restrictions.off = function(selection$$1) {
68520 if (!_initialized) return;
68522 selection$$1.selectAll('.surface')
68524 .on('click.restrictions', null)
68525 .on('mouseover.restrictions', null);
68528 .on('resize.restrictions', null);
68532 return utilRebind(restrictions, dispatch$$1, 'on');
68535 function uiFieldTextarea(field) {
68536 var dispatch$$1 = dispatch('change'),
68537 input = select(null);
68540 function textarea(selection$$1) {
68541 input = selection$$1.selectAll('textarea')
68544 input = input.enter()
68545 .append('textarea')
68546 .attr('id', 'preset-input-' + field.safeid)
68547 .attr('placeholder', field.placeholder() || t('inspector.unknown'))
68548 .attr('maxlength', 255)
68550 .on('input', change(true))
68551 .on('blur', change())
68552 .on('change', change())
68557 function change(onInput) {
68558 return function() {
68560 t$$1[field.key] = utilGetSetValue(input) || undefined;
68561 dispatch$$1.call('change', this, t$$1, onInput);
68566 textarea.tags = function(tags) {
68567 utilGetSetValue(input, tags[field.key] || '');
68571 textarea.focus = function() {
68572 input.node().focus();
68576 return utilRebind(textarea, dispatch$$1, 'on');
68579 function uiFieldWikipedia(field, context) {
68580 var dispatch$$1 = dispatch('change'),
68581 wikipedia = services.wikipedia,
68582 wikidata = services.wikidata,
68583 link = select(null),
68584 lang = select(null),
68585 title = select(null),
68590 function wiki(selection$$1) {
68591 var langcombo = d3combobox()
68592 .container(context.container())
68593 .fetcher(function(value, cb) {
68594 var v = value.toLowerCase();
68596 cb(wikipedia$2.filter(function(d) {
68597 return d[0].toLowerCase().indexOf(v) >= 0 ||
68598 d[1].toLowerCase().indexOf(v) >= 0 ||
68599 d[2].toLowerCase().indexOf(v) >= 0;
68600 }).map(function(d) {
68601 return { value: d[1] };
68605 var titlecombo = d3combobox()
68606 .container(context.container())
68607 .fetcher(function(value, cb) {
68609 value = context.entity(entity.id).tags.name || '';
68612 var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
68613 searchfn(language()[2], value, function(query, data$$1) {
68614 cb(data$$1.map(function(d) {
68615 return { value: d };
68621 lang = selection$$1.selectAll('input.wiki-lang')
68624 lang = lang.enter()
68626 .attr('type', 'text')
68627 .attr('class', 'wiki-lang')
68628 .attr('placeholder', t('translate.localized_translation_language'))
68632 utilGetSetValue(lang, language()[1]);
68636 .on('blur', changeLang)
68637 .on('change', changeLang);
68640 title = selection$$1.selectAll('input.wiki-title')
68643 title = title.enter()
68645 .attr('type', 'text')
68646 .attr('class', 'wiki-title')
68647 .attr('id', 'preset-input-' + field.safeid)
68654 .on('change', change);
68657 link = selection$$1.selectAll('.wiki-link')
68660 link = link.enter()
68662 .attr('class', 'button-input-action wiki-link minor')
68663 .attr('tabindex', -1)
68664 .call(svgIcon('#iD-icon-out-link'))
68668 .on('click', function() {
68669 event.preventDefault();
68670 if (wikiURL) window.open(wikiURL, '_blank');
68675 function language() {
68676 var value = utilGetSetValue(lang).toLowerCase();
68677 var locale = utilDetect().locale.toLowerCase();
68678 var localeLanguage;
68679 return find$1(wikipedia$2, function(d) {
68680 if (d[2] === locale) localeLanguage = d;
68681 return d[0].toLowerCase() === value ||
68682 d[1].toLowerCase() === value ||
68684 }) || localeLanguage || ['English', 'English', 'en'];
68688 function changeLang() {
68689 utilGetSetValue(lang, language()[1]);
68699 function change(skipWikidata) {
68700 var value = utilGetSetValue(title),
68701 m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/),
68702 l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; }),
68706 // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
68707 value = decodeURIComponent(m[2]).replace(/_/g, ' ');
68711 // Best-effort `anchordecode:` implementation
68712 anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
68714 anchor = decodeURIComponent(m[3]);
68716 value += '#' + anchor.replace(/_/g, ' ');
68718 value = value.slice(0, 1).toUpperCase() + value.slice(1);
68719 utilGetSetValue(lang, l[1]);
68720 utilGetSetValue(title, value);
68724 syncTags.wikipedia = language()[2] + ':' + value;
68726 syncTags.wikipedia = undefined;
68727 syncTags.wikidata = undefined;
68730 dispatch$$1.call('change', this, syncTags);
68733 if (skipWikidata || !value || !language()[2]) return;
68735 // attempt asynchronous update of wikidata tag..
68736 var initGraph = context.graph(),
68737 initEntityId = entity.id;
68739 wikidata.itemsByTitle(language()[2], value, function(title, data$$1) {
68740 // If graph has changed, we can't apply this update.
68741 if (context.graph() !== initGraph) return;
68743 if (!data$$1 || !Object.keys(data$$1).length) return;
68745 var qids = Object.keys(data$$1);
68746 var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
68747 var currTags = clone(context.entity(initEntityId).tags);
68749 currTags.wikidata = value;
68751 // Coalesce the update of wikidata tag into the previous tag change
68753 actionChangeTags(initEntityId, currTags),
68754 context.history().undoAnnotation()
68757 // do not dispatch.call('change') here, because entity_editor
68758 // changeTags() is not intended to be called asynchronously
68763 wiki.tags = function(tags) {
68764 var value = tags[field.key] || '',
68765 m = value.match(/([^:]+):([^#]+)(?:#(.+))?/),
68766 l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; }),
68767 anchor = m && m[3];
68769 // value in correct format
68771 utilGetSetValue(lang, l[1]);
68772 utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
68775 // Best-effort `anchorencode:` implementation
68776 anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
68778 anchor = anchor.replace(/ /g, '_');
68781 wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
68782 m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
68784 // unrecognized value format
68786 utilGetSetValue(title, value);
68787 if (value && value !== '') {
68788 utilGetSetValue(lang, '');
68789 wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
68797 wiki.entity = function(_) {
68798 if (!arguments.length) return entity;
68804 wiki.focus = function() {
68805 title.node().focus();
68809 return utilRebind(wiki, dispatch$$1, 'on');
68813 access: uiFieldAccess,
68814 address: uiFieldAddress,
68815 check: uiFieldCheck,
68816 combo: uiFieldCombo,
68817 cycleway: uiFieldCycleway,
68818 defaultCheck: uiFieldCheck,
68819 email: uiFieldText,
68820 lanes: uiFieldLanes,
68821 localized: uiFieldLocalized,
68822 maxspeed: uiFieldMaxspeed,
68823 multiCombo: uiFieldCombo,
68824 networkCombo: uiFieldCombo,
68825 number: uiFieldText,
68826 onewayCheck: uiFieldCheck,
68827 radio: uiFieldRadio,
68828 restrictions: uiFieldRestrictions,
68829 semiCombo: uiFieldCombo,
68830 structureRadio: uiFieldRadio,
68833 textarea: uiFieldTextarea,
68834 typeCombo: uiFieldCombo,
68836 wikipedia: uiFieldWikipedia
68839 function uiField(context, presetField, entity, options) {
68840 options = assignIn({
68848 var dispatch$$1 = dispatch('change');
68849 var field = clone(presetField);
68850 var _show = options.show;
68855 field.impl = uiFields[field.type](field, context)
68856 .on('change', function(t$$1, onInput) {
68857 dispatch$$1.call('change', field, t$$1, onInput);
68860 if (entity && field.impl.entity) {
68861 field.impl.entity(entity);
68864 field.keys = field.keys || [field.key];
68867 function isModified() {
68868 if (!entity) return false;
68869 var original = context.graph().base().entities[entity.id];
68870 return some(field.keys, function(key) {
68871 return original ? _tags[key] !== original.tags[key] : _tags[key];
68876 function isPresent() {
68877 return some(field.keys, function(key) {
68883 function revert(d) {
68884 event.stopPropagation();
68885 event.preventDefault();
68886 if (!entity) return false;
68888 var original = context.graph().base().entities[entity.id];
68890 d.keys.forEach(function(key) {
68891 t$$1[key] = original ? original.tags[key] : undefined;
68894 dispatch$$1.call('change', d, t$$1);
68898 function remove(d) {
68899 event.stopPropagation();
68900 event.preventDefault();
68903 d.keys.forEach(function(key) {
68904 t$$1[key] = undefined;
68907 dispatch$$1.call('change', d, t$$1);
68911 field.render = function(selection$$1) {
68912 var container = selection$$1.selectAll('.form-field')
68916 var enter = container.enter()
68918 .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
68919 .classed('nowrap', !options.wrap);
68921 if (options.wrap) {
68924 .attr('class', 'form-label')
68925 .attr('for', function(d) { return 'preset-input-' + d.safeid; })
68926 .text(function(d) { return d.label(); });
68930 .attr('class', 'form-label-button-wrap');
68932 if (options.remove) {
68935 .attr('class', 'remove-icon')
68936 .attr('title', t('icons.remove'))
68937 .attr('tabindex', -1)
68938 .call(svgIcon('#iD-operation-delete'));
68941 if (options.revert) {
68944 .attr('class', 'modified-icon')
68945 .attr('title', t('icons.undo'))
68946 .attr('tabindex', -1)
68947 .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-redo' : '#iD-icon-undo'));
68953 container = container
68956 container.selectAll('.form-label-button-wrap .remove-icon')
68957 .on('click', remove);
68959 container.selectAll('.form-label-button-wrap .modified-icon')
68960 .on('click', revert);
68963 .classed('modified', isModified())
68964 .classed('present', isPresent())
68965 .each(function(d) {
68966 var reference, help;
68968 // instantiate field help
68969 if (options.wrap && field.type === 'restrictions') {
68970 help = uiFieldHelp(context, 'restrictions');
68973 // instantiate tag reference
68974 if (options.wrap && options.info) {
68975 var referenceKey = d.key;
68976 if (d.type === 'multiCombo') { // lookup key without the trailing ':'
68977 referenceKey = referenceKey.replace(/:$/, '');
68980 reference = uiTagReference(d.reference || { key: referenceKey }, context);
68981 if (_state === 'hover') {
68982 reference.showing(false);
68989 // add field help components
68993 .select('.form-label-button-wrap')
68994 .call(help.button);
68997 // add tag reference components
69000 .call(reference.body)
69001 .select('.form-label-button-wrap')
69002 .call(reference.button);
69005 d.impl.tags(_tags);
69010 field.state = function(_) {
69011 if (!arguments.length) return _state;
69017 field.tags = function(_) {
69018 if (!arguments.length) return _tags;
69024 field.show = function() {
69026 if (field.default && field.key && _tags[field.key] !== field.default) {
69028 t$$1[field.key] = field.default;
69029 dispatch$$1.call('change', this, t$$1);
69034 field.isShown = function() {
69035 return _show || some(field.keys, function(key) { return !!_tags[key]; });
69039 field.focus = function() {
69040 field.impl.focus();
69044 return utilRebind(field, dispatch$$1, 'on');
69047 function uiFormFields(context) {
69051 function formFields(selection$$1, klass) {
69052 render(selection$$1, klass);
69056 function render(selection$$1, klass) {
69058 var shown = fieldsArr.filter(function(field) { return field.isShown(); }),
69059 notShown = fieldsArr.filter(function(field) { return !field.isShown(); });
69061 var container = selection$$1.selectAll('.form-fields-container')
69064 container = container.enter()
69066 .attr('class', 'form-fields-container ' + (klass || ''))
69070 var fields = container.selectAll('.wrap-form-field')
69071 .data(shown, function(d) { return d.id; });
69077 var enter = fields.enter()
69079 .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
69087 .each(function(d) {
69093 notShown = notShown.map(function(field) {
69095 title: field.label(),
69096 value: field.label(),
69102 var more = selection$$1.selectAll('.more-fields')
69103 .data((notShown.length > 0) ? [0] : []);
69108 more = more.enter()
69110 .attr('class', 'more-fields')
69112 .text(t('inspector.add_fields'))
69116 var input = more.selectAll('.value')
69122 input = input.enter()
69124 .attr('class', 'value')
69125 .attr('type', 'text')
69130 .call(utilGetSetValue, '')
69131 .attr('placeholder', function() {
69132 var placeholder = [];
69133 for (var field in notShown) {
69134 placeholder.push(notShown[field].title);
69136 return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
69139 .container(context.container())
69142 .on('accept', function (d) {
69143 var field = d.field;
69145 render(selection$$1);
69146 if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
69154 formFields.fieldsArr = function(_) {
69155 if (!arguments.length) return fieldsArr;
69164 function uiPresetEditor(context) {
69165 var dispatch$$1 = dispatch('change'),
69166 formFields = uiFormFields(context),
69174 function presetEditor(selection$$1) {
69175 selection$$1.call(uiDisclosure(context, 'preset_fields', true)
69176 .title(t('inspector.all_fields'))
69182 function render(selection$$1) {
69184 var entity = context.entity(entityId),
69185 geometry = context.geometry(entityId),
69186 presets = context.presets();
69190 preset.fields.forEach(function(field) {
69191 if (field.matchGeometry(geometry)) {
69193 uiField(context, field, entity)
69198 if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
69200 uiField(context, presets.field('restrictions'), entity)
69204 presets.universal().forEach(function(field) {
69205 if (preset.fields.indexOf(field) === -1) {
69207 uiField(context, field, entity, { show: false })
69212 fieldsArr.forEach(function(field) {
69214 .on('change', function(t$$1, onInput) {
69215 dispatch$$1.call('change', field, t$$1, onInput);
69220 fieldsArr.forEach(function(field) {
69228 .call(formFields.fieldsArr(fieldsArr), 'inspector-inner fillL3');
69231 selection$$1.selectAll('.wrap-form-field input')
69232 .on('keydown', function() {
69233 // if user presses enter, and combobox is not active, accept edits..
69234 if (event.keyCode === 13 && select('.combobox').empty()) {
69235 context.enter(modeBrowse(context));
69241 presetEditor.preset = function(_) {
69242 if (!arguments.length) return preset;
69243 if (preset && preset.id === _.id) return presetEditor;
69246 return presetEditor;
69250 presetEditor.state = function(_) {
69251 if (!arguments.length) return state;
69253 return presetEditor;
69257 presetEditor.tags = function(_) {
69258 if (!arguments.length) return tags;
69260 // Don't reset fieldsArr here.
69261 return presetEditor;
69265 presetEditor.entityID = function(_) {
69266 if (!arguments.length) return entityId;
69267 if (entityId === _) return presetEditor;
69270 return presetEditor;
69274 return utilRebind(presetEditor, dispatch$$1, 'on');
69277 function uiEntityEditor(context) {
69278 var dispatch$$1 = dispatch('choose');
69279 var _state = 'select';
69280 var _coalesceChanges = false;
69281 var _modified = false;
69287 var presetEditor = uiPresetEditor(context)
69288 .on('change', changeTags);
69289 var rawTagEditor = uiRawTagEditor(context)
69290 .on('change', changeTags);
69293 function entityEditor(selection$$1) {
69294 var entity = context.entity(_entityID);
69295 var tags = clone(entity.tags);
69298 var header = selection$$1.selectAll('.header')
69302 var enter = header.enter()
69304 .attr('class', 'header fillL cf');
69308 .attr('class', 'fl preset-reset preset-choose')
69309 .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward'));
69313 .attr('class', 'fr preset-close')
69314 .on('click', function() { context.enter(modeBrowse(context)); })
69315 .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
69319 .text(t('inspector.edit'));
69325 header.selectAll('.preset-reset')
69326 .on('click', function() {
69327 dispatch$$1.call('choose', this, _activePreset);
69332 var body = selection$$1.selectAll('.inspector-body')
69336 enter = body.enter()
69338 .attr('class', 'inspector-body');
69342 .attr('class', 'preset-list-item inspector-inner')
69344 .attr('class', 'preset-list-button-wrap')
69346 .attr('class', 'preset-list-button preset-reset')
69347 .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
69349 .attr('class', 'label');
69353 .attr('class', 'inspector-border preset-editor');
69357 .attr('class', 'inspector-border raw-tag-editor inspector-inner');
69361 .attr('class', 'inspector-border raw-member-editor inspector-inner');
69365 .attr('class', 'raw-membership-editor inspector-inner');
69369 .attr('type', 'text')
69370 .attr('class', 'key-trap');
69377 if (_tagReference) {
69378 body.selectAll('.preset-list-button-wrap')
69379 .call(_tagReference.button);
69381 body.selectAll('.preset-list-item')
69382 .call(_tagReference.body);
69385 body.selectAll('.preset-reset')
69386 .on('click', function() {
69387 dispatch$$1.call('choose', this, _activePreset);
69390 body.select('.preset-list-item button')
69391 .call(uiPresetIcon()
69392 .geometry(context.geometry(_entityID))
69393 .preset(_activePreset)
69396 body.select('.preset-list-item .label')
69397 .text(_activePreset.name());
69399 body.select('.preset-editor')
69401 .preset(_activePreset)
69402 .entityID(_entityID)
69407 body.select('.raw-tag-editor')
69409 .preset(_activePreset)
69410 .entityID(_entityID)
69415 if (entity.type === 'relation') {
69416 body.select('.raw-member-editor')
69417 .style('display', 'block')
69418 .call(uiRawMemberEditor(context)
69419 .entityID(_entityID)
69422 body.select('.raw-member-editor')
69423 .style('display', 'none');
69426 body.select('.raw-membership-editor')
69427 .call(uiRawMembershipEditor(context)
69428 .entityID(_entityID)
69431 body.select('.key-trap')
69432 .on('keydown.key-trap', function() {
69433 // On tabbing, send focus back to the first field on the inspector-body
69434 // (probably the `name` field) #4159
69435 if (event.keyCode === 9 && !event.shiftKey) {
69436 event.preventDefault();
69437 body.select('input').node().focus();
69442 .on('change.entity-editor', historyChanged);
69445 function historyChanged() {
69446 if (_state === 'hide') return;
69448 var entity = context.hasEntity(_entityID);
69449 var graph = context.graph();
69450 if (!entity) return;
69452 var match = context.presets().match(entity, graph);
69453 var activePreset = entityEditor.preset();
69454 var weakPreset = activePreset && isEmpty(activePreset.addTags);
69456 // A "weak" preset doesn't set any tags. (e.g. "Address")
69457 // Don't replace a weak preset with a fallback preset (e.g. "Point")
69458 if (!(weakPreset && match.isFallback())) {
69459 entityEditor.preset(match);
69461 entityEditor.modified(_base !== graph);
69462 entityEditor(selection$$1);
69467 // Tag changes that fire on input can all get coalesced into a single
69468 // history operation when the user leaves the field. #2342
69469 function changeTags(changed, onInput) {
69470 var entity = context.entity(_entityID);
69471 var annotation = t('operations.change_tags.annotation');
69472 var tags = clone(entity.tags);
69474 for (var k in changed) {
69476 var v = changed[k];
69477 if (v !== undefined || tags.hasOwnProperty(k)) {
69483 tags = utilCleanTags(tags);
69486 if (!isEqual(entity.tags, tags)) {
69487 if (_coalesceChanges) {
69488 context.overwrite(actionChangeTags(_entityID, tags), annotation);
69490 context.perform(actionChangeTags(_entityID, tags), annotation);
69491 _coalesceChanges = !!onInput;
69497 entityEditor.modified = function(_) {
69498 if (!arguments.length) return _modified;
69500 d3_selectAll('button.preset-close use')
69501 .attr('xlink:href', (_modified ? '#iD-icon-apply' : '#iD-icon-close'));
69502 return entityEditor;
69506 entityEditor.state = function(_) {
69507 if (!arguments.length) return _state;
69509 return entityEditor;
69513 entityEditor.entityID = function(_) {
69514 if (!arguments.length) return _entityID;
69516 _base = context.graph();
69517 _coalesceChanges = false;
69519 var presetMatch = context.presets().match(context.entity(_entityID), _base);
69521 return entityEditor
69522 .preset(presetMatch)
69527 entityEditor.preset = function(_) {
69528 if (!arguments.length) return _activePreset;
69529 if (_ !== _activePreset) {
69531 _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)), context)
69534 return entityEditor;
69538 return utilRebind(entityEditor, dispatch$$1, 'on');
69541 function uiPresetList(context) {
69542 var dispatch$$1 = dispatch('choose'),
69548 function presetList(selection$$1) {
69549 var entity = context.entity(id),
69550 geometry = context.geometry(id);
69552 // Treat entities on addr:interpolation lines as points, not vertices (#3241)
69553 if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
69554 geometry = 'point';
69557 var presets = context.presets().matchGeometry(geometry);
69559 selection$$1.html('');
69561 var messagewrap = selection$$1
69563 .attr('class', 'header fillL cf');
69565 var message = messagewrap
69567 .text(t('inspector.choose'));
69569 if (context.entity(id).isUsed(context.graph())) {
69572 .attr('class', 'preset-choose')
69573 .on('click', function() { dispatch$$1.call('choose', this, currentPreset); })
69574 .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'));
69578 .attr('class', 'close')
69579 .on('click', function() {
69580 context.enter(modeBrowse(context));
69582 .call(svgIcon('#iD-icon-close'));
69585 function keydown() {
69586 // hack to let delete shortcut work when search is autofocused
69587 if (search.property('value').length === 0 &&
69588 (event.keyCode === d3keybinding.keyCodes['⌫'] ||
69589 event.keyCode === d3keybinding.keyCodes['⌦'])) {
69590 event.preventDefault();
69591 event.stopPropagation();
69592 operationDelete([id], context)();
69593 } else if (search.property('value').length === 0 &&
69594 (event.ctrlKey || event.metaKey) &&
69595 event.keyCode === d3keybinding.keyCodes.z) {
69596 event.preventDefault();
69597 event.stopPropagation();
69599 } else if (!event.ctrlKey && !event.metaKey) {
69600 select(this).on('keydown', null);
69604 function keypress() {
69606 var value = search.property('value');
69607 if (event.keyCode === 13 && value.length) {
69608 list.selectAll('.preset-list-item:first-child').datum().choose();
69612 function inputevent() {
69613 var value = search.property('value');
69614 list.classed('filtered', value.length);
69615 if (value.length) {
69616 var results = presets.search(value, geometry);
69617 message.text(t('inspector.results', {
69618 n: results.collection.length,
69621 list.call(drawList, results);
69623 list.call(drawList, context.presets().defaults(geometry, 36));
69624 message.text(t('inspector.choose'));
69628 var searchWrap = selection$$1
69630 .attr('class', 'search-header');
69632 var search = searchWrap
69634 .attr('class', 'preset-search-input')
69635 .attr('placeholder', t('inspector.search'))
69636 .attr('type', 'search')
69638 .on('keydown', keydown)
69639 .on('keypress', keypress)
69640 .on('input', inputevent);
69643 .call(svgIcon('#iD-icon-search', 'pre-text'));
69646 search.node().focus();
69649 var listWrap = selection$$1
69651 .attr('class', 'inspector-body');
69653 var list = listWrap
69655 .attr('class', 'preset-list fillL cf')
69656 .call(drawList, context.presets().defaults(geometry, 36));
69660 function drawList(list, presets) {
69661 var collection = presets.collection.map(function(preset) {
69662 return preset.members ? CategoryItem(preset) : PresetItem(preset);
69665 var items = list.selectAll('.preset-list-item')
69666 .data(collection, function(d) { return d.preset.id; });
69675 .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
69676 .classed('current', function(item) { return item.preset === currentPreset; })
69677 .each(function(item) { select(this).call(item); })
69678 .style('opacity', 0)
69680 .style('opacity', 1);
69684 function CategoryItem(preset) {
69685 var box, sublist, shown = false;
69687 function item(selection$$1) {
69688 var wrap = selection$$1.append('div')
69689 .attr('class', 'preset-list-button-wrap category col12');
69693 .attr('class', 'preset-list-button')
69694 .classed('expanded', false)
69695 .call(uiPresetIcon()
69696 .geometry(context.geometry(id))
69698 .on('click', function() {
69699 var isExpanded = select(this).classed('expanded');
69700 var iconName = isExpanded ?
69701 (textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward') : '#iD-icon-down';
69703 .classed('expanded', !isExpanded);
69704 select(this).selectAll('div.label svg.icon use')
69705 .attr('href', iconName);
69711 .attr('class', 'label');
69714 .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'))
69716 .html(function() { return preset.name() + '…'; });
69718 box = selection$$1.append('div')
69719 .attr('class', 'subgrid col12')
69720 .style('max-height', '0px')
69721 .style('opacity', 0);
69724 .attr('class', 'arrow');
69726 sublist = box.append('div')
69727 .attr('class', 'preset-list fillL3 cf fl');
69731 item.choose = function() {
69732 if (!box || !sublist) return;
69738 .style('opacity', '0')
69739 .style('max-height', '0px')
69740 .style('padding-bottom', '0px');
69743 sublist.call(drawList, preset.members);
69746 .style('opacity', '1')
69747 .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
69748 .style('padding-bottom', '20px');
69752 item.preset = preset;
69758 function PresetItem(preset) {
69759 function item(selection$$1) {
69760 var wrap = selection$$1.append('div')
69761 .attr('class', 'preset-list-button-wrap col12');
69763 wrap.append('button')
69764 .attr('class', 'preset-list-button')
69765 .call(uiPresetIcon()
69766 .geometry(context.geometry(id))
69768 .on('click', item.choose)
69770 .attr('class', 'label')
69771 .text(preset.name());
69773 wrap.call(item.reference.button);
69774 selection$$1.call(item.reference.body);
69777 item.choose = function() {
69778 context.presets().choose(preset);
69781 actionChangePreset(id, currentPreset, preset),
69782 t('operations.change_tags.annotation')
69785 dispatch$$1.call('choose', this, preset);
69788 item.help = function() {
69789 event.stopPropagation();
69790 item.reference.toggle();
69793 item.preset = preset;
69794 item.reference = uiTagReference(preset.reference(context.geometry(id)), context);
69800 presetList.autofocus = function(_) {
69801 if (!arguments.length) return autofocus;
69807 presetList.entityID = function(_) {
69808 if (!arguments.length) return id;
69810 presetList.preset(context.presets().match(context.entity(id), context.graph()));
69815 presetList.preset = function(_) {
69816 if (!arguments.length) return currentPreset;
69822 return utilRebind(presetList, dispatch$$1, 'on');
69825 function uiViewOnOSM(context) {
69828 function viewOnOSM(selection) {
69829 var entity = context.entity(id);
69831 selection.style('display', entity.isNew() ? 'none' : null);
69833 var link = selection.selectAll('.view-on-osm')
69836 var enter = link.enter()
69838 .attr('class', 'view-on-osm')
69839 .attr('target', '_blank')
69840 .call(svgIcon('#iD-icon-out-link', 'inline'));
69844 .text(t('inspector.view_on_osm'));
69848 .attr('href', context.connection().entityURL(entity));
69852 viewOnOSM.entityID = function(_) {
69853 if (!arguments.length) return id;
69861 function uiInspector(context) {
69862 var presetList = uiPresetList(context);
69863 var entityEditor = uiEntityEditor(context);
69864 var _state = 'select';
69866 var _newFeature = false;
69869 function inspector(selection$$1) {
69871 .entityID(_entityID)
69872 .autofocus(_newFeature)
69873 .on('choose', setPreset);
69877 .entityID(_entityID)
69878 .on('choose', showList);
69880 var wrap = selection$$1.selectAll('.panewrap')
69883 var enter = wrap.enter()
69885 .attr('class', 'panewrap');
69889 .attr('class', 'preset-list-pane pane');
69893 .attr('class', 'entity-editor-pane pane');
69895 wrap = wrap.merge(enter);
69896 var presetPane = wrap.selectAll('.preset-list-pane');
69897 var editorPane = wrap.selectAll('.entity-editor-pane');
69899 var graph = context.graph(),
69900 entity = context.entity(_entityID),
69901 showEditor = _state === 'hover' ||
69902 entity.isUsed(graph) ||
69903 entity.isHighwayIntersection(graph);
69906 wrap.style('right', '0%');
69907 editorPane.call(entityEditor);
69909 wrap.style('right', '-100%');
69910 presetPane.call(presetList);
69913 var footer = selection$$1.selectAll('.footer')
69916 footer = footer.enter()
69918 .attr('class', 'footer')
69922 .call(uiViewOnOSM(context).entityID(_entityID));
69925 function showList(preset) {
69927 .styleTween('right', function() { return interpolate('0%', '-100%'); });
69930 .call(presetList.preset(preset).autofocus(true));
69934 function setPreset(preset) {
69936 .styleTween('right', function() { return interpolate('-100%', '0%'); });
69939 .call(entityEditor.preset(preset));
69944 inspector.state = function(_) {
69945 if (!arguments.length) return _state;
69947 entityEditor.state(_state);
69949 // remove any old field help overlay that might have gotten attached to the inspector
69950 d3_selectAll('.field-help-body').remove();
69956 inspector.entityID = function(_) {
69957 if (!arguments.length) return _entityID;
69963 inspector.newFeature = function(_) {
69964 if (!arguments.length) return _newFeature;
69973 function uiSidebar(context) {
69974 var inspector = uiInspector(context),
69978 function sidebar(selection) {
69979 var featureListWrap = selection
69981 .attr('class', 'feature-list-pane')
69982 .call(uiFeatureList(context));
69985 var inspectorWrap = selection
69987 .attr('class', 'inspector-hidden inspector-wrap fr');
69990 function hover(id) {
69991 if (!current && context.hasEntity(id)) {
69993 .classed('inspector-hidden', true);
69996 .classed('inspector-hidden', false)
69997 .classed('inspector-hover', true);
69999 if (inspector.entityID() !== id || inspector.state() !== 'hover') {
70008 } else if (!current) {
70010 .classed('inspector-hidden', false);
70012 .classed('inspector-hidden', true);
70019 sidebar.hover = throttle(hover, 200);
70022 sidebar.select = function(id, newFeature) {
70023 if (!current && id) {
70025 .classed('inspector-hidden', true);
70028 .classed('inspector-hidden', false)
70029 .classed('inspector-hover', false);
70031 if (inspector.entityID() !== id || inspector.state() !== 'select') {
70035 .newFeature(newFeature);
70041 } else if (!current) {
70043 .classed('inspector-hidden', false);
70045 .classed('inspector-hidden', true);
70052 sidebar.show = function(component) {
70054 .classed('inspector-hidden', true);
70056 .classed('inspector-hidden', true);
70058 if (current) current.remove();
70059 current = selection
70061 .attr('class', 'sidebar-component')
70066 sidebar.hide = function() {
70068 .classed('inspector-hidden', false);
70070 .classed('inspector-hidden', true);
70072 if (current) current.remove();
70078 sidebar.hover = function() {};
70079 sidebar.hover.cancel = function() {};
70080 sidebar.select = function() {};
70081 sidebar.show = function() {};
70082 sidebar.hide = function() {};
70087 function uiSpinner(context) {
70088 var osm = context.connection();
70091 return function(selection) {
70092 var img = selection
70094 .attr('src', context.imagePath('loader-black.gif'))
70095 .style('opacity', 0);
70099 .on('loading.spinner', function() {
70101 .style('opacity', 1);
70103 .on('loaded.spinner', function() {
70105 .style('opacity', 0);
70111 function uiSplash(context) {
70113 return function(selection) {
70114 if (context.storage('sawSplash'))
70117 context.storage('sawSplash', true);
70119 var modalSelection = uiModal(selection);
70121 modalSelection.select('.modal')
70122 .attr('class', 'modal-splash modal col6');
70124 var introModal = modalSelection.select('.content')
70126 .attr('class', 'fillL');
70130 .attr('class','modal-section cf')
70131 .append('h3').text(t('splash.welcome'));
70135 .attr('class','modal-section')
70137 .html(t('splash.text', {
70138 version: context.version,
70139 website: '<a href="http://ideditor.com/">ideditor.com</a>',
70140 github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
70143 var buttonWrap = introModal
70145 .attr('class', 'modal-actions cf');
70147 var walkthrough = buttonWrap
70149 .attr('class', 'walkthrough col6')
70150 .on('click', function() {
70151 context.container().call(uiIntro(context));
70152 modalSelection.close();
70157 .attr('class', 'logo logo-walkthrough')
70159 .attr('xlink:href', '#iD-logo-walkthrough');
70163 .text(t('splash.walkthrough'));
70165 var startEditing = buttonWrap
70167 .attr('class', 'start-editing col6')
70168 .on('click', modalSelection.close);
70172 .attr('class', 'logo logo-features')
70174 .attr('xlink:href', '#iD-logo-features');
70178 .text(t('splash.start'));
70181 modalSelection.select('button.close')
70182 .attr('class','hide');
70187 function uiStatus(context) {
70188 var osm = context.connection();
70191 return function(selection$$1) {
70194 function update() {
70195 osm.status(function(err, apiStatus) {
70196 selection$$1.html('');
70199 if (apiStatus === 'connectionSwitched') {
70200 // if the connection was just switched, we can't rely on
70201 // the status (we're getting the status of the previous api)
70204 } else if (apiStatus === 'rateLimited') {
70206 .text(t('status.rateLimit'))
70208 .attr('class', 'api-status-login')
70209 .attr('target', '_blank')
70210 .call(svgIcon('#iD-icon-out-link', 'inline'))
70213 .on('click.login', function() {
70214 event.preventDefault();
70215 osm.authenticate();
70218 // eslint-disable-next-line no-warning-comments
70219 // TODO: nice messages for different error types
70220 selection$$1.text(t('status.error'));
70223 } else if (apiStatus === 'readonly') {
70224 selection$$1.text(t('status.readonly'));
70225 } else if (apiStatus === 'offline') {
70226 selection$$1.text(t('status.offline'));
70229 selection$$1.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
70233 osm.on('change', function() { update(selection$$1); });
70235 window.setInterval(update, 90000);
70236 update(selection$$1);
70240 function uiUndoRedo(context) {
70244 action: function() { if (editable()) context.undo(); },
70245 annotation: function() { return context.history().undoAnnotation(); }
70249 action: function() { if (editable()) context.redo(); },
70250 annotation: function() { return context.history().redoAnnotation(); }
70254 function editable() {
70255 var mode = context.mode();
70256 return context.editable() && mode && mode.id !== 'save';
70260 return function(selection$$1) {
70261 var tooltipBehavior = tooltip()
70262 .placement('bottom')
70264 .title(function (d) {
70265 return uiTooltipHtml(d.annotation() ?
70266 t(d.id + '.tooltip', {action: d.annotation()}) :
70267 t(d.id + '.nothing'), d.cmd);
70270 var buttons = selection$$1.selectAll('button')
70274 .attr('class', function(d) { return 'col6 disabled ' + d.id + '-button'; })
70275 .on('click', function(d) { return d.action(); })
70276 .call(tooltipBehavior);
70278 buttons.each(function(d) {
70279 var iconName = d.id;
70280 if (textDirection === 'rtl') {
70281 if (iconName === 'undo') {
70283 } else if (iconName === 'redo') {
70288 .call(svgIcon('#iD-icon-' + iconName));
70291 var keybinding = d3keybinding('undo')
70292 .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
70293 .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
70299 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
70302 .on('move.undo_redo', debouncedUpdate)
70303 .on('drawn.undo_redo', debouncedUpdate);
70306 .on('change.undo_redo', update);
70309 .on('enter.undo_redo', update);
70312 function update() {
70314 .property('disabled', !editable())
70315 .classed('disabled', function(d) { return !d.annotation(); })
70317 var selection$$1 = select(this);
70318 if (selection$$1.property('tooltipVisible')) {
70319 selection$$1.call(tooltipBehavior.show);
70326 // these are module variables so they are preserved through a ui.restart()
70327 var sawVersion = null,
70328 isNewVersion = false,
70332 function uiVersion(context) {
70334 var currVersion = context.version,
70335 matchedVersion = currVersion.match(/\d\.\d\.\d.*/);
70337 if (sawVersion === null && matchedVersion !== null) {
70338 isNewVersion = (context.storage('sawVersion') !== currVersion);
70339 isNewUser = !context.storage('sawSplash');
70340 context.storage('sawVersion', currVersion);
70341 sawVersion = currVersion;
70344 return function(selection) {
70347 .attr('target', '_blank')
70348 .attr('tabindex', -1)
70349 .attr('href', 'https://github.com/openstreetmap/iD')
70350 .text(currVersion);
70352 // only show new version indicator to users that have used iD before
70353 if (isNewVersion && !isNewUser) {
70356 .attr('class', 'badge')
70358 .attr('target', '_blank')
70359 .attr('tabindex', -1)
70360 .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
70361 .call(svgIcon('#maki-gift-11'))
70363 .title(t('version.whats_new', { version: currVersion }))
70370 function uiZoom(context) {
70374 title: t('zoom.in'),
70375 action: context.zoomIn,
70380 title: t('zoom.out'),
70381 action: context.zoomOut,
70386 function zoomIn() {
70387 event.preventDefault();
70392 function zoomOut() {
70393 event.preventDefault();
70398 function zoomInFurther() {
70399 event.preventDefault();
70400 context.zoomInFurther();
70404 function zoomOutFurther() {
70405 event.preventDefault();
70406 context.zoomOutFurther();
70410 return function(selection$$1) {
70411 var button = selection$$1.selectAll('button')
70415 .attr('tabindex', -1)
70416 .attr('class', function(d) { return d.id; })
70417 .on('click.editor', function(d) { d.action(); })
70419 .placement((textDirection === 'rtl') ? 'right' : 'left')
70421 .title(function(d) {
70422 return uiTooltipHtml(d.title, d.key);
70426 button.each(function(d) {
70428 .call(svgIcon('#iD-icon-' + d.icon, 'light'));
70431 var keybinding = d3keybinding('zoom');
70433 ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
70434 keybinding.on([key], zoomIn);
70435 keybinding.on([uiCmd('⌘' + key)], zoomInFurther);
70438 ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
70439 keybinding.on([key], zoomOut);
70440 keybinding.on([uiCmd('⌘' + key)], zoomOutFurther);
70448 function uiInit(context) {
70449 var uiInitCounter = 0;
70452 function render(container) {
70454 .attr('dir', textDirection);
70456 var map = context.map();
70458 var hash = behaviorHash(context);
70461 if (!hash.hadHash) {
70462 map.centerZoom([0, 0], 2);
70467 .attr('id', 'defs')
70468 .call(svgDefs(context));
70472 .attr('id', 'sidebar')
70473 .attr('class', 'col4')
70476 var content = container
70478 .attr('id', 'content')
70479 .attr('class', 'active');
70484 .attr('class', 'fillD');
70489 .attr('dir', 'ltr')
70493 .call(uiMapInMap(context))
70494 .call(uiInfo(context))
70495 .call(uiNotice(context));
70499 .attr('class', 'spacer col4');
70501 var limiter = bar.append('div')
70502 .attr('class', 'limiter');
70506 .attr('class', 'button-wrap joined col3')
70507 .call(uiModes(context), limiter);
70511 .attr('class', 'button-wrap joined col1')
70512 .call(uiUndoRedo(context));
70516 .attr('class', 'button-wrap col1')
70517 .call(uiSave(context));
70521 .attr('class', 'full-screen')
70522 .call(uiFullScreen(context));
70526 .attr('class', 'spinner')
70527 .call(uiSpinner(context));
70532 .attr('class', 'map-controls');
70536 .attr('class', 'map-control zoombuttons')
70537 .call(uiZoom(context));
70541 .attr('class', 'map-control geolocate-control')
70542 .call(uiGeolocate(context));
70546 .attr('class', 'map-control background-control')
70547 .call(uiBackground(context));
70551 .attr('class', 'map-control map-data-control')
70552 .call(uiMapData(context));
70556 .attr('class', 'map-control help-control')
70557 .call(uiHelp(context));
70560 var about = content
70562 .attr('id', 'about');
70566 .attr('id', 'attrib')
70567 .attr('dir', 'ltr')
70568 .call(uiAttribution(context));
70572 .attr('class', 'api-status')
70573 .call(uiStatus(context));
70578 .attr('id', 'footer')
70579 .attr('class', 'fillD');
70583 .attr('id', 'flash-wrap')
70584 .attr('class', 'footer-hide');
70586 var footerWrap = footer
70588 .attr('id', 'footer-wrap')
70589 .attr('class', 'footer-show');
70593 .attr('id', 'scale-block')
70594 .call(uiScale(context));
70596 var aboutList = footerWrap
70598 .attr('id', 'info-block')
70600 .attr('id', 'about-list');
70602 if (!context.embed()) {
70604 .call(uiAccount(context));
70609 .attr('class', 'version')
70610 .call(uiVersion(context));
70612 var issueLinks = aboutList
70617 .attr('target', '_blank')
70618 .attr('tabindex', -1)
70619 .attr('href', 'https://github.com/openstreetmap/iD/issues')
70620 .call(svgIcon('#iD-icon-bug', 'light'))
70621 .call(tooltip().title(t('report_a_bug')).placement('top'));
70625 .attr('target', '_blank')
70626 .attr('tabindex', -1)
70627 .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
70628 .call(svgIcon('#iD-icon-translate', 'light'))
70629 .call(tooltip().title(t('help_translate')).placement('top'));
70633 .attr('class', 'feature-warning')
70634 .attr('tabindex', -1)
70635 .call(uiFeatureInfo(context));
70639 .attr('class', 'user-list')
70640 .attr('tabindex', -1)
70641 .call(uiContributors(context));
70644 var photoviewer = content
70646 .attr('id', 'photoviewer')
70647 .classed('al', true) // 'al'=left, 'ar'=right
70648 .classed('hide', true);
70652 .attr('class', 'thumb-hide')
70653 .on('click', function () {
70654 if (services.streetside) { services.streetside.hideViewer(); }
70655 if (services.mapillary) { services.mapillary.hideViewer(); }
70656 if (services.openstreetcam) { services.openstreetcam.hideViewer(); }
70659 .call(svgIcon('#iD-icon-close'));
70662 window.onbeforeunload = function() {
70663 return context.save();
70666 window.onunload = function() {
70667 context.history().unlock();
70670 var mapDimensions = map.dimensions();
70673 function onResize() {
70674 mapDimensions = utilGetDimensions(content, true);
70675 map.dimensions(mapDimensions);
70679 .on('resize.editor', onResize);
70684 return function() {
70685 event.preventDefault();
70686 context.pan(d, 100);
70694 var keybinding = d3keybinding('main')
70695 .on('⌫', function() { event.preventDefault(); })
70696 .on('←', pan([pa, 0]))
70697 .on('↑', pan([0, pa]))
70698 .on('→', pan([-pa, 0]))
70699 .on('↓', pan([0, -pa]))
70700 .on(['⇧←', uiCmd('⌘←')], pan([mapDimensions[0], 0]))
70701 .on(['⇧↑', uiCmd('⌘↑')], pan([0, mapDimensions[1]]))
70702 .on(['⇧→', uiCmd('⌘→')], pan([-mapDimensions[0], 0]))
70703 .on(['⇧↓', uiCmd('⌘↓')], pan([0, -mapDimensions[1]]));
70708 context.enter(modeBrowse(context));
70710 if (!uiInitCounter++) {
70711 if (!hash.startWalkthrough) {
70712 context.container()
70713 .call(uiSplash(context))
70714 .call(uiRestore(context));
70717 context.container()
70718 .call(uiShortcuts(context));
70721 var osm = context.connection(),
70722 auth = uiLoading(context).message(t('loading_auth')).blocking(true);
70726 .on('authLoading.ui', function() {
70727 context.container()
70730 .on('authDone.ui', function() {
70737 if (hash.startWalkthrough) {
70738 hash.startWalkthrough = false;
70739 context.container().call(uiIntro(context));
70744 var renderCallback;
70746 function ui(node, callback) {
70747 renderCallback = callback;
70748 var container = select(node);
70749 context.container(container);
70750 context.loadLocale(function(err) {
70761 ui.restart = function(arg) {
70762 context.locale(arg);
70763 context.loadLocale(function(err) {
70765 context.container().selectAll('*').remove();
70766 render(context.container());
70767 if (renderCallback) renderCallback();
70773 ui.sidebar = uiSidebar(context);
70778 function uiChangesetEditor(context) {
70779 var dispatch$$1 = dispatch('change');
70780 var formFields = uiFormFields(context);
70786 function changesetEditor(selection) {
70791 function render(selection) {
70792 var initial = false;
70796 var presets = context.presets();
70799 uiField(context, presets.field('comment'), null, { show: true, revert: false }),
70800 uiField(context, presets.field('source'), null, { show: false, revert: false }),
70801 uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
70804 _fieldsArr.forEach(function(field) {
70806 .on('change', function(t$$1, onInput) {
70807 dispatch$$1.call('change', field, t$$1, onInput);
70812 _fieldsArr.forEach(function(field) {
70819 .call(formFields.fieldsArr(_fieldsArr));
70823 var commentField = selection.select('#preset-input-comment');
70824 var commentNode = commentField.node();
70827 commentNode.focus();
70828 commentNode.select();
70831 // trigger a 'blur' event so that comment field can be cleaned
70832 // and checked for hashtags, even if retrieved from localstorage
70833 utilTriggerEvent(commentField, 'blur');
70835 var osm = context.connection();
70837 osm.userChangesets(function (err, changesets) {
70840 var comments = changesets.map(function(changeset) {
70842 title: changeset.tags.comment,
70843 value: changeset.tags.comment
70849 .container(context.container())
70850 .caseSensitive(true)
70851 .data(uniqBy(comments, 'title'))
70857 // Add warning if comment mentions Google
70858 var hasGoogle = _tags.comment.match(/google/i);
70859 var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
70860 .data(hasGoogle ? [0] : []);
70862 commentWarning.exit()
70865 .style('opacity', 0)
70868 var commentEnter = commentWarning.enter()
70869 .insert('div', '.tag-reference-body')
70870 .attr('class', 'field-warning comment-warning')
70871 .style('opacity', 0);
70875 .attr('target', '_blank')
70876 .attr('tabindex', -1)
70877 .call(svgIcon('#iD-icon-alert', 'inline'))
70878 .attr('href', t('commit.google_warning_link'))
70880 .text(t('commit.google_warning'));
70885 .style('opacity', 1);
70889 changesetEditor.tags = function(_) {
70890 if (!arguments.length) return _tags;
70892 // Don't reset _fieldsArr here.
70893 return changesetEditor;
70897 changesetEditor.changesetID = function(_) {
70898 if (!arguments.length) return _changesetID;
70899 if (_changesetID === _) return changesetEditor;
70902 return changesetEditor;
70906 return utilRebind(changesetEditor, dispatch$$1, 'on');
70910 * This method is like `_.union` except that it accepts `iteratee` which is
70911 * invoked for each element of each `arrays` to generate the criterion by
70912 * which uniqueness is computed. Result values are chosen from the first
70913 * array in which the value occurs. The iteratee is invoked with one argument:
70920 * @param {...Array} [arrays] The arrays to inspect.
70921 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
70922 * @returns {Array} Returns the new array of combined values.
70925 * _.unionBy([2.1], [1.2, 2.3], Math.floor);
70928 * // The `_.property` iteratee shorthand.
70929 * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
70930 * // => [{ 'x': 1 }, { 'x': 2 }]
70932 var unionBy = baseRest(function(arrays) {
70933 var iteratee = last(arrays);
70934 if (isArrayLikeObject(iteratee)) {
70935 iteratee = undefined;
70937 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
70940 function uiCommitChanges(context) {
70941 var detected = utilDetect();
70945 function commitChanges(selection$$1) {
70946 var history = context.history();
70947 var summary = history.difference().summary();
70949 var container = selection$$1.selectAll('.modal-section.commit-section')
70952 var containerEnter = container.enter()
70954 .attr('class', 'commit-section modal-section fillL2');
70958 .text(t('commit.changes', { count: summary.length }));
70962 .attr('class', 'changeset-list');
70964 container = containerEnter
70968 var items = container.select('ul').selectAll('li')
70971 var itemsEnter = items.enter()
70973 .attr('class', 'change-item');
70976 .each(function(d) {
70978 .call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
70983 .attr('class', 'change-type')
70984 .text(function(d) { return t('commit.' + d.changeType) + ' '; });
70988 .attr('class', 'entity-type')
70989 .text(function(d) {
70990 var matched = context.presets().match(d.entity, d.graph);
70991 return (matched && matched.name()) || utilDisplayType(d.entity.id);
70996 .attr('class', 'entity-name')
70997 .text(function(d) {
70998 var name = utilDisplayName(d.entity) || '',
71003 return string += ' ' + name;
71007 .style('opacity', 0)
71009 .style('opacity', 1);
71015 .on('mouseover', mouseover)
71016 .on('mouseout', mouseout)
71017 .on('click', click);
71020 // Download changeset link
71021 var changeset = new osmChangeset().update({ id: undefined });
71022 var changes = history.changes(actionDiscardTags(history.difference()));
71024 delete changeset.id; // Export without chnageset_id
71026 var data = JXON.stringify(changeset.osmChangeJXON(changes));
71027 var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
71028 var fileName = 'changes.osc';
71030 var linkEnter = container.selectAll('.download-changes')
71034 .attr('class', 'download-changes');
71036 if (detected.download) { // All except IE11 and Edge
71037 linkEnter // download the data as a file
71038 .attr('href', window.URL.createObjectURL(blob))
71039 .attr('download', fileName);
71041 } else { // IE11 and Edge
71042 linkEnter // open data uri in a new tab
71043 .attr('target', '_blank')
71044 .on('click.download', function() {
71045 navigator.msSaveBlob(blob, fileName);
71050 .call(svgIcon('#iD-icon-load', 'inline'))
71052 .text(t('commit.download_changes'));
71055 function mouseover(d) {
71057 context.surface().selectAll(
71058 utilEntityOrMemberSelector([d.entity.id], context.graph())
71059 ).classed('hover', true);
71064 function mouseout() {
71065 context.surface().selectAll('.hover')
71066 .classed('hover', false);
71070 function click(change) {
71071 if (change.changeType === 'deleted') {
71074 var entity = change.entity;
71075 _entityID = change.entity.id;
71076 context.map().zoomTo(entity);
71077 context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
71078 .classed('hover', true);
71084 commitChanges.entityID = function(_) {
71085 if (!arguments.length) return _entityID;
71087 return commitChanges;
71091 return commitChanges;
71094 function uiCommitWarnings(context) {
71096 function commitWarnings(selection) {
71098 var changes = context.history().changes();
71099 var warnings = context.history().validate(changes);
71101 var container = selection.selectAll('.warning-section')
71102 .data(warnings.length ? [0] : []);
71107 var containerEnter = container.enter()
71109 .attr('class', 'modal-section warning-section fillL2');
71113 .text(t('commit.warnings'));
71117 .attr('class', 'changeset-list');
71119 container = containerEnter
71123 var items = container.select('ul').selectAll('li')
71129 var itemsEnter = items.enter()
71131 .attr('class', 'warning-item');
71134 .call(svgIcon('#iD-icon-alert', 'pre-text'));
71138 .text(function(d) { return d.message; });
71140 itemsEnter.filter(function(d) { return d.tooltip; })
71142 .title(function(d) { return d.tooltip; })
71150 .on('mouseover', mouseover)
71151 .on('mouseout', mouseout)
71152 .on('click', warningClick);
71155 function mouseover(d) {
71157 context.surface().selectAll(
71158 utilEntityOrMemberSelector([d.entity.id], context.graph())
71159 ).classed('hover', true);
71164 function mouseout() {
71165 context.surface().selectAll('.hover')
71166 .classed('hover', false);
71170 function warningClick(d) {
71172 context.map().zoomTo(d.entity);
71173 context.enter(modeSelect(context, [d.entity.id]));
71180 return commitWarnings;
71184 var readOnlyTags = [
71185 /^changesets_count$/,
71193 // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
71194 // from https://stackoverflow.com/a/25575009
71195 var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
71198 function uiCommit(context) {
71199 var dispatch$$1 = dispatch('cancel', 'save');
71203 var changesetEditor = uiChangesetEditor(context)
71204 .on('change', changeTags);
71205 var rawTagEditor = uiRawTagEditor(context)
71206 .on('change', changeTags);
71207 var commitChanges = uiCommitChanges(context);
71208 var commitWarnings = uiCommitWarnings(context);
71211 function commit(selection$$1) {
71212 _selection = selection$$1;
71214 var osm = context.connection();
71217 // expire stored comment, hashtags, source after cutoff datetime - #3947 #4899
71218 var commentDate = +context.storage('commentDate') || 0;
71219 var currDate = Date.now();
71220 var cutoff = 2 * 86400 * 1000; // 2 days
71221 if (commentDate > currDate || currDate - commentDate > cutoff) {
71222 context.storage('comment', null);
71223 context.storage('hashtags', null);
71224 context.storage('source', null);
71228 if (!_changeset$1) {
71229 var detected = utilDetect();
71231 comment: context.storage('comment') || '',
71232 created_by: ('iD ' + context.version).substr(0, 255),
71233 host: detected.host.substr(0, 255),
71234 locale: detected.locale.substr(0, 255)
71237 // call findHashtags initially - this will remove stored
71238 // hashtags if any hashtags are found in the comment - #4304
71239 findHashtags(tags, true);
71241 var hashtags = context.storage('hashtags');
71243 tags.hashtags = hashtags;
71246 // iD 2.8.1 could write a literal 'undefined' here.. see #5021
71247 // (old source values expire after 2 days, so 'undefined' checks can go away in v2.9)
71248 var source = context.storage('source');
71249 if (source && source !== 'undefined') {
71250 tags.source = source;
71251 } else if (source === 'undefined') {
71252 context.storage('source', null);
71255 _changeset$1 = new osmChangeset({ tags: tags });
71258 tags = clone(_changeset$1.tags);
71259 tags.imagery_used = context.history().imageryUsed().join(';').substr(0, 255);
71260 _changeset$1 = _changeset$1.update({ tags: tags });
71262 var header = selection$$1.selectAll('.header')
71267 .attr('class', 'header fillL')
71269 .text(t('commit.title'));
71271 var body = selection$$1.selectAll('.body')
71274 body = body.enter()
71276 .attr('class', 'body')
71280 // Changeset Section
71281 var changesetSection = body.selectAll('.changeset-editor')
71284 changesetSection = changesetSection.enter()
71286 .attr('class', 'modal-section changeset-editor')
71287 .merge(changesetSection);
71290 .call(changesetEditor
71291 .changesetID(_changeset$1.id)
71297 body.call(commitWarnings);
71300 // Upload Explanation
71301 var saveSection = body.selectAll('.save-section')
71304 saveSection = saveSection.enter()
71306 .attr('class','modal-section save-section fillL cf')
71307 .merge(saveSection);
71309 var prose = saveSection.selectAll('.commit-info')
71312 prose = prose.enter()
71314 .attr('class', 'commit-info')
71315 .text(t('commit.upload_explanation'))
71318 osm.userDetails(function(err, user) {
71321 var userLink = select(document.createElement('div'));
71323 _userDetails = user;
71325 if (user.image_url) {
71328 .attr('src', user.image_url)
71329 .attr('class', 'icon pre-text user-icon');
71334 .attr('class','user-info')
71335 .text(user.display_name)
71336 .attr('href', osm.userURL(user.display_name))
71337 .attr('tabindex', -1)
71338 .attr('target', '_blank');
71341 .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
71346 var requestReview = saveSection.selectAll('.request-review')
71350 var requestReviewEnter = requestReview.enter()
71352 .attr('class', 'request-review');
71354 var labelEnter = requestReviewEnter
71356 .attr('for', 'commit-input-request-review');
71360 .attr('type', 'checkbox')
71361 .attr('id', 'commit-input-request-review');
71365 .text(t('commit.request_review'));
71368 requestReview = requestReview
71369 .merge(requestReviewEnter);
71371 var requestReviewInput = requestReview.selectAll('input')
71372 .property('checked', isReviewRequested(_changeset$1.tags))
71373 .on('change', toggleRequestReview);
71377 var buttonSection = saveSection.selectAll('.buttons')
71381 var buttonEnter = buttonSection.enter()
71383 .attr('class', 'buttons fillL cf');
71387 .attr('class', 'secondary-action col5 button cancel-button')
71389 .attr('class', 'label')
71390 .text(t('commit.cancel'));
71394 .attr('class', 'action col5 button save-button')
71396 .attr('class', 'label')
71397 .text(t('commit.save'));
71400 buttonSection = buttonSection
71401 .merge(buttonEnter);
71403 buttonSection.selectAll('.cancel-button')
71404 .on('click.cancel', function() {
71405 var selectedID = commitChanges.entityID();
71406 dispatch$$1.call('cancel', this, selectedID);
71409 buttonSection.selectAll('.save-button')
71410 .attr('disabled', function() {
71411 var n = select('#preset-input-comment').node();
71412 return (n && n.value.length) ? null : true;
71414 .on('click.save', function() {
71415 this.blur(); // avoid keeping focus on the button - #4641
71416 dispatch$$1.call('save', this, _changeset$1);
71421 var tagSection = body.selectAll('.tag-section.raw-tag-editor')
71424 tagSection = tagSection.enter()
71426 .attr('class', 'modal-section tag-section raw-tag-editor')
71427 .merge(tagSection);
71429 var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
71432 .expanded(expanded)
71433 .readOnlyTags(readOnlyTags)
71434 .tags(clone(_changeset$1.tags))
71439 body.call(commitChanges);
71442 function toggleRequestReview() {
71443 var rr = requestReviewInput.property('checked');
71444 updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
71446 var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
71449 .expanded(expanded)
71450 .readOnlyTags(readOnlyTags)
71451 .tags(clone(_changeset$1.tags))
71457 function changeTags(changed, onInput) {
71458 if (changed.hasOwnProperty('comment')) {
71459 if (changed.comment === undefined) {
71460 changed.comment = '';
71463 context.storage('comment', changed.comment);
71464 context.storage('commentDate', Date.now());
71467 if (changed.hasOwnProperty('source')) {
71468 if (changed.source === undefined) {
71469 context.storage('source', null);
71470 } else if (!onInput) {
71471 context.storage('source', changed.source);
71472 context.storage('commentDate', Date.now());
71476 updateChangeset(changed, onInput);
71479 _selection.call(commit);
71484 function findHashtags(tags, commentOnly) {
71485 var inComment = commentTags();
71486 var inHashTags = hashTags();
71488 if (inComment !== null) { // when hashtags are detected in comment...
71489 context.storage('hashtags', null); // always remove stored hashtags - #4304
71490 if (commentOnly) { inHashTags = null; } // optionally override hashtags field
71492 return unionBy(inComment, inHashTags, function (s) {
71493 return s.toLowerCase();
71496 // Extract hashtags from `comment`
71497 function commentTags() {
71498 return tags.comment
71499 .replace(/http\S*/g, '') // drop anything that looks like a URL - #4289
71500 .match(hashtagRegex);
71503 // Extract and clean hashtags from `hashtags`
71504 function hashTags() {
71505 var t$$1 = tags.hashtags || '';
71508 .map(function (s) {
71509 if (s[0] !== '#') { s = '#' + s; } // prepend '#'
71510 var matched = s.match(hashtagRegex);
71511 return matched && matched[0];
71512 }).filter(Boolean); // exclude falsey
71517 function isReviewRequested(tags) {
71518 var rr = tags.review_requested;
71519 if (rr === undefined) return false;
71520 rr = rr.trim().toLowerCase();
71521 return !(rr === '' || rr === 'no');
71525 function updateChangeset(changed, onInput) {
71526 var tags = clone(_changeset$1.tags);
71528 forEach(changed, function(v, k) {
71529 k = k.trim().substr(0, 255);
71530 if (readOnlyTags.indexOf(k) !== -1) return;
71532 if (k !== '' && v !== undefined) {
71536 tags[k] = v.trim().substr(0, 255);
71544 // when changing the comment, override hashtags with any found in comment.
71545 var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
71546 var arr = findHashtags(tags, commentOnly);
71548 tags.hashtags = arr.join(';').substr(0, 255);
71549 context.storage('hashtags', tags.hashtags);
71551 delete tags.hashtags;
71552 context.storage('hashtags', null);
71556 // always update userdetails, just in case user reauthenticates as someone else
71557 if (_userDetails && _userDetails.changesets_count !== undefined) {
71558 var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1; // #4283
71559 tags.changesets_count = String(changesetsCount);
71561 // first 100 edits - new user
71562 if (changesetsCount <= 100) {
71564 s = context.storage('walkthrough_completed');
71566 tags['ideditor:walkthrough_completed'] = s;
71569 s = context.storage('walkthrough_progress');
71571 tags['ideditor:walkthrough_progress'] = s;
71574 s = context.storage('walkthrough_started');
71576 tags['ideditor:walkthrough_started'] = s;
71580 delete tags.changesets_count;
71583 if (!isEqual(_changeset$1.tags, tags)) {
71584 _changeset$1 = _changeset$1.update({ tags: tags });
71589 commit.reset = function() {
71590 _changeset$1 = null;
71594 return utilRebind(commit, dispatch$$1, 'on');
71597 function uiConfirm(selection) {
71598 var modalSelection = uiModal(selection);
71600 modalSelection.select('.modal')
71601 .classed('modal-alert', true);
71603 var section = modalSelection.select('.content');
71605 section.append('div')
71606 .attr('class', 'modal-section header');
71608 section.append('div')
71609 .attr('class', 'modal-section message-text');
71611 var buttons = section.append('div')
71612 .attr('class', 'modal-section buttons cf');
71615 modalSelection.okButton = function() {
71618 .attr('class', 'action col4')
71619 .on('click.confirm', function() {
71620 modalSelection.remove();
71622 .text(t('confirm.okay'))
71626 return modalSelection;
71630 return modalSelection;
71633 function uiConflicts(context) {
71634 var dispatch$$1 = dispatch('cancel', 'save');
71635 var keybinding = d3keybinding('conflicts');
71640 function keybindingOn() {
71642 .call(keybinding.on('⎋', cancel, true));
71645 function keybindingOff() {
71647 .call(keybinding.off);
71650 function tryAgain() {
71652 dispatch$$1.call('save');
71655 function cancel() {
71657 dispatch$$1.call('cancel');
71661 function conflicts(selection$$1) {
71664 var headerEnter = selection$$1.selectAll('.header')
71668 .attr('class', 'header fillL');
71672 .attr('class', 'fr')
71673 .on('click', cancel)
71674 .call(svgIcon('#iD-icon-close'));
71678 .text(t('save.conflict.header'));
71680 var bodyEnter = selection$$1.selectAll('.body')
71684 .attr('class', 'body fillL');
71686 var conflictsHelpEnter = bodyEnter
71688 .attr('class', 'conflicts-help')
71689 .text(t('save.conflict.help'));
71692 // Download changes link
71693 var detected = utilDetect();
71694 var changeset = new osmChangeset();
71696 delete changeset.id; // Export without changeset_id
71698 var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
71699 var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
71700 var fileName = 'changes.osc';
71702 var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
71704 .attr('class', 'download-changes');
71706 if (detected.download) { // All except IE11 and Edge
71707 linkEnter // download the data as a file
71708 .attr('href', window.URL.createObjectURL(blob))
71709 .attr('download', fileName);
71711 } else { // IE11 and Edge
71712 linkEnter // open data uri in a new tab
71713 .attr('target', '_blank')
71714 .on('click.download', function() {
71715 navigator.msSaveBlob(blob, fileName);
71720 .call(svgIcon('#iD-icon-load', 'inline'))
71722 .text(t('save.conflict.download_changes'));
71727 .attr('class', 'conflict-container fillL3')
71728 .call(showConflict, 0);
71732 .attr('class', 'conflicts-done')
71733 .attr('opacity', 0)
71734 .style('display', 'none')
71735 .text(t('save.conflict.done'));
71737 var buttonsEnter = bodyEnter
71739 .attr('class','buttons col12 joined conflicts-buttons');
71743 .attr('disabled', _conflictList.length > 1)
71744 .attr('class', 'action conflicts-button col6')
71745 .text(t('save.title'))
71746 .on('click.try_again', tryAgain);
71750 .attr('class', 'secondary-action conflicts-button col6')
71751 .text(t('confirm.cancel'))
71752 .on('click.cancel', cancel);
71756 function showConflict(selection$$1, index) {
71757 index = utilWrap(index, _conflictList.length);
71759 var parent = select(selection$$1.node().parentNode);
71761 // enable save button if this is the last conflict being reviewed..
71762 if (index === _conflictList.length - 1) {
71763 window.setTimeout(function() {
71764 parent.select('.conflicts-button')
71765 .attr('disabled', null);
71767 parent.select('.conflicts-done')
71769 .attr('opacity', 1)
71770 .style('display', 'block');
71774 var conflict = selection$$1
71775 .selectAll('.conflict')
71776 .data([_conflictList[index]]);
71781 var conflictEnter = conflict.enter()
71783 .attr('class', 'conflict');
71787 .attr('class', 'conflict-count')
71788 .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
71792 .attr('class', 'conflict-description')
71794 .text(function(d) { return d.name; })
71795 .on('click', function(d) {
71796 event.preventDefault();
71797 zoomToEntity(d.id);
71800 var details = conflictEnter
71802 .attr('class', 'conflict-detail-container');
71806 .attr('class', 'conflict-detail-list')
71808 .data(function(d) { return d.details || []; })
71811 .attr('class', 'conflict-detail-item')
71812 .html(function(d) { return d; });
71816 .attr('class', 'conflict-choices')
71821 .attr('class', 'conflict-nav-buttons joined cf')
71822 .selectAll('button')
71823 .data(['previous', 'next'])
71826 .text(function(d) { return t('save.conflict.' + d); })
71827 .attr('class', 'conflict-nav-button action col6')
71828 .attr('disabled', function(d, i) {
71829 return (i === 0 && index === 0) ||
71830 (i === 1 && index === _conflictList.length - 1) || null;
71832 .on('click', function(d, i) {
71833 event.preventDefault();
71835 var container = parent.selectAll('.conflict-container');
71836 var sign = (i === 0 ? -1 : 1);
71839 .selectAll('.conflict')
71843 .call(showConflict, index + sign);
71849 function addChoices(selection$$1) {
71850 var choices = selection$$1
71852 .attr('class', 'layer-list')
71854 .data(function(d) { return d.choices || []; });
71857 var choicesEnter = choices.enter()
71859 .attr('class', 'layer');
71861 var labelEnter = choicesEnter
71866 .attr('type', 'radio')
71867 .attr('name', function(d) { return d.id; })
71868 .on('change', function(d, i) {
71869 var ul = this.parentNode.parentNode.parentNode;
71870 ul.__data__.chosen = i;
71876 .text(function(d) { return d.text; });
71881 .each(function(d, i) {
71882 var ul = this.parentNode;
71883 if (ul.__data__.chosen === i) {
71890 function choose(ul, datum) {
71891 if (event) event.preventDefault();
71895 .classed('active', function(d) { return d === datum; })
71896 .selectAll('input')
71897 .property('checked', function(d) { return d === datum; });
71899 var extent = geoExtent$$1();
71902 entity = context.graph().hasEntity(datum.id);
71903 if (entity) extent._extend(entity.extent(context.graph()));
71907 entity = context.graph().hasEntity(datum.id);
71908 if (entity) extent._extend(entity.extent(context.graph()));
71910 zoomToEntity(datum.id, extent);
71914 function zoomToEntity(id, extent) {
71915 context.surface().selectAll('.hover')
71916 .classed('hover', false);
71918 var entity = context.graph().hasEntity(id);
71921 context.map().trimmedExtent(extent);
71923 context.map().zoomTo(entity);
71925 context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
71926 .classed('hover', true);
71931 // The conflict list should be an array of objects like:
71934 // name: entityName(local),
71935 // details: merge.conflicts(),
71938 // choice(id, keepMine, forceLocal),
71939 // choice(id, keepTheirs, forceRemote)
71942 conflicts.conflictList = function(_) {
71943 if (!arguments.length) return _conflictList;
71949 conflicts.origChanges = function(_) {
71950 if (!arguments.length) return _origChanges;
71956 return utilRebind(conflicts, dispatch$$1, 'on');
71959 function uiEditMenu(context, operations) {
71961 var center = [0, 0];
71962 var offset = [0, 0];
71965 var p = 8; // top padding
71966 var m = 4; // top margin
71967 var h = 15; // height of icon
71968 var vpBottomMargin = 45; // viewport bottom margin
71969 var vpSideMargin = 35; // viewport side margin
71970 var buttonWidth = 44;
71971 var buttonHeight = (2 * p + h);
71972 var menuWidth = buttonWidth;
71973 var menuHeight = (2 * m) + operations.length * buttonHeight;
71974 var menuSideMargin = 10;
71975 var tooltipWidth = 200;
71976 var tooltipHeight = 200; // a reasonable guess, real height depends on tooltip contents
71979 var editMenu = function (selection$$1) {
71980 if (!operations.length) return;
71982 selection$$1.node().parentNode.focus();
71984 var isRTL = textDirection === 'rtl';
71985 var viewport = context.surfaceRect();
71987 if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
71988 // menu is going left-to-right and near right viewport edge, go left instead
71990 } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
71991 // menu is going right-to-left and near left viewport edge, go right instead
71995 offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
71997 if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
71998 // menu is near bottom viewport edge, shift upwards
71999 offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
72002 var origin = [ center[0] + offset[0], center[1] + offset[1] ];
72004 menu = selection$$1
72006 .attr('class', 'edit-menu')
72007 .attr('transform', 'translate(' + origin + ')')
72008 .attr('opacity', 0);
72012 .attr('opacity', 1);
72016 .attr('class', 'edit-menu-background')
72020 .attr('width', menuWidth)
72021 .attr('height', menuHeight)
72022 .attr('stroke-linecap', 'round');
72025 var button = menu.selectAll('.edit-menu-item')
72029 .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
72030 .classed('disabled', function (d) { return d.disabled(); })
72031 .attr('transform', function (d, i) {
72032 return 'translate(' + geoVecFloor([
72034 m + i * buttonHeight
72035 ]).join(',') + ')';
72041 .attr('width', buttonWidth)
72042 .attr('height', buttonHeight)
72043 .on('click', click)
72044 .on('mousedown', mousedown)
72045 .on('mouseover', mouseover)
72046 .on('mouseout', mouseout);
72050 .attr('width', '20')
72051 .attr('height', '20')
72052 .attr('transform', function () { return 'translate(' + [2 * p, 5] + ')'; })
72053 .attr('xlink:href', function (d) { return '#iD-operation-' + d.id; });
72055 tooltip = select(document.body)
72057 .attr('class', 'tooltip-inner edit-menu-tooltip');
72060 function click(operation) {
72061 event.stopPropagation();
72062 if (operation.disabled()) return;
72067 function mousedown() {
72068 event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
72071 function mouseover(d, i) {
72075 tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
72077 tipX = viewport.left + origin[0] - 4 - tooltipWidth;
72080 if (tipX + tooltipWidth > viewport.right) {
72081 // tip is going left-to-right and near right viewport edge, go left instead
72082 tipX = viewport.left + origin[0] - 4 - tooltipWidth;
72083 } else if (tipX < viewport.left) {
72084 // tip is going right-to-left and near left viewport edge, go right instead
72085 tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
72088 tipY = viewport.top + origin[1] + (i * buttonHeight);
72089 if (tipY + tooltipHeight > viewport.bottom) {
72090 // tip is near bottom viewport edge, shift upwards
72091 tipY -= tipY + tooltipHeight - viewport.bottom;
72095 .style('left', tipX + 'px')
72096 .style('top', tipY + 'px')
72097 .style('display', 'block')
72098 .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
72101 function mouseout() {
72102 tooltip.style('display', 'none');
72107 editMenu.close = function () {
72110 .style('pointer-events', 'none')
72112 .attr('opacity', 0)
72122 editMenu.center = function (_) {
72123 if (!arguments.length) return center;
72135 function uiFlash() {
72136 var _duration = 2000;
72137 var _iconName = '#iD-icon-no';
72138 var _iconClass = 'disabled';
72145 _flashTimer.stop();
72148 select('#footer-wrap')
72149 .attr('class', 'footer-hide');
72150 select('#flash-wrap')
72151 .attr('class', 'footer-show');
72153 var content = select('#flash-wrap').selectAll('.flash-content')
72157 var contentEnter = content.enter()
72159 .attr('class', 'flash-content');
72161 var iconEnter = contentEnter
72163 .attr('class', 'flash-icon')
72165 .attr('transform', 'translate(10,10)');
72173 .attr('transform', 'translate(-7,-7)')
72174 .attr('width', '14')
72175 .attr('height', '14');
72179 .attr('class', 'flash-text');
72184 .merge(contentEnter);
72187 .selectAll('.flash-icon')
72188 .attr('class', 'flash-icon ' + (_iconClass || ''));
72191 .selectAll('.flash-icon use')
72192 .attr('xlink:href', _iconName);
72195 .selectAll('.flash-text')
72196 .attr('class', 'flash-text ' + (_textClass || ''))
72200 _flashTimer = timeout$1(function() {
72201 _flashTimer = null;
72202 select('#footer-wrap')
72203 .attr('class', 'footer-show');
72204 select('#flash-wrap')
72205 .attr('class', 'footer-hide');
72212 flash.duration = function(_) {
72213 if (!arguments.length) return _duration;
72218 flash.text = function(_) {
72219 if (!arguments.length) return _text;
72224 flash.textClass = function(_) {
72225 if (!arguments.length) return _textClass;
72230 flash.iconName = function(_) {
72231 if (!arguments.length) return _iconName;
72236 flash.iconClass = function(_) {
72237 if (!arguments.length) return _iconClass;
72245 function uiLasso(context) {
72246 var group, polygon;
72248 lasso.coordinates = [];
72250 function lasso(selection$$1) {
72251 context.container()
72252 .classed('lasso', true);
72254 group = selection$$1
72256 .attr('class', 'lasso hide');
72260 .attr('class', 'lasso-path');
72263 .call(uiToggle(true));
72269 polygon.data([lasso.coordinates])
72270 .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
72275 lasso.extent = function () {
72276 return lasso.coordinates.reduce(function(extent, point$$1) {
72277 return extent.extend(geoExtent$$1(point$$1));
72278 }, geoExtent$$1());
72282 lasso.p = function(_) {
72283 if (!arguments.length) return lasso;
72284 lasso.coordinates.push(_);
72290 lasso.close = function() {
72292 group.call(uiToggle(false, function() {
72293 select(this).remove();
72296 context.container().classed('lasso', false);
72303 function uiRadialMenu(context, operations) {
72305 var center = [0, 0];
72309 var radialMenu = function(selection$$1) {
72310 if (!operations.length) return;
72312 selection$$1.node().parentNode.focus();
72314 function click(operation) {
72315 event.stopPropagation();
72316 if (operation.disabled()) return;
72318 radialMenu.close();
72321 menu = selection$$1
72323 .attr('class', 'radial-menu')
72324 .attr('transform', 'translate(' + center + ')')
72325 .attr('opacity', 0);
72329 .attr('opacity', 1);
72332 var a = Math.PI / 4;
72333 var a0 = -Math.PI / 4;
72334 var a1 = a0 + (operations.length - 1) * a;
72338 .attr('class', 'radial-menu-background')
72339 .attr('d', 'M' + r * Math.sin(a0) + ',' +
72341 ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
72342 (r * Math.sin(a1) + 1e-3) + ',' +
72343 (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
72344 .attr('stroke-width', 50)
72345 .attr('stroke-linecap', 'round');
72347 var button = menu.selectAll()
72351 .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
72352 .classed('disabled', function(d) { return d.disabled(); })
72353 .attr('transform', function(d, i) {
72354 return 'translate(' + geoVecFloor([
72355 r * Math.sin(a0 + i * a),
72356 r * Math.cos(a0 + i * a)]).join(',') + ')';
72362 .on('click', click)
72363 .on('mousedown', mousedown)
72364 .on('mouseover', mouseover)
72365 .on('mouseout', mouseout);
72369 .attr('transform', 'translate(-10,-10)')
72370 .attr('width', '20')
72371 .attr('height', '20')
72372 .attr('xlink:href', function(d) { return '#iD-operation-' + d.id; });
72374 tooltip = select(document.body)
72376 .attr('class', 'tooltip-inner radial-menu-tooltip');
72378 function mousedown() {
72379 event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
72382 function mouseover(d, i) {
72383 var rect = context.surfaceRect();
72384 var angle = a0 + i * a;
72385 var top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px';
72386 var left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px';
72387 var bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px';
72388 var right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
72391 .style('top', null)
72392 .style('left', null)
72393 .style('bottom', null)
72394 .style('right', null)
72395 .style('display', 'block')
72396 .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
72400 .style('right', right)
72401 .style('top', top);
72402 } else if (i >= 4) {
72404 .style('left', left)
72405 .style('bottom', bottom);
72408 .style('left', left)
72409 .style('top', top);
72413 function mouseout() {
72414 tooltip.style('display', 'none');
72419 radialMenu.close = function() {
72422 .style('pointer-events', 'none')
72424 .attr('opacity', 0)
72434 radialMenu.center = function(_) {
72435 if (!arguments.length) return center;
72444 function uiSelectionList(context, selectedIDs) {
72446 function selectEntity(entity) {
72447 context.enter(modeSelect(context, [entity.id]));
72451 function deselectEntity(entity) {
72452 event.stopPropagation();
72453 var index = selectedIDs.indexOf(entity.id);
72455 selectedIDs.splice(index, 1);
72457 context.enter(modeSelect(context, selectedIDs));
72461 function selectionList(selection$$1) {
72462 selection$$1.classed('selection-list-pane', true);
72464 var header = selection$$1
72466 .attr('class', 'header fillL cf');
72470 .text(t('inspector.multiselect'));
72472 var listWrap = selection$$1
72474 .attr('class', 'inspector-body');
72476 var list = listWrap
72478 .attr('class', 'feature-list cf');
72480 context.history().on('change.selection-list', drawList);
72484 function drawList() {
72485 var entities = selectedIDs
72486 .map(function(id) { return context.hasEntity(id); })
72487 .filter(function(entity) { return entity; });
72489 var items = list.selectAll('.feature-list-item')
72490 .data(entities, osmEntity$$1.key);
72496 var enter = items.enter()
72498 .attr('class', 'feature-list-item')
72499 .on('click', selectEntity);
72503 .attr('class', 'label');
72507 .attr('class', 'close')
72508 .on('click', deselectEntity)
72509 .call(svgIcon('#iD-icon-close'));
72513 .attr('class', 'entity-geom-icon')
72514 .call(svgIcon('', 'pre-text'));
72518 .attr('class', 'entity-type');
72522 .attr('class', 'entity-name');
72525 items = items.merge(enter);
72527 items.selectAll('.entity-geom-icon use')
72528 .attr('href', function() {
72529 var entity = this.parentNode.parentNode.__data__;
72530 return '#iD-icon-' + context.geometry(entity.id);
72533 items.selectAll('.entity-type')
72534 .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
72536 items.selectAll('.entity-name')
72537 .text(function(entity) { return utilDisplayName(entity); });
72541 return selectionList;
72544 function uiSourceSwitch(context) {
72549 event.preventDefault();
72551 var osm = context.connection();
72554 if (context.inIntro()) return;
72556 if (context.history().hasChanges() &&
72557 !window.confirm(t('source_switch.lose_changes'))) return;
72559 var isLive = select(this)
72563 context.enter(modeBrowse(context));
72564 context.history().clearSaved(); // remove saved history
72565 context.flush(); // remove stored data
72568 .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
72569 .classed('live', isLive);
72571 osm.switch(isLive ? keys[0] : keys[1]); // switch connection (warning: dispatches 'change' event)
72574 var sourceSwitch = function(selection$$1) {
72578 .text(t('source_switch.live'))
72579 .classed('live', true)
72580 .attr('tabindex', -1)
72581 .on('click', click);
72585 sourceSwitch.keys = function(_) {
72586 if (!arguments.length) return keys;
72588 return sourceSwitch;
72592 return sourceSwitch;
72595 function uiSuccess$$1(context) {
72598 // All else being equal, rank more "social" communities higher
72599 // (anything not in this list receives no adjustment)
72600 var COMMUNITYRANK = {
72610 var detected = utilDetect();
72611 var dispatch$$1 = dispatch('cancel');
72616 // string-to-date parsing in JavaScript is weird
72617 function parseEventDate(when) {
72620 var raw = when.trim();
72623 if (!/Z$/.test(raw)) { // if no trailing 'Z', add one
72624 raw += 'Z'; // this forces date to be parsed as a UTC date
72627 var parsed = new Date(raw);
72628 return new Date(parsed.toUTCString().substr(0, 25)); // convert to local timezone
72632 function success(selection$$1) {
72633 var header = selection$$1
72635 .attr('class', 'header fillL');
72639 .attr('class', 'fr')
72640 .on('click', function() { dispatch$$1.call('cancel'); })
72641 .call(svgIcon('#iD-icon-close'));
72645 .text(t('success.just_edited'));
72647 var body = selection$$1
72649 .attr('class', 'body save-success fillL');
72653 .attr('class', 'save-summary');
72657 .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
72661 .text(t('success.help_html'))
72663 .attr('class', 'link-out')
72664 .attr('target', '_blank')
72665 .attr('tabindex', -1)
72666 .attr('href', t('success.help_link_url'))
72667 .call(svgIcon('#iD-icon-out-link', 'inline'))
72669 .text(t('success.help_link_text'));
72671 var osm = context.connection();
72674 var changesetURL = osm.changesetURL(_changeset.id);
72676 var table = summary
72678 .attr('class', 'summary-table');
72682 .attr('class', 'summary-row');
72686 .attr('class', 'cell-icon summary-icon')
72688 .attr('target', '_blank')
72689 .attr('href', changesetURL)
72691 .attr('class', 'logo-small')
72693 .attr('xlink:href', '#iD-logo-osm');
72695 var summaryDetail = row
72697 .attr('class', 'cell-detail summary-detail');
72701 .attr('class', 'cell-detail summary-view-on-osm')
72702 .attr('target', '_blank')
72703 .attr('href', changesetURL)
72704 .text(t('success.view_on_osm'));
72708 .text(t('success.changeset_id', { changeset_id: _changeset.id }));
72711 // Gather community polygon IDs intersecting the map..
72712 var matchFeatures = data.community.query(context.map().center(), true) || [];
72713 var matchIDs = matchFeatures.map(function(feature) { return feature.id; });
72715 // Gather community resources that are either global or match a polygon.
72716 var matchResources = filter(data.community.resources, function(v) {
72717 return !v.featureId || matchIDs.indexOf(v.featureId) !== -1;
72720 if (matchResources.length) {
72721 // sort by size ascending, then by community rank
72722 matchResources.sort(function(a, b) {
72723 var aSize = Infinity;
72724 var bSize = Infinity;
72725 var aRank = COMMUNITYRANK[a.type] || 0;
72726 var bRank = COMMUNITYRANK[b.type] || 0;
72729 aSize = data.community.features[a.featureId].properties.area;
72732 bSize = data.community.features[b.featureId].properties.area;
72735 return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
72739 .call(showCommunityLinks, matchResources);
72744 function showCommunityLinks(selection$$1, matchResources) {
72745 var communityLinks = selection$$1
72747 .attr('class', 'save-communityLinks');
72751 .text(t('success.like_osm'));
72753 var table = communityLinks
72755 .attr('class', 'community-table');
72757 var row = table.selectAll('.community-row')
72758 .data(matchResources);
72760 var rowEnter = row.enter()
72762 .attr('class', 'community-row');
72766 .attr('class', 'cell-icon community-icon')
72768 .attr('target', '_blank')
72769 .attr('href', function(d) { return d.url; })
72771 .attr('class', 'logo-small')
72773 .attr('xlink:href', function(d) { return '#community-' + d.type; });
72775 var communityDetail = rowEnter
72777 .attr('class', 'cell-detail community-detail');
72780 .each(showCommunityDetails);
72784 .attr('class', 'community-missing')
72785 .text(t('success.missing'))
72787 .attr('class', 'link-out')
72788 .attr('target', '_blank')
72789 .attr('tabindex', -1)
72790 .call(svgIcon('#iD-icon-out-link', 'inline'))
72791 .attr('href', 'https://github.com/osmlab/osm-community-index/issues')
72793 .text(t('success.tell_us'));
72797 function showCommunityDetails(d) {
72798 var selection$$1 = select(this);
72799 var communityID = d.id;
72800 var replacements = {
72801 url: linkify(d.url),
72802 signupUrl: linkify(d.signupUrl || d.url)
72807 .attr('class', 'community-name')
72809 .attr('target', '_blank')
72810 .attr('href', d.url)
72811 .text(t('community.' + d.id + '.name'));
72813 var descriptionHTML = t('community.' + d.id + '.description', replacements);
72815 if (d.type === 'reddit') { // linkify subreddits #4997
72816 descriptionHTML = descriptionHTML
72817 .replace(/(\/r\/\w*\/*)/i, function(match) { return linkify(d.url, match); });
72822 .attr('class', 'community-description')
72823 .html(descriptionHTML);
72825 if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
72828 .call(uiDisclosure(context, 'community-more-' + d.id, false)
72830 .updatePreference(false)
72831 .title(t('success.more'))
72836 var nextEvents = (d.events || [])
72837 .map(function(event$$1) {
72838 event$$1.date = parseEventDate(event$$1.when);
72841 .filter(function(event$$1) { // date is valid and future (or today)
72842 var t$$1 = event$$1.date.getTime();
72843 var now = (new Date()).setHours(0,0,0,0);
72844 return !isNaN(t$$1) && t$$1 >= now;
72846 .sort(function(a, b) { // sort by date ascending
72847 return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
72849 .slice(0, MAXEVENTS); // limit number of events shown
72851 if (nextEvents.length) {
72854 .call(uiDisclosure(context, 'community-events-' + d.id, false)
72856 .updatePreference(false)
72857 .title(t('success.events'))
72858 .content(showNextEvents)
72860 .select('.hide-toggle')
72862 .attr('class', 'badge-text')
72863 .text(nextEvents.length);
72867 function showMore(selection$$1) {
72868 var more = selection$$1
72870 .attr('class', 'community-more');
72872 if (d.extendedDescription) {
72875 .attr('class', 'community-extended-description')
72876 .html(t('community.' + d.id + '.extendedDescription', replacements));
72879 if (d.languageCodes && d.languageCodes.length) {
72882 .attr('class', 'community-languages')
72883 .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
72888 function showNextEvents(selection$$1) {
72889 var events = selection$$1
72891 .attr('class', 'community-events');
72893 var item = events.selectAll('.community-event')
72896 var itemEnter = item.enter()
72898 .attr('class', 'community-event');
72902 .attr('class', 'community-event-name')
72904 .attr('target', '_blank')
72905 .attr('href', function(d) { return d.url; })
72906 .text(function(d) {
72908 if (d.i18n && d.id) {
72909 name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
72916 .attr('class', 'community-event-when')
72917 .text(function(d) {
72919 weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
72921 if (d.date.getHours() || d.date.getMinutes()) { // include time if it has one
72922 options.hour = 'numeric';
72923 options.minute = 'numeric';
72925 return d.date.toLocaleString(detected.locale, options);
72930 .attr('class', 'community-event-where')
72931 .text(function(d) {
72932 var where = d.where;
72933 if (d.i18n && d.id) {
72934 where = t('community.' + communityID + '.events.' + d.id + '.where', { default: where });
72941 .attr('class', 'community-event-description')
72942 .text(function(d) {
72943 var description = d.description;
72944 if (d.i18n && d.id) {
72945 description = t('community.' + communityID + '.events.' + d.id + '.description', { default: description });
72947 return description;
72952 function linkify(url, text) {
72953 text = text || url;
72954 return '<a target="_blank" href="' + url + '">' + text + '</a>';
72959 success.changeset = function(_) {
72960 if (!arguments.length) return _changeset;
72966 success.location = function(_) {
72967 if (!arguments.length) return _location;
72973 return utilRebind(success, dispatch$$1, 'on');
72976 function coreHistory(context) {
72977 var imageryUsed = ['Bing'];
72978 var dispatch$$1 = dispatch('change', 'undone', 'redone');
72979 var lock = utilSessionMutex('lock');
72980 var duration = 150;
72981 var _checkpoints = {};
72987 // internal _act, accepts list of actions and eased time
72988 function _act(actions, t) {
72989 actions = Array.prototype.slice.call(actions);
72992 if (!isFunction(actions[actions.length - 1])) {
72993 annotation = actions.pop();
72996 _stack[_index].transform = context.projection.transform();
72997 _stack[_index].selectedIDs = context.selectedIDs();
72999 var graph = _stack[_index].graph;
73000 for (var i = 0; i < actions.length; i++) {
73001 graph = actions[i](graph, t);
73006 annotation: annotation,
73007 imageryUsed: imageryUsed
73012 // internal _perform with eased time
73013 function _perform(args, t) {
73014 var previous = _stack[_index].graph;
73015 _stack = _stack.slice(0, _index + 1);
73016 _stack.push(_act(args, t));
73018 return change(previous);
73022 // internal _replace with eased time
73023 function _replace(args, t) {
73024 var previous = _stack[_index].graph;
73025 // assert(_index == _stack.length - 1)
73026 _stack[_index] = _act(args, t);
73027 return change(previous);
73031 // internal _overwrite with eased time
73032 function _overwrite(args, t) {
73033 var previous = _stack[_index].graph;
73038 _stack = _stack.slice(0, _index + 1);
73039 _stack.push(_act(args, t));
73041 return change(previous);
73045 // determine diffrence and dispatch a change event
73046 function change(previous) {
73047 var difference$$1 = coreDifference(previous, history.graph());
73048 dispatch$$1.call('change', this, difference$$1);
73049 return difference$$1;
73053 // iD uses namespaced keys so multiple installations do not conflict
73054 function getKey(n) {
73055 return 'iD_' + window.location.origin + '_' + n;
73061 graph: function() {
73062 return _stack[_index].graph;
73067 return _stack[0].graph;
73071 merge: function(entities, extent) {
73072 _stack[0].graph.rebase(entities, map$3(_stack, 'graph'), false);
73073 _tree.rebase(entities, false);
73075 dispatch$$1.call('change', this, undefined, extent);
73079 perform: function() {
73080 // complete any transition already in progress
73081 select(document).interrupt('history.perform');
73083 var transitionable = false;
73084 var action0 = arguments[0];
73086 if (arguments.length === 1 ||
73087 arguments.length === 2 && !isFunction(arguments[1])) {
73088 transitionable = !!action0.transitionable;
73091 if (transitionable) {
73092 var origArguments = arguments;
73094 .transition('history.perform')
73095 .duration(duration)
73097 .tween('history.tween', function() {
73098 return function(t) {
73099 if (t < 1) _overwrite([action0], t);
73102 .on('start', function() {
73103 _perform([action0], 0);
73105 .on('end interrupt', function() {
73106 _overwrite(origArguments, 1);
73110 return _perform(arguments);
73115 replace: function() {
73116 select(document).interrupt('history.perform');
73117 return _replace(arguments, 1);
73121 // Same as calling pop and then perform
73122 overwrite: function() {
73123 select(document).interrupt('history.perform');
73124 return _overwrite(arguments, 1);
73129 select(document).interrupt('history.perform');
73131 var previous = _stack[_index].graph;
73132 if (isNaN(+n) || +n < 0) {
73135 while (n-- > 0 && _index > 0) {
73139 return change(previous);
73143 // Back to the previous annotated state or _index = 0.
73145 select(document).interrupt('history.perform');
73147 var previous = _stack[_index].graph;
73148 while (_index > 0) {
73150 if (_stack[_index].annotation) break;
73153 dispatch$$1.call('undone', this, _stack[_index]);
73154 return change(previous);
73158 // Forward to the next annotated state.
73160 select(document).interrupt('history.perform');
73162 var previous = _stack[_index].graph;
73163 var tryIndex = _index;
73164 while (tryIndex < _stack.length - 1) {
73166 if (_stack[tryIndex].annotation) {
73168 dispatch$$1.call('redone', this, _stack[_index]);
73173 return change(previous);
73177 undoAnnotation: function() {
73180 if (_stack[i].annotation) return _stack[i].annotation;
73186 redoAnnotation: function() {
73187 var i = _index + 1;
73188 while (i <= _stack.length - 1) {
73189 if (_stack[i].annotation) return _stack[i].annotation;
73195 intersects: function(extent) {
73196 return _tree.intersects(extent, _stack[_index].graph);
73200 difference: function() {
73201 var base = _stack[0].graph;
73202 var head = _stack[_index].graph;
73203 return coreDifference(base, head);
73207 changes: function(action) {
73208 var base = _stack[0].graph;
73209 var head = _stack[_index].graph;
73212 head = action(head);
73215 var difference$$1 = coreDifference(base, head);
73218 modified: difference$$1.modified(),
73219 created: difference$$1.created(),
73220 deleted: difference$$1.deleted()
73225 validate: function(changes) {
73227 map$3(Validations, function(fn) { return fn()(changes, _stack[_index].graph); })
73232 hasChanges: function() {
73233 return this.difference().length() > 0;
73237 imageryUsed: function(sources) {
73239 imageryUsed = sources;
73242 var arr = map$3(_stack.slice(1, _index + 1), 'imageryUsed');
73243 return without(uniq(flatten(arr)), 'Custom');
73248 // save the current history state
73249 checkpoint: function(key) {
73250 _checkpoints[key] = {
73251 stack: cloneDeep(_stack),
73258 // restore history state to a given checkpoint or reset completely
73259 reset: function(key) {
73260 if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
73261 _stack = cloneDeep(_checkpoints[key].stack);
73262 _index = _checkpoints[key].index;
73264 _stack = [{graph: coreGraph$$1()}];
73266 _tree = coreTree(_stack[0].graph);
73269 dispatch$$1.call('change');
73274 toIntroGraph: function() {
73275 var nextId = { n: 0, r: 0, w: 0 };
73277 var graph = this.graph();
73278 var baseEntities = {};
73280 // clone base entities..
73281 forEach(graph.base().entities, function(entity) {
73282 var copy = cloneDeepWith(entity, customizer);
73283 baseEntities[copy.id] = copy;
73286 // replace base entities with head entities..
73287 forEach(graph.entities, function(entity, id) {
73289 var copy = cloneDeepWith(entity, customizer);
73290 baseEntities[copy.id] = copy;
73292 delete baseEntities[id];
73296 // swap temporary for permanent ids..
73297 forEach(baseEntities, function(entity) {
73298 if (Array.isArray(entity.nodes)) {
73299 entity.nodes = entity.nodes.map(function(node) {
73300 return permIds[node] || node;
73303 if (Array.isArray(entity.members)) {
73304 entity.members = entity.members.map(function(member) {
73305 member.id = permIds[member.id] || member.id;
73311 return JSON.stringify({ dataIntroGraph: baseEntities });
73314 function customizer(src) {
73315 var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
73316 if (isEmpty(copy.tags)) {
73320 if (Array.isArray(copy.loc)) {
73321 copy.loc[0] = +copy.loc[0].toFixed(6);
73322 copy.loc[1] = +copy.loc[1].toFixed(6);
73325 var match = src.id.match(/([nrw])-\d*/); // temporary id
73326 if (match !== null) {
73327 var nrw = match[1], permId;
73328 do { permId = nrw + (++nextId[nrw]); }
73329 while (baseEntities.hasOwnProperty(permId));
73331 copy.id = permIds[src.id] = permId;
73338 toJSON: function() {
73339 if (!this.hasChanges()) return;
73341 var allEntities = {};
73342 var baseEntities = {};
73343 var base = _stack[0];
73345 var s = _stack.map(function(i) {
73346 var modified = [], deleted = [];
73348 forEach(i.graph.entities, function(entity, id) {
73350 var key = osmEntity$$1.key(entity);
73351 allEntities[key] = entity;
73352 modified.push(key);
73357 // make sure that the originals of changed or deleted entities get merged
73358 // into the base of the _stack after restoring the data from JSON.
73359 if (id in base.graph.entities) {
73360 baseEntities[id] = base.graph.entities[id];
73362 // get originals of parent entities too
73363 forEach(base.graph._parentWays[id], function(parentId) {
73364 if (parentId in base.graph.entities) {
73365 baseEntities[parentId] = base.graph.entities[parentId];
73372 if (modified.length) x.modified = modified;
73373 if (deleted.length) x.deleted = deleted;
73374 if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
73375 if (i.annotation) x.annotation = i.annotation;
73380 return JSON.stringify({
73382 entities: values$1(allEntities),
73383 baseEntities: values$1(baseEntities),
73385 nextIDs: osmEntity$$1.id.next,
73391 fromJSON: function(json, loadChildNodes) {
73392 var h = JSON.parse(json);
73393 var loadComplete = true;
73395 osmEntity$$1.id.next = h.nextIDs;
73398 if (h.version === 2 || h.version === 3) {
73399 var allEntities = {};
73401 h.entities.forEach(function(entity) {
73402 allEntities[osmEntity$$1.key(entity)] = osmEntity$$1(entity);
73405 if (h.version === 3) {
73406 // This merges originals for changed entities into the base of
73407 // the _stack even if the current _stack doesn't have them (for
73408 // example when iD has been restarted in a different region)
73409 var baseEntities = h.baseEntities.map(function(d) { return osmEntity$$1(d); });
73410 _stack[0].graph.rebase(baseEntities, map$3(_stack, 'graph'), true);
73411 _tree.rebase(baseEntities, true);
73413 // When we restore a modified way, we also need to fetch any missing
73414 // childnodes that would normally have been downloaded with it.. #2142
73415 if (loadChildNodes) {
73416 var osm = context.connection();
73417 var nodes = flatten(uniq(map$3(filter(baseEntities, { type: 'way' }), 'nodes')));
73418 var missing = reject(nodes, function(n) { return _stack[0].graph.hasEntity(n); });
73420 if (!isEmpty(missing) && osm) {
73421 loadComplete = false;
73422 context.redrawEnable(false);
73424 var loading = uiLoading(context).blocking(true);
73425 context.container().call(loading);
73427 var childNodesLoaded = function(err, result) {
73429 var visible = groupBy(result.data, 'visible');
73430 if (!isEmpty(visible.true)) {
73431 missing = difference(missing, map$3(visible.true, 'id'));
73432 _stack[0].graph.rebase(visible.true, map$3(_stack, 'graph'), true);
73433 _tree.rebase(visible.true, true);
73436 // fetch older versions of nodes that were deleted..
73437 forEach(visible.false, function(entity) {
73438 osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
73442 if (err || isEmpty(missing)) {
73444 context.redrawEnable(true);
73445 dispatch$$1.call('change');
73449 osm.loadMultiple(missing, childNodesLoaded);
73454 _stack = h.stack.map(function(d) {
73455 var entities = {}, entity;
73458 d.modified.forEach(function(key) {
73459 entity = allEntities[key];
73460 entities[entity.id] = entity;
73465 d.deleted.forEach(function(id) {
73466 entities[id] = undefined;
73471 graph: coreGraph$$1(_stack[0].graph).load(entities),
73472 annotation: d.annotation,
73473 imageryUsed: d.imageryUsed
73477 } else { // original version
73478 _stack = h.stack.map(function(d) {
73481 for (var i in d.entities) {
73482 var entity = d.entities[i];
73483 entities[i] = entity === 'undefined' ? undefined : osmEntity$$1(entity);
73486 d.graph = coreGraph$$1(_stack[0].graph).load(entities);
73491 if (loadComplete) {
73492 dispatch$$1.call('change');
73500 if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
73505 clearSaved: function() {
73506 context.debouncedSave.cancel();
73507 if (lock.locked()) context.storage(getKey('saved_history'), null);
73513 return lock.lock();
73517 unlock: function() {
73522 // is iD not open in another window and it detects that
73523 // there's a history stored in localStorage that's recoverable?
73524 restorableChanges: function() {
73525 return lock.locked() && !!context.storage(getKey('saved_history'));
73529 // load history from a version stored in localStorage
73530 restore: function() {
73531 if (!lock.locked()) return;
73533 var json = context.storage(getKey('saved_history'));
73534 if (json) history.fromJSON(json, true);
73545 return utilRebind(history, dispatch$$1, 'on');
73548 /** Used to store function metadata. */
73549 var metaMap = WeakMap && new WeakMap;
73552 * The base implementation of `setData` without support for hot loop shorting.
73555 * @param {Function} func The function to associate metadata with.
73556 * @param {*} data The metadata.
73557 * @returns {Function} Returns `func`.
73559 var baseSetData = !metaMap ? identity$8 : function(func, data) {
73560 metaMap.set(func, data);
73565 * Creates a function that produces an instance of `Ctor` regardless of
73566 * whether it was invoked as part of a `new` expression or by `call` or `apply`.
73569 * @param {Function} Ctor The constructor to wrap.
73570 * @returns {Function} Returns the new wrapped function.
73572 function createCtor(Ctor) {
73573 return function() {
73574 // Use a `switch` statement to work with class constructors. See
73575 // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
73576 // for more details.
73577 var args = arguments;
73578 switch (args.length) {
73579 case 0: return new Ctor;
73580 case 1: return new Ctor(args[0]);
73581 case 2: return new Ctor(args[0], args[1]);
73582 case 3: return new Ctor(args[0], args[1], args[2]);
73583 case 4: return new Ctor(args[0], args[1], args[2], args[3]);
73584 case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
73585 case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
73586 case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
73588 var thisBinding = baseCreate(Ctor.prototype),
73589 result = Ctor.apply(thisBinding, args);
73591 // Mimic the constructor's `return` behavior.
73592 // See https://es5.github.io/#x13.2.2 for more details.
73593 return isObject(result) ? result : thisBinding;
73597 /** Used to compose bitmasks for function metadata. */
73598 var WRAP_BIND_FLAG = 1;
73601 * Creates a function that wraps `func` to invoke it with the optional `this`
73602 * binding of `thisArg`.
73605 * @param {Function} func The function to wrap.
73606 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
73607 * @param {*} [thisArg] The `this` binding of `func`.
73608 * @returns {Function} Returns the new wrapped function.
73610 function createBind(func, bitmask, thisArg) {
73611 var isBind = bitmask & WRAP_BIND_FLAG,
73612 Ctor = createCtor(func);
73614 function wrapper() {
73615 var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
73616 return fn.apply(isBind ? thisArg : this, arguments);
73621 /* Built-in method references for those with the same name as other `lodash` methods. */
73622 var nativeMax$5 = Math.max;
73625 * Creates an array that is the composition of partially applied arguments,
73626 * placeholders, and provided arguments into a single array of arguments.
73629 * @param {Array} args The provided arguments.
73630 * @param {Array} partials The arguments to prepend to those provided.
73631 * @param {Array} holders The `partials` placeholder indexes.
73632 * @params {boolean} [isCurried] Specify composing for a curried function.
73633 * @returns {Array} Returns the new array of composed arguments.
73635 function composeArgs(args, partials, holders, isCurried) {
73636 var argsIndex = -1,
73637 argsLength = args.length,
73638 holdersLength = holders.length,
73640 leftLength = partials.length,
73641 rangeLength = nativeMax$5(argsLength - holdersLength, 0),
73642 result = Array(leftLength + rangeLength),
73643 isUncurried = !isCurried;
73645 while (++leftIndex < leftLength) {
73646 result[leftIndex] = partials[leftIndex];
73648 while (++argsIndex < holdersLength) {
73649 if (isUncurried || argsIndex < argsLength) {
73650 result[holders[argsIndex]] = args[argsIndex];
73653 while (rangeLength--) {
73654 result[leftIndex++] = args[argsIndex++];
73659 /* Built-in method references for those with the same name as other `lodash` methods. */
73660 var nativeMax$6 = Math.max;
73663 * This function is like `composeArgs` except that the arguments composition
73664 * is tailored for `_.partialRight`.
73667 * @param {Array} args The provided arguments.
73668 * @param {Array} partials The arguments to append to those provided.
73669 * @param {Array} holders The `partials` placeholder indexes.
73670 * @params {boolean} [isCurried] Specify composing for a curried function.
73671 * @returns {Array} Returns the new array of composed arguments.
73673 function composeArgsRight(args, partials, holders, isCurried) {
73674 var argsIndex = -1,
73675 argsLength = args.length,
73677 holdersLength = holders.length,
73679 rightLength = partials.length,
73680 rangeLength = nativeMax$6(argsLength - holdersLength, 0),
73681 result = Array(rangeLength + rightLength),
73682 isUncurried = !isCurried;
73684 while (++argsIndex < rangeLength) {
73685 result[argsIndex] = args[argsIndex];
73687 var offset = argsIndex;
73688 while (++rightIndex < rightLength) {
73689 result[offset + rightIndex] = partials[rightIndex];
73691 while (++holdersIndex < holdersLength) {
73692 if (isUncurried || argsIndex < argsLength) {
73693 result[offset + holders[holdersIndex]] = args[argsIndex++];
73700 * Gets the number of `placeholder` occurrences in `array`.
73703 * @param {Array} array The array to inspect.
73704 * @param {*} placeholder The placeholder to search for.
73705 * @returns {number} Returns the placeholder count.
73707 function countHolders(array, placeholder) {
73708 var length = array.length,
73712 if (array[length] === placeholder) {
73720 * The function whose prototype chain sequence wrappers inherit from.
73724 function baseLodash() {
73725 // No operation performed.
73728 /** Used as references for the maximum length and index of an array. */
73729 var MAX_ARRAY_LENGTH = 4294967295;
73732 * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
73736 * @param {*} value The value to wrap.
73738 function LazyWrapper(value) {
73739 this.__wrapped__ = value;
73740 this.__actions__ = [];
73742 this.__filtered__ = false;
73743 this.__iteratees__ = [];
73744 this.__takeCount__ = MAX_ARRAY_LENGTH;
73745 this.__views__ = [];
73748 // Ensure `LazyWrapper` is an instance of `baseLodash`.
73749 LazyWrapper.prototype = baseCreate(baseLodash.prototype);
73750 LazyWrapper.prototype.constructor = LazyWrapper;
73753 * Gets metadata for `func`.
73756 * @param {Function} func The function to query.
73757 * @returns {*} Returns the metadata for `func`.
73759 var getData = !metaMap ? noop$3 : function(func) {
73760 return metaMap.get(func);
73763 /** Used to lookup unminified function names. */
73764 var realNames = {};
73766 /** Used for built-in method references. */
73767 var objectProto$k = Object.prototype;
73769 /** Used to check objects for own properties. */
73770 var hasOwnProperty$h = objectProto$k.hasOwnProperty;
73773 * Gets the name of `func`.
73776 * @param {Function} func The function to query.
73777 * @returns {string} Returns the function name.
73779 function getFuncName(func) {
73780 var result = (func.name + ''),
73781 array = realNames[result],
73782 length = hasOwnProperty$h.call(realNames, result) ? array.length : 0;
73785 var data = array[length],
73786 otherFunc = data.func;
73787 if (otherFunc == null || otherFunc == func) {
73795 * The base constructor for creating `lodash` wrapper objects.
73798 * @param {*} value The value to wrap.
73799 * @param {boolean} [chainAll] Enable explicit method chain sequences.
73801 function LodashWrapper(value, chainAll) {
73802 this.__wrapped__ = value;
73803 this.__actions__ = [];
73804 this.__chain__ = !!chainAll;
73805 this.__index__ = 0;
73806 this.__values__ = undefined;
73809 LodashWrapper.prototype = baseCreate(baseLodash.prototype);
73810 LodashWrapper.prototype.constructor = LodashWrapper;
73813 * Creates a clone of `wrapper`.
73816 * @param {Object} wrapper The wrapper to clone.
73817 * @returns {Object} Returns the cloned wrapper.
73819 function wrapperClone(wrapper) {
73820 if (wrapper instanceof LazyWrapper) {
73821 return wrapper.clone();
73823 var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
73824 result.__actions__ = copyArray(wrapper.__actions__);
73825 result.__index__ = wrapper.__index__;
73826 result.__values__ = wrapper.__values__;
73830 /** Used for built-in method references. */
73831 var objectProto$l = Object.prototype;
73833 /** Used to check objects for own properties. */
73834 var hasOwnProperty$i = objectProto$l.hasOwnProperty;
73837 * Creates a `lodash` object which wraps `value` to enable implicit method
73838 * chain sequences. Methods that operate on and return arrays, collections,
73839 * and functions can be chained together. Methods that retrieve a single value
73840 * or may return a primitive value will automatically end the chain sequence
73841 * and return the unwrapped value. Otherwise, the value must be unwrapped
73844 * Explicit chain sequences, which must be unwrapped with `_#value`, may be
73845 * enabled using `_.chain`.
73847 * The execution of chained methods is lazy, that is, it's deferred until
73848 * `_#value` is implicitly or explicitly called.
73850 * Lazy evaluation allows several methods to support shortcut fusion.
73851 * Shortcut fusion is an optimization to merge iteratee calls; this avoids
73852 * the creation of intermediate arrays and can greatly reduce the number of
73853 * iteratee executions. Sections of a chain sequence qualify for shortcut
73854 * fusion if the section is applied to an array and iteratees accept only
73855 * one argument. The heuristic for whether a section qualifies for shortcut
73856 * fusion is subject to change.
73858 * Chaining is supported in custom builds as long as the `_#value` method is
73859 * directly or indirectly included in the build.
73861 * In addition to lodash methods, wrappers have `Array` and `String` methods.
73863 * The wrapper `Array` methods are:
73864 * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
73866 * The wrapper `String` methods are:
73867 * `replace` and `split`
73869 * The wrapper methods that support shortcut fusion are:
73870 * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
73871 * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
73872 * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
73874 * The chainable wrapper methods are:
73875 * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
73876 * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
73877 * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
73878 * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
73879 * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
73880 * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
73881 * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
73882 * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
73883 * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
73884 * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
73885 * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
73886 * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
73887 * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
73888 * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
73889 * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
73890 * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
73891 * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
73892 * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
73893 * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
73894 * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
73895 * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
73896 * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
73897 * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
73898 * `zipObject`, `zipObjectDeep`, and `zipWith`
73900 * The wrapper methods that are **not** chainable by default are:
73901 * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
73902 * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
73903 * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
73904 * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
73905 * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
73906 * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
73907 * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
73908 * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
73909 * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
73910 * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
73911 * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
73912 * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
73913 * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
73914 * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
73915 * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
73916 * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
73917 * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
73918 * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
73919 * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
73920 * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
73921 * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
73922 * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
73923 * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
73924 * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
73925 * `upperFirst`, `value`, and `words`
73930 * @param {*} value The value to wrap in a `lodash` instance.
73931 * @returns {Object} Returns the new `lodash` wrapper instance.
73934 * function square(n) {
73938 * var wrapped = _([1, 2, 3]);
73940 * // Returns an unwrapped value.
73941 * wrapped.reduce(_.add);
73944 * // Returns a wrapped value.
73945 * var squares = wrapped.map(square);
73947 * _.isArray(squares);
73950 * _.isArray(squares.value());
73953 function lodash(value) {
73954 if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
73955 if (value instanceof LodashWrapper) {
73958 if (hasOwnProperty$i.call(value, '__wrapped__')) {
73959 return wrapperClone(value);
73962 return new LodashWrapper(value);
73965 // Ensure wrappers are instances of `baseLodash`.
73966 lodash.prototype = baseLodash.prototype;
73967 lodash.prototype.constructor = lodash;
73970 * Checks if `func` has a lazy counterpart.
73973 * @param {Function} func The function to check.
73974 * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
73977 function isLaziable(func) {
73978 var funcName = getFuncName(func),
73979 other = lodash[funcName];
73981 if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
73984 if (func === other) {
73987 var data = getData(other);
73988 return !!data && func === data[0];
73992 * Sets metadata for `func`.
73994 * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
73995 * period of time, it will trip its breaker and transition to an identity
73996 * function to avoid garbage collection pauses in V8. See
73997 * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
73998 * for more details.
74001 * @param {Function} func The function to associate metadata with.
74002 * @param {*} data The metadata.
74003 * @returns {Function} Returns `func`.
74005 var setData = shortOut(baseSetData);
74007 /** Used to match wrap detail comments. */
74008 var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
74009 reSplitDetails = /,? & /;
74012 * Extracts wrapper details from the `source` body comment.
74015 * @param {string} source The source to inspect.
74016 * @returns {Array} Returns the wrapper details.
74018 function getWrapDetails(source) {
74019 var match = source.match(reWrapDetails);
74020 return match ? match[1].split(reSplitDetails) : [];
74023 /** Used to match wrap detail comments. */
74024 var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
74027 * Inserts wrapper `details` in a comment at the top of the `source` body.
74030 * @param {string} source The source to modify.
74031 * @returns {Array} details The details to insert.
74032 * @returns {string} Returns the modified source.
74034 function insertWrapDetails(source, details) {
74035 var length = details.length;
74039 var lastIndex = length - 1;
74040 details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
74041 details = details.join(length > 2 ? ', ' : ' ');
74042 return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
74045 /** Used to compose bitmasks for function metadata. */
74046 var WRAP_BIND_FLAG$1 = 1,
74047 WRAP_BIND_KEY_FLAG = 2,
74048 WRAP_CURRY_FLAG = 8,
74049 WRAP_CURRY_RIGHT_FLAG = 16,
74050 WRAP_PARTIAL_FLAG = 32,
74051 WRAP_PARTIAL_RIGHT_FLAG = 64,
74052 WRAP_ARY_FLAG = 128,
74053 WRAP_REARG_FLAG = 256,
74054 WRAP_FLIP_FLAG = 512;
74056 /** Used to associate wrap methods with their bit flags. */
74058 ['ary', WRAP_ARY_FLAG],
74059 ['bind', WRAP_BIND_FLAG$1],
74060 ['bindKey', WRAP_BIND_KEY_FLAG],
74061 ['curry', WRAP_CURRY_FLAG],
74062 ['curryRight', WRAP_CURRY_RIGHT_FLAG],
74063 ['flip', WRAP_FLIP_FLAG],
74064 ['partial', WRAP_PARTIAL_FLAG],
74065 ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
74066 ['rearg', WRAP_REARG_FLAG]
74070 * Updates wrapper `details` based on `bitmask` flags.
74073 * @returns {Array} details The details to modify.
74074 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
74075 * @returns {Array} Returns `details`.
74077 function updateWrapDetails(details, bitmask) {
74078 arrayEach(wrapFlags, function(pair) {
74079 var value = '_.' + pair[0];
74080 if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
74081 details.push(value);
74084 return details.sort();
74088 * Sets the `toString` method of `wrapper` to mimic the source of `reference`
74089 * with wrapper details in a comment at the top of the source body.
74092 * @param {Function} wrapper The function to modify.
74093 * @param {Function} reference The reference function.
74094 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
74095 * @returns {Function} Returns `wrapper`.
74097 function setWrapToString(wrapper, reference, bitmask) {
74098 var source = (reference + '');
74099 return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
74102 /** Used to compose bitmasks for function metadata. */
74103 var WRAP_BIND_FLAG$2 = 1,
74104 WRAP_BIND_KEY_FLAG$1 = 2,
74105 WRAP_CURRY_BOUND_FLAG = 4,
74106 WRAP_CURRY_FLAG$1 = 8,
74107 WRAP_PARTIAL_FLAG$1 = 32,
74108 WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
74111 * Creates a function that wraps `func` to continue currying.
74114 * @param {Function} func The function to wrap.
74115 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
74116 * @param {Function} wrapFunc The function to create the `func` wrapper.
74117 * @param {*} placeholder The placeholder value.
74118 * @param {*} [thisArg] The `this` binding of `func`.
74119 * @param {Array} [partials] The arguments to prepend to those provided to
74120 * the new function.
74121 * @param {Array} [holders] The `partials` placeholder indexes.
74122 * @param {Array} [argPos] The argument positions of the new function.
74123 * @param {number} [ary] The arity cap of `func`.
74124 * @param {number} [arity] The arity of `func`.
74125 * @returns {Function} Returns the new wrapped function.
74127 function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
74128 var isCurry = bitmask & WRAP_CURRY_FLAG$1,
74129 newHolders = isCurry ? holders : undefined,
74130 newHoldersRight = isCurry ? undefined : holders,
74131 newPartials = isCurry ? partials : undefined,
74132 newPartialsRight = isCurry ? undefined : partials;
74134 bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
74135 bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
74137 if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
74138 bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);
74141 func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
74142 newHoldersRight, argPos, ary, arity
74145 var result = wrapFunc.apply(undefined, newData);
74146 if (isLaziable(func)) {
74147 setData(result, newData);
74149 result.placeholder = placeholder;
74150 return setWrapToString(result, func, bitmask);
74154 * Gets the argument placeholder value for `func`.
74157 * @param {Function} func The function to inspect.
74158 * @returns {*} Returns the placeholder value.
74160 function getHolder(func) {
74162 return object.placeholder;
74165 /* Built-in method references for those with the same name as other `lodash` methods. */
74166 var nativeMin$2 = Math.min;
74169 * Reorder `array` according to the specified indexes where the element at
74170 * the first index is assigned as the first element, the element at
74171 * the second index is assigned as the second element, and so on.
74174 * @param {Array} array The array to reorder.
74175 * @param {Array} indexes The arranged array indexes.
74176 * @returns {Array} Returns `array`.
74178 function reorder(array, indexes) {
74179 var arrLength = array.length,
74180 length = nativeMin$2(indexes.length, arrLength),
74181 oldArray = copyArray(array);
74184 var index = indexes[length];
74185 array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
74190 /** Used as the internal argument placeholder. */
74191 var PLACEHOLDER = '__lodash_placeholder__';
74194 * Replaces all `placeholder` elements in `array` with an internal placeholder
74195 * and returns an array of their indexes.
74198 * @param {Array} array The array to modify.
74199 * @param {*} placeholder The placeholder to replace.
74200 * @returns {Array} Returns the new array of placeholder indexes.
74202 function replaceHolders(array, placeholder) {
74204 length = array.length,
74208 while (++index < length) {
74209 var value = array[index];
74210 if (value === placeholder || value === PLACEHOLDER) {
74211 array[index] = PLACEHOLDER;
74212 result[resIndex++] = index;
74218 /** Used to compose bitmasks for function metadata. */
74219 var WRAP_BIND_FLAG$3 = 1,
74220 WRAP_BIND_KEY_FLAG$2 = 2,
74221 WRAP_CURRY_FLAG$2 = 8,
74222 WRAP_CURRY_RIGHT_FLAG$1 = 16,
74223 WRAP_ARY_FLAG$1 = 128,
74224 WRAP_FLIP_FLAG$1 = 512;
74227 * Creates a function that wraps `func` to invoke it with optional `this`
74228 * binding of `thisArg`, partial application, and currying.
74231 * @param {Function|string} func The function or method name to wrap.
74232 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
74233 * @param {*} [thisArg] The `this` binding of `func`.
74234 * @param {Array} [partials] The arguments to prepend to those provided to
74235 * the new function.
74236 * @param {Array} [holders] The `partials` placeholder indexes.
74237 * @param {Array} [partialsRight] The arguments to append to those provided
74238 * to the new function.
74239 * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
74240 * @param {Array} [argPos] The argument positions of the new function.
74241 * @param {number} [ary] The arity cap of `func`.
74242 * @param {number} [arity] The arity of `func`.
74243 * @returns {Function} Returns the new wrapped function.
74245 function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
74246 var isAry = bitmask & WRAP_ARY_FLAG$1,
74247 isBind = bitmask & WRAP_BIND_FLAG$3,
74248 isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,
74249 isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),
74250 isFlip = bitmask & WRAP_FLIP_FLAG$1,
74251 Ctor = isBindKey ? undefined : createCtor(func);
74253 function wrapper() {
74254 var length = arguments.length,
74255 args = Array(length),
74259 args[index] = arguments[index];
74262 var placeholder = getHolder(wrapper),
74263 holdersCount = countHolders(args, placeholder);
74266 args = composeArgs(args, partials, holders, isCurried);
74268 if (partialsRight) {
74269 args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
74271 length -= holdersCount;
74272 if (isCurried && length < arity) {
74273 var newHolders = replaceHolders(args, placeholder);
74274 return createRecurry(
74275 func, bitmask, createHybrid, wrapper.placeholder, thisArg,
74276 args, newHolders, argPos, ary, arity - length
74279 var thisBinding = isBind ? thisArg : this,
74280 fn = isBindKey ? thisBinding[func] : func;
74282 length = args.length;
74284 args = reorder(args, argPos);
74285 } else if (isFlip && length > 1) {
74288 if (isAry && ary < length) {
74291 if (this && this !== root$2 && this instanceof wrapper) {
74292 fn = Ctor || createCtor(fn);
74294 return fn.apply(thisBinding, args);
74300 * Creates a function that wraps `func` to enable currying.
74303 * @param {Function} func The function to wrap.
74304 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
74305 * @param {number} arity The arity of `func`.
74306 * @returns {Function} Returns the new wrapped function.
74308 function createCurry(func, bitmask, arity) {
74309 var Ctor = createCtor(func);
74311 function wrapper() {
74312 var length = arguments.length,
74313 args = Array(length),
74315 placeholder = getHolder(wrapper);
74318 args[index] = arguments[index];
74320 var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
74322 : replaceHolders(args, placeholder);
74324 length -= holders.length;
74325 if (length < arity) {
74326 return createRecurry(
74327 func, bitmask, createHybrid, wrapper.placeholder, undefined,
74328 args, holders, undefined, undefined, arity - length);
74330 var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
74331 return apply(fn, this, args);
74336 /** Used to compose bitmasks for function metadata. */
74337 var WRAP_BIND_FLAG$4 = 1;
74340 * Creates a function that wraps `func` to invoke it with the `this` binding
74341 * of `thisArg` and `partials` prepended to the arguments it receives.
74344 * @param {Function} func The function to wrap.
74345 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
74346 * @param {*} thisArg The `this` binding of `func`.
74347 * @param {Array} partials The arguments to prepend to those provided to
74348 * the new function.
74349 * @returns {Function} Returns the new wrapped function.
74351 function createPartial(func, bitmask, thisArg, partials) {
74352 var isBind = bitmask & WRAP_BIND_FLAG$4,
74353 Ctor = createCtor(func);
74355 function wrapper() {
74356 var argsIndex = -1,
74357 argsLength = arguments.length,
74359 leftLength = partials.length,
74360 args = Array(leftLength + argsLength),
74361 fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
74363 while (++leftIndex < leftLength) {
74364 args[leftIndex] = partials[leftIndex];
74366 while (argsLength--) {
74367 args[leftIndex++] = arguments[++argsIndex];
74369 return apply(fn, isBind ? thisArg : this, args);
74374 /** Used as the internal argument placeholder. */
74375 var PLACEHOLDER$1 = '__lodash_placeholder__';
74377 /** Used to compose bitmasks for function metadata. */
74378 var WRAP_BIND_FLAG$5 = 1,
74379 WRAP_BIND_KEY_FLAG$3 = 2,
74380 WRAP_CURRY_BOUND_FLAG$1 = 4,
74381 WRAP_CURRY_FLAG$3 = 8,
74382 WRAP_ARY_FLAG$2 = 128,
74383 WRAP_REARG_FLAG$1 = 256;
74385 /* Built-in method references for those with the same name as other `lodash` methods. */
74386 var nativeMin$3 = Math.min;
74389 * Merges the function metadata of `source` into `data`.
74391 * Merging metadata reduces the number of wrappers used to invoke a function.
74392 * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
74393 * may be applied regardless of execution order. Methods like `_.ary` and
74394 * `_.rearg` modify function arguments, making the order in which they are
74395 * executed important, preventing the merging of metadata. However, we make
74396 * an exception for a safe combined case where curried functions have `_.ary`
74397 * and or `_.rearg` applied.
74400 * @param {Array} data The destination metadata.
74401 * @param {Array} source The source metadata.
74402 * @returns {Array} Returns `data`.
74404 function mergeData(data, source) {
74405 var bitmask = data[1],
74406 srcBitmask = source[1],
74407 newBitmask = bitmask | srcBitmask,
74408 isCommon = newBitmask < (WRAP_BIND_FLAG$5 | WRAP_BIND_KEY_FLAG$3 | WRAP_ARY_FLAG$2);
74411 ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$3)) ||
74412 ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
74413 ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$3));
74415 // Exit early if metadata can't be merged.
74416 if (!(isCommon || isCombo)) {
74419 // Use source `thisArg` if available.
74420 if (srcBitmask & WRAP_BIND_FLAG$5) {
74421 data[2] = source[2];
74422 // Set when currying a bound function.
74423 newBitmask |= bitmask & WRAP_BIND_FLAG$5 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
74425 // Compose partial arguments.
74426 var value = source[3];
74428 var partials = data[3];
74429 data[3] = partials ? composeArgs(partials, value, source[4]) : value;
74430 data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
74432 // Compose partial right arguments.
74435 partials = data[5];
74436 data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
74437 data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
74439 // Use source `argPos` if available.
74444 // Use source `ary` if it's smaller.
74445 if (srcBitmask & WRAP_ARY_FLAG$2) {
74446 data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
74448 // Use source `arity` if one is not provided.
74449 if (data[9] == null) {
74450 data[9] = source[9];
74452 // Use source `func` and merge bitmasks.
74453 data[0] = source[0];
74454 data[1] = newBitmask;
74459 /** Error message constants. */
74460 var FUNC_ERROR_TEXT$4 = 'Expected a function';
74462 /** Used to compose bitmasks for function metadata. */
74463 var WRAP_BIND_FLAG$6 = 1,
74464 WRAP_BIND_KEY_FLAG$4 = 2,
74465 WRAP_CURRY_FLAG$4 = 8,
74466 WRAP_CURRY_RIGHT_FLAG$2 = 16,
74467 WRAP_PARTIAL_FLAG$2 = 32,
74468 WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
74470 /* Built-in method references for those with the same name as other `lodash` methods. */
74471 var nativeMax$7 = Math.max;
74474 * Creates a function that either curries or invokes `func` with optional
74475 * `this` binding and partially applied arguments.
74478 * @param {Function|string} func The function or method name to wrap.
74479 * @param {number} bitmask The bitmask flags.
74482 * 4 - `_.curry` or `_.curryRight` of a bound function
74484 * 16 - `_.curryRight`
74486 * 64 - `_.partialRight`
74490 * @param {*} [thisArg] The `this` binding of `func`.
74491 * @param {Array} [partials] The arguments to be partially applied.
74492 * @param {Array} [holders] The `partials` placeholder indexes.
74493 * @param {Array} [argPos] The argument positions of the new function.
74494 * @param {number} [ary] The arity cap of `func`.
74495 * @param {number} [arity] The arity of `func`.
74496 * @returns {Function} Returns the new wrapped function.
74498 function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
74499 var isBindKey = bitmask & WRAP_BIND_KEY_FLAG$4;
74500 if (!isBindKey && typeof func != 'function') {
74501 throw new TypeError(FUNC_ERROR_TEXT$4);
74503 var length = partials ? partials.length : 0;
74505 bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);
74506 partials = holders = undefined;
74508 ary = ary === undefined ? ary : nativeMax$7(toInteger(ary), 0);
74509 arity = arity === undefined ? arity : toInteger(arity);
74510 length -= holders ? holders.length : 0;
74512 if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {
74513 var partialsRight = partials,
74514 holdersRight = holders;
74516 partials = holders = undefined;
74518 var data = isBindKey ? undefined : getData(func);
74521 func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
74526 mergeData(newData, data);
74529 bitmask = newData[1];
74530 thisArg = newData[2];
74531 partials = newData[3];
74532 holders = newData[4];
74533 arity = newData[9] = newData[9] === undefined
74534 ? (isBindKey ? 0 : func.length)
74535 : nativeMax$7(newData[9] - length, 0);
74537 if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {
74538 bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);
74540 if (!bitmask || bitmask == WRAP_BIND_FLAG$6) {
74541 var result = createBind(func, bitmask, thisArg);
74542 } else if (bitmask == WRAP_CURRY_FLAG$4 || bitmask == WRAP_CURRY_RIGHT_FLAG$2) {
74543 result = createCurry(func, bitmask, arity);
74544 } else if ((bitmask == WRAP_PARTIAL_FLAG$2 || bitmask == (WRAP_BIND_FLAG$6 | WRAP_PARTIAL_FLAG$2)) && !holders.length) {
74545 result = createPartial(func, bitmask, thisArg, partials);
74547 result = createHybrid.apply(undefined, newData);
74549 var setter = data ? baseSetData : setData;
74550 return setWrapToString(setter(result, newData), func, bitmask);
74553 /** Used to compose bitmasks for function metadata. */
74554 var WRAP_BIND_FLAG$7 = 1,
74555 WRAP_PARTIAL_FLAG$3 = 32;
74558 * Creates a function that invokes `func` with the `this` binding of `thisArg`
74559 * and `partials` prepended to the arguments it receives.
74561 * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
74562 * may be used as a placeholder for partially applied arguments.
74564 * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
74565 * property of bound functions.
74570 * @category Function
74571 * @param {Function} func The function to bind.
74572 * @param {*} thisArg The `this` binding of `func`.
74573 * @param {...*} [partials] The arguments to be partially applied.
74574 * @returns {Function} Returns the new bound function.
74577 * function greet(greeting, punctuation) {
74578 * return greeting + ' ' + this.user + punctuation;
74581 * var object = { 'user': 'fred' };
74583 * var bound = _.bind(greet, object, 'hi');
74587 * // Bound with placeholders.
74588 * var bound = _.bind(greet, object, _, '!');
74592 var bind$2 = baseRest(function(func, thisArg, partials) {
74593 var bitmask = WRAP_BIND_FLAG$7;
74594 if (partials.length) {
74595 var holders = replaceHolders(partials, getHolder(bind$2));
74596 bitmask |= WRAP_PARTIAL_FLAG$3;
74598 return createWrap(func, bitmask, thisArg, partials, holders);
74601 // Assign default placeholders.
74602 bind$2.placeholder = {};
74604 function presetCollection(collection) {
74605 var maxSearchResults = 50,
74606 maxSuggestionResults = 10;
74610 collection: collection,
74613 item: function(id) {
74614 return find$1(this.collection, function(d) {
74615 return d.id === id;
74620 matchGeometry: function(geometry) {
74621 return presetCollection(this.collection.filter(function(d) {
74622 return d.matchGeometry(geometry);
74627 search: function(value, geometry) {
74628 if (!value) return this;
74630 function leading(a) {
74631 var index = a.indexOf(value);
74632 return index === 0 || a[index - 1] === ' ';
74635 function suggestionName(name) {
74636 var nameArray = name.split(' - ');
74637 if (nameArray.length > 1) {
74638 name = nameArray.slice(0, nameArray.length - 1).join(' - ');
74640 return name.toLowerCase();
74644 value = value.toLowerCase();
74646 var searchable = filter(this.collection, function(a) {
74647 return a.searchable !== false && a.suggestion !== true;
74649 suggestions = filter(this.collection, function(a) {
74650 return a.suggestion === true;
74654 // matches value to preset.name
74655 var leading_name = filter(searchable, function(a) {
74656 return leading(a.name().toLowerCase());
74657 }).sort(function(a, b) {
74658 var aCompare = a.name().toLowerCase(),
74659 bCompare = b.name().toLowerCase(),
74662 // priority if search string matches preset name exactly - #4325
74663 if (value === aCompare) return -1;
74664 if (value === bCompare) return 1;
74666 // priority for higher matchScore
74667 i = b.originalScore - a.originalScore;
74668 if (i !== 0) return i;
74670 // priority if search string appears earlier in preset name
74671 i = aCompare.indexOf(value) - bCompare.indexOf(value);
74672 if (i !== 0) return i;
74674 // priority for shorter preset names
74675 return a.name().length - b.name().length;
74678 // matches value to preset.terms values
74679 var leading_terms = filter(searchable, function(a) {
74680 return some(a.terms() || [], leading);
74683 // matches value to preset.tags values
74684 var leading_tag_values = filter(searchable, function(a) {
74685 return some(without(values$1(a.tags || {}), '*'), leading);
74689 // finds close matches to value in preset.name
74690 var similar_name = searchable.map(function(a) {
74693 dist: utilEditDistance(value, a.name())
74695 }).filter(function(a) {
74696 return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
74697 }).sort(function(a, b) {
74698 return a.dist - b.dist;
74699 }).map(function(a) {
74703 // finds close matches to value in preset.terms
74704 var similar_terms = filter(searchable, function(a) {
74705 return some(a.terms() || [], function(b) {
74706 return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
74710 var leading_suggestions = filter(suggestions, function(a) {
74711 return leading(suggestionName(a.name()));
74712 }).sort(function(a, b) {
74713 a = suggestionName(a.name());
74714 b = suggestionName(b.name());
74715 var i = a.indexOf(value) - b.indexOf(value);
74716 if (i === 0) return a.length - b.length;
74720 var similar_suggestions = suggestions.map(function(a) {
74723 dist: utilEditDistance(value, suggestionName(a.name()))
74725 }).filter(function(a) {
74726 return a.dist + Math.min(value.length - suggestionName(a.preset.name()).length, 0) < 1;
74727 }).sort(function(a, b) {
74728 return a.dist - b.dist;
74729 }).map(function(a) {
74733 var other = presets.item(geometry);
74735 var results = leading_name.concat(
74737 leading_tag_values,
74738 leading_suggestions.slice(0, maxSuggestionResults + 5),
74741 similar_suggestions.slice(0, maxSuggestionResults)
74742 ).slice(0, maxSearchResults - 1);
74744 return presetCollection(uniq(results.concat(other)));
74752 function presetCategory(id, category, all) {
74753 category = clone(category);
74758 category.members = presetCollection(category.members.map(function(id) {
74759 return all.item(id);
74763 category.matchGeometry = function(geometry) {
74764 return category.geometry.indexOf(geometry) >= 0;
74768 category.matchScore = function() {
74773 category.name = function() {
74774 return t('presets.categories.' + id + '.name', {'default': id});
74778 category.terms = function() {
74786 function presetField(id, field) {
74787 field = clone(field);
74791 // for use in classes, element ids, css selectors
74792 field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
74794 field.matchGeometry = function(geometry) {
74795 return !field.geometry || field.geometry === geometry;
74799 field.t = function(scope, options) {
74800 return t('presets.fields.' + id + '.' + scope, options);
74804 field.label = function() {
74805 return field.t('label', {'default': id});
74809 var placeholder = field.placeholder;
74810 field.placeholder = function() {
74811 return field.t('placeholder', {'default': placeholder});
74818 function presetPreset(id, preset, fields) {
74819 preset = clone(preset);
74822 preset.fields = (preset.fields || []).map(getFields);
74823 preset.geometry = (preset.geometry || []);
74826 function getFields(f) {
74831 preset.matchGeometry = function(geometry) {
74832 return preset.geometry.indexOf(geometry) >= 0;
74836 preset.originalScore = preset.matchScore || 1;
74839 preset.matchScore = function(entity) {
74840 var tags = preset.tags,
74843 for (var t$$1 in tags) {
74844 if (entity.tags[t$$1] === tags[t$$1]) {
74845 score += preset.originalScore;
74846 } else if (tags[t$$1] === '*' && t$$1 in entity.tags) {
74847 score += preset.originalScore / 2;
74857 preset.t = function(scope, options) {
74858 return t('presets.presets.' + id + '.' + scope, options);
74862 var origName = preset.name || '';
74863 preset.name = function() {
74864 if (preset.suggestion) {
74865 id = id.split('/');
74866 id = id[0] + '/' + id[1];
74867 return origName + ' - ' + t('presets.presets.' + id + '.name');
74869 return preset.t('name', { 'default': origName });
74872 var origTerms = (preset.terms || []).join();
74873 preset.terms = function() {
74874 return preset.t('terms', { 'default': origTerms }).toLowerCase().trim().split(/\s*,+\s*/);
74878 preset.isFallback = function() {
74879 var tagCount = Object.keys(preset.tags).length;
74880 return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
74884 var reference = preset.reference || {};
74885 preset.reference = function(geometry) {
74886 var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0],
74887 value = reference.value || preset.tags[key];
74889 if (geometry === 'relation' && key === 'type') {
74890 if (value in preset.tags) {
74892 value = preset.tags[key];
74894 return { rtype: value };
74898 if (value === '*') {
74899 return { key: key };
74901 return { key: key, value: value };
74906 var removeTags = preset.removeTags || preset.tags || {};
74907 preset.removeTags = function(tags, geometry) {
74908 tags = omit(tags, keys$1(removeTags));
74910 for (var f in preset.fields) {
74911 var field = preset.fields[f];
74912 if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
74913 delete tags[field.key];
74922 var applyTags = preset.addTags || preset.tags || {};
74923 preset.applyTags = function(tags, geometry) {
74926 tags = clone(tags);
74928 for (k in applyTags) {
74929 if (applyTags[k] === '*') {
74932 tags[k] = applyTags[k];
74936 // Add area=yes if necessary.
74937 // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
74938 // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
74939 // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
74940 if (!applyTags.hasOwnProperty('area')) {
74942 if (geometry === 'area') {
74943 var needsAreaTag = true;
74944 if (preset.geometry.indexOf('line') === -1) {
74945 for (k in applyTags) {
74946 if (k in areaKeys) {
74947 needsAreaTag = false;
74952 if (needsAreaTag) {
74958 for (var f in preset.fields) {
74959 var field = preset.fields[f];
74960 if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
74961 tags[field.key] = field.default;
74972 function presetIndex() {
74973 // a presetCollection with methods for
74974 // loading new data and returning defaults
74976 var all = presetCollection([]);
74977 var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
74979 var _universal = [];
74980 var _recent = presetCollection([]);
74982 // Index of presets by (geometry, tag key).
74991 all.match = function(entity, resolver) {
74992 var geometry = entity.geometry(resolver);
74995 // Treat entities on addr:interpolation lines as points, not vertices - #3241
74996 if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
74997 geometry = 'point';
75000 var geometryMatches = _index[geometry];
75004 for (var k in entity.tags) {
75005 // If any part of an address is present,
75006 // allow fallback to "Address" preset - #4353
75007 if (k.match(/^addr:/) !== null && geometryMatches['addr:*']) {
75008 address = geometryMatches['addr:*'][0];
75011 var keyMatches = geometryMatches[k];
75012 if (!keyMatches) continue;
75014 for (var i = 0; i < keyMatches.length; i++) {
75015 var score = keyMatches[i].matchScore(entity);
75016 if (score > best) {
75018 match = keyMatches[i];
75023 if (address && (!match || match.isFallback())) {
75027 return match || all.item(geometry);
75031 // Because of the open nature of tagging, iD will never have a complete
75032 // list of tags used in OSM, so we want it to have logic like "assume
75033 // that a closed way with an amenity tag is an area, unless the amenity
75034 // is one of these specific types". This function computes a structure
75035 // that allows testing of such conditions, based on the presets designated
75036 // as as supporting (or not supporting) the area geometry.
75038 // The returned object L is a whitelist/blacklist of tags. A closed way
75039 // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
75040 // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
75041 // and the subkeys form the blacklist.
75042 all.areaKeys = function() {
75044 var ignore = ['barrier', 'highway', 'footway', 'railway', 'type']; // probably a line..
75045 var presets = reject(all.collection, 'suggestion');
75048 presets.forEach(function(d) {
75049 for (var key in d.tags) break;
75051 if (ignore.indexOf(key) !== -1) return;
75053 if (d.geometry.indexOf('area') !== -1) { // probably an area..
75054 areaKeys[key] = areaKeys[key] || {};
75059 presets.forEach(function(d) {
75060 for (var key in d.tags) break;
75062 if (ignore.indexOf(key) !== -1) return;
75064 var value = d.tags[key];
75065 if (key in areaKeys && // probably an area...
75066 d.geometry.indexOf('line') !== -1 && // but sometimes a line
75068 areaKeys[key][value] = true;
75076 all.init = function() {
75077 var d = data.presets;
75079 all.collection = [];
75080 _recent.collection = [];
75083 _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
75086 forEach(d.fields, function(d, id) {
75087 _fields[id] = presetField(id, d);
75089 _universal.push(_fields[id]);
75095 forEach(d.presets, function(d, id) {
75096 all.collection.push(presetPreset(id, d, _fields));
75100 if (d.categories) {
75101 forEach(d.categories, function(d, id) {
75102 all.collection.push(presetCategory(id, d, all));
75107 var getItem = bind$2(all.item, all);
75109 area: presetCollection(d.defaults.area.map(getItem)),
75110 line: presetCollection(d.defaults.line.map(getItem)),
75111 point: presetCollection(d.defaults.point.map(getItem)),
75112 vertex: presetCollection(d.defaults.vertex.map(getItem)),
75113 relation: presetCollection(d.defaults.relation.map(getItem))
75117 for (var i = 0; i < all.collection.length; i++) {
75118 var preset = all.collection[i];
75119 var geometry = preset.geometry;
75121 for (var j = 0; j < geometry.length; j++) {
75122 var g = _index[geometry[j]];
75123 for (var k in preset.tags) {
75124 (g[k] = g[k] || []).push(preset);
75132 all.field = function(id) {
75133 return _fields[id];
75136 all.universal = function() {
75140 all.defaults = function(geometry, n) {
75141 var rec = _recent.matchGeometry(geometry).collection.slice(0, 4);
75142 var def = uniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
75143 return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
75146 all.choose = function(preset) {
75147 _recent = presetCollection(uniq([preset].concat(_recent.collection)));
75156 function setAreaKeys(value) {
75161 function coreContext() {
75163 context.version = '2.9.2';
75165 // create a special translation that contains the keys in place of the strings
75166 var tkeys = cloneDeep(en);
75169 function traverser(v, k, obj) {
75172 forOwn(v, traverser);
75173 } else if (isString(v)) {
75174 obj[k] = parents.join('.');
75179 forOwn(tkeys, traverser);
75180 addTranslation('_tkeys_', tkeys);
75182 addTranslation('en', en);
75185 var dispatch$$1 = dispatch('enter', 'exit', 'change');
75187 // https://github.com/openstreetmap/iD/issues/772
75188 // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
75190 try { storage = localStorage; } catch (e) {} // eslint-disable-line no-empty
75191 storage = storage || (function() {
75194 getItem: function(k) { return s[k]; },
75195 setItem: function(k, v) { s[k] = v; },
75196 removeItem: function(k) { delete s[k]; }
75200 context.storage = function(k, v) {
75202 if (arguments.length === 1) return storage.getItem(k);
75203 else if (v === null) storage.removeItem(k);
75204 else storage.setItem(k, v);
75206 // localstorage quota exceeded
75207 /* eslint-disable no-console */
75208 if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
75209 /* eslint-enable no-console */
75214 /* Straight accessors. Avoid using these if you can. */
75215 var ui, connection, history;
75216 context.ui = function() { return ui; };
75217 context.connection = function() { return connection; };
75218 context.history = function() { return history; };
75222 context.preauth = function(options) {
75224 connection.switch(options);
75229 context.loadTiles = utilCallWhenIdle(function(projection, dimensions, callback) {
75231 function done(err, result) {
75232 if (connection.getConnectionId() !== cid) {
75233 if (callback) callback({ message: 'Connection Switched', status: -1 });
75236 if (!err) history.merge(result.data, result.extent);
75237 if (callback) callback(err, result);
75239 if (connection && context.editable()) {
75240 cid = connection.getConnectionId();
75241 connection.loadTiles(projection, dimensions, done);
75245 context.loadEntity = function(entityId, callback) {
75247 function done(err, result) {
75248 if (connection.getConnectionId() !== cid) {
75249 if (callback) callback({ message: 'Connection Switched', status: -1 });
75252 if (!err) history.merge(result.data, result.extent);
75253 if (callback) callback(err, result);
75256 cid = connection.getConnectionId();
75257 connection.loadEntity(entityId, done);
75261 context.zoomToEntity = function(entityId, zoomTo) {
75262 if (zoomTo !== false) {
75263 this.loadEntity(entityId, function(err, result) {
75265 var entity = find$1(result.data, function(e) { return e.id === entityId; });
75266 if (entity) { map.zoomTo(entity); }
75270 map.on('drawn.zoomToEntity', function() {
75271 if (!context.hasEntity(entityId)) return;
75272 map.on('drawn.zoomToEntity', null);
75273 context.on('enter.zoomToEntity', null);
75274 context.enter(modeSelect(context, [entityId]));
75277 context.on('enter.zoomToEntity', function() {
75278 if (mode.id !== 'browse') {
75279 map.on('drawn.zoomToEntity', null);
75280 context.on('enter.zoomToEntity', null);
75285 var minEditableZoom = 16;
75286 context.minEditableZoom = function(_) {
75287 if (!arguments.length) return minEditableZoom;
75288 minEditableZoom = _;
75290 connection.tileZoom(_);
75297 var inIntro = false;
75298 context.inIntro = function(_) {
75299 if (!arguments.length) return inIntro;
75304 context.save = function() {
75305 // no history save, no message onbeforeunload
75306 if (inIntro || select('.modal').size()) return;
75309 if (mode && mode.id === 'save') {
75312 canSave = context.selectedIDs().every(function(id) {
75313 var entity = context.hasEntity(id);
75314 return entity && !entity.isDegenerate();
75321 if (history.hasChanges()) {
75322 return t('save.unsaved_changes');
75328 context.hasEntity = function(id) {
75329 return history.graph().hasEntity(id);
75331 context.entity = function(id) {
75332 return history.graph().entity(id);
75334 context.childNodes = function(way) {
75335 return history.graph().childNodes(way);
75337 context.geometry = function(id) {
75338 return context.entity(id).geometry(history.graph());
75344 context.mode = function() {
75347 context.enter = function(newMode) {
75350 dispatch$$1.call('exit', this, mode);
75355 dispatch$$1.call('enter', this, mode);
75358 context.selectedIDs = function() {
75359 if (mode && mode.selectedIDs) {
75360 return mode.selectedIDs();
75365 context.activeID = function() {
75366 return mode && mode.activeID && mode.activeID();
75371 context.install = function(behavior) {
75372 context.surface().call(behavior);
75374 context.uninstall = function(behavior) {
75375 context.surface().call(behavior.off);
75380 var copyIDs = [], copyGraph;
75381 context.copyGraph = function() { return copyGraph; };
75382 context.copyIDs = function(_) {
75383 if (!arguments.length) return copyIDs;
75385 copyGraph = history.graph();
75392 context.background = function() { return background; };
75397 context.features = function() { return features; };
75398 context.hasHiddenConnections = function(id) {
75399 var graph = history.graph(),
75400 entity = graph.entity(id);
75401 return features.hasHiddenConnections(entity, graph);
75407 context.presets = function() { return presets; };
75412 context.map = function() { return map; };
75413 context.layers = function() { return map.layers; };
75414 context.surface = function() { return map.surface; };
75415 context.editable = function() { return map.editable(); };
75416 context.surfaceRect = function() {
75417 return map.surface.node().getBoundingClientRect();
75423 tile: false, // tile boundaries
75424 collision: false, // label collision bounding boxes
75425 imagery: false, // imagery bounding polygons
75426 community: false, // community bounding polygons
75427 imperial: false, // imperial (not metric) bounding polygons
75428 driveLeft: false, // driveLeft bounding polygons
75429 target: false // touch targets
75431 context.debugFlags = function() {
75434 context.setDebug = function(flag, val) {
75435 if (arguments.length === 1) val = true;
75436 debugFlags[flag] = val;
75437 dispatch$$1.call('change');
75440 context.getDebug = function(flag) {
75441 return flag && debugFlags[flag];
75446 var container = select(document.body);
75447 context.container = function(_) {
75448 if (!arguments.length) return container;
75450 container.classed('id-container', true);
75454 context.embed = function(_) {
75455 if (!arguments.length) return embed;
75462 var assetPath = '';
75463 context.assetPath = function(_) {
75464 if (!arguments.length) return assetPath;
75470 context.assetMap = function(_) {
75471 if (!arguments.length) return assetMap;
75476 context.asset = function(_) {
75477 var filename = assetPath + _;
75478 return assetMap[filename] || filename;
75481 context.imagePath = function(_) {
75482 return context.asset('img/' + _);
75487 // `locale` variable contains a "requested locale".
75488 // It won't become the `currentLocale` until after loadLocale() is called.
75489 var locale, localePath;
75491 context.locale = function(loc, path) {
75492 if (!arguments.length) return currentLocale;
75498 context.loadLocale = function(callback) {
75499 if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
75500 localePath = localePath || context.asset('locales/' + locale + '.json');
75501 d3_json(localePath, function(err, result) {
75503 addTranslation(locale, result[locale]);
75523 /* reset (aka flush) */
75524 context.reset = context.flush = function() {
75525 context.debouncedSave.cancel();
75526 forEach(services, function(service) {
75527 if (service && typeof service.reset === 'function') {
75528 service.reset(context);
75539 context.projection = geoRawMercator();
75540 context.curtainProjection = geoRawMercator();
75542 locale = utilDetect().locale;
75543 if (locale && !dataLocales.hasOwnProperty(locale)) {
75544 locale = locale.split('-')[0];
75547 history = coreHistory(context);
75548 context.graph = history.graph;
75549 context.changes = history.changes;
75550 context.intersects = history.intersects;
75552 // Debounce save, since it's a synchronous localStorage write,
75553 // and history changes can happen frequently (e.g. when dragging).
75554 context.debouncedSave = debounce(context.save, 350);
75555 function withDebouncedSave(fn) {
75556 return function() {
75557 var result = fn.apply(history, arguments);
75558 context.debouncedSave();
75563 context.perform = withDebouncedSave(history.perform);
75564 context.replace = withDebouncedSave(history.replace);
75565 context.pop = withDebouncedSave(history.pop);
75566 context.overwrite = withDebouncedSave(history.overwrite);
75567 context.undo = withDebouncedSave(history.undo);
75568 context.redo = withDebouncedSave(history.redo);
75570 ui = uiInit(context);
75572 connection = services.osm;
75573 background = rendererBackground(context);
75574 features = rendererFeatures(context);
75575 presets = presetIndex();
75577 map = rendererMap(context);
75578 context.mouse = map.mouse;
75579 context.extent = map.extent;
75580 context.pan = map.pan;
75581 context.zoomIn = map.zoomIn;
75582 context.zoomOut = map.zoomOut;
75583 context.zoomInFurther = map.zoomInFurther;
75584 context.zoomOutFurther = map.zoomOutFurther;
75585 context.redrawEnable = map.redrawEnable;
75587 forEach(services, function(service) {
75588 if (service && typeof service.init === 'function') {
75589 service.init(context);
75596 areaKeys = presets.areaKeys();
75599 return utilRebind(context, dispatch$$1, 'on');
75602 function osmWay() {
75603 if (!(this instanceof osmWay)) {
75604 return (new osmWay()).initialize(arguments);
75605 } else if (arguments.length) {
75606 this.initialize(arguments);
75611 osmEntity$$1.way = osmWay;
75613 osmWay.prototype = Object.create(osmEntity$$1.prototype);
75616 assignIn(osmWay.prototype, {
75621 copy: function(resolver, copies) {
75622 if (copies[this.id])
75623 return copies[this.id];
75625 var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
75627 var nodes = this.nodes.map(function(id) {
75628 return resolver.entity(id).copy(resolver, copies).id;
75631 copy = copy.update({ nodes: nodes });
75632 copies[this.id] = copy;
75638 extent: function(resolver) {
75639 return resolver.transient(this, 'extent', function() {
75640 var extent = geoExtent$$1();
75641 for (var i = 0; i < this.nodes.length; i++) {
75642 var node = resolver.hasEntity(this.nodes[i]);
75644 extent._extend(node.extent());
75652 first: function() {
75653 return this.nodes[0];
75658 return this.nodes[this.nodes.length - 1];
75662 contains: function(node) {
75663 return this.nodes.indexOf(node) >= 0;
75667 affix: function(node) {
75668 if (this.nodes[0] === node) return 'prefix';
75669 if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
75673 layer: function() {
75674 // explicit layer tag, clamp between -10, 10..
75675 if (isFinite(this.tags.layer)) {
75676 return Math.max(-10, Math.min(+(this.tags.layer), 10));
75679 // implied layer tag..
75680 if (this.tags.covered === 'yes') return -1;
75681 if (this.tags.location === 'overground') return 1;
75682 if (this.tags.location === 'underground') return -1;
75683 if (this.tags.location === 'underwater') return -10;
75685 if (this.tags.power === 'line') return 10;
75686 if (this.tags.power === 'minor_line') return 10;
75687 if (this.tags.aerialway) return 10;
75688 if (this.tags.bridge) return 1;
75689 if (this.tags.cutting) return -1;
75690 if (this.tags.tunnel) return -1;
75691 if (this.tags.waterway) return -1;
75692 if (this.tags.man_made === 'pipeline') return -10;
75693 if (this.tags.boundary) return -10;
75698 isOneWay: function() {
75699 // explicit oneway tag..
75704 'reversible': true,
75705 'alternating': true,
75709 if (values[this.tags.oneway] !== undefined) {
75710 return values[this.tags.oneway];
75713 // implied oneway tag..
75714 for (var key in this.tags) {
75715 if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
75722 lanes: function() {
75723 return osmLanes(this);
75727 isClosed: function() {
75728 return this.nodes.length > 1 && this.first() === this.last();
75732 isConvex: function(resolver) {
75733 if (!this.isClosed() || this.isDegenerate()) return null;
75735 var nodes = uniq(resolver.childNodes(this));
75736 var coords = map$3(nodes, 'loc');
75740 for (var i = 0; i < coords.length; i++) {
75741 var o = coords[(i+1) % coords.length];
75743 var b = coords[(i+2) % coords.length];
75744 var res = geoVecCross(a, b, o);
75746 curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
75749 } else if (prev && curr !== prev) {
75758 isArea: function() {
75759 // `highway` and `railway` are typically linear features, but there
75760 // are a few exceptions that should be treated as areas, even in the
75761 // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
75776 if (this.tags.area === 'yes')
75778 if (!this.isClosed() || this.tags.area === 'no')
75780 for (var key in this.tags) {
75781 if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
75784 if (key in lineKeys && this.tags[key] in lineKeys[key]) {
75792 isDegenerate: function() {
75793 return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
75797 areAdjacent: function(n1, n2) {
75798 for (var i = 0; i < this.nodes.length; i++) {
75799 if (this.nodes[i] === n1) {
75800 if (this.nodes[i - 1] === n2) return true;
75801 if (this.nodes[i + 1] === n2) return true;
75808 geometry: function(graph) {
75809 return graph.transient(this, 'geometry', function() {
75810 return this.isArea() ? 'area' : 'line';
75815 // If this way is not closed, append the beginning node to the end of the nodelist to close it.
75816 close: function() {
75817 if (this.isClosed() || !this.nodes.length) return this;
75819 var nodes = this.nodes.slice();
75820 nodes = nodes.filter(noRepeatNodes);
75821 nodes.push(nodes[0]);
75822 return this.update({ nodes: nodes });
75826 // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
75827 unclose: function() {
75828 if (!this.isClosed()) return this;
75830 var nodes = this.nodes.slice(),
75831 connector = this.first(),
75832 i = nodes.length - 1;
75834 // remove trailing connectors..
75835 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
75836 nodes.splice(i, 1);
75837 i = nodes.length - 1;
75840 nodes = nodes.filter(noRepeatNodes);
75841 return this.update({ nodes: nodes });
75845 // Adds a node (id) in front of the node which is currently at position index.
75846 // If index is undefined, the node will be added to the end of the way for linear ways,
75847 // or just before the final connecting node for circular ways.
75848 // Consecutive duplicates are eliminated including existing ones.
75849 // Circularity is always preserved when adding a node.
75850 addNode: function(id, index) {
75851 var nodes = this.nodes.slice(),
75852 isClosed = this.isClosed(),
75853 max = isClosed ? nodes.length - 1 : nodes.length;
75855 if (index === undefined) {
75859 if (index < 0 || index > max) {
75860 throw new RangeError('index ' + index + ' out of range 0..' + max);
75863 // If this is a closed way, remove all connector nodes except the first one
75864 // (there may be duplicates) and adjust index if necessary..
75866 var connector = this.first();
75868 // leading connectors..
75870 while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
75871 nodes.splice(i, 1);
75872 if (index > i) index--;
75875 // trailing connectors..
75876 i = nodes.length - 1;
75877 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
75878 nodes.splice(i, 1);
75879 if (index > i) index--;
75880 i = nodes.length - 1;
75884 nodes.splice(index, 0, id);
75885 nodes = nodes.filter(noRepeatNodes);
75887 // If the way was closed before, append a connector node to keep it closed..
75888 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
75889 nodes.push(nodes[0]);
75892 return this.update({ nodes: nodes });
75896 // Replaces the node which is currently at position index with the given node (id).
75897 // Consecutive duplicates are eliminated including existing ones.
75898 // Circularity is preserved when updating a node.
75899 updateNode: function(id, index) {
75900 var nodes = this.nodes.slice(),
75901 isClosed = this.isClosed(),
75902 max = nodes.length - 1;
75904 if (index === undefined || index < 0 || index > max) {
75905 throw new RangeError('index ' + index + ' out of range 0..' + max);
75908 // If this is a closed way, remove all connector nodes except the first one
75909 // (there may be duplicates) and adjust index if necessary..
75911 var connector = this.first();
75913 // leading connectors..
75915 while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
75916 nodes.splice(i, 1);
75917 if (index > i) index--;
75920 // trailing connectors..
75921 i = nodes.length - 1;
75922 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
75923 nodes.splice(i, 1);
75924 if (index === i) index = 0; // update leading connector instead
75925 i = nodes.length - 1;
75929 nodes.splice(index, 1, id);
75930 nodes = nodes.filter(noRepeatNodes);
75932 // If the way was closed before, append a connector node to keep it closed..
75933 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
75934 nodes.push(nodes[0]);
75937 return this.update({nodes: nodes});
75941 // Replaces each occurrence of node id needle with replacement.
75942 // Consecutive duplicates are eliminated including existing ones.
75943 // Circularity is preserved.
75944 replaceNode: function(needle, replacement) {
75945 var nodes = this.nodes.slice(),
75946 isClosed = this.isClosed();
75948 for (var i = 0; i < nodes.length; i++) {
75949 if (nodes[i] === needle) {
75950 nodes[i] = replacement;
75954 nodes = nodes.filter(noRepeatNodes);
75956 // If the way was closed before, append a connector node to keep it closed..
75957 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
75958 nodes.push(nodes[0]);
75961 return this.update({nodes: nodes});
75965 // Removes each occurrence of node id needle with replacement.
75966 // Consecutive duplicates are eliminated including existing ones.
75967 // Circularity is preserved.
75968 removeNode: function(id) {
75969 var nodes = this.nodes.slice(),
75970 isClosed = this.isClosed();
75973 .filter(function(node) { return node !== id; })
75974 .filter(noRepeatNodes);
75976 // If the way was closed before, append a connector node to keep it closed..
75977 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
75978 nodes.push(nodes[0]);
75981 return this.update({nodes: nodes});
75985 asJXON: function(changeset_id) {
75988 '@id': this.osmId(),
75989 '@version': this.version || 0,
75990 nd: map$3(this.nodes, function(id) {
75991 return { keyAttributes: { ref: osmEntity$$1.id.toOSM(id) } };
75993 tag: map$3(this.tags, function(v, k) {
75994 return { keyAttributes: { k: k, v: v } };
75998 if (changeset_id) {
75999 r.way['@changeset'] = changeset_id;
76005 asGeoJSON: function(resolver) {
76006 return resolver.transient(this, 'GeoJSON', function() {
76007 var coordinates = map$3(resolver.childNodes(this), 'loc');
76008 if (this.isArea() && this.isClosed()) {
76011 coordinates: [coordinates]
76015 type: 'LineString',
76016 coordinates: coordinates
76023 area: function(resolver) {
76024 return resolver.transient(this, 'area', function() {
76025 var nodes = resolver.childNodes(this);
76029 coordinates: [map$3(nodes, 'loc')]
76032 if (!this.isClosed() && nodes.length) {
76033 json.coordinates[0].push(nodes[0].loc);
76036 var area = d3_geoArea(json);
76038 // Heuristic for detecting counterclockwise winding order. Assumes
76039 // that OpenStreetMap polygons are not hemisphere-spanning.
76040 if (area > 2 * Math.PI) {
76041 json.coordinates[0] = json.coordinates[0].reverse();
76042 area = d3_geoArea(json);
76045 return isNaN(area) ? 0 : area;
76051 // Filter function to eliminate consecutive duplicates.
76052 function noRepeatNodes(node, i, arr) {
76053 return i === 0 || node !== arr[i - 1];
76056 // For fixing up rendering of multipolygons with tags on the outer member.
76057 // https://github.com/openstreetmap/iD/issues/613
76058 function osmIsSimpleMultipolygonOuterMember(entity, graph) {
76059 if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
76062 var parents = graph.parentRelations(entity);
76063 if (parents.length !== 1)
76066 var parent = parents[0];
76067 if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
76070 var members = parent.members, member;
76071 for (var i = 0; i < members.length; i++) {
76072 member = members[i];
76073 if (member.id === entity.id && member.role && member.role !== 'outer')
76074 return false; // Not outer member
76075 if (member.id !== entity.id && (!member.role || member.role === 'outer'))
76076 return false; // Not a simple multipolygon
76083 function osmSimpleMultipolygonOuterMember(entity, graph) {
76084 if (entity.type !== 'way')
76087 var parents = graph.parentRelations(entity);
76088 if (parents.length !== 1)
76091 var parent = parents[0];
76092 if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
76095 var members = parent.members, member, outerMember;
76096 for (var i = 0; i < members.length; i++) {
76097 member = members[i];
76098 if (!member.role || member.role === 'outer') {
76100 return false; // Not a simple multipolygon
76101 outerMember = member;
76108 var outerEntity = graph.hasEntity(outerMember.id);
76109 if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
76112 return outerEntity;
76116 // Join `toJoin` array into sequences of connecting ways.
76118 // Segments which share identical start/end nodes will, as much as possible,
76119 // be connected with each other.
76121 // The return value is a nested array. Each constituent array contains elements
76122 // of `toJoin` which have been determined to connect.
76124 // Each consitituent array also has a `nodes` property whose value is an
76125 // ordered array of member nodes, with appropriate order reversal and
76126 // start/end coordinate de-duplication.
76128 // Members of `toJoin` must have, at minimum, `type` and `id` properties.
76129 // Thus either an array of `osmWay`s or a relation member array may be used.
76131 // If an member is an `osmWay`, its tags and childnodes may be reversed via
76132 // `actionReverse` in the output.
76134 // The returned sequences array also has an `actions` array property, containing
76135 // any reversal actions that should be applied to the graph, should the calling
76136 // code attempt to actually join the given ways.
76138 // Incomplete members (those for which `graph.hasEntity(element.id)` returns
76139 // false) and non-way members are ignored.
76141 function osmJoinWays(toJoin, graph) {
76142 function resolve(member) {
76143 return graph.childNodes(graph.entity(member.id));
76146 function reverse(item) {
76147 var action = actionReverse(item.id, { reverseOneway: true });
76148 sequences.actions.push(action);
76149 return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
76152 // make a copy containing only the items to join
76153 toJoin = toJoin.filter(function(member) {
76154 return member.type === 'way' && graph.hasEntity(member.id);
76157 // Are the things we are joining relation members or `osmWays`?
76158 // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
76160 var joinAsMembers = true;
76161 for (i = 0; i < toJoin.length; i++) {
76162 if (toJoin[i] instanceof osmWay) {
76163 joinAsMembers = false;
76168 var sequences = [];
76169 sequences.actions = [];
76171 while (toJoin.length) {
76172 // start a new sequence
76173 var item = toJoin.shift();
76174 var currWays = [item];
76175 var currNodes = resolve(item).slice();
76176 var doneSequence = false;
76179 while (toJoin.length && !doneSequence) {
76180 var start = currNodes[0];
76181 var end = currNodes[currNodes.length - 1];
76185 // Find the next way/member to join.
76186 for (i = 0; i < toJoin.length; i++) {
76188 nodes = resolve(item);
76190 // (for member ordering only, not way ordering - see #4872)
76191 // Strongly prefer to generate a forward path that preserves the order
76192 // of the members array. For multipolygons and most relations, member
76193 // order does not matter - but for routes, it does. (see #4589)
76194 // If we started this sequence backwards (i.e. next member way attaches to
76195 // the start node and not the end node), reverse the initial way before continuing.
76196 if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
76197 (nodes[nodes.length - 1] === start || nodes[0] === start)
76199 currWays[0] = reverse(currWays[0]);
76200 currNodes.reverse();
76201 start = currNodes[0];
76202 end = currNodes[currNodes.length - 1];
76205 if (nodes[0] === end) {
76206 fn = currNodes.push; // join to end
76207 nodes = nodes.slice(1);
76209 } else if (nodes[nodes.length - 1] === end) {
76210 fn = currNodes.push; // join to end
76211 nodes = nodes.slice(0, -1).reverse();
76212 item = reverse(item);
76214 } else if (nodes[nodes.length - 1] === start) {
76215 fn = currNodes.unshift; // join to beginning
76216 nodes = nodes.slice(0, -1);
76218 } else if (nodes[0] === start) {
76219 fn = currNodes.unshift; // join to beginning
76220 nodes = nodes.slice(1).reverse();
76221 item = reverse(item);
76228 if (!nodes) { // couldn't find a joinable way/member
76229 doneSequence = true;
76233 fn.apply(currWays, [item]);
76234 fn.apply(currNodes, nodes);
76236 toJoin.splice(i, 1);
76239 currWays.nodes = currNodes;
76240 sequences.push(currWays);
76246 function osmRelation() {
76247 if (!(this instanceof osmRelation)) {
76248 return (new osmRelation()).initialize(arguments);
76249 } else if (arguments.length) {
76250 this.initialize(arguments);
76255 osmEntity$$1.relation = osmRelation;
76257 osmRelation.prototype = Object.create(osmEntity$$1.prototype);
76260 osmRelation.creationOrder = function(a, b) {
76261 var aId = parseInt(osmEntity$$1.id.toOSM(a.id), 10);
76262 var bId = parseInt(osmEntity$$1.id.toOSM(b.id), 10);
76264 if (aId < 0 || bId < 0) return aId - bId;
76269 assignIn(osmRelation.prototype, {
76274 copy: function(resolver, copies) {
76275 if (copies[this.id])
76276 return copies[this.id];
76278 var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
76280 var members = this.members.map(function(member) {
76281 return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
76284 copy = copy.update({members: members});
76285 copies[this.id] = copy;
76291 extent: function(resolver, memo) {
76292 return resolver.transient(this, 'extent', function() {
76293 if (memo && memo[this.id]) return geoExtent$$1();
76295 memo[this.id] = true;
76297 var extent = geoExtent$$1();
76298 for (var i = 0; i < this.members.length; i++) {
76299 var member = resolver.hasEntity(this.members[i].id);
76301 extent._extend(member.extent(resolver, memo));
76309 geometry: function(graph) {
76310 return graph.transient(this, 'geometry', function() {
76311 return this.isMultipolygon() ? 'area' : 'relation';
76316 isDegenerate: function() {
76317 return this.members.length === 0;
76321 // Return an array of members, each extended with an 'index' property whose value
76322 // is the member index.
76323 indexedMembers: function() {
76324 var result = new Array(this.members.length);
76325 for (var i = 0; i < this.members.length; i++) {
76326 result[i] = assignIn({}, this.members[i], {index: i});
76332 // Return the first member with the given role. A copy of the member object
76333 // is returned, extended with an 'index' property whose value is the member index.
76334 memberByRole: function(role) {
76335 for (var i = 0; i < this.members.length; i++) {
76336 if (this.members[i].role === role) {
76337 return assignIn({}, this.members[i], {index: i});
76342 // Same as memberByRole, but returns all members with the given role
76343 membersByRole: function(role) {
76345 for (var i = 0; i < this.members.length; i++) {
76346 if (this.members[i].role === role) {
76347 result.push(assignIn({}, this.members[i], {index: i}));
76353 // Return the first member with the given id. A copy of the member object
76354 // is returned, extended with an 'index' property whose value is the member index.
76355 memberById: function(id) {
76356 for (var i = 0; i < this.members.length; i++) {
76357 if (this.members[i].id === id) {
76358 return assignIn({}, this.members[i], {index: i});
76364 // Return the first member with the given id and role. A copy of the member object
76365 // is returned, extended with an 'index' property whose value is the member index.
76366 memberByIdAndRole: function(id, role) {
76367 for (var i = 0; i < this.members.length; i++) {
76368 if (this.members[i].id === id && this.members[i].role === role) {
76369 return assignIn({}, this.members[i], {index: i});
76375 addMember: function(member, index) {
76376 var members = this.members.slice();
76377 members.splice(index === undefined ? members.length : index, 0, member);
76378 return this.update({members: members});
76382 updateMember: function(member, index) {
76383 var members = this.members.slice();
76384 members.splice(index, 1, assignIn({}, members[index], member));
76385 return this.update({members: members});
76389 removeMember: function(index) {
76390 var members = this.members.slice();
76391 members.splice(index, 1);
76392 return this.update({members: members});
76396 removeMembersWithID: function(id) {
76397 var members = reject(this.members, function(m) { return m.id === id; });
76398 return this.update({members: members});
76402 // Wherever a member appears with id `needle.id`, replace it with a member
76403 // with id `replacement.id`, type `replacement.type`, and the original role,
76404 // By default, adding a duplicate member (by id and role) is prevented.
76405 // Return an updated relation.
76406 replaceMember: function(needle, replacement, keepDuplicates) {
76407 if (!this.memberById(needle.id))
76412 for (var i = 0; i < this.members.length; i++) {
76413 var member = this.members[i];
76414 if (member.id !== needle.id) {
76415 members.push(member);
76416 } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
76417 members.push({id: replacement.id, type: replacement.type, role: member.role});
76421 return this.update({members: members});
76425 asJXON: function(changeset_id) {
76428 '@id': this.osmId(),
76429 '@version': this.version || 0,
76430 member: map$3(this.members, function(member) {
76435 ref: osmEntity$$1.id.toOSM(member.id)
76439 tag: map$3(this.tags, function(v, k) {
76440 return { keyAttributes: { k: k, v: v } };
76444 if (changeset_id) r.relation['@changeset'] = changeset_id;
76449 asGeoJSON: function(resolver) {
76450 return resolver.transient(this, 'GeoJSON', function () {
76451 if (this.isMultipolygon()) {
76453 type: 'MultiPolygon',
76454 coordinates: this.multipolygon(resolver)
76458 type: 'FeatureCollection',
76459 properties: this.tags,
76460 features: this.members.map(function (member) {
76461 return assignIn({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
76469 area: function(resolver) {
76470 return resolver.transient(this, 'area', function() {
76471 return d3_geoArea(this.asGeoJSON(resolver));
76476 isMultipolygon: function() {
76477 return this.tags.type === 'multipolygon';
76481 isComplete: function(resolver) {
76482 for (var i = 0; i < this.members.length; i++) {
76483 if (!resolver.hasEntity(this.members[i].id)) {
76491 isRestriction: function() {
76492 return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
76496 isValidRestriction: function() {
76497 if (!this.isRestriction()) return false;
76499 var froms = this.members.filter(function(m) { return m.role === 'from'; });
76500 var vias = this.members.filter(function(m) { return m.role === 'via'; });
76501 var tos = this.members.filter(function(m) { return m.role === 'to'; });
76503 if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
76504 if (froms.some(function(m) { return m.type !== 'way'; })) return false;
76506 if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
76507 if (tos.some(function(m) { return m.type !== 'way'; })) return false;
76509 if (vias.length === 0) return false;
76510 if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
76516 // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
76517 // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
76519 // This corresponds to the structure needed for rendering a multipolygon path using a
76520 // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
76522 // In the case of invalid geometries, this function will still return a result which
76523 // includes the nodes of all way members, but some Nds may be unclosed and some inner
76524 // rings not matched with the intended outer ring.
76526 multipolygon: function(resolver) {
76527 var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
76528 var inners = this.members.filter(function(m) { return 'inner' === m.role; });
76530 outers = osmJoinWays(outers, resolver);
76531 inners = osmJoinWays(inners, resolver);
76533 outers = outers.map(function(outer) { return map$3(outer.nodes, 'loc'); });
76534 inners = inners.map(function(inner) { return map$3(inner.nodes, 'loc'); });
76536 var result = outers.map(function(o) {
76537 // Heuristic for detecting counterclockwise winding order. Assumes
76538 // that OpenStreetMap polygons are not hemisphere-spanning.
76539 return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
76542 function findOuter(inner) {
76545 for (o = 0; o < outers.length; o++) {
76547 if (geoPolygonContainsPolygon(outer, inner))
76551 for (o = 0; o < outers.length; o++) {
76553 if (geoPolygonIntersectsPolygon(outer, inner, false))
76558 for (var i = 0; i < inners.length; i++) {
76559 var inner = inners[i];
76561 if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
76562 inner = inner.reverse();
76565 var o = findOuter(inners[i]);
76566 if (o !== undefined)
76567 result[o].push(inners[i]);
76569 result.push([inners[i]]); // Invalid geometry
76576 function osmTurn(turn) {
76577 if (!(this instanceof osmTurn)) {
76578 return new osmTurn(turn);
76580 assignIn(this, turn);
76584 function osmIntersection(graph, startVertexId, maxDistance) {
76585 maxDistance = maxDistance || 30; // in meters
76586 var vgraph = coreGraph$$1(); // virtual graph
76590 function memberOfRestriction(entity) {
76591 return graph.parentRelations(entity)
76592 .some(function(r) { return r.isRestriction(); });
76595 function isRoad(way) {
76596 if (way.isArea() || way.isDegenerate()) return false;
76599 'motorway_link': true,
76601 'trunk_link': true,
76603 'primary_link': true,
76605 'secondary_link': true,
76607 'tertiary_link': true,
76608 'residential': true,
76609 'unclassified': true,
76610 'living_street': true,
76615 return roads[way.tags.highway];
76619 var startNode = graph.entity(startVertexId);
76620 var checkVertices = [startNode];
76623 var vertexIds = [];
76633 // `actions` will store whatever actions must be performed to satisfy
76634 // preconditions for adding a turn restriction to this intersection.
76635 // - Remove any existing degenerate turn restrictions (missing from/to, etc)
76636 // - Reverse oneways so that they are drawn in the forward direction
76637 // - Split ways on key vertices
76641 // STEP 1: walk the graph outwards from starting vertex to search
76642 // for more key vertices and ways to include in the intersection..
76644 while (checkVertices.length) {
76645 vertex = checkVertices.pop();
76647 // check this vertex for parent ways that are roads
76648 checkWays = graph.parentWays(vertex);
76649 var hasWays = false;
76650 for (i = 0; i < checkWays.length; i++) {
76651 way = checkWays[i];
76652 if (!isRoad(way) && !memberOfRestriction(way)) continue;
76654 ways.push(way); // it's a road, or it's already in a turn restriction
76657 // check the way's children for more key vertices
76658 nodes = uniq(graph.childNodes(way));
76659 for (j = 0; j < nodes.length; j++) {
76661 if (node === vertex) continue; // same thing
76662 if (vertices.indexOf(node) !== -1) continue; // seen it already
76663 if (node.loc && startNode.loc &&
76664 geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue; // too far from start
76666 // a key vertex will have parents that are also roads
76667 var hasParents = false;
76668 parents = graph.parentWays(node);
76669 for (k = 0; k < parents.length; k++) {
76670 parent = parents[k];
76671 if (parent === way) continue; // same thing
76672 if (ways.indexOf(parent) !== -1) continue; // seen it already
76673 if (!isRoad(parent)) continue; // not a road
76679 checkVertices.push(node);
76685 vertices.push(vertex);
76689 vertices = uniq(vertices);
76693 // STEP 2: Build a virtual graph containing only the entities in the intersection..
76694 // Everything done after this step should act on the virtual graph
76695 // Any actions that must be performed later to the main graph go in `actions` array
76696 ways.forEach(function(way) {
76697 graph.childNodes(way).forEach(function(node) {
76698 vgraph = vgraph.replace(node);
76701 vgraph = vgraph.replace(way);
76703 graph.parentRelations(way).forEach(function(relation) {
76704 if (relation.isRestriction()) {
76705 if (relation.isValidRestriction(graph)) {
76706 vgraph = vgraph.replace(relation);
76707 } else if (relation.isComplete(graph)) {
76708 actions.push(actionDeleteRelation(relation.id));
76715 // STEP 3: Force all oneways to be drawn in the forward direction
76716 ways.forEach(function(w) {
76717 var way = vgraph.entity(w.id);
76718 if (way.tags.oneway === '-1') {
76719 var action = actionReverse(way.id, { reverseOneway: true });
76720 actions.push(action);
76721 vgraph = action(vgraph);
76726 // STEP 4: Split ways on key vertices
76727 var origCount = osmEntity$$1.id.next.way;
76728 vertices.forEach(function(v) {
76729 // This is an odd way to do it, but we need to find all the ways that
76730 // will be split here, then split them one at a time to ensure that these
76731 // actions can be replayed on the main graph exactly in the same order.
76732 // (It is unintuitive, but the order of ways returned from graph.parentWays()
76733 // is arbitrary, depending on how the main graph and vgraph were built)
76734 var splitAll = actionSplit(v.id);
76735 if (!splitAll.disabled(vgraph)) {
76736 splitAll.ways(vgraph).forEach(function(way) {
76737 var splitOne = actionSplit(v.id).limitWays([way.id]);
76738 actions.push(splitOne);
76739 vgraph = splitOne(vgraph);
76744 // In here is where we should also split the intersection at nearby junction.
76745 // for https://github.com/mapbox/iD-internal/issues/31
76746 // nearbyVertices.forEach(function(v) {
76749 // Reasons why we reset the way id count here:
76750 // 1. Continuity with way ids created by the splits so that we can replay
76751 // these actions later if the user decides to create a turn restriction
76752 // 2. Avoids churning way ids just by hovering over a vertex
76753 // and displaying the turn restriction editor
76754 osmEntity$$1.id.next.way = origCount;
76757 // STEP 5: Update arrays to point to vgraph entities
76758 vertexIds = vertices.map(function(v) { return v.id; });
76762 vertexIds.forEach(function(id) {
76763 var vertex = vgraph.entity(id);
76764 var parents = vgraph.parentWays(vertex);
76765 vertices.push(vertex);
76766 ways = ways.concat(parents);
76769 vertices = uniq(vertices);
76772 vertexIds = vertices.map(function(v) { return v.id; });
76773 wayIds = ways.map(function(w) { return w.id; });
76776 // STEP 6: Update the ways with some metadata that will be useful for
76777 // walking the intersection graph later and rendering turn arrows.
76779 function withMetadata(way, vertexIds) {
76780 var __oneWay = way.isOneWay();
76782 // which affixes are key vertices?
76783 var __first = (vertexIds.indexOf(way.first()) !== -1);
76784 var __last = (vertexIds.indexOf(way.last()) !== -1);
76786 // what roles is this way eligible for?
76787 var __via = (__first && __last);
76788 var __from = ((__first && !__oneWay) || __last);
76789 var __to = (__first || (__last && !__oneWay));
76791 return way.update({
76802 wayIds.forEach(function(id) {
76803 var way = withMetadata(vgraph.entity(id), vertexIds);
76804 vgraph = vgraph.replace(way);
76809 // STEP 7: Simplify - This is an iterative process where we:
76810 // 1. Find trivial vertices with only 2 parents
76811 // 2. trim off the leaf way from those vertices and remove from vgraph
76814 var removeWayIds = [];
76815 var removeVertexIds = [];
76819 checkVertices = vertexIds.slice();
76821 for (i = 0; i < checkVertices.length; i++) {
76822 var vertexId = checkVertices[i];
76823 vertex = vgraph.hasEntity(vertexId);
76826 if (vertexIds.indexOf(vertexId) !== -1) {
76827 vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
76829 removeVertexIds.push(vertexId);
76833 parents = vgraph.parentWays(vertex);
76834 if (parents.length < 3) {
76835 if (vertexIds.indexOf(vertexId) !== -1) {
76836 vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
76840 if (parents.length === 2) { // vertex with 2 parents is trivial
76841 var a = parents[0];
76842 var b = parents[1];
76843 var aIsLeaf = a && !a.__via;
76844 var bIsLeaf = b && !b.__via;
76845 var leaf, survivor;
76847 if (aIsLeaf && !bIsLeaf) {
76850 } else if (!aIsLeaf && bIsLeaf) {
76855 if (leaf && survivor) {
76856 survivor = withMetadata(survivor, vertexIds); // update survivor way
76857 vgraph = vgraph.replace(survivor).remove(leaf); // update graph
76858 removeWayIds.push(leaf.id);
76863 parents = vgraph.parentWays(vertex);
76865 if (parents.length < 2) { // vertex is no longer a key vertex
76866 if (vertexIds.indexOf(vertexId) !== -1) {
76867 vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
76869 removeVertexIds.push(vertexId);
76873 if (parents.length < 1) { // vertex is no longer attached to anything
76874 vgraph = vgraph.remove(vertex);
76878 } while (keepGoing);
76881 vertices = vertices
76882 .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
76883 .map(function(vertex) { return vgraph.entity(vertex.id); });
76885 .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
76886 .map(function(way) { return vgraph.entity(way.id); });
76889 // OK! Here is our intersection..
76890 var intersection = {
76893 vertices: vertices,
76899 // Get all the valid turns through this intersection given a starting way id.
76900 // This operates on the virtual graph for everything.
76902 // Basically, walk through all possible paths from starting way,
76903 // honoring the existing turn restrictions as we go (watch out for loops!)
76905 // For each path found, generate and return a `osmTurn` datastructure.
76907 intersection.turns = function(fromWayId, maxViaWay) {
76908 if (!fromWayId) return [];
76909 if (!maxViaWay) maxViaWay = 0;
76911 var vgraph = intersection.graph;
76912 var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
76914 var start = vgraph.entity(fromWayId);
76915 if (!start || !(start.__from || start.__via)) return [];
76917 // maxViaWay=0 from-*-to (0 vias)
76918 // maxViaWay=1 from-*-via-*-to (1 via max)
76919 // maxViaWay=2 from-*-via-*-via-*-to (2 vias max)
76920 var maxPathLength = (maxViaWay * 2) + 3;
76927 // traverse the intersection graph and find all the valid paths
76928 function step(entity, currPath, currRestrictions, matchedRestriction) {
76929 currPath = clone(currPath || []);
76930 if (currPath.length >= maxPathLength) return;
76931 currPath.push(entity.id);
76932 currRestrictions = clone(currRestrictions || []);
76935 if (entity.type === 'node') {
76936 var parents = vgraph.parentWays(entity);
76939 // which ways can we step into?
76940 for (i = 0; i < parents.length; i++) {
76941 var way = parents[i];
76943 // if next way is a oneway incoming to this vertex, skip
76944 if (way.__oneWay && way.nodes[0] !== entity.id) continue;
76946 // if we have seen it before (allowing for an initial u-turn), skip
76947 if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
76949 // Check all "current" restrictions (where we've already walked the `FROM`)
76950 var restrict = undefined;
76951 for (j = 0; j < currRestrictions.length; j++) {
76952 var restriction = currRestrictions[j];
76953 var f = restriction.memberByRole('from');
76954 var v = restriction.membersByRole('via');
76955 var t = restriction.memberByRole('to');
76956 var isOnly = /^only_/.test(restriction.tags.restriction);
76958 // Does the current path match this turn restriction?
76959 var matchesFrom = (f.id === fromWayId);
76960 var matchesViaTo = false;
76961 var isAlongOnlyPath = false;
76963 if (t.id === way.id) { // match TO
76965 if (v.length === 1 && v[0].type === 'node') { // match VIA node
76966 matchesViaTo = (v[0].id === entity.id && (
76967 (matchesFrom && currPath.length === 2) ||
76968 (!matchesFrom && currPath.length > 2)
76971 } else { // match all VIA ways
76973 for (k = 2; k < currPath.length; k +=2 ) { // k = 2 skips FROM
76974 pathVias.push(currPath[k]); // (path goes way-node-way...)
76976 var restrictionVias = [];
76977 for (k = 0; k < v.length; k++) {
76978 if (v[k].type === 'way') {
76979 restrictionVias.push(v[k].id);
76982 var diff = difference(pathVias, restrictionVias);
76983 matchesViaTo = !diff.length;
76986 } else if (isOnly) {
76987 for (k = 0; k < v.length; k++) {
76988 // way doesn't match TO, but is one of the via ways along the path of an "only"
76989 if (v[k].type === 'way' && v[k].id === way.id) {
76990 isAlongOnlyPath = true;
76996 if (matchesViaTo) {
76998 restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
77000 restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
77002 } else { // indirect - caused by a different nearby restriction
77003 if (isAlongOnlyPath) {
77004 restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
77005 } else if (isOnly) {
77006 restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
77010 // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
77011 if (restrict && restrict.direct)
77015 nextWays.push({ way: way, restrict: restrict });
77018 nextWays.forEach(function(nextWay) {
77019 step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
77023 } else { // entity.type === 'way'
77024 if (currPath.length >= 3) { // this is a "complete" path..
77025 var turnPath = clone(currPath);
77027 // an indirect restriction - only include the partial path (starting at FROM)
77028 if (matchedRestriction && matchedRestriction.direct === false) {
77029 for (i = 0; i < turnPath.length; i++) {
77030 if (turnPath[i] === matchedRestriction.from) {
77031 turnPath = turnPath.slice(i);
77037 var turn = pathToTurn(turnPath);
77039 if (matchedRestriction) {
77040 turn.restrictionID = matchedRestriction.id;
77041 turn.no = matchedRestriction.no;
77042 turn.only = matchedRestriction.only;
77043 turn.direct = matchedRestriction.direct;
77045 turns.push(osmTurn(turn));
77048 if (currPath[0] === currPath[2]) return; // if we made a u-turn - stop here
77051 if (matchedRestriction && matchedRestriction.end) return; // don't advance any further
77053 // which nodes can we step into?
77054 var n1 = vgraph.entity(entity.first());
77055 var n2 = vgraph.entity(entity.last());
77056 var dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc);
77057 var nextNodes = [];
77059 if (currPath.length > 1) {
77060 if (dist > maxDistance) return; // the next node is too far
77061 if (!entity.__via) return; // this way is a leaf / can't be a via
77064 if (!entity.__oneWay && // bidirectional..
77065 keyVertexIds.indexOf(n1.id) !== -1 && // key vertex..
77066 currPath.indexOf(n1.id) === -1) { // haven't seen it yet..
77067 nextNodes.push(n1); // can advance to first node
77069 if (keyVertexIds.indexOf(n2.id) !== -1 && // key vertex..
77070 currPath.indexOf(n2.id) === -1) { // haven't seen it yet..
77071 nextNodes.push(n2); // can advance to last node
77074 nextNodes.forEach(function(nextNode) {
77075 // gather restrictions FROM this way
77076 var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
77077 if (!r.isRestriction()) return false;
77079 var f = r.memberByRole('from');
77080 if (!f || f.id !== entity.id) return false;
77082 var isOnly = /^only_/.test(r.tags.restriction);
77083 if (!isOnly) return true;
77085 // `only_` restrictions only matter along the direction of the VIA - #4849
77086 var isOnlyVia = false;
77087 var v = r.membersByRole('via');
77088 if (v.length === 1 && v[0].type === 'node') { // via node
77089 isOnlyVia = (v[0].id === nextNode.id);
77090 } else { // via way(s)
77091 for (var i = 0; i < v.length; i++) {
77092 if (v[i].type !== 'way') continue;
77093 var viaWay = vgraph.entity(v[i].id);
77094 if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
77103 step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
77109 // assumes path is alternating way-node-way of odd length
77110 function pathToTurn(path) {
77111 if (path.length < 3) return;
77112 var fromWayId, fromNodeId, fromVertexId;
77113 var toWayId, toNodeId, toVertexId;
77114 var viaWayIds, viaNodeId, isUturn;
77116 fromWayId = path[0];
77117 toWayId = path[path.length - 1];
77119 if (path.length === 3 && fromWayId === toWayId) { // u turn
77120 var way = vgraph.entity(fromWayId);
77121 if (way.__oneWay) return null;
77124 viaNodeId = fromVertexId = toVertexId = path[1];
77125 fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
77129 fromVertexId = path[1];
77130 fromNodeId = adjacentNode(fromWayId, fromVertexId);
77131 toVertexId = path[path.length - 2];
77132 toNodeId = adjacentNode(toWayId, toVertexId);
77134 if (path.length === 3) {
77135 viaNodeId = path[1];
77137 viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
77138 viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1); // remove first, last
77143 key: path.join('_'),
77145 from: { node: fromNodeId, way: fromWayId, vertex: fromVertexId },
77146 via: { node: viaNodeId, ways: viaWayIds },
77147 to: { node: toNodeId, way: toWayId, vertex: toVertexId },
77152 function adjacentNode(wayId, affixId) {
77153 var nodes = vgraph.entity(wayId).nodes;
77154 return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
77160 return intersection;
77164 function osmInferRestriction(graph, turn, projection) {
77165 var fromWay = graph.entity(turn.from.way);
77166 var fromNode = graph.entity(turn.from.node);
77167 var fromVertex = graph.entity(turn.from.vertex);
77168 var toWay = graph.entity(turn.to.way);
77169 var toNode = graph.entity(turn.to.node);
77170 var toVertex = graph.entity(turn.to.vertex);
77172 var fromOneWay = (fromWay.tags.oneway === 'yes');
77173 var toOneWay = (toWay.tags.oneway === 'yes');
77174 var angle = (geoAngle(fromVertex, fromNode, projection) -
77175 geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
77180 if (fromNode === toNode)
77181 return 'no_u_turn';
77182 if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
77183 return 'no_u_turn'; // wider tolerance for u-turn if both ways are oneway
77184 if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
77185 return 'no_u_turn'; // even wider tolerance for u-turn if there is a via way (from !== to)
77187 return 'no_right_turn';
77189 return 'no_left_turn';
77191 return 'no_straight_on';
77194 function actionAddMember(relationId, member, memberIndex, insertPair) {
77196 return function action(graph) {
77197 var relation = graph.entity(relationId);
77199 // There are some special rules for Public Transport v2 routes.
77200 var isPTv2 = /stop|platform/.test(member.role);
77202 if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
77203 // Try to perform sensible inserts based on how the ways join together
77204 graph = addWayMember(relation, graph);
77206 // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
77207 // Stops and Platforms for PTv2 should be ordered first.
77208 // hack: We do not currently have the ability to place them in the exactly correct order.
77209 if (isPTv2 && isNaN(memberIndex)) {
77213 graph = graph.replace(relation.addMember(member, memberIndex));
77220 // Add a way member into the relation "wherever it makes sense".
77221 // In this situation we were not supplied a memberIndex.
77222 function addWayMember(relation, graph) {
77223 var groups, tempWay, item, i, j, k;
77225 // remove PTv2 stops and platforms before doing anything.
77226 var PTv2members = [];
77228 for (i = 0; i < relation.members.length; i++) {
77229 var m = relation.members[i];
77230 if (/stop|platform/.test(m.role)) {
77231 PTv2members.push(m);
77236 relation = relation.update({ members: members });
77240 // We're adding a member that must stay paired with an existing member.
77241 // (This feature is used by `actionSplit`)
77243 // This is tricky because the members may exist multiple times in the
77244 // member list, and with different A-B/B-A ordering and different roles.
77245 // (e.g. a bus route that loops out and back - #4589).
77247 // Replace the existing member with a temporary way,
77248 // so that `osmJoinWays` can treat the pair like a single way.
77249 tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
77250 graph = graph.replace(tempWay);
77251 var tempMember = { id: tempWay.id, type: 'way', role: member.role };
77252 var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
77253 groups = groupBy(tempRelation.members, function(m) { return m.type; });
77254 groups.way = groups.way || [];
77257 // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
77258 groups = groupBy(relation.members, function(m) { return m.type; });
77259 groups.way = groups.way || [];
77260 groups.way.push(member);
77263 members = withIndex(groups.way);
77264 var joined = osmJoinWays(members, graph);
77266 // `joined` might not contain all of the way members,
77267 // But will contain only the completed (downloaded) members
77268 for (i = 0; i < joined.length; i++) {
77269 var segment = joined[i];
77270 var nodes = segment.nodes.slice();
77271 var startIndex = segment[0].index;
77273 // j = array index in `members` where this segment starts
77274 for (j = 0; j < members.length; j++) {
77275 if (members[j].index === startIndex) {
77280 // k = each member in segment
77281 for (k = 0; k < segment.length; k++) {
77283 var way = graph.entity(item.id);
77285 // If this is a paired item, generate members in correct order and role
77286 if (tempWay && item.id === tempWay.id) {
77287 if (nodes[0].id === insertPair.nodes[0]) {
77289 { id: insertPair.originalID, type: 'way', role: item.role },
77290 { id: insertPair.insertedID, type: 'way', role: item.role }
77294 { id: insertPair.insertedID, type: 'way', role: item.role },
77295 { id: insertPair.originalID, type: 'way', role: item.role }
77300 // reorder `members` if necessary
77302 if (j+k >= members.length || item.index !== members[j+k].index) {
77303 moveMember(members, item.index, j+k);
77307 nodes.splice(0, way.nodes.length - 1);
77312 graph = graph.remove(tempWay);
77315 // Final pass: skip dead items, split pairs, remove index properties
77316 var wayMembers = [];
77317 for (i = 0; i < members.length; i++) {
77319 if (item.index === -1) continue;
77322 wayMembers.push(item.pair[0]);
77323 wayMembers.push(item.pair[1]);
77325 wayMembers.push(omit(item, 'index'));
77329 // Put stops and platforms first, then nodes, ways, relations
77330 // This is recommended for Public Transport v2 routes:
77331 // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
77332 var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
77334 return graph.replace(relation.update({members: newMembers}));
77337 // `moveMember()` changes the `members` array in place by splicing
77338 // the item with `.index = findIndex` to where it belongs,
77339 // and marking the old position as "dead" with `.index = -1`
77343 // members 0 1 2 3 4 5 6 7 8 9 keep 5 in j+k
77347 // members 0 1 2 3 4 5 6 7 8 9 move 4 to j+k
77348 // members 0 1 2 3 x 5 4 6 7 8 9 moved
77352 // members 0 1 2 3 x 5 4 6 7 8 9 move 7 to j+k
77353 // members 0 1 2 3 x 5 4 7 6 x 8 9 moved
77357 // members 0 1 2 3 x 5 4 7 6 x 8 9 keep 6 in j+k
77359 function moveMember(arr, findIndex, toIndex) {
77360 for (var i = 0; i < arr.length; i++) {
77361 if (arr[i].index === findIndex) {
77366 var item = clone(arr[i]);
77367 arr[i].index = -1; // mark as dead
77368 item.index = toIndex;
77369 arr.splice(toIndex, 0, item);
77373 // This is the same as `Relation.indexedMembers`,
77374 // Except we don't want to index all the members, only the ways
77375 function withIndex(arr) {
77376 var result = new Array(arr.length);
77377 for (var i = 0; i < arr.length; i++) {
77378 result[i] = arr[i];
77379 result[i].index = i;
77387 function actionAddMidpoint(midpoint, node) {
77388 return function(graph) {
77389 graph = graph.replace(node.move(midpoint.loc));
77391 var parents = intersection(
77392 graph.parentWays(graph.entity(midpoint.edge[0])),
77393 graph.parentWays(graph.entity(midpoint.edge[1])));
77395 parents.forEach(function(way) {
77396 for (var i = 0; i < way.nodes.length - 1; i++) {
77397 if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
77398 graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
77400 // Add only one midpoint on doubled-back segments,
77401 // turning them into self-intersections.
77411 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
77412 function actionAddVertex(wayId, nodeId, index) {
77413 return function(graph) {
77414 return graph.replace(graph.entity(wayId).addNode(nodeId, index));
77418 function actionChangeMember(relationId, member, memberIndex) {
77419 return function(graph) {
77420 return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
77424 function actionChangePreset(entityId, oldPreset, newPreset) {
77425 return function(graph) {
77426 var entity = graph.entity(entityId),
77427 geometry = entity.geometry(graph),
77428 tags = entity.tags;
77430 if (oldPreset) tags = oldPreset.removeTags(tags, geometry);
77431 if (newPreset) tags = newPreset.applyTags(tags, geometry);
77433 return graph.replace(entity.update({tags: tags}));
77437 function actionChangeTags(entityId, tags) {
77438 return function(graph) {
77439 var entity = graph.entity(entityId);
77440 return graph.replace(entity.update({tags: tags}));
77444 function actionCircularize(wayId, projection, maxAngle) {
77445 maxAngle = (maxAngle || 20) * Math.PI / 180;
77448 var action = function(graph, t) {
77449 if (t === null || !isFinite(t)) t = 1;
77450 t = Math.min(Math.max(+t, 0), 1);
77452 var way = graph.entity(wayId),
77455 graph.childNodes(way).forEach(function(node) {
77456 if (!origNodes[node.id]) origNodes[node.id] = node;
77459 if (!way.isConvex(graph)) {
77460 graph = action.makeConvex(graph);
77463 var nodes = uniq(graph.childNodes(way)),
77464 keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
77465 points = nodes.map(function(n) { return projection(n.loc); }),
77466 keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
77467 centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
77468 radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }),
77469 sign = d3_polygonArea(points) > 0 ? 1 : -1,
77472 // we need atleast two key nodes for the algorithm to work
77473 if (!keyNodes.length) {
77474 keyNodes = [nodes[0]];
77475 keyPoints = [points[0]];
77478 if (keyNodes.length === 1) {
77479 var index = nodes.indexOf(keyNodes[0]),
77480 oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
77482 keyNodes.push(nodes[oppositeIndex]);
77483 keyPoints.push(points[oppositeIndex]);
77486 // key points and nodes are those connected to the ways,
77487 // they are projected onto the circle, inbetween nodes are moved
77488 // to constant intervals between key nodes, extra inbetween nodes are
77489 // added if necessary.
77490 for (var i = 0; i < keyPoints.length; i++) {
77491 var nextKeyNodeIndex = (i + 1) % keyNodes.length,
77492 startNode = keyNodes[i],
77493 endNode = keyNodes[nextKeyNodeIndex],
77494 startNodeIndex = nodes.indexOf(startNode),
77495 endNodeIndex = nodes.indexOf(endNode),
77496 numberNewPoints = -1,
77497 indexRange = endNodeIndex - startNodeIndex,
77499 inBetweenNodes = [],
77500 startAngle, endAngle, totalAngle, eachAngle,
77501 angle, loc, node, origNode, j;
77503 if (indexRange < 0) {
77504 indexRange += nodes.length;
77507 // position this key node
77508 var distance = geoVecLength(centroid, keyPoints[i]);
77509 if (distance === 0) { distance = 1e-4; }
77511 centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
77512 centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
77514 loc = projection.invert(keyPoints[i]);
77515 node = keyNodes[i];
77516 origNode = origNodes[node.id];
77517 node = node.move(geoVecInterp(origNode.loc, loc, t));
77518 graph = graph.replace(node);
77520 // figure out the between delta angle we want to match to
77521 startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
77522 endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
77523 totalAngle = endAngle - startAngle;
77525 // detects looping around -pi/pi
77526 if (totalAngle * sign > 0) {
77527 totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
77532 eachAngle = totalAngle / (indexRange + numberNewPoints);
77533 } while (Math.abs(eachAngle) > maxAngle);
77536 // move existing nodes
77537 for (j = 1; j < indexRange; j++) {
77538 angle = startAngle + j * eachAngle;
77539 loc = projection.invert([
77540 centroid[0] + Math.cos(angle) * radius,
77541 centroid[1] + Math.sin(angle) * radius
77544 node = nodes[(j + startNodeIndex) % nodes.length];
77545 origNode = origNodes[node.id];
77546 nearNodes[node.id] = angle;
77548 node = node.move(geoVecInterp(origNode.loc, loc, t));
77549 graph = graph.replace(node);
77552 // add new inbetween nodes if necessary
77553 for (j = 0; j < numberNewPoints; j++) {
77554 angle = startAngle + (indexRange + j) * eachAngle;
77555 loc = projection.invert([
77556 centroid[0] + Math.cos(angle) * radius,
77557 centroid[1] + Math.sin(angle) * radius
77560 // choose a nearnode to use as the original
77561 var min$$1 = Infinity;
77562 for (var nodeId in nearNodes) {
77563 var nearAngle = nearNodes[nodeId],
77564 dist = Math.abs(nearAngle - angle);
77565 if (dist < min$$1) {
77567 origNode = origNodes[nodeId];
77571 node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
77572 graph = graph.replace(node);
77574 nodes.splice(endNodeIndex + j, 0, node);
77575 inBetweenNodes.push(node.id);
77578 // Check for other ways that share these keyNodes..
77579 // If keyNodes are adjacent in both ways,
77580 // we can add inBetween nodes to that shared way too..
77581 if (indexRange === 1 && inBetweenNodes.length) {
77582 var startIndex1 = way.nodes.lastIndexOf(startNode.id),
77583 endIndex1 = way.nodes.lastIndexOf(endNode.id),
77584 wayDirection1 = (endIndex1 - startIndex1);
77585 if (wayDirection1 < -1) { wayDirection1 = 1; }
77587 /* eslint-disable no-loop-func */
77588 forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
77589 if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
77590 var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
77591 endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
77592 wayDirection2 = (endIndex2 - startIndex2),
77593 insertAt = endIndex2;
77594 if (wayDirection2 < -1) { wayDirection2 = 1; }
77596 if (wayDirection1 !== wayDirection2) {
77597 inBetweenNodes.reverse();
77598 insertAt = startIndex2;
77600 for (j = 0; j < inBetweenNodes.length; j++) {
77601 sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
77603 graph = graph.replace(sharedWay);
77606 /* eslint-enable no-loop-func */
77611 // update the way to have all the new nodes
77612 ids = nodes.map(function(n) { return n.id; });
77615 way = way.update({nodes: ids});
77616 graph = graph.replace(way);
77622 action.makeConvex = function(graph) {
77623 var way = graph.entity(wayId),
77624 nodes = uniq(graph.childNodes(way)),
77625 points = nodes.map(function(n) { return projection(n.loc); }),
77626 sign = d3_polygonArea(points) > 0 ? 1 : -1,
77627 hull = d3_polygonHull(points);
77629 // D3 convex hulls go counterclockwise..
77635 for (var i = 0; i < hull.length - 1; i++) {
77636 var startIndex = points.indexOf(hull[i]),
77637 endIndex = points.indexOf(hull[i+1]),
77638 indexRange = (endIndex - startIndex);
77640 if (indexRange < 0) {
77641 indexRange += nodes.length;
77644 // move interior nodes to the surface of the convex hull..
77645 for (var j = 1; j < indexRange; j++) {
77646 var point = geoVecInterp(hull[i], hull[i+1], j / indexRange),
77647 node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
77648 graph = graph.replace(node);
77655 action.disabled = function(graph) {
77656 if (!graph.entity(wayId).isClosed())
77657 return 'not_closed';
77661 action.transitionable = true;
77667 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
77668 function actionDeleteWay(wayId) {
77671 function canDeleteNode(node, graph) {
77672 return !graph.parentWays(node).length &&
77673 !graph.parentRelations(node).length &&
77674 !node.hasInterestingTags();
77678 var action = function(graph) {
77679 var way = graph.entity(wayId);
77681 graph.parentRelations(way)
77682 .forEach(function(parent) {
77683 parent = parent.removeMembersWithID(wayId);
77684 graph = graph.replace(parent);
77686 if (parent.isDegenerate()) {
77687 graph = actionDeleteRelation(parent.id)(graph);
77691 uniq(way.nodes).forEach(function(nodeId) {
77692 graph = graph.replace(way.removeNode(nodeId));
77694 var node = graph.entity(nodeId);
77695 if (canDeleteNode(node, graph)) {
77696 graph = graph.remove(node);
77700 return graph.remove(way);
77707 function actionDeleteMultiple(ids) {
77709 way: actionDeleteWay,
77710 node: actionDeleteNode,
77711 relation: actionDeleteRelation
77715 var action = function(graph) {
77716 ids.forEach(function(id) {
77717 if (graph.hasEntity(id)) { // It may have been deleted aready.
77718 graph = actions[graph.entity(id).type](id)(graph);
77729 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
77730 function actionDeleteRelation(relationId) {
77733 function canDeleteEntity(entity, graph) {
77734 return !graph.parentWays(entity).length &&
77735 !graph.parentRelations(entity).length &&
77736 !entity.hasInterestingTags();
77740 var action = function(graph) {
77741 var relation = graph.entity(relationId);
77743 graph.parentRelations(relation)
77744 .forEach(function(parent) {
77745 parent = parent.removeMembersWithID(relationId);
77746 graph = graph.replace(parent);
77748 if (parent.isDegenerate()) {
77749 graph = actionDeleteRelation(parent.id)(graph);
77753 uniq(map$3(relation.members, 'id')).forEach(function(memberId) {
77754 graph = graph.replace(relation.removeMembersWithID(memberId));
77756 var entity = graph.entity(memberId);
77757 if (canDeleteEntity(entity, graph)) {
77758 graph = actionDeleteMultiple([memberId])(graph);
77762 return graph.remove(relation);
77769 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
77770 function actionDeleteNode(nodeId) {
77771 var action = function(graph) {
77772 var node = graph.entity(nodeId);
77774 graph.parentWays(node)
77775 .forEach(function(parent) {
77776 parent = parent.removeNode(nodeId);
77777 graph = graph.replace(parent);
77779 if (parent.isDegenerate()) {
77780 graph = actionDeleteWay(parent.id)(graph);
77784 graph.parentRelations(node)
77785 .forEach(function(parent) {
77786 parent = parent.removeMembersWithID(nodeId);
77787 graph = graph.replace(parent);
77789 if (parent.isDegenerate()) {
77790 graph = actionDeleteRelation(parent.id)(graph);
77794 return graph.remove(node);
77801 // Connect the ways at the given nodes.
77803 // First choose a node to be the survivor, with preference given
77804 // to an existing (not new) node.
77806 // Tags and relation memberships of of non-surviving nodes are merged
77807 // to the survivor.
77809 // This is the inverse of `iD.actionDisconnect`.
77812 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
77813 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
77815 function actionConnect(nodeIDs) {
77816 var action = function(graph) {
77822 // Choose a survivor node, prefer an existing (not new) node - #4974
77823 for (i = 0; i < nodeIDs.length; i++) {
77824 survivor = graph.entity(nodeIDs[i]);
77825 if (survivor.version) break; // found one
77828 // Replace all non-surviving nodes with the survivor and merge tags.
77829 for (i = 0; i < nodeIDs.length; i++) {
77830 node = graph.entity(nodeIDs[i]);
77831 if (node.id === survivor.id) continue;
77833 parents = graph.parentWays(node);
77834 for (j = 0; j < parents.length; j++) {
77835 if (!parents[j].areAdjacent(node.id, survivor.id)) {
77836 graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
77840 parents = graph.parentRelations(node);
77841 for (j = 0; j < parents.length; j++) {
77842 graph = graph.replace(parents[j].replaceMember(node, survivor));
77845 survivor = survivor.mergeTags(node.tags);
77846 graph = actionDeleteNode(node.id)(graph);
77849 graph = graph.replace(survivor);
77855 action.disabled = function(graph) {
77857 var restrictionIDs = [];
77860 var relations, relation, role;
77863 // Choose a survivor node, prefer an existing (not new) node - #4974
77864 for (i = 0; i < nodeIDs.length; i++) {
77865 survivor = graph.entity(nodeIDs[i]);
77866 if (survivor.version) break; // found one
77869 // 1. disable if the nodes being connected have conflicting relation roles
77870 for (i = 0; i < nodeIDs.length; i++) {
77871 node = graph.entity(nodeIDs[i]);
77872 relations = graph.parentRelations(node);
77874 for (j = 0; j < relations.length; j++) {
77875 relation = relations[j];
77876 role = relation.memberById(node.id).role || '';
77878 // if this node is a via node in a restriction, remember for later
77879 if (relation.isValidRestriction()) {
77880 restrictionIDs.push(relation.id);
77883 if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
77886 seen[relation.id] = role;
77891 // gather restrictions for parent ways
77892 for (i = 0; i < nodeIDs.length; i++) {
77893 node = graph.entity(nodeIDs[i]);
77895 var parents = graph.parentWays(node);
77896 for (j = 0; j < parents.length; j++) {
77897 var parent = parents[j];
77898 relations = graph.parentRelations(parent);
77900 for (k = 0; k < relations.length; k++) {
77901 relation = relations[k];
77902 if (relation.isValidRestriction()) {
77903 restrictionIDs.push(relation.id);
77910 // test restrictions
77911 restrictionIDs = uniq(restrictionIDs);
77912 for (i = 0; i < restrictionIDs.length; i++) {
77913 relation = graph.entity(restrictionIDs[i]);
77914 if (!relation.isComplete(graph)) continue;
77916 var memberWays = relation.members
77917 .filter(function(m) { return m.type === 'way'; })
77918 .map(function(m) { return graph.entity(m.id); });
77920 memberWays = uniq(memberWays);
77921 var f = relation.memberByRole('from');
77922 var t = relation.memberByRole('to');
77923 var isUturn = (f.id === t.id);
77925 // 2a. disable if connection would damage a restriction
77926 // (a key node is a node at the junction of ways)
77927 var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
77928 for (j = 0; j < relation.members.length; j++) {
77929 collectNodes(relation.members[j], nodes);
77932 nodes.keyfrom = uniq(nodes.keyfrom.filter(hasDuplicates));
77933 nodes.keyto = uniq(nodes.keyto.filter(hasDuplicates));
77935 var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
77936 nodes.from = nodes.from.filter(filter);
77937 nodes.via = nodes.via.filter(filter);
77938 nodes.to = nodes.to.filter(filter);
77940 var connectFrom = false;
77941 var connectVia = false;
77942 var connectTo = false;
77943 var connectKeyFrom = false;
77944 var connectKeyTo = false;
77946 for (j = 0; j < nodeIDs.length; j++) {
77947 var n = nodeIDs[j];
77948 if (nodes.from.indexOf(n) !== -1) { connectFrom = true; }
77949 if (nodes.via.indexOf(n) !== -1) { connectVia = true; }
77950 if (nodes.to.indexOf(n) !== -1) { connectTo = true; }
77951 if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; }
77952 if (nodes.keyto.indexOf(n) !== -1) { connectKeyTo = true; }
77954 if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
77955 if (connectFrom && connectVia) { return 'restriction'; }
77956 if (connectTo && connectVia) { return 'restriction'; }
77958 // connecting to a key node -
77959 // if both nodes are on a member way (i.e. part of the turn restriction),
77960 // the connecting node must be adjacent to the key node.
77961 if (connectKeyFrom || connectKeyTo) {
77962 if (nodeIDs.length !== 2) { return 'restriction'; }
77966 for (j = 0; j < memberWays.length; j++) {
77967 way = memberWays[j];
77968 if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; }
77969 if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; }
77972 if (n0 && n1) { // both nodes are part of the restriction
77974 for (j = 0; j < memberWays.length; j++) {
77975 way = memberWays[j];
77976 if (way.areAdjacent(n0, n1)) {
77982 return 'restriction';
77987 // 2b. disable if nodes being connected will destroy a member way in a restriction
77988 // (to test, make a copy and try actually connecting the nodes)
77989 for (j = 0; j < memberWays.length; j++) {
77990 way = memberWays[j].update({}); // make copy
77991 for (k = 0; k < nodeIDs.length; k++) {
77992 if (nodeIDs[k] === survivor.id) continue;
77994 if (way.areAdjacent(nodeIDs[k], survivor.id)) {
77995 way = way.removeNode(nodeIDs[k]);
77997 way = way.replaceNode(nodeIDs[k], survivor.id);
78000 if (way.isDegenerate()) {
78001 return 'restriction';
78009 // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
78010 function hasDuplicates(n, i, arr) {
78011 return arr.indexOf(n) !== arr.lastIndexOf(n);
78014 function keyNodeFilter(froms, tos) {
78015 return function(n) {
78016 return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
78020 function collectNodes(member, collection) {
78021 var entity = graph.hasEntity(member.id);
78022 if (!entity) return;
78024 var role = member.role || '';
78025 if (!collection[role]) {
78026 collection[role] = [];
78029 if (member.type === 'node') {
78030 collection[role].push(member.id);
78031 if (role === 'via') {
78032 collection.keyfrom.push(member.id);
78033 collection.keyto.push(member.id);
78036 } else if (member.type === 'way') {
78037 collection[role].push.apply(collection[role], entity.nodes);
78038 if (role === 'from' || role === 'via') {
78039 collection.keyfrom.push(entity.first());
78040 collection.keyfrom.push(entity.last());
78042 if (role === 'to' || role === 'via') {
78043 collection.keyto.push(entity.first());
78044 collection.keyto.push(entity.last());
78054 function actionCopyEntities(ids, fromGraph) {
78058 var action = function(graph) {
78059 ids.forEach(function(id) {
78060 fromGraph.entity(id).copy(fromGraph, copies);
78063 for (var id in copies) {
78064 graph = graph.replace(copies[id]);
78071 action.copies = function() {
78079 function actionDeleteMember(relationId, memberIndex) {
78080 return function(graph) {
78081 var relation = graph.entity(relationId)
78082 .removeMember(memberIndex);
78084 graph = graph.replace(relation);
78086 if (relation.isDegenerate())
78087 graph = actionDeleteRelation(relation.id)(graph);
78093 function actionDeprecateTags(entityId) {
78095 return function(graph) {
78096 var entity = graph.entity(entityId),
78097 newtags = clone(entity.tags),
78101 // This handles dataDeprecated tags with a single condition
78102 for (var i = 0; i < dataDeprecated.length; i++) {
78104 rule = dataDeprecated[i];
78105 var match = toPairs(rule.old)[0],
78106 replacements = rule.replace ? toPairs(rule.replace) : null;
78108 if (entity.tags[match[0]] && match[1] === '*') {
78110 var value = entity.tags[match[0]];
78111 if (replacements && !newtags[replacements[0][0]]) {
78112 newtags[replacements[0][0]] = value;
78114 delete newtags[match[0]];
78117 } else if (entity.tags[match[0]] === match[1]) {
78118 newtags = assign({}, rule.replace || {}, omit(newtags, match[0]));
78124 return graph.replace(entity.update({tags: newtags}));
78131 function actionDiscardTags(difference) {
78133 return function(graph) {
78134 function discardTags(entity) {
78136 var keys = Object.keys(entity.tags);
78137 var discarded = false;
78139 for (var i = 0; i < keys.length; i++) {
78141 if (dataDiscarded[k] || !entity.tags[k]) {
78144 tags[k] = entity.tags[k];
78149 graph = graph.replace(entity.update({ tags: tags }));
78153 difference.modified().forEach(discardTags);
78154 difference.created().forEach(discardTags);
78160 // Disconect the ways at the given node.
78162 // Optionally, disconnect only the given ways.
78164 // For testing convenience, accepts an ID to assign to the (first) new node.
78165 // Normally, this will be undefined and the way will automatically
78166 // be assigned a new ID.
78168 // This is the inverse of `iD.actionConnect`.
78171 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
78172 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
78174 function actionDisconnect(nodeId, newNodeId) {
78178 var action = function(graph) {
78179 var node = graph.entity(nodeId);
78180 var connections = action.connections(graph);
78182 connections.forEach(function(connection) {
78183 var way = graph.entity(connection.wayID);
78184 var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
78186 graph = graph.replace(newNode);
78187 if (connection.index === 0 && way.isArea()) {
78188 // replace shared node with shared node..
78189 graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
78190 } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
78191 // replace closing node with new new node..
78192 graph = graph.replace(way.unclose().addNode(newNode.id));
78194 // replace shared node with multiple new nodes..
78195 graph = graph.replace(way.updateNode(newNode.id, connection.index));
78203 action.connections = function(graph) {
78204 var candidates = [];
78205 var keeping = false;
78206 var parentWays = graph.parentWays(graph.entity(nodeId));
78208 parentWays.forEach(function(way) {
78209 if (wayIds && wayIds.indexOf(way.id) === -1) {
78213 if (way.isArea() && (way.nodes[0] === nodeId)) {
78214 candidates.push({ wayID: way.id, index: 0 });
78216 way.nodes.forEach(function(waynode, index) {
78217 if (waynode === nodeId) {
78218 candidates.push({ wayID: way.id, index: index });
78224 return keeping ? candidates : candidates.slice(1);
78228 action.disabled = function(graph) {
78229 var connections = action.connections(graph);
78230 if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
78231 return 'not_connected';
78233 var parentWays = graph.parentWays(graph.entity(nodeId));
78234 var seenRelationIds = {};
78235 var sharedRelation;
78237 parentWays.forEach(function(way) {
78238 if (wayIds && wayIds.indexOf(way.id) === -1)
78241 var relations = graph.parentRelations(way);
78242 relations.forEach(function(relation) {
78243 if (relation.id in seenRelationIds) {
78244 sharedRelation = relation;
78246 seenRelationIds[relation.id] = true;
78251 if (sharedRelation)
78256 action.limitWays = function(_) {
78257 if (!arguments.length) return wayIds;
78266 // Join ways at the end node they share.
78268 // This is the inverse of `iD.actionSplit`.
78271 // https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
78272 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
78274 function actionJoin(ids) {
78276 function groupEntitiesByGeometry(graph) {
78277 var entities = ids.map(function(id) { return graph.entity(id); });
78278 return assignIn({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
78282 var action = function(graph) {
78283 var ways = ids.map(graph.entity, graph);
78284 var survivorID = ways[0].id;
78286 // Prefer to keep an existing way.
78287 for (var i = 0; i < ways.length; i++) {
78288 if (!ways[i].isNew()) {
78289 survivorID = ways[i].id;
78294 var sequences = osmJoinWays(ways, graph);
78295 var joined = sequences[0];
78297 // We might need to reverse some of these ways before joining them. #4688
78298 // `joined.actions` property will contain any actions we need to apply.
78299 graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
78301 var survivor = graph.entity(survivorID);
78302 survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
78303 graph = graph.replace(survivor);
78305 joined.forEach(function(way) {
78306 if (way.id === survivorID) return;
78308 graph.parentRelations(way).forEach(function(parent) {
78309 graph = graph.replace(parent.replaceMember(way, survivor));
78312 survivor = survivor.mergeTags(way.tags);
78314 graph = graph.replace(survivor);
78315 graph = actionDeleteWay(way.id)(graph);
78322 action.disabled = function(graph) {
78323 var geometries = groupEntitiesByGeometry(graph);
78324 if (ids.length < 2 || ids.length !== geometries.line.length)
78325 return 'not_eligible';
78327 var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
78328 if (joined.length > 1)
78329 return 'not_adjacent';
78331 var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
78334 var conflicting = false;
78336 joined[0].forEach(function(way) {
78337 var parents = graph.parentRelations(way);
78338 parents.forEach(function(parent) {
78339 if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
78343 for (var k in way.tags) {
78344 if (!(k in tags)) {
78345 tags[k] = way.tags[k];
78346 } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
78347 conflicting = true;
78353 return 'restriction';
78356 return 'conflicting_tags';
78363 function actionMerge(ids) {
78365 function groupEntitiesByGeometry(graph) {
78366 var entities = ids.map(function(id) { return graph.entity(id); });
78367 return assignIn({point: [], area: [], line: [], relation: []},
78368 groupBy(entities, function(entity) { return entity.geometry(graph); }));
78372 var action = function(graph) {
78373 var geometries = groupEntitiesByGeometry(graph),
78374 target = geometries.area[0] || geometries.line[0],
78375 points = geometries.point;
78377 points.forEach(function(point) {
78378 target = target.mergeTags(point.tags);
78379 graph = graph.replace(target);
78381 graph.parentRelations(point).forEach(function(parent) {
78382 graph = graph.replace(parent.replaceMember(point, target));
78385 var nodes = uniq(graph.childNodes(target)),
78386 removeNode = point;
78388 for (var i = 0; i < nodes.length; i++) {
78389 var node = nodes[i];
78390 if (graph.parentWays(node).length > 1 ||
78391 graph.parentRelations(node).length ||
78392 node.hasInterestingTags()) {
78396 // Found an uninteresting child node on the target way.
78397 // Move orig point into its place to preserve point's history. #3683
78398 graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
78399 target = target.replaceNode(node.id, point.id);
78400 graph = graph.replace(target);
78405 graph = graph.remove(removeNode);
78412 action.disabled = function(graph) {
78413 var geometries = groupEntitiesByGeometry(graph);
78414 if (geometries.point.length === 0 ||
78415 (geometries.area.length + geometries.line.length) !== 1 ||
78416 geometries.relation.length !== 0)
78417 return 'not_eligible';
78424 // `actionMergeNodes` is just a combination of:
78426 // 1. move all the nodes to a common location
78427 // 2. `actionConnect` them
78429 function actionMergeNodes(nodeIDs) {
78431 // If there is a single "interesting" node, use that as the location.
78432 // Otherwise return the average location of all the nodes.
78433 function chooseLoc(graph) {
78434 if (!nodeIDs.length) return null;
78436 var interestingCount = 0;
78437 var interestingLoc;
78439 for (var i = 0; i < nodeIDs.length; i++) {
78440 var node = graph.entity(nodeIDs[i]);
78441 if (node.hasInterestingTags()) {
78442 interestingLoc = (++interestingCount === 1) ? node.loc : null;
78444 sum = geoVecAdd(sum, node.loc);
78447 return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
78451 var action = function(graph) {
78452 if (nodeIDs.length < 2) return graph;
78453 var toLoc = chooseLoc(graph);
78455 for (var i = 0; i < nodeIDs.length; i++) {
78456 var node = graph.entity(nodeIDs[i]);
78457 graph = graph.replace(node.move(toLoc));
78460 return actionConnect(nodeIDs)(graph);
78464 action.disabled = function(graph) {
78465 if (nodeIDs.length < 2) return 'not_eligible';
78467 for (var i = 0; i < nodeIDs.length; i++) {
78468 var entity = graph.entity(nodeIDs[i]);
78469 if (entity.type !== 'node') return 'not_eligible';
78472 return actionConnect(nodeIDs).disabled(graph);
78478 function actionMergePolygon(ids, newRelationId) {
78480 function groupEntities(graph) {
78481 var entities = ids.map(function (id) { return graph.entity(id); });
78486 }, groupBy(entities, function(entity) {
78487 if (entity.type === 'way' && entity.isClosed()) {
78488 return 'closedWay';
78489 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
78490 return 'multipolygon';
78498 var action = function(graph) {
78499 var entities = groupEntities(graph);
78501 // An array representing all the polygons that are part of the multipolygon.
78503 // Each element is itself an array of objects with an id property, and has a
78504 // locs property which is an array of the locations forming the polygon.
78505 var polygons = entities.multipolygon.reduce(function(polygons, m) {
78506 return polygons.concat(osmJoinWays(m.members, graph));
78507 }, []).concat(entities.closedWay.map(function(d) {
78508 var member = [{id: d.id}];
78509 member.nodes = graph.childNodes(d);
78513 // contained is an array of arrays of boolean values,
78514 // where contained[j][k] is true iff the jth way is
78515 // contained by the kth way.
78516 var contained = polygons.map(function(w, i) {
78517 return polygons.map(function(d, n) {
78518 if (i === n) return null;
78519 return geoPolygonContainsPolygon(
78520 map$3(d.nodes, 'loc'),
78521 map$3(w.nodes, 'loc'));
78525 // Sort all polygons as either outer or inner ways
78529 while (polygons.length) {
78530 extractUncontained(polygons);
78531 polygons = polygons.filter(isContained);
78532 contained = contained.filter(isContained).map(filterContained);
78535 function isContained(d, i) {
78536 return some(contained[i]);
78539 function filterContained(d) {
78540 return d.filter(isContained);
78543 function extractUncontained(polygons) {
78544 polygons.forEach(function(d, i) {
78545 if (!isContained(d, i)) {
78546 d.forEach(function(member) {
78550 role: outer ? 'outer' : 'inner'
78558 // Move all tags to one relation
78559 var relation = entities.multipolygon[0] ||
78560 osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
78562 entities.multipolygon.slice(1).forEach(function(m) {
78563 relation = relation.mergeTags(m.tags);
78564 graph = graph.remove(m);
78567 entities.closedWay.forEach(function(way) {
78568 function isThisOuter(m) {
78569 return m.id === way.id && m.role !== 'inner';
78571 if (members.some(isThisOuter)) {
78572 relation = relation.mergeTags(way.tags);
78573 graph = graph.replace(way.update({ tags: {} }));
78577 return graph.replace(relation.update({
78579 tags: omit(relation.tags, 'area')
78584 action.disabled = function(graph) {
78585 var entities = groupEntities(graph);
78586 if (entities.other.length > 0 ||
78587 entities.closedWay.length + entities.multipolygon.length < 2)
78588 return 'not_eligible';
78589 if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
78590 return 'incomplete_relation';
78597 // Text diff algorithm following Hunt and McIlroy 1976.
78598 // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
78599 // comparison, Bell Telephone Laboratories CSTR #41 (1976)
78600 // http://www.cs.dartmouth.edu/~doug/
78602 // Expects two arrays of strings.
78603 function LCS(file1, file2) {
78604 var equivalenceClasses;
78609 var c, i, j, jX, r, s;
78611 equivalenceClasses = {};
78612 for (j = 0; j < file2.length; j++) {
78614 if (equivalenceClasses[line]) {
78615 equivalenceClasses[line].push(j);
78617 equivalenceClasses[line] = [j];
78622 { file1index: -1, file2index: -1, chain: null }
78625 for (i = 0; i < file1.length; i++) {
78627 file2indices = equivalenceClasses[line] || [];
78632 for (jX = 0; jX < file2indices.length; jX++) {
78633 j = file2indices[jX];
78635 for (s = r; s < candidates.length; s++) {
78636 if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
78641 if (s < candidates.length) {
78642 newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
78643 if (r === candidates.length) {
78644 candidates.push(c);
78650 if (r === candidates.length) {
78651 break; // no point in examining further (j)s
78659 // At this point, we know the LCS: it's in the reverse of the
78660 // linked-list through .chain of candidates[candidates.length - 1].
78662 return candidates[candidates.length - 1];
78666 // We apply the LCS to give a simple representation of the
78667 // offsets and lengths of mismatched chunks in the input
78668 // files. This is used by diff3MergeIndices below.
78669 function diffIndices(file1, file2) {
78671 var tail1 = file1.length;
78672 var tail2 = file2.length;
78674 for (var candidate = LCS(file1, file2);
78675 candidate !== null;
78676 candidate = candidate.chain)
78678 var mismatchLength1 = tail1 - candidate.file1index - 1;
78679 var mismatchLength2 = tail2 - candidate.file2index - 1;
78680 tail1 = candidate.file1index;
78681 tail2 = candidate.file2index;
78683 if (mismatchLength1 || mismatchLength2) {
78685 file1: [tail1 + 1, mismatchLength1],
78686 file2: [tail2 + 1, mismatchLength2]
78696 // Given three files, A, O, and B, where both A and B are
78697 // independently derived from O, returns a fairly complicated
78698 // internal representation of merge decisions it's taken. The
78699 // interested reader may wish to consult
78701 // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
78702 // 'A Formal Investigation of ' In Arvind and Prasad,
78703 // editors, Foundations of Software Technology and Theoretical
78704 // Computer Science (FSTTCS), December 2007.
78706 // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
78707 function diff3MergeIndices(a, o, b) {
78709 var m1 = diffIndices(o, a);
78710 var m2 = diffIndices(o, b);
78713 function addHunk(h, side) {
78714 hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
78716 for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
78717 for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
78718 hunks.sort(function (x, y) { return x[0] - y[0]; });
78721 var commonOffset = 0;
78722 function copyCommon(targetOffset) {
78723 if (targetOffset > commonOffset) {
78724 result.push([1, commonOffset, targetOffset - commonOffset]);
78725 commonOffset = targetOffset;
78729 for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
78730 var firstHunkIndex = hunkIndex;
78731 var hunk = hunks[hunkIndex];
78732 var regionLhs = hunk[0];
78733 var regionRhs = regionLhs + hunk[2];
78734 while (hunkIndex < hunks.length - 1) {
78735 var maybeOverlapping = hunks[hunkIndex + 1];
78736 var maybeLhs = maybeOverlapping[0];
78737 if (maybeLhs > regionRhs) {
78740 regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
78744 copyCommon(regionLhs);
78745 if (firstHunkIndex === hunkIndex) {
78746 // The 'overlap' was only one hunk long, meaning that
78747 // there's no conflict here. Either a and o were the
78748 // same, or b and o were the same.
78750 result.push([hunk[1], hunk[3], hunk[4]]);
78753 // A proper conflict. Determine the extents of the
78754 // regions involved from a, o and b. Effectively merge
78755 // all the hunks on the left into one giant hunk, and
78756 // do the same for the right; then, correct for skew
78757 // in the regions of o that each side changed, and
78758 // report appropriate spans for the three sides.
78760 0: [a.length, -1, o.length, -1],
78761 2: [b.length, -1, o.length, -1]
78763 for (i = firstHunkIndex; i <= hunkIndex; i++) {
78765 var side = hunk[1];
78766 var r = regions[side];
78767 var oLhs = hunk[0];
78768 var oRhs = oLhs + hunk[2];
78769 var abLhs = hunk[3];
78770 var abRhs = abLhs + hunk[4];
78771 r[0] = Math.min(abLhs, r[0]);
78772 r[1] = Math.max(abRhs, r[1]);
78773 r[2] = Math.min(oLhs, r[2]);
78774 r[3] = Math.max(oRhs, r[3]);
78776 var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
78777 var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
78778 var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
78779 var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
78782 regionLhs, regionRhs - regionLhs,
78783 bLhs, bRhs - bLhs]);
78785 commonOffset = regionRhs;
78788 copyCommon(o.length);
78793 // Applies the output of diff3MergeIndices to actually
78794 // construct the merged file; the returned result alternates
78795 // between 'ok' and 'conflict' blocks.
78796 function diff3Merge(a, o, b, excludeFalseConflicts) {
78798 var files = [a, o, b];
78799 var indices = diff3MergeIndices(a, o, b);
78802 function flushOk() {
78803 if (okLines.length) {
78804 result.push({ok: okLines});
78808 function pushOk(xs) {
78809 for (var j = 0; j < xs.length; j++) {
78810 okLines.push(xs[j]);
78814 function isTrueConflict(rec) {
78815 if (rec[2] !== rec[6]) return true;
78818 for (var j = 0; j < rec[2]; j++) {
78819 if (a[j + aoff] !== b[j + boff]) {
78826 for (var i = 0; i < indices.length; i++) {
78827 var x = indices[i];
78830 if (excludeFalseConflicts && !isTrueConflict(x)) {
78831 pushOk(files[0].slice(x[1], x[1] + x[2]));
78836 a: a.slice(x[1], x[1] + x[2]),
78838 o: o.slice(x[3], x[3] + x[4]),
78840 b: b.slice(x[5], x[5] + x[6]),
78846 pushOk(files[side].slice(x[1], x[1] + x[2]));
78854 function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
78855 var _option = 'safe'; // 'safe', 'force_local', 'force_remote'
78856 var _conflicts = [];
78860 return isFunction(formatUser) ? formatUser(d) : d;
78864 function mergeLocation(remote, target) {
78865 function pointEqual(a, b) {
78866 var epsilon = 1e-6;
78867 return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
78870 if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
78873 if (_option === 'force_remote') {
78874 return target.update({loc: remote.loc});
78877 _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
78882 function mergeNodes(base, remote, target) {
78883 if (_option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
78886 if (_option === 'force_remote') {
78887 return target.update({nodes: remote.nodes});
78890 var ccount = _conflicts.length;
78891 var o = base.nodes || [];
78892 var a = target.nodes || [];
78893 var b = remote.nodes || [];
78895 var hunks = diff3Merge(a, o, b, true);
78897 for (var i = 0; i < hunks.length; i++) {
78898 var hunk = hunks[i];
78900 nodes.push.apply(nodes, hunk.ok);
78902 // for all conflicts, we can assume c.a !== c.b
78903 // because `diff3Merge` called with `true` option to exclude false conflicts..
78904 var c = hunk.conflict;
78905 if (isEqual(c.o, c.a)) { // only changed remotely
78906 nodes.push.apply(nodes, c.b);
78907 } else if (isEqual(c.o, c.b)) { // only changed locally
78908 nodes.push.apply(nodes, c.a);
78909 } else { // changed both locally and remotely
78910 _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
78916 return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
78920 function mergeChildren(targetWay, children, updates, graph) {
78921 function isUsed(node, targetWay) {
78922 var parentWays = map$3(graph.parentWays(node), 'id');
78923 return node.hasInterestingTags() ||
78924 without(parentWays, targetWay.id).length > 0 ||
78925 graph.parentRelations(node).length > 0;
78928 var ccount = _conflicts.length;
78930 for (var i = 0; i < children.length; i++) {
78931 var id = children[i];
78932 var node = graph.hasEntity(id);
78934 // remove unused childNodes..
78935 if (targetWay.nodes.indexOf(id) === -1) {
78936 if (node && !isUsed(node, targetWay)) {
78937 updates.removeIds.push(id);
78942 // restore used childNodes..
78943 var local = localGraph.hasEntity(id);
78944 var remote = remoteGraph.hasEntity(id);
78947 if (_option === 'force_remote' && remote && remote.visible) {
78948 updates.replacements.push(remote);
78950 } else if (_option === 'force_local' && local) {
78951 target = osmEntity$$1(local);
78953 target = target.update({ version: remote.version });
78955 updates.replacements.push(target);
78957 } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
78958 target = osmEntity$$1(local, { version: remote.version });
78959 if (remote.visible) {
78960 target = mergeLocation(remote, target);
78962 _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
78965 if (_conflicts.length !== ccount) break;
78966 updates.replacements.push(target);
78974 function updateChildren(updates, graph) {
78975 for (var i = 0; i < updates.replacements.length; i++) {
78976 graph = graph.replace(updates.replacements[i]);
78978 if (updates.removeIds.length) {
78979 graph = actionDeleteMultiple(updates.removeIds)(graph);
78985 function mergeMembers(remote, target) {
78986 if (_option === 'force_local' || isEqual(target.members, remote.members)) {
78989 if (_option === 'force_remote') {
78990 return target.update({members: remote.members});
78993 _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
78998 function mergeTags(base, remote, target) {
78999 function ignoreKey(k) {
79000 return dataDiscarded[k];
79003 if (_option === 'force_local' || isEqual(target.tags, remote.tags)) {
79006 if (_option === 'force_remote') {
79007 return target.update({tags: remote.tags});
79010 var ccount = _conflicts.length;
79011 var o = base.tags || {};
79012 var a = target.tags || {};
79013 var b = remote.tags || {};
79014 var keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey);
79015 var tags = clone(a);
79016 var changed = false;
79018 for (var i = 0; i < keys.length; i++) {
79021 if (o[k] !== b[k] && a[k] !== b[k]) { // changed remotely..
79022 if (o[k] !== a[k]) { // changed locally..
79023 _conflicts.push(t('merge_remote_changes.conflict.tags',
79024 { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
79026 } else { // unchanged locally, accept remote change..
79027 if (b.hasOwnProperty(k)) {
79037 return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
79041 // `graph.base()` is the common ancestor of the two graphs.
79042 // `localGraph` contains user's edits up to saving
79043 // `remoteGraph` contains remote edits to modified nodes
79044 // `graph` must be a descendent of `localGraph` and may include
79045 // some conflict resolution actions performed on it.
79047 // --- ... --- `localGraph` -- ... -- `graph`
79049 // `graph.base()` --- ... --- `remoteGraph`
79051 var action = function(graph) {
79052 var updates = { replacements: [], removeIds: [] };
79053 var base = graph.base().entities[id];
79054 var local = localGraph.entity(id);
79055 var remote = remoteGraph.entity(id);
79056 var target = osmEntity$$1(local, { version: remote.version });
79059 if (!remote.visible) {
79060 if (_option === 'force_remote') {
79061 return actionDeleteMultiple([id])(graph);
79063 } else if (_option === 'force_local') {
79064 if (target.type === 'way') {
79065 target = mergeChildren(target, uniq(local.nodes), updates, graph);
79066 graph = updateChildren(updates, graph);
79068 return graph.replace(target);
79071 _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
79072 return graph; // do nothing
79077 if (target.type === 'node') {
79078 target = mergeLocation(remote, target);
79080 } else if (target.type === 'way') {
79081 // pull in any child nodes that may not be present locally..
79082 graph.rebase(remoteGraph.childNodes(remote), [graph], false);
79083 target = mergeNodes(base, remote, target);
79084 target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
79086 } else if (target.type === 'relation') {
79087 target = mergeMembers(remote, target);
79090 target = mergeTags(base, remote, target);
79092 if (!_conflicts.length) {
79093 graph = updateChildren(updates, graph).replace(target);
79100 action.withOption = function(opt) {
79106 action.conflicts = function() {
79114 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
79115 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
79116 function actionMove(moveIds, tryDelta, projection, cache) {
79117 var _delta = tryDelta;
79119 function setupCache(graph) {
79120 function canMove(nodeId) {
79121 // Allow movement of any node that is in the selectedIDs list..
79122 if (moveIds.indexOf(nodeId) !== -1) return true;
79124 // Allow movement of a vertex where 2 ways meet..
79125 var parents = map$3(graph.parentWays(graph.entity(nodeId)), 'id');
79126 if (parents.length < 3) return true;
79128 // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
79129 var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
79130 if (!parentsMoving) delete cache.moving[nodeId];
79132 return parentsMoving;
79135 function cacheEntities(ids) {
79136 for (var i = 0; i < ids.length; i++) {
79138 if (cache.moving[id]) continue;
79139 cache.moving[id] = true;
79141 var entity = graph.hasEntity(id);
79142 if (!entity) continue;
79144 if (entity.type === 'node') {
79145 cache.nodes.push(id);
79146 cache.startLoc[id] = entity.loc;
79147 } else if (entity.type === 'way') {
79148 cache.ways.push(id);
79149 cacheEntities(entity.nodes);
79151 cacheEntities(entity.members.map(function(member) {
79158 function cacheIntersections(ids) {
79159 function isEndpoint(way, id) {
79160 return !way.isClosed() && !!way.affix(id);
79163 for (var i = 0; i < ids.length; i++) {
79166 // consider only intersections with 1 moved and 1 unmoved way.
79167 var childNodes = graph.childNodes(graph.entity(id));
79168 for (var j = 0; j < childNodes.length; j++) {
79169 var node = childNodes[j];
79170 var parents = graph.parentWays(node);
79171 if (parents.length !== 2) continue;
79173 var moved = graph.entity(id);
79174 var unmoved = null;
79175 for (var k = 0; k < parents.length; k++) {
79176 var way = parents[k];
79177 if (!cache.moving[way.id]) {
79182 if (!unmoved) continue;
79184 // exclude ways that are overly connected..
79185 if (intersection(moved.nodes, unmoved.nodes).length > 2) continue;
79186 if (moved.isArea() || unmoved.isArea()) continue;
79188 cache.intersections.push({
79191 unmovedId: unmoved.id,
79192 movedIsEP: isEndpoint(moved, node.id),
79193 unmovedIsEP: isEndpoint(unmoved, node.id)
79205 cache.intersections = [];
79206 cache.replacedVertex = {};
79207 cache.startLoc = {};
79211 cacheEntities(moveIds);
79212 cacheIntersections(cache.ways);
79213 cache.nodes = filter(cache.nodes, canMove);
79220 // Place a vertex where the moved vertex used to be, to preserve way shape..
79229 // * node '*' added to preserve shape
79231 // / b ---- e way `b,e` moved here:
79236 function replaceMovedVertex(nodeId, wayId, graph, delta) {
79237 var way = graph.entity(wayId);
79238 var moved = graph.entity(nodeId);
79239 var movedIndex = way.nodes.indexOf(nodeId);
79240 var len, prevIndex, nextIndex;
79242 if (way.isClosed()) {
79243 len = way.nodes.length - 1;
79244 prevIndex = (movedIndex + len - 1) % len;
79245 nextIndex = (movedIndex + len + 1) % len;
79247 len = way.nodes.length;
79248 prevIndex = movedIndex - 1;
79249 nextIndex = movedIndex + 1;
79252 var prev = graph.hasEntity(way.nodes[prevIndex]);
79253 var next = graph.hasEntity(way.nodes[nextIndex]);
79255 // Don't add orig vertex at endpoint..
79256 if (!prev || !next) return graph;
79258 var key = wayId + '_' + nodeId;
79259 var orig = cache.replacedVertex[key];
79262 cache.replacedVertex[key] = orig;
79263 cache.startLoc[orig.id] = cache.startLoc[nodeId];
79268 start = projection(cache.startLoc[nodeId]);
79269 end = projection.invert(geoVecAdd(start, delta));
79271 end = cache.startLoc[nodeId];
79273 orig = orig.move(end);
79275 var angle = Math.abs(geoAngle(orig, prev, projection) -
79276 geoAngle(orig, next, projection)) * 180 / Math.PI;
79278 // Don't add orig vertex if it would just make a straight line..
79279 if (angle > 175 && angle < 185) return graph;
79281 // moving forward or backward along way?
79282 var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
79283 var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
79284 var d1 = geoPathLength(p1);
79285 var d2 = geoPathLength(p2);
79286 var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
79288 // moving around closed loop?
79289 if (way.isClosed() && insertAt === 0) insertAt = len;
79291 way = way.addNode(orig.id, insertAt);
79292 return graph.replace(orig).replace(way);
79296 // Remove duplicate vertex that might have been added by
79297 // replaceMovedVertex. This is done after the unzorro checks.
79298 function removeDuplicateVertices(wayId, graph) {
79299 var way = graph.entity(wayId);
79300 var epsilon = 1e-6;
79303 function isInteresting(node, graph) {
79304 return graph.parentWays(node).length > 1 ||
79305 graph.parentRelations(node).length ||
79306 node.hasInterestingTags();
79309 for (var i = 0; i < way.nodes.length; i++) {
79310 curr = graph.entity(way.nodes[i]);
79312 if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
79313 if (!isInteresting(prev, graph)) {
79314 way = way.removeNode(prev.id);
79315 graph = graph.replace(way).remove(prev);
79316 } else if (!isInteresting(curr, graph)) {
79317 way = way.removeNode(curr.id);
79318 graph = graph.replace(way).remove(curr);
79329 // Reorder nodes around intersections that have moved..
79331 // Start: way1.nodes: b,e (moving)
79332 // a - b - c ----- d way2.nodes: a,b,c,d (static)
79334 // e isEP1: true, isEP2, false
79336 // way1 `b,e` moved here:
79337 // a ----- c = b - d
79341 // reorder nodes way1.nodes: b,e
79342 // a ----- c - b - d way2.nodes: a,c,b,d
79346 function unZorroIntersection(intersection$$1, graph) {
79347 var vertex = graph.entity(intersection$$1.nodeId);
79348 var way1 = graph.entity(intersection$$1.movedId);
79349 var way2 = graph.entity(intersection$$1.unmovedId);
79350 var isEP1 = intersection$$1.movedIsEP;
79351 var isEP2 = intersection$$1.unmovedIsEP;
79353 // don't move the vertex if it is the endpoint of both ways.
79354 if (isEP1 && isEP2) return graph;
79356 var nodes1 = without(graph.childNodes(way1), vertex);
79357 var nodes2 = without(graph.childNodes(way2), vertex);
79359 if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
79360 if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
79362 var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
79363 var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
79366 // snap vertex to nearest edge (or some point between them)..
79367 if (!isEP1 && !isEP2) {
79368 var epsilon = 1e-6, maxIter = 10;
79369 for (var i = 0; i < maxIter; i++) {
79370 loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
79371 edge1 = geoChooseEdge(nodes1, projection(loc), projection);
79372 edge2 = geoChooseEdge(nodes2, projection(loc), projection);
79373 if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
79375 } else if (!isEP1) {
79381 graph = graph.replace(vertex.move(loc));
79383 // if zorro happened, reorder nodes..
79384 if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
79385 way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
79386 graph = graph.replace(way1);
79388 if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
79389 way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
79390 graph = graph.replace(way2);
79397 function cleanupIntersections(graph) {
79398 for (var i = 0; i < cache.intersections.length; i++) {
79399 var obj = cache.intersections[i];
79400 graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
79401 graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
79402 graph = unZorroIntersection(obj, graph);
79403 graph = removeDuplicateVertices(obj.movedId, graph);
79404 graph = removeDuplicateVertices(obj.unmovedId, graph);
79411 // check if moving way endpoint can cross an unmoved way, if so limit delta..
79412 function limitDelta(graph) {
79413 function moveNode(loc) {
79414 return geoVecAdd(projection(loc), _delta);
79417 for (var i = 0; i < cache.intersections.length; i++) {
79418 var obj = cache.intersections[i];
79420 // Don't limit movement if this is vertex joins 2 endpoints..
79421 if (obj.movedIsEP && obj.unmovedIsEP) continue;
79422 // Don't limit movement if this vertex is not an endpoint anyway..
79423 if (!obj.movedIsEP) continue;
79425 var node = graph.entity(obj.nodeId);
79426 var start = projection(node.loc);
79427 var end = geoVecAdd(start, _delta);
79428 var movedNodes = graph.childNodes(graph.entity(obj.movedId));
79429 var movedPath = map$3(map$3(movedNodes, 'loc'), moveNode);
79430 var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
79431 var unmovedPath = map$3(map$3(unmovedNodes, 'loc'), projection);
79432 var hits = geoPathIntersections(movedPath, unmovedPath);
79434 for (var j = 0; i < hits.length; i++) {
79435 if (isEqual(hits[j], end)) continue;
79436 var edge = geoChooseEdge(unmovedNodes, end, projection);
79437 _delta = geoVecSubtract(projection(edge.loc), start);
79443 var action = function(graph) {
79444 if (_delta[0] === 0 && _delta[1] === 0) return graph;
79448 if (cache.intersections.length) {
79452 for (var i = 0; i < cache.nodes.length; i++) {
79453 var node = graph.entity(cache.nodes[i]);
79454 var start = projection(node.loc);
79455 var end = geoVecAdd(start, _delta);
79456 graph = graph.replace(node.move(projection.invert(end)));
79459 if (cache.intersections.length) {
79460 graph = cleanupIntersections(graph);
79467 action.delta = function() {
79475 function actionMoveNode(nodeID, toLoc) {
79477 var action = function(graph, t) {
79478 if (t === null || !isFinite(t)) t = 1;
79479 t = Math.min(Math.max(+t, 0), 1);
79481 var node = graph.entity(nodeID);
79482 return graph.replace(
79483 node.move(geoVecInterp(node.loc, toLoc, t))
79487 action.transitionable = true;
79492 function actionNoop() {
79493 return function(graph) {
79499 * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
79501 function actionOrthogonalize(wayId, projection) {
79502 var threshold = 12, // degrees within right or straight to alter
79503 lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
79504 upperThreshold = Math.cos(threshold * Math.PI / 180);
79507 var action = function(graph, t) {
79508 if (t === null || !isFinite(t)) t = 1;
79509 t = Math.min(Math.max(+t, 0), 1);
79511 var way = graph.entity(wayId),
79512 nodes = graph.childNodes(way),
79513 points = uniq(nodes).map(function(n) { return projection(n.loc); }),
79514 corner = {i: 0, dotp: 1},
79516 node, loc, score, motions, i, j;
79518 if (points.length === 3) { // move only one vertex for right triangle
79519 for (i = 0; i < 1000; i++) {
79520 motions = points.map(calcMotion);
79521 points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
79522 score = corner.dotp;
79523 if (score < epsilon) {
79528 node = graph.entity(nodes[corner.i].id);
79529 loc = projection.invert(points[corner.i]);
79530 graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
79534 originalPoints = clone(points);
79537 for (i = 0; i < 1000; i++) {
79538 motions = points.map(calcMotion);
79539 for (j = 0; j < motions.length; j++) {
79540 points[j] = addPoints(points[j],motions[j]);
79542 var newScore = squareness(points);
79543 if (newScore < score) {
79544 best = clone(points);
79547 if (score < epsilon) {
79554 for (i = 0; i < points.length; i++) {
79555 // only move the points that actually moved
79556 if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
79557 loc = projection.invert(points[i]);
79558 node = graph.entity(nodes[i].id);
79559 graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
79563 // remove empty nodes on straight sections
79564 for (i = 0; t === 1 && i < points.length; i++) {
79565 node = graph.entity(nodes[i].id);
79567 if (graph.parentWays(node).length > 1 ||
79568 graph.parentRelations(node).length ||
79569 node.hasInterestingTags()) {
79573 var dotp = normalizedDotProduct(i, points);
79574 if (dotp < -1 + epsilon) {
79575 graph = actionDeleteNode(node.id)(graph);
79583 function calcMotion(b, i, array) {
79584 var a = array[(i - 1 + array.length) % array.length],
79585 c = array[(i + 1) % array.length],
79586 p = subtractPoints(a, b),
79587 q = subtractPoints(c, b),
79590 scale = 2 * Math.min(geoVecLength(p, [0, 0]), geoVecLength(q, [0, 0]));
79591 p = normalizePoint(p, 1.0);
79592 q = normalizePoint(q, 1.0);
79594 dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
79596 // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
79597 if (array.length > 3) {
79598 if (dotp < -0.707106781186547) {
79601 } else if (dotp && Math.abs(dotp) < corner.dotp) {
79603 corner.dotp = Math.abs(dotp);
79606 return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
79611 function squareness(points) {
79612 return points.reduce(function(sum, val, i, array) {
79613 var dotp = normalizedDotProduct(i, array);
79615 dotp = filterDotProduct(dotp);
79616 return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
79621 function normalizedDotProduct(i, points) {
79622 var a = points[(i - 1 + points.length) % points.length],
79624 c = points[(i + 1) % points.length],
79625 p = subtractPoints(a, b),
79626 q = subtractPoints(c, b);
79628 p = normalizePoint(p, 1.0);
79629 q = normalizePoint(q, 1.0);
79631 return p[0] * q[0] + p[1] * q[1];
79635 function subtractPoints(a, b) {
79636 return [a[0] - b[0], a[1] - b[1]];
79640 function addPoints(a, b) {
79641 return [a[0] + b[0], a[1] + b[1]];
79645 function normalizePoint(point, scale) {
79646 var vector = [0, 0];
79647 var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
79648 if (length !== 0) {
79649 vector[0] = point[0] / length;
79650 vector[1] = point[1] / length;
79653 vector[0] *= scale;
79654 vector[1] *= scale;
79660 function filterDotProduct(dotp) {
79661 if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
79669 action.disabled = function(graph) {
79670 var way = graph.entity(wayId),
79671 nodes = graph.childNodes(way),
79672 points = uniq(nodes).map(function(n) { return projection(n.loc); });
79674 if (squareness(points)) {
79678 return 'not_squarish';
79682 action.transitionable = true;
79688 // `actionRestrictTurn` creates a turn restriction relation.
79690 // `turn` must be an `osmTurn` object
79691 // see osm/intersection.js, pathToTurn()
79693 // This specifies a restriction of type `restriction` when traveling from
79694 // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
79695 // (The action does not check that these entities form a valid intersection.)
79697 // From, to, and via ways should be split before calling this action.
79698 // (old versions of the code would split the ways here, but we no longer do it)
79700 // For testing convenience, accepts a restrictionID to assign to the new
79701 // relation. Normally, this will be undefined and the relation will
79702 // automatically be assigned a new ID.
79704 function actionRestrictTurn(turn, restrictionType, restrictionID) {
79706 return function(graph) {
79707 var fromWay = graph.entity(turn.from.way);
79708 var toWay = graph.entity(turn.to.way);
79709 var viaNode = turn.via.node && graph.entity(turn.via.node);
79710 var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
79713 members.push({ id: fromWay.id, type: 'way', role: 'from' });
79716 members.push({ id: viaNode.id, type: 'node', role: 'via' });
79717 } else if (viaWays) {
79718 viaWays.forEach(function(viaWay) {
79719 members.push({ id: viaWay.id, type: 'way', role: 'via' });
79723 members.push({ id: toWay.id, type: 'way', role: 'to' });
79725 return graph.replace(osmRelation({
79728 type: 'restriction',
79729 restriction: restrictionType
79736 function actionRevert(id) {
79737 var action = function(graph) {
79738 var entity = graph.hasEntity(id),
79739 base = graph.base().entities[id];
79741 if (entity && !base) { // entity will be removed..
79742 if (entity.type === 'node') {
79743 graph.parentWays(entity)
79744 .forEach(function(parent) {
79745 parent = parent.removeNode(id);
79746 graph = graph.replace(parent);
79748 if (parent.isDegenerate()) {
79749 graph = actionDeleteWay(parent.id)(graph);
79754 graph.parentRelations(entity)
79755 .forEach(function(parent) {
79756 parent = parent.removeMembersWithID(id);
79757 graph = graph.replace(parent);
79759 if (parent.isDegenerate()) {
79760 graph = actionDeleteRelation(parent.id)(graph);
79765 return graph.revert(id);
79771 function actionRotate(rotateIds, pivot, angle, projection) {
79773 var action = function(graph) {
79774 return graph.update(function(graph) {
79775 utilGetAllNodes(rotateIds, graph).forEach(function(node) {
79776 var point = geoRotate([projection(node.loc)], angle, pivot)[0];
79777 graph = graph.replace(node.move(projection.invert(point)));
79785 /* Built-in method references for those with the same name as other `lodash` methods. */
79786 var nativeMax$8 = Math.max;
79789 * Gets the index at which the first occurrence of `value` is found in `array`
79790 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
79791 * for equality comparisons. If `fromIndex` is negative, it's used as the
79792 * offset from the end of `array`.
79798 * @param {Array} array The array to inspect.
79799 * @param {*} value The value to search for.
79800 * @param {number} [fromIndex=0] The index to search from.
79801 * @returns {number} Returns the index of the matched value, else `-1`.
79804 * _.indexOf([1, 2, 1, 2], 2);
79807 * // Search from the `fromIndex`.
79808 * _.indexOf([1, 2, 1, 2], 2, 2);
79811 function indexOf(array, value, fromIndex) {
79812 var length = array == null ? 0 : array.length;
79816 var index = fromIndex == null ? 0 : toInteger(fromIndex);
79818 index = nativeMax$8(length + index, 0);
79820 return baseIndexOf(array, value, index);
79823 // Split a way at the given node.
79825 // Optionally, split only the given ways, if multiple ways share
79828 // This is the inverse of `iD.actionJoin`.
79830 // For testing convenience, accepts an ID to assign to the new way.
79831 // Normally, this will be undefined and the way will automatically
79832 // be assigned a new ID.
79835 // https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
79837 function actionSplit(nodeId, newWayIds) {
79840 // If the way is closed, we need to search for a partner node
79841 // to split the way at.
79843 // The following looks for a node that is both far away from
79844 // the initial node in terms of way segment length and nearby
79845 // in terms of beeline-distance. This assures that areas get
79846 // split on the most "natural" points (independent of the number
79848 // For example: bone-shaped areas get split across their waist
79849 // line, circles across the diameter.
79850 function splitArea(nodes, idxA, graph) {
79851 var lengths = new Array(nodes.length);
79857 function wrap(index) {
79858 return utilWrap(index, nodes.length);
79861 function dist(nA, nB) {
79862 var locA = graph.entity(nA).loc;
79863 var locB = graph.entity(nB).loc;
79864 var epsilon = 1e-6;
79865 return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
79868 // calculate lengths
79870 for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
79871 length += dist(nodes[i], nodes[wrap(i-1)]);
79872 lengths[i] = length;
79876 for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
79877 length += dist(nodes[i], nodes[wrap(i+1)]);
79878 if (length < lengths[i])
79879 lengths[i] = length;
79882 // determine best opposite node to split
79883 for (i = 0; i < nodes.length; i++) {
79884 var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
79895 function split(graph, wayA, newWayId) {
79896 var wayB = osmWay({id: newWayId, tags: wayA.tags}); // `wayB` is the NEW way
79897 var origNodes = wayA.nodes.slice();
79900 var isArea = wayA.isArea();
79901 var isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
79903 if (wayA.isClosed()) {
79904 var nodes = wayA.nodes.slice(0, -1);
79905 var idxA = indexOf(nodes, nodeId);
79906 var idxB = splitArea(nodes, idxA, graph);
79909 nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
79910 nodesB = nodes.slice(idxB, idxA + 1);
79912 nodesA = nodes.slice(idxA, idxB + 1);
79913 nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
79916 var idx = indexOf(wayA.nodes, nodeId, 1);
79917 nodesA = wayA.nodes.slice(0, idx + 1);
79918 nodesB = wayA.nodes.slice(idx);
79921 wayA = wayA.update({nodes: nodesA});
79922 wayB = wayB.update({nodes: nodesB});
79924 graph = graph.replace(wayA);
79925 graph = graph.replace(wayB);
79927 graph.parentRelations(wayA).forEach(function(relation) {
79930 // Turn restrictions - make sure:
79931 // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
79932 // (whichever one is connected to the VIA node/ways)
79933 // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
79934 if (relation.isRestriction()) {
79935 var f = relation.memberByRole('from');
79936 var v = relation.membersByRole('via');
79937 var t = relation.memberByRole('to');
79940 // 1. split a FROM/TO
79941 if (f.id === wayA.id || t.id === wayA.id) {
79943 if (v.length === 1 && v[0].type === 'node') { // check via node
79944 keepB = wayB.contains(v[0].id);
79945 } else { // check via way(s)
79946 for (i = 0; i < v.length; i++) {
79947 if (v[i].type === 'way') {
79948 var wayVia = graph.hasEntity(v[i].id);
79949 if (wayVia && intersection(wayB.nodes, wayVia.nodes).length) {
79958 relation = relation.replaceMember(wayA, wayB);
79959 graph = graph.replace(relation);
79964 for (i = 0; i < v.length; i++) {
79965 if (v[i].type === 'way' && v[i].id === wayA.id) {
79971 graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
79977 // All other relations (Routes, Multipolygons, etc):
79978 // 1. Both `wayA` and `wayB` remain in the relation
79979 // 2. But must be inserted as a pair (see `actionAddMember` for details)
79981 if (relation === isOuter) {
79982 graph = graph.replace(relation.mergeTags(wayA.tags));
79983 graph = graph.replace(wayA.update({tags: {}}));
79984 graph = graph.replace(wayB.update({tags: {}}));
79990 role: relation.memberById(wayA.id).role
79994 originalID: wayA.id,
79995 insertedID: wayB.id,
79999 graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
80003 if (!isOuter && isArea) {
80004 var multipolygon = osmRelation({
80005 tags: assignIn({}, wayA.tags, {type: 'multipolygon'}),
80007 {id: wayA.id, role: 'outer', type: 'way'},
80008 {id: wayB.id, role: 'outer', type: 'way'}
80012 graph = graph.replace(multipolygon);
80013 graph = graph.replace(wayA.update({tags: {}}));
80014 graph = graph.replace(wayB.update({tags: {}}));
80021 var action = function(graph) {
80022 var candidates = action.ways(graph);
80023 for (var i = 0; i < candidates.length; i++) {
80024 graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
80030 action.ways = function(graph) {
80031 var node = graph.entity(nodeId);
80032 var parents = graph.parentWays(node);
80033 var hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
80035 return parents.filter(function(parent) {
80036 if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
80039 if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
80042 if (parent.isClosed()) {
80046 for (var i = 1; i < parent.nodes.length - 1; i++) {
80047 if (parent.nodes[i] === nodeId) {
80057 action.disabled = function(graph) {
80058 var candidates = action.ways(graph);
80059 if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length))
80060 return 'not_eligible';
80064 action.limitWays = function(_) {
80065 if (!arguments.length) return _wayIDs;
80075 * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
80077 function actionStraighten(wayId, projection) {
80079 function positionAlongWay(n, s, e) {
80080 return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
80081 (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
80085 var action = function(graph, t) {
80086 if (t === null || !isFinite(t)) t = 1;
80087 t = Math.min(Math.max(+t, 0), 1);
80089 var way = graph.entity(wayId),
80090 nodes = graph.childNodes(way),
80091 points = nodes.map(function(n) { return projection(n.loc); }),
80092 startPoint = points[0],
80093 endPoint = points[points.length-1],
80097 for (i = 1; i < points.length-1; i++) {
80098 var node = nodes[i],
80101 if (t < 1 || graph.parentWays(node).length > 1 ||
80102 graph.parentRelations(node).length ||
80103 node.hasInterestingTags()) {
80105 var u = positionAlongWay(point, startPoint, endPoint),
80107 startPoint[0] + u * (endPoint[0] - startPoint[0]),
80108 startPoint[1] + u * (endPoint[1] - startPoint[1])
80110 loc2 = projection.invert(p);
80112 graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
80116 if (toDelete.indexOf(node) === -1) {
80117 toDelete.push(node);
80122 for (i = 0; i < toDelete.length; i++) {
80123 graph = actionDeleteNode(toDelete[i].id)(graph);
80130 action.disabled = function(graph) {
80131 // check way isn't too bendy
80132 var way = graph.entity(wayId),
80133 nodes = graph.childNodes(way),
80134 points = nodes.map(function(n) { return projection(n.loc); }),
80135 startPoint = points[0],
80136 endPoint = points[points.length-1],
80137 threshold = 0.2 * geoVecLength(startPoint, endPoint),
80140 if (threshold === 0) {
80141 return 'too_bendy';
80144 for (i = 1; i < points.length-1; i++) {
80145 var point = points[i],
80146 u = positionAlongWay(point, startPoint, endPoint),
80147 p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
80148 p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
80149 dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
80151 // to bendy if point is off by 20% of total start/end distance in projected space
80152 if (isNaN(dist) || dist > threshold) {
80153 return 'too_bendy';
80159 action.transitionable = true;
80165 // `actionUnrestrictTurn` deletes a turn restriction relation.
80167 // `turn` must be an `osmTurn` object with a `restrictionID` property.
80168 // see osm/intersection.js, pathToTurn()
80170 function actionUnrestrictTurn(turn) {
80171 return function(graph) {
80172 return actionDeleteRelation(turn.restrictionID)(graph);
80176 /* Reflect the given area around its axis of symmetry */
80177 function actionReflect(reflectIds, projection) {
80178 var useLongAxis = true;
80181 // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
80182 // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
80183 function getSmallestSurroundingRectangle(graph, nodes) {
80184 var points = nodes.map(function(n) { return projection(n.loc); }),
80185 hull = d3_polygonHull(points),
80186 centroid = d3_polygonCentroid(hull),
80187 minArea = Infinity,
80192 for (var i = 0; i <= hull.length - 1; i++) {
80193 var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
80194 angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
80195 poly = geoRotate(hull, -angle, centroid),
80196 extent = poly.reduce(function(extent, point) {
80197 return extent.extend(geoExtent$$1(point));
80198 }, geoExtent$$1()),
80199 area = extent.area();
80201 if (area < minArea) {
80203 ssrExtent = extent;
80210 poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
80216 var action = function(graph, t) {
80217 if (t === null || !isFinite(t)) t = 1;
80218 t = Math.min(Math.max(+t, 0), 1);
80220 var nodes = utilGetAllNodes(reflectIds, graph),
80221 ssr = getSmallestSurroundingRectangle(graph, nodes);
80223 // Choose line pq = axis of symmetry.
80224 // The shape's surrounding rectangle has 2 axes of symmetry.
80225 // Reflect across the longer axis by default.
80226 var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
80227 q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
80228 p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
80229 q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
80232 var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
80233 if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
80241 // reflect c across pq
80242 // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
80243 var dx = q[0] - p[0];
80244 var dy = q[1] - p[1];
80245 var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
80246 var b = 2 * dx * dy / (dx * dx + dy * dy);
80247 for (var i = 0; i < nodes.length; i++) {
80248 var node = nodes[i];
80249 var c = projection(node.loc);
80251 a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
80252 b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
80254 var loc2 = projection.invert(c2);
80255 node = node.move(geoVecInterp(node.loc, loc2, t));
80256 graph = graph.replace(node);
80263 action.useLongAxis = function(_) {
80264 if (!arguments.length) return useLongAxis;
80270 action.transitionable = true;
80278 var index$4 = /*#__PURE__*/Object.freeze({
80279 d3combobox: d3combobox,
80280 d3geoTile: d3geoTile,
80281 d3keybinding: d3keybinding
80284 var Connection = services.osm;
80288 var iD = /*#__PURE__*/Object.freeze({
80289 Connection: Connection,
80293 Context: coreContext,
80294 setAreaKeys: setAreaKeys,
80295 Difference: coreDifference,
80296 Graph: coreGraph$$1,
80297 History: coreHistory,
80299 geoCross: geoVecCross,
80300 geoInterp: geoVecInterp,
80301 geoRoundCoordinates: geoVecFloor,
80302 geoEuclideanDistance: geoVecLength,
80303 Entity: osmEntity$$1,
80305 Relation: osmRelation,
80307 BackgroundSource: rendererBackgroundSource,
80308 Background: rendererBackground,
80309 Features: rendererFeatures,
80311 TileLayer: rendererTileLayer,
80312 Detect: utilDetect,
80313 uiPreset: uiPresetEditor,
80314 actionAddEntity: actionAddEntity,
80315 actionAddMember: actionAddMember,
80316 actionAddMidpoint: actionAddMidpoint,
80317 actionAddVertex: actionAddVertex,
80318 actionChangeMember: actionChangeMember,
80319 actionChangePreset: actionChangePreset,
80320 actionChangeTags: actionChangeTags,
80321 actionCircularize: actionCircularize,
80322 actionConnect: actionConnect,
80323 actionCopyEntities: actionCopyEntities,
80324 actionDeleteMember: actionDeleteMember,
80325 actionDeleteMultiple: actionDeleteMultiple,
80326 actionDeleteNode: actionDeleteNode,
80327 actionDeleteRelation: actionDeleteRelation,
80328 actionDeleteWay: actionDeleteWay,
80329 actionDeprecateTags: actionDeprecateTags,
80330 actionDiscardTags: actionDiscardTags,
80331 actionDisconnect: actionDisconnect,
80332 actionJoin: actionJoin,
80333 actionMerge: actionMerge,
80334 actionMergeNodes: actionMergeNodes,
80335 actionMergePolygon: actionMergePolygon,
80336 actionMergeRemoteChanges: actionMergeRemoteChanges,
80337 actionMove: actionMove,
80338 actionMoveNode: actionMoveNode,
80339 actionNoop: actionNoop,
80340 actionOrthogonalize: actionOrthogonalize,
80341 actionRestrictTurn: actionRestrictTurn,
80342 actionReverse: actionReverse,
80343 actionRevert: actionRevert,
80344 actionRotate: actionRotate,
80345 actionSplit: actionSplit,
80346 actionStraighten: actionStraighten,
80347 actionUnrestrictTurn: actionUnrestrictTurn,
80348 actionReflect: actionReflect,
80349 behaviorAddWay: behaviorAddWay,
80350 behaviorBreathe: behaviorBreathe,
80351 behaviorCopy: behaviorCopy,
80352 behaviorDrag: behaviorDrag,
80353 behaviorDrawWay: behaviorDrawWay,
80354 behaviorDraw: behaviorDraw,
80355 behaviorEdit: behaviorEdit,
80356 behaviorHash: behaviorHash,
80357 behaviorHover: behaviorHover,
80358 behaviorLasso: behaviorLasso,
80359 behaviorOperation: behaviorOperation,
80360 behaviorPaste: behaviorPaste,
80361 behaviorSelect: behaviorSelect,
80362 behaviorTail: behaviorTail,
80363 coreContext: coreContext,
80364 coreDifference: coreDifference,
80365 coreGraph: coreGraph$$1,
80366 coreHistory: coreHistory,
80367 coreTree: coreTree,
80369 dataWikipedia: wikipedia$2,
80370 dataSuggestions: dataSuggestions,
80371 dataAddressFormats: dataAddressFormats,
80372 dataDeprecated: dataDeprecated,
80373 dataDiscarded: dataDiscarded,
80374 dataLocales: dataLocales,
80375 dataPhoneFormats: dataPhoneFormats,
80376 dataShortcuts: dataShortcuts,
80377 dataImperial: dataImperial,
80378 dataDriveLeft: dataDriveLeft,
80380 geoExtent: geoExtent$$1,
80381 geoLatToMeters: geoLatToMeters,
80382 geoLonToMeters: geoLonToMeters,
80383 geoMetersToLat: geoMetersToLat,
80384 geoMetersToLon: geoMetersToLon,
80385 geoMetersToOffset: geoMetersToOffset,
80386 geoOffsetToMeters: geoOffsetToMeters,
80387 geoScaleToZoom: geoScaleToZoom,
80388 geoSphericalDistance: geoSphericalDistance,
80389 geoZoomToScale: geoZoomToScale,
80390 geoAngle: geoAngle,
80391 geoChooseEdge: geoChooseEdge,
80392 geoEdgeEqual: geoEdgeEqual,
80393 geoHasLineIntersections: geoHasLineIntersections,
80394 geoHasSelfIntersections: geoHasSelfIntersections,
80395 geoRotate: geoRotate,
80396 geoLineIntersection: geoLineIntersection,
80397 geoPathHasIntersections: geoPathHasIntersections,
80398 geoPathIntersections: geoPathIntersections,
80399 geoPathLength: geoPathLength,
80400 geoPointInPolygon: geoPointInPolygon,
80401 geoPolygonContainsPolygon: geoPolygonContainsPolygon,
80402 geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
80403 geoViewportEdge: geoViewportEdge,
80404 geoRawMercator: geoRawMercator,
80405 geoVecAdd: geoVecAdd,
80406 geoVecAngle: geoVecAngle,
80407 geoVecCross: geoVecCross,
80408 geoVecDot: geoVecDot,
80409 geoVecEqual: geoVecEqual,
80410 geoVecFloor: geoVecFloor,
80411 geoVecInterp: geoVecInterp,
80412 geoVecLength: geoVecLength,
80413 geoVecSubtract: geoVecSubtract,
80414 geoVecScale: geoVecScale,
80415 modeAddArea: modeAddArea$$1,
80416 modeAddLine: modeAddLine$$1,
80417 modeAddPoint: modeAddPoint$$1,
80418 modeBrowse: modeBrowse,
80419 modeDragNode: modeDragNode$$1,
80420 modeDrawArea: modeDrawArea,
80421 modeDrawLine: modeDrawLine,
80422 modeMove: modeMove$$1,
80423 modeRotate: modeRotate$$1,
80424 modeSave: modeSave$$1,
80425 modeSelect: modeSelect,
80426 operationCircularize: operationCircularize,
80427 operationContinue: operationContinue,
80428 operationDelete: operationDelete,
80429 operationDisconnect: operationDisconnect,
80430 operationMerge: operationMerge,
80431 operationMove: operationMove,
80432 operationOrthogonalize: operationOrthogonalize,
80433 operationReflectShort: operationReflectShort,
80434 operationReflectLong: operationReflectLong,
80435 operationReverse: operationReverse,
80436 operationRotate: operationRotate,
80437 operationSplit: operationSplit,
80438 operationStraighten: operationStraighten,
80439 osmChangeset: osmChangeset,
80440 osmEntity: osmEntity$$1,
80442 osmRelation: osmRelation,
80444 osmIntersection: osmIntersection,
80446 osmInferRestriction: osmInferRestriction,
80447 osmLanes: osmLanes,
80448 osmIsSimpleMultipolygonOuterMember: osmIsSimpleMultipolygonOuterMember,
80449 osmSimpleMultipolygonOuterMember: osmSimpleMultipolygonOuterMember,
80450 osmJoinWays: osmJoinWays,
80451 osmOneWayTags: osmOneWayTags,
80452 osmPavedTags: osmPavedTags,
80453 osmIsInterestingTag: osmIsInterestingTag,
80454 presetCategory: presetCategory,
80455 presetCollection: presetCollection,
80456 presetField: presetField,
80457 presetPreset: presetPreset,
80458 presetIndex: presetIndex,
80459 rendererBackgroundSource: rendererBackgroundSource,
80460 rendererBackground: rendererBackground,
80461 rendererFeatures: rendererFeatures,
80462 rendererMap: rendererMap,
80463 rendererTileLayer: rendererTileLayer,
80464 services: services,
80465 serviceMapillary: serviceMapillary,
80466 serviceNominatim: serviceNominatim,
80467 serviceOpenstreetcam: serviceOpenstreetcam,
80468 serviceOsm: serviceOsm,
80469 serviceStreetside: serviceStreetside,
80470 serviceTaginfo: serviceTaginfo,
80471 serviceWikidata: serviceWikidata,
80472 serviceWikipedia: serviceWikipedia,
80473 svgAreas: svgAreas$$1,
80474 svgDebug: svgDebug$$1,
80478 svgLabels: svgLabels,
80479 svgLayers: svgLayers,
80480 svgLines: svgLines$$1,
80481 svgMapillaryImages: svgMapillaryImages$$1,
80482 svgMapillarySigns: svgMapillarySigns$$1,
80483 svgMidpoints: svgMidpoints$$1,
80484 svgOneWaySegments: svgOneWaySegments,
80485 svgOpenstreetcamImages: svgOpenstreetcamImages$$1,
80487 svgPassiveVertex: svgPassiveVertex,
80489 svgPointTransform: svgPointTransform,
80490 svgPoints: svgPoints$$1,
80491 svgRelationMemberTags: svgRelationMemberTags,
80492 svgSegmentWay: svgSegmentWay,
80493 svgStreetside: svgStreetside$$1,
80494 svgTagClasses: svgTagClasses,
80495 svgTurns: svgTurns,
80496 svgVertices: svgVertices$$1,
80497 uiFields: uiFields,
80498 uiFieldDefaultCheck: uiFieldCheck,
80499 uiFieldOnewayCheck: uiFieldCheck,
80500 uiFieldCheck: uiFieldCheck,
80501 uiFieldMultiCombo: uiFieldCombo,
80502 uiFieldNetworkCombo: uiFieldCombo,
80503 uiFieldSemiCombo: uiFieldCombo,
80504 uiFieldTypeCombo: uiFieldCombo,
80505 uiFieldCombo: uiFieldCombo,
80506 uiFieldUrl: uiFieldText,
80507 uiFieldNumber: uiFieldText,
80508 uiFieldTel: uiFieldText,
80509 uiFieldEmail: uiFieldText,
80510 uiFieldText: uiFieldText,
80511 uiFieldAccess: uiFieldAccess,
80512 uiFieldAddress: uiFieldAddress,
80513 uiFieldCycleway: uiFieldCycleway,
80514 uiFieldLanes: uiFieldLanes,
80515 uiFieldLocalized: uiFieldLocalized,
80516 uiFieldMaxspeed: uiFieldMaxspeed,
80517 uiFieldStructureRadio: uiFieldRadio,
80518 uiFieldRadio: uiFieldRadio,
80519 uiFieldRestrictions: uiFieldRestrictions,
80520 uiFieldTextarea: uiFieldTextarea,
80521 uiFieldWikipedia: uiFieldWikipedia,
80523 uiInfoPanels: uiInfoPanels,
80524 uiPanelBackground: uiPanelBackground,
80525 uiPanelHistory: uiPanelHistory,
80526 uiPanelLocation: uiPanelLocation,
80527 uiPanelMeasurement: uiPanelMeasurement,
80529 uiAccount: uiAccount,
80530 uiAttribution: uiAttribution,
80531 uiBackground: uiBackground,
80532 uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
80533 uiBackgroundOffset: uiBackgroundOffset,
80534 uiChangesetEditor: uiChangesetEditor,
80536 uiCommit: uiCommit,
80537 uiCommitChanges: uiCommitChanges,
80538 uiCommitWarnings: uiCommitWarnings,
80539 uiConfirm: uiConfirm,
80540 uiConflicts: uiConflicts,
80541 uiContributors: uiContributors,
80542 uiCurtain: uiCurtain,
80543 uiDisclosure: uiDisclosure,
80544 uiEditMenu: uiEditMenu,
80545 uiEntityEditor: uiEntityEditor,
80546 uiFeatureInfo: uiFeatureInfo,
80547 uiFeatureList: uiFeatureList,
80549 uiFieldHelp: uiFieldHelp,
80551 uiFormFields: uiFormFields,
80552 uiFullScreen: uiFullScreen,
80553 uiGeolocate: uiGeolocate,
80556 uiInspector: uiInspector,
80558 uiLoading: uiLoading,
80559 uiMapData: uiMapData,
80560 uiMapInMap: uiMapInMap,
80563 uiNotice: uiNotice,
80564 uiPresetEditor: uiPresetEditor,
80565 uiPresetIcon: uiPresetIcon,
80566 uiPresetList: uiPresetList,
80567 uiRadialMenu: uiRadialMenu,
80568 uiRawMemberEditor: uiRawMemberEditor,
80569 uiRawMembershipEditor: uiRawMembershipEditor,
80570 uiRawTagEditor: uiRawTagEditor,
80571 uiRestore: uiRestore,
80574 uiSelectionList: uiSelectionList,
80575 uiSidebar: uiSidebar,
80576 uiSourceSwitch: uiSourceSwitch,
80577 uiSpinner: uiSpinner,
80578 uiSplash: uiSplash,
80579 uiStatus: uiStatus,
80580 uiSuccess: uiSuccess$$1,
80581 uiTagReference: uiTagReference,
80582 uiToggle: uiToggle,
80583 uiTooltipHtml: uiTooltipHtml,
80584 uiUndoRedo: uiUndoRedo,
80585 uiVersion: uiVersion,
80586 uiViewOnOSM: uiViewOnOSM,
80588 utilAsyncMap: utilAsyncMap,
80589 utilCallWhenIdle: utilCallWhenIdle,
80590 utilCleanTags: utilCleanTags,
80591 utilDisplayName: utilDisplayName,
80592 utilDisplayNameForPath: utilDisplayNameForPath,
80593 utilDisplayType: utilDisplayType,
80594 utilEditDistance: utilEditDistance,
80595 utilEntitySelector: utilEntitySelector,
80596 utilEntityOrMemberSelector: utilEntityOrMemberSelector,
80597 utilFastMouse: utilFastMouse,
80598 utilFunctor: utilFunctor,
80599 utilGetAllNodes: utilGetAllNodes,
80600 utilGetPrototypeOf: utilGetPrototypeOf,
80601 utilGetSetValue: utilGetSetValue,
80602 utilIdleWorker: utilIdleWorker,
80603 utilNoAuto: utilNoAuto,
80604 utilPrefixCSSProperty: utilPrefixCSSProperty,
80605 utilPrefixDOMProperty: utilPrefixDOMProperty,
80606 utilQsString: utilQsString,
80607 utilRebind: utilRebind,
80608 utilSetTransform: utilSetTransform,
80609 utilSessionMutex: utilSessionMutex,
80610 utilStringQs: utilStringQs,
80611 utilSuggestNames: utilSuggestNames,
80612 utilTagText: utilTagText,
80613 utilTriggerEvent: utilTriggerEvent,
80614 utilWrap: utilWrap,
80615 d3combobox: d3combobox,
80616 d3geoTile: d3geoTile,
80617 d3keybinding: d3keybinding,
80618 validationDeprecatedTag: validationDeprecatedTag,
80619 validationDisconnectedHighway: validationDisconnectedHighway,
80620 validationManyDeletions: validationManyDeletions,
80621 validationMissingTag: validationMissingTag,
80622 validationOldMultipolygon: validationOldMultipolygon,
80623 validationTagSuggestsArea: validationTagSuggestsArea
80629 //# sourceMappingURL=iD.js.map