]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
Update to iD v2.9.2
[rails.git] / vendor / assets / iD / iD.js
1 (function () {
2   var version = "4.13.0";
3
4   function ascending(a, b) {
5     return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
6   }
7
8   function bisector(compare) {
9     if (compare.length === 1) compare = ascendingComparator(compare);
10     return {
11       left: function(a, x, lo, hi) {
12         if (lo == null) lo = 0;
13         if (hi == null) hi = a.length;
14         while (lo < hi) {
15           var mid = lo + hi >>> 1;
16           if (compare(a[mid], x) < 0) lo = mid + 1;
17           else hi = mid;
18         }
19         return lo;
20       },
21       right: function(a, x, lo, hi) {
22         if (lo == null) lo = 0;
23         if (hi == null) hi = a.length;
24         while (lo < hi) {
25           var mid = lo + hi >>> 1;
26           if (compare(a[mid], x) > 0) hi = mid;
27           else lo = mid + 1;
28         }
29         return lo;
30       }
31     };
32   }
33
34   function ascendingComparator(f) {
35     return function(d, x) {
36       return ascending(f(d), x);
37     };
38   }
39
40   var ascendingBisect = bisector(ascending);
41   var bisectRight = ascendingBisect.right;
42   var bisectLeft = ascendingBisect.left;
43
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]);
48     return pairs;
49   }
50
51   function pair(a, b) {
52     return [a, b];
53   }
54
55   function cross(values0, values1, reduce) {
56     var n0 = values0.length,
57         n1 = values1.length,
58         values = new Array(n0 * n1),
59         i0,
60         i1,
61         i,
62         value0;
63
64     if (reduce == null) reduce = pair;
65
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]);
69       }
70     }
71
72     return values;
73   }
74
75   function d3_descending(a, b) {
76     return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
77   }
78
79   function number(x) {
80     return x === null ? NaN : +x;
81   }
82
83   function variance(values, valueof) {
84     var n = values.length,
85         m = 0,
86         i = -1,
87         mean = 0,
88         value,
89         delta,
90         sum = 0;
91
92     if (valueof == null) {
93       while (++i < n) {
94         if (!isNaN(value = number(values[i]))) {
95           delta = value - mean;
96           mean += delta / ++m;
97           sum += delta * (value - mean);
98         }
99       }
100     }
101
102     else {
103       while (++i < n) {
104         if (!isNaN(value = number(valueof(values[i], i, values)))) {
105           delta = value - mean;
106           mean += delta / ++m;
107           sum += delta * (value - mean);
108         }
109       }
110     }
111
112     if (m > 1) return sum / (m - 1);
113   }
114
115   function deviation(array, f) {
116     var v = variance(array, f);
117     return v ? Math.sqrt(v) : v;
118   }
119
120   function extent(values, valueof) {
121     var n = values.length,
122         i = -1,
123         value,
124         min,
125         max;
126
127     if (valueof == null) {
128       while (++i < n) { // Find the first comparable value.
129         if ((value = values[i]) != null && value >= value) {
130           min = max = 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;
135             }
136           }
137         }
138       }
139     }
140
141     else {
142       while (++i < n) { // Find the first comparable value.
143         if ((value = valueof(values[i], i, values)) != null && value >= value) {
144           min = max = 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;
149             }
150           }
151         }
152       }
153     }
154
155     return [min, max];
156   }
157
158   var array = Array.prototype;
159
160   var slice = array.slice;
161   var map = array.map;
162
163   function constant(x) {
164     return function() {
165       return x;
166     };
167   }
168
169   function identity(x) {
170     return x;
171   }
172
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;
175
176     var i = -1,
177         n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
178         range = new Array(n);
179
180     while (++i < n) {
181       range[i] = start + i * step;
182     }
183
184     return range;
185   }
186
187   var e10 = Math.sqrt(50),
188       e5 = Math.sqrt(10),
189       e2 = Math.sqrt(2);
190
191   function ticks(start, stop, count) {
192     var reverse,
193         i = -1,
194         n,
195         ticks,
196         step;
197
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 [];
202
203     if (step > 0) {
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;
208     } else {
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;
213     }
214
215     if (reverse) ticks.reverse();
216
217     return ticks;
218   }
219
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);
224     return power >= 0
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);
227   }
228
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;
237   }
238
239   function sturges(values) {
240     return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
241   }
242
243   function histogram() {
244     var value = identity,
245         domain = extent,
246         threshold = sturges;
247
248     function histogram(data) {
249       var i,
250           n = data.length,
251           x,
252           values = new Array(n);
253
254       for (i = 0; i < n; ++i) {
255         values[i] = value(data[i], i, data);
256       }
257
258       var xz = domain(values),
259           x0 = xz[0],
260           x1 = xz[1],
261           tz = threshold(values, x0, x1);
262
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
267       }
268
269       // Remove any thresholds outside the domain.
270       var m = tz.length;
271       while (tz[0] <= x0) tz.shift(), --m;
272       while (tz[m - 1] > x1) tz.pop(), --m;
273
274       var bins = new Array(m + 1),
275           bin;
276
277       // Initialize bins.
278       for (i = 0; i <= m; ++i) {
279         bin = bins[i] = [];
280         bin.x0 = i > 0 ? tz[i - 1] : x0;
281         bin.x1 = i < m ? tz[i] : x1;
282       }
283
284       // Assign data to bins by value, ignoring any outside the domain.
285       for (i = 0; i < n; ++i) {
286         x = values[i];
287         if (x0 <= x && x <= x1) {
288           bins[bisectRight(tz, x, 0, m)].push(data[i]);
289         }
290       }
291
292       return bins;
293     }
294
295     histogram.value = function(_) {
296       return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
297     };
298
299     histogram.domain = function(_) {
300       return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;
301     };
302
303     histogram.thresholds = function(_) {
304       return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;
305     };
306
307     return histogram;
308   }
309
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);
315     var n,
316         i = (n - 1) * p,
317         i0 = Math.floor(i),
318         value0 = +valueof(values[i0], i0, values),
319         value1 = +valueof(values[i0 + 1], i0 + 1, values);
320     return value0 + (value1 - value0) * (i - i0);
321   }
322
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)));
326   }
327
328   function scott(values, min, max) {
329     return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
330   }
331
332   function max(values, valueof) {
333     var n = values.length,
334         i = -1,
335         value,
336         max;
337
338     if (valueof == null) {
339       while (++i < n) { // Find the first comparable value.
340         if ((value = values[i]) != null && value >= value) {
341           max = value;
342           while (++i < n) { // Compare the remaining values.
343             if ((value = values[i]) != null && value > max) {
344               max = value;
345             }
346           }
347         }
348       }
349     }
350
351     else {
352       while (++i < n) { // Find the first comparable value.
353         if ((value = valueof(values[i], i, values)) != null && value >= value) {
354           max = value;
355           while (++i < n) { // Compare the remaining values.
356             if ((value = valueof(values[i], i, values)) != null && value > max) {
357               max = value;
358             }
359           }
360         }
361       }
362     }
363
364     return max;
365   }
366
367   function mean(values, valueof) {
368     var n = values.length,
369         m = n,
370         i = -1,
371         value,
372         sum = 0;
373
374     if (valueof == null) {
375       while (++i < n) {
376         if (!isNaN(value = number(values[i]))) sum += value;
377         else --m;
378       }
379     }
380
381     else {
382       while (++i < n) {
383         if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;
384         else --m;
385       }
386     }
387
388     if (m) return sum / m;
389   }
390
391   function d3_median(values, valueof) {
392     var n = values.length,
393         i = -1,
394         value,
395         numbers = [];
396
397     if (valueof == null) {
398       while (++i < n) {
399         if (!isNaN(value = number(values[i]))) {
400           numbers.push(value);
401         }
402       }
403     }
404
405     else {
406       while (++i < n) {
407         if (!isNaN(value = number(valueof(values[i], i, values)))) {
408           numbers.push(value);
409         }
410       }
411     }
412
413     return quantile(numbers.sort(ascending), 0.5);
414   }
415
416   function merge(arrays) {
417     var n = arrays.length,
418         m,
419         i = -1,
420         j = 0,
421         merged,
422         array;
423
424     while (++i < n) j += arrays[i].length;
425     merged = new Array(j);
426
427     while (--n >= 0) {
428       array = arrays[n];
429       m = array.length;
430       while (--m >= 0) {
431         merged[--j] = array[m];
432       }
433     }
434
435     return merged;
436   }
437
438   function min(values, valueof) {
439     var n = values.length,
440         i = -1,
441         value,
442         min;
443
444     if (valueof == null) {
445       while (++i < n) { // Find the first comparable value.
446         if ((value = values[i]) != null && value >= value) {
447           min = value;
448           while (++i < n) { // Compare the remaining values.
449             if ((value = values[i]) != null && min > value) {
450               min = value;
451             }
452           }
453         }
454       }
455     }
456
457     else {
458       while (++i < n) { // Find the first comparable value.
459         if ((value = valueof(values[i], i, values)) != null && value >= value) {
460           min = value;
461           while (++i < n) { // Compare the remaining values.
462             if ((value = valueof(values[i], i, values)) != null && min > value) {
463               min = value;
464             }
465           }
466         }
467       }
468     }
469
470     return min;
471   }
472
473   function permute(array, indexes) {
474     var i = indexes.length, permutes = new Array(i);
475     while (i--) permutes[i] = array[indexes[i]];
476     return permutes;
477   }
478
479   function scan(values, compare) {
480     if (!(n = values.length)) return;
481     var n,
482         i = 0,
483         j = 0,
484         xi,
485         xj = values[j];
486
487     if (compare == null) compare = ascending;
488
489     while (++i < n) {
490       if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {
491         xj = xi, j = i;
492       }
493     }
494
495     if (compare(xj, xj) === 0) return j;
496   }
497
498   function shuffle(array, i0, i1) {
499     var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
500         t,
501         i;
502
503     while (m) {
504       i = Math.random() * m-- | 0;
505       t = array[m + i0];
506       array[m + i0] = array[i + i0];
507       array[i + i0] = t;
508     }
509
510     return array;
511   }
512
513   function sum(values, valueof) {
514     var n = values.length,
515         i = -1,
516         value,
517         sum = 0;
518
519     if (valueof == null) {
520       while (++i < n) {
521         if (value = +values[i]) sum += value; // Note: zero and null are equivalent.
522       }
523     }
524
525     else {
526       while (++i < n) {
527         if (value = +valueof(values[i], i, values)) sum += value;
528       }
529     }
530
531     return sum;
532   }
533
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];
539       }
540     }
541     return transpose;
542   }
543
544   function length(d) {
545     return d.length;
546   }
547
548   function zip() {
549     return transpose(arguments);
550   }
551
552   var slice$1 = Array.prototype.slice;
553
554   function identity$1(x) {
555     return x;
556   }
557
558   var top = 1,
559       right = 2,
560       bottom = 3,
561       left = 4,
562       epsilon = 1e-6;
563
564   function translateX(x) {
565     return "translate(" + (x + 0.5) + ",0)";
566   }
567
568   function translateY(y) {
569     return "translate(0," + (y + 0.5) + ")";
570   }
571
572   function number$1(scale) {
573     return function(d) {
574       return +scale(d);
575     };
576   }
577
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);
581     return function(d) {
582       return +scale(d) + offset;
583     };
584   }
585
586   function entering() {
587     return !this.__axis;
588   }
589
590   function axis(orient, scale) {
591     var tickArguments = [],
592         tickValues = null,
593         tickFormat = null,
594         tickSizeInner = 6,
595         tickSizeOuter = 6,
596         tickPadding = 3,
597         k = orient === top || orient === left ? -1 : 1,
598         x = orient === left || orient === right ? "x" : "y",
599         transform = orient === top || orient === bottom ? translateX : translateY;
600
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");
616
617       path = path.merge(path.enter().insert("path", ".tick")
618           .attr("class", "domain")
619           .attr("stroke", "#000"));
620
621       tick = tick.merge(tickEnter);
622
623       line = line.merge(tickEnter.append("line")
624           .attr("stroke", "#000")
625           .attr(x + "2", k * tickSizeInner));
626
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"));
631
632       if (context !== selection) {
633         path = path.transition(context);
634         tick = tick.transition(context);
635         line = line.transition(context);
636         text = text.transition(context);
637
638         tickExit = tickExit.transition(context)
639             .attr("opacity", epsilon)
640             .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); });
641
642         tickEnter
643             .attr("opacity", epsilon)
644             .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });
645       }
646
647       tickExit.remove();
648
649       path
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);
653
654       tick
655           .attr("opacity", 1)
656           .attr("transform", function(d) { return transform(position(d)); });
657
658       line
659           .attr(x + "2", k * tickSizeInner);
660
661       text
662           .attr(x, k * spacing)
663           .text(format);
664
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");
670
671       selection
672           .each(function() { this.__axis = position; });
673     }
674
675     axis.scale = function(_) {
676       return arguments.length ? (scale = _, axis) : scale;
677     };
678
679     axis.ticks = function() {
680       return tickArguments = slice$1.call(arguments), axis;
681     };
682
683     axis.tickArguments = function(_) {
684       return arguments.length ? (tickArguments = _ == null ? [] : slice$1.call(_), axis) : tickArguments.slice();
685     };
686
687     axis.tickValues = function(_) {
688       return arguments.length ? (tickValues = _ == null ? null : slice$1.call(_), axis) : tickValues && tickValues.slice();
689     };
690
691     axis.tickFormat = function(_) {
692       return arguments.length ? (tickFormat = _, axis) : tickFormat;
693     };
694
695     axis.tickSize = function(_) {
696       return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
697     };
698
699     axis.tickSizeInner = function(_) {
700       return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
701     };
702
703     axis.tickSizeOuter = function(_) {
704       return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
705     };
706
707     axis.tickPadding = function(_) {
708       return arguments.length ? (tickPadding = +_, axis) : tickPadding;
709     };
710
711     return axis;
712   }
713
714   function axisTop(scale) {
715     return axis(top, scale);
716   }
717
718   function axisRight(scale) {
719     return axis(right, scale);
720   }
721
722   function axisBottom(scale) {
723     return axis(bottom, scale);
724   }
725
726   function axisLeft(scale) {
727     return axis(left, scale);
728   }
729
730   var noop = {value: function() {}};
731
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);
735       _[t] = [];
736     }
737     return new Dispatch(_);
738   }
739
740   function Dispatch(_) {
741     this._ = _;
742   }
743
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};
750     });
751   }
752
753   Dispatch.prototype = dispatch.prototype = {
754     constructor: Dispatch,
755     on: function(typename, callback) {
756       var _ = this._,
757           T = parseTypenames(typename + "", _),
758           t,
759           i = -1,
760           n = T.length;
761
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;
765         return;
766       }
767
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);
771       while (++i < n) {
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);
774       }
775
776       return this;
777     },
778     copy: function() {
779       var copy = {}, _ = this._;
780       for (var t in _) copy[t] = _[t].slice();
781       return new Dispatch(copy);
782     },
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);
787     },
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);
791     }
792   };
793
794   function get(type, name) {
795     for (var i = 0, n = type.length, c; i < n; ++i) {
796       if ((c = type[i]).name === name) {
797         return c.value;
798       }
799     }
800   }
801
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));
806         break;
807       }
808     }
809     if (callback != null) type.push({name: name, value: callback});
810     return type;
811   }
812
813   var xhtml = "http://www.w3.org/1999/xhtml";
814
815   var namespaces = {
816     svg: "http://www.w3.org/2000/svg",
817     xhtml: xhtml,
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/"
821   };
822
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;
827   }
828
829   function creatorInherit(name) {
830     return function() {
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);
836     };
837   }
838
839   function creatorFixed(fullname) {
840     return function() {
841       return this.ownerDocument.createElementNS(fullname.space, fullname.local);
842     };
843   }
844
845   function creator(name) {
846     var fullname = namespace(name);
847     return (fullname.local
848         ? creatorFixed
849         : creatorInherit)(fullname);
850   }
851
852   function none() {}
853
854   function selector(selector) {
855     return selector == null ? none : function() {
856       return this.querySelector(selector);
857     };
858   }
859
860   function selection_select(select) {
861     if (typeof select !== "function") select = selector(select);
862
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;
868         }
869       }
870     }
871
872     return new Selection(subgroups, this._parents);
873   }
874
875   function empty() {
876     return [];
877   }
878
879   function selectorAll(selector) {
880     return selector == null ? empty : function() {
881       return this.querySelectorAll(selector);
882     };
883   }
884
885   function selection_selectAll(select) {
886     if (typeof select !== "function") select = selectorAll(select);
887
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));
892           parents.push(node);
893         }
894       }
895     }
896
897     return new Selection(subgroups, parents);
898   }
899
900   var matcher = function(selector) {
901     return function() {
902       return this.matches(selector);
903     };
904   };
905
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) {
914         return function() {
915           return vendorMatches.call(this, selector);
916         };
917       };
918     }
919   }
920
921   var matcher$1 = matcher;
922
923   function selection_filter(match) {
924     if (typeof match !== "function") match = matcher$1(match);
925
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)) {
929           subgroup.push(node);
930         }
931       }
932     }
933
934     return new Selection(subgroups, this._parents);
935   }
936
937   function sparse(update) {
938     return new Array(update.length);
939   }
940
941   function selection_enter() {
942     return new Selection(this._enter || this._groups.map(sparse), this._parents);
943   }
944
945   function EnterNode(parent, datum) {
946     this.ownerDocument = parent.ownerDocument;
947     this.namespaceURI = parent.namespaceURI;
948     this._next = null;
949     this._parent = parent;
950     this.__data__ = datum;
951   }
952
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); }
959   };
960
961   function constant$1(x) {
962     return function() {
963       return x;
964     };
965   }
966
967   var keyPrefix = "$"; // Protect against keys like “__proto__”.
968
969   function bindIndex(parent, group, enter, update, exit, data) {
970     var i = 0,
971         node,
972         groupLength = group.length,
973         dataLength = data.length;
974
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];
981         update[i] = node;
982       } else {
983         enter[i] = new EnterNode(parent, data[i]);
984       }
985     }
986
987     // Put any non-null nodes that don’t fit into exit.
988     for (; i < groupLength; ++i) {
989       if (node = group[i]) {
990         exit[i] = node;
991       }
992     }
993   }
994
995   function bindKey(parent, group, enter, update, exit, data, key) {
996     var i,
997         node,
998         nodeByKeyValue = {},
999         groupLength = group.length,
1000         dataLength = data.length,
1001         keyValues = new Array(groupLength),
1002         keyValue;
1003
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) {
1010           exit[i] = node;
1011         } else {
1012           nodeByKeyValue[keyValue] = node;
1013         }
1014       }
1015     }
1016
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]) {
1023         update[i] = node;
1024         node.__data__ = data[i];
1025         nodeByKeyValue[keyValue] = null;
1026       } else {
1027         enter[i] = new EnterNode(parent, data[i]);
1028       }
1029     }
1030
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)) {
1034         exit[i] = node;
1035       }
1036     }
1037   }
1038
1039   function selection_data(value, key) {
1040     if (!value) {
1041       data = new Array(this.size()), j = -1;
1042       this.each(function(d) { data[++j] = d; });
1043       return data;
1044     }
1045
1046     var bind = key ? bindKey : bindIndex,
1047         parents = this._parents,
1048         groups = this._groups;
1049
1050     if (typeof value !== "function") value = constant$1(value);
1051
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],
1054           group = groups[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);
1061
1062       bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
1063
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;
1072         }
1073       }
1074     }
1075
1076     update = new Selection(update, parents);
1077     update._enter = enter;
1078     update._exit = exit;
1079     return update;
1080   }
1081
1082   function selection_exit() {
1083     return new Selection(this._exit || this._groups.map(sparse), this._parents);
1084   }
1085
1086   function selection_merge(selection$$1) {
1087
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]) {
1091           merge[i] = node;
1092         }
1093       }
1094     }
1095
1096     for (; j < m0; ++j) {
1097       merges[j] = groups0[j];
1098     }
1099
1100     return new Selection(merges, this._parents);
1101   }
1102
1103   function selection_order() {
1104
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);
1109           next = node;
1110         }
1111       }
1112     }
1113
1114     return this;
1115   }
1116
1117   function selection_sort(compare) {
1118     if (!compare) compare = ascending$1;
1119
1120     function compareNode(a, b) {
1121       return a && b ? compare(a.__data__, b.__data__) : !a - !b;
1122     }
1123
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;
1128         }
1129       }
1130       sortgroup.sort(compareNode);
1131     }
1132
1133     return new Selection(sortgroups, this._parents).order();
1134   }
1135
1136   function ascending$1(a, b) {
1137     return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
1138   }
1139
1140   function selection_call() {
1141     var callback = arguments[0];
1142     arguments[0] = this;
1143     callback.apply(null, arguments);
1144     return this;
1145   }
1146
1147   function selection_nodes() {
1148     var nodes = new Array(this.size()), i = -1;
1149     this.each(function() { nodes[++i] = this; });
1150     return nodes;
1151   }
1152
1153   function selection_node() {
1154
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;
1159       }
1160     }
1161
1162     return null;
1163   }
1164
1165   function selection_size() {
1166     var size = 0;
1167     this.each(function() { ++size; });
1168     return size;
1169   }
1170
1171   function selection_empty() {
1172     return !this.node();
1173   }
1174
1175   function selection_each(callback) {
1176
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);
1180       }
1181     }
1182
1183     return this;
1184   }
1185
1186   function attrRemove(name) {
1187     return function() {
1188       this.removeAttribute(name);
1189     };
1190   }
1191
1192   function attrRemoveNS(fullname) {
1193     return function() {
1194       this.removeAttributeNS(fullname.space, fullname.local);
1195     };
1196   }
1197
1198   function attrConstant(name, value) {
1199     return function() {
1200       this.setAttribute(name, value);
1201     };
1202   }
1203
1204   function attrConstantNS(fullname, value) {
1205     return function() {
1206       this.setAttributeNS(fullname.space, fullname.local, value);
1207     };
1208   }
1209
1210   function attrFunction(name, value) {
1211     return function() {
1212       var v = value.apply(this, arguments);
1213       if (v == null) this.removeAttribute(name);
1214       else this.setAttribute(name, v);
1215     };
1216   }
1217
1218   function attrFunctionNS(fullname, value) {
1219     return function() {
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);
1223     };
1224   }
1225
1226   function selection_attr(name, value) {
1227     var fullname = namespace(name);
1228
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);
1234     }
1235
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));
1240   }
1241
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
1246   }
1247
1248   function styleRemove(name) {
1249     return function() {
1250       this.style.removeProperty(name);
1251     };
1252   }
1253
1254   function styleConstant(name, value, priority) {
1255     return function() {
1256       this.style.setProperty(name, value, priority);
1257     };
1258   }
1259
1260   function styleFunction(name, value, priority) {
1261     return function() {
1262       var v = value.apply(this, arguments);
1263       if (v == null) this.style.removeProperty(name);
1264       else this.style.setProperty(name, v, priority);
1265     };
1266   }
1267
1268   function selection_style(name, value, priority) {
1269     return arguments.length > 1
1270         ? this.each((value == null
1271               ? styleRemove : typeof value === "function"
1272               ? styleFunction
1273               : styleConstant)(name, value, priority == null ? "" : priority))
1274         : styleValue(this.node(), name);
1275   }
1276
1277   function styleValue(node, name) {
1278     return node.style.getPropertyValue(name)
1279         || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
1280   }
1281
1282   function propertyRemove(name) {
1283     return function() {
1284       delete this[name];
1285     };
1286   }
1287
1288   function propertyConstant(name, value) {
1289     return function() {
1290       this[name] = value;
1291     };
1292   }
1293
1294   function propertyFunction(name, value) {
1295     return function() {
1296       var v = value.apply(this, arguments);
1297       if (v == null) delete this[name];
1298       else this[name] = v;
1299     };
1300   }
1301
1302   function selection_property(name, value) {
1303     return arguments.length > 1
1304         ? this.each((value == null
1305             ? propertyRemove : typeof value === "function"
1306             ? propertyFunction
1307             : propertyConstant)(name, value))
1308         : this.node()[name];
1309   }
1310
1311   function classArray(string) {
1312     return string.trim().split(/^|\s+/);
1313   }
1314
1315   function classList(node) {
1316     return node.classList || new ClassList(node);
1317   }
1318
1319   function ClassList(node) {
1320     this._node = node;
1321     this._names = classArray(node.getAttribute("class") || "");
1322   }
1323
1324   ClassList.prototype = {
1325     add: function(name) {
1326       var i = this._names.indexOf(name);
1327       if (i < 0) {
1328         this._names.push(name);
1329         this._node.setAttribute("class", this._names.join(" "));
1330       }
1331     },
1332     remove: function(name) {
1333       var i = this._names.indexOf(name);
1334       if (i >= 0) {
1335         this._names.splice(i, 1);
1336         this._node.setAttribute("class", this._names.join(" "));
1337       }
1338     },
1339     contains: function(name) {
1340       return this._names.indexOf(name) >= 0;
1341     }
1342   };
1343
1344   function classedAdd(node, names) {
1345     var list = classList(node), i = -1, n = names.length;
1346     while (++i < n) list.add(names[i]);
1347   }
1348
1349   function classedRemove(node, names) {
1350     var list = classList(node), i = -1, n = names.length;
1351     while (++i < n) list.remove(names[i]);
1352   }
1353
1354   function classedTrue(names) {
1355     return function() {
1356       classedAdd(this, names);
1357     };
1358   }
1359
1360   function classedFalse(names) {
1361     return function() {
1362       classedRemove(this, names);
1363     };
1364   }
1365
1366   function classedFunction(names, value) {
1367     return function() {
1368       (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
1369     };
1370   }
1371
1372   function selection_classed(name, value) {
1373     var names = classArray(name + "");
1374
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;
1378       return true;
1379     }
1380
1381     return this.each((typeof value === "function"
1382         ? classedFunction : value
1383         ? classedTrue
1384         : classedFalse)(names, value));
1385   }
1386
1387   function textRemove() {
1388     this.textContent = "";
1389   }
1390
1391   function textConstant(value) {
1392     return function() {
1393       this.textContent = value;
1394     };
1395   }
1396
1397   function textFunction(value) {
1398     return function() {
1399       var v = value.apply(this, arguments);
1400       this.textContent = v == null ? "" : v;
1401     };
1402   }
1403
1404   function selection_text(value) {
1405     return arguments.length
1406         ? this.each(value == null
1407             ? textRemove : (typeof value === "function"
1408             ? textFunction
1409             : textConstant)(value))
1410         : this.node().textContent;
1411   }
1412
1413   function htmlRemove() {
1414     this.innerHTML = "";
1415   }
1416
1417   function htmlConstant(value) {
1418     return function() {
1419       this.innerHTML = value;
1420     };
1421   }
1422
1423   function htmlFunction(value) {
1424     return function() {
1425       var v = value.apply(this, arguments);
1426       this.innerHTML = v == null ? "" : v;
1427     };
1428   }
1429
1430   function selection_html(value) {
1431     return arguments.length
1432         ? this.each(value == null
1433             ? htmlRemove : (typeof value === "function"
1434             ? htmlFunction
1435             : htmlConstant)(value))
1436         : this.node().innerHTML;
1437   }
1438
1439   function raise() {
1440     if (this.nextSibling) this.parentNode.appendChild(this);
1441   }
1442
1443   function selection_raise() {
1444     return this.each(raise);
1445   }
1446
1447   function lower() {
1448     if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
1449   }
1450
1451   function selection_lower() {
1452     return this.each(lower);
1453   }
1454
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));
1459     });
1460   }
1461
1462   function constantNull() {
1463     return null;
1464   }
1465
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);
1471     });
1472   }
1473
1474   function remove() {
1475     var parent = this.parentNode;
1476     if (parent) parent.removeChild(this);
1477   }
1478
1479   function selection_remove() {
1480     return this.each(remove);
1481   }
1482
1483   function selection_cloneShallow() {
1484     return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
1485   }
1486
1487   function selection_cloneDeep() {
1488     return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
1489   }
1490
1491   function selection_clone(deep) {
1492     return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
1493   }
1494
1495   function selection_datum(value) {
1496     return arguments.length
1497         ? this.property("__data__", value)
1498         : this.node().__data__;
1499   }
1500
1501   var filterEvents = {};
1502
1503   var event = null;
1504
1505   if (typeof document !== "undefined") {
1506     var element$1 = document.documentElement;
1507     if (!("onmouseenter" in element$1)) {
1508       filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
1509     }
1510   }
1511
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);
1518       }
1519     };
1520   }
1521
1522   function contextListener(listener, index, group) {
1523     return function(event1) {
1524       var event0 = event; // Events can be reentrant (e.g., focus).
1525       event = event1;
1526       try {
1527         listener.call(this, this.__data__, index, group);
1528       } finally {
1529         event = event0;
1530       }
1531     };
1532   }
1533
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};
1539     });
1540   }
1541
1542   function onRemove(typename) {
1543     return function() {
1544       var on = this.__on;
1545       if (!on) return;
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);
1549         } else {
1550           on[++i] = o;
1551         }
1552       }
1553       if (++i) on.length = i;
1554       else delete this.__on;
1555     };
1556   }
1557
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);
1566           o.value = value;
1567           return;
1568         }
1569       }
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];
1573       else on.push(o);
1574     };
1575   }
1576
1577   function selection_on(typename, value, capture) {
1578     var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
1579
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) {
1585             return o.value;
1586           }
1587         }
1588       }
1589       return;
1590     }
1591
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));
1595     return this;
1596   }
1597
1598   function customEvent(event1, listener, that, args) {
1599     var event0 = event;
1600     event1.sourceEvent = event;
1601     event = event1;
1602     try {
1603       return listener.apply(that, args);
1604     } finally {
1605       event = event0;
1606     }
1607   }
1608
1609   function dispatchEvent(node, type, params) {
1610     var window = defaultView(node),
1611         event = window.CustomEvent;
1612
1613     if (typeof event === "function") {
1614       event = new event(type, params);
1615     } else {
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);
1619     }
1620
1621     node.dispatchEvent(event);
1622   }
1623
1624   function dispatchConstant(type, params) {
1625     return function() {
1626       return dispatchEvent(this, type, params);
1627     };
1628   }
1629
1630   function dispatchFunction(type, params) {
1631     return function() {
1632       return dispatchEvent(this, type, params.apply(this, arguments));
1633     };
1634   }
1635
1636   function selection_dispatch(type, params) {
1637     return this.each((typeof params === "function"
1638         ? dispatchFunction
1639         : dispatchConstant)(type, params));
1640   }
1641
1642   var root = [null];
1643
1644   function Selection(groups, parents) {
1645     this._groups = groups;
1646     this._parents = parents;
1647   }
1648
1649   function selection() {
1650     return new Selection([[document.documentElement]], root);
1651   }
1652
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,
1683     on: selection_on,
1684     dispatch: selection_dispatch
1685   };
1686
1687   function select(selector) {
1688     return typeof selector === "string"
1689         ? new Selection([[document.querySelector(selector)]], [document.documentElement])
1690         : new Selection([[selector]], root);
1691   }
1692
1693   function create(name) {
1694     return select(creator(name).call(document.documentElement));
1695   }
1696
1697   var nextId = 0;
1698
1699   function local() {
1700     return new Local;
1701   }
1702
1703   function Local() {
1704     this._ = "@" + (++nextId).toString(36);
1705   }
1706
1707   Local.prototype = local.prototype = {
1708     constructor: Local,
1709     get: function(node) {
1710       var id = this._;
1711       while (!(id in node)) if (!(node = node.parentNode)) return;
1712       return node[id];
1713     },
1714     set: function(node, value) {
1715       return node[this._] = value;
1716     },
1717     remove: function(node) {
1718       return this._ in node && delete node[this._];
1719     },
1720     toString: function() {
1721       return this._;
1722     }
1723   };
1724
1725   function sourceEvent() {
1726     var current = event, source;
1727     while (source = current.sourceEvent) current = source;
1728     return current;
1729   }
1730
1731   function point(node, event) {
1732     var svg = node.ownerSVGElement || node;
1733
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];
1739     }
1740
1741     var rect = node.getBoundingClientRect();
1742     return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
1743   }
1744
1745   function mouse(node) {
1746     var event = sourceEvent();
1747     if (event.changedTouches) event = event.changedTouches[0];
1748     return point(node, event);
1749   }
1750
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);
1755   }
1756
1757   function touch(node, touches, identifier) {
1758     if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
1759
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);
1763       }
1764     }
1765
1766     return null;
1767   }
1768
1769   function d3_touches(node, touches) {
1770     if (touches == null) touches = sourceEvent().touches;
1771
1772     for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
1773       points[i] = point(node, touches[i]);
1774     }
1775
1776     return points;
1777   }
1778
1779   function nopropagation() {
1780     event.stopImmediatePropagation();
1781   }
1782
1783   function noevent() {
1784     event.preventDefault();
1785     event.stopImmediatePropagation();
1786   }
1787
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);
1793     } else {
1794       root.__noselect = root.style.MozUserSelect;
1795       root.style.MozUserSelect = "none";
1796     }
1797   }
1798
1799   function yesdrag(view, noclick) {
1800     var root = view.document.documentElement,
1801         selection$$1 = select(view).on("dragstart.drag", null);
1802     if (noclick) {
1803       selection$$1.on("click.drag", noevent, true);
1804       setTimeout(function() { selection$$1.on("click.drag", null); }, 0);
1805     }
1806     if ("onselectstart" in root) {
1807       selection$$1.on("selectstart.drag", null);
1808     } else {
1809       root.style.MozUserSelect = root.__noselect;
1810       delete root.__noselect;
1811     }
1812   }
1813
1814   function constant$2(x) {
1815     return function() {
1816       return x;
1817     };
1818   }
1819
1820   function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
1821     this.target = target;
1822     this.type = type;
1823     this.subject = subject;
1824     this.identifier = id;
1825     this.active = active;
1826     this.x = x;
1827     this.y = y;
1828     this.dx = dx;
1829     this.dy = dy;
1830     this._ = dispatch;
1831   }
1832
1833   DragEvent.prototype.on = function() {
1834     var value = this._.on.apply(this._, arguments);
1835     return value === this._ ? this : value;
1836   };
1837
1838   // Ignore right-click, since that should open the context menu.
1839   function defaultFilter() {
1840     return !event.button;
1841   }
1842
1843   function defaultContainer() {
1844     return this.parentNode;
1845   }
1846
1847   function defaultSubject(d) {
1848     return d == null ? {x: event.x, y: event.y} : d;
1849   }
1850
1851   function defaultTouchable() {
1852     return "ontouchstart" in this;
1853   }
1854
1855   function drag() {
1856     var filter = defaultFilter,
1857         container = defaultContainer,
1858         subject = defaultSubject,
1859         touchable = defaultTouchable,
1860         gestures = {},
1861         listeners = dispatch("start", "drag", "end"),
1862         active = 0,
1863         mousedownx,
1864         mousedowny,
1865         mousemoving,
1866         touchending,
1867         clickDistance2 = 0;
1868
1869     function drag(selection$$1) {
1870       selection$$1
1871           .on("mousedown.drag", mousedowned)
1872         .filter(touchable)
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)");
1878     }
1879
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);
1885       nodrag(event.view);
1886       nopropagation();
1887       mousemoving = false;
1888       mousedownx = event.clientX;
1889       mousedowny = event.clientY;
1890       gesture("start");
1891     }
1892
1893     function mousemoved() {
1894       noevent();
1895       if (!mousemoving) {
1896         var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
1897         mousemoving = dx * dx + dy * dy > clickDistance2;
1898       }
1899       gestures.mouse("drag");
1900     }
1901
1902     function mouseupped() {
1903       select(event.view).on("mousemove.drag mouseup.drag", null);
1904       yesdrag(event.view, mousemoving);
1905       noevent();
1906       gestures.mouse("end");
1907     }
1908
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;
1914
1915       for (i = 0; i < n; ++i) {
1916         if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
1917           nopropagation();
1918           gesture("start");
1919         }
1920       }
1921     }
1922
1923     function touchmoved() {
1924       var touches = event.changedTouches,
1925           n = touches.length, i, gesture;
1926
1927       for (i = 0; i < n; ++i) {
1928         if (gesture = gestures[touches[i].identifier]) {
1929           noevent();
1930           gesture("drag");
1931         }
1932       }
1933     }
1934
1935     function touchended() {
1936       var touches = event.changedTouches,
1937           n = touches.length, i, gesture;
1938
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]) {
1943           nopropagation();
1944           gesture("end");
1945         }
1946       }
1947     }
1948
1949     function beforestart(id, container, point$$1, that, args) {
1950       var p = point$$1(container, id), s, dx, dy,
1951           sublisteners = listeners.copy();
1952
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;
1957         return true;
1958       })) return;
1959
1960       return function gesture(type) {
1961         var p0 = p, n;
1962         switch (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;
1966         }
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]);
1968       };
1969     }
1970
1971     drag.filter = function(_) {
1972       return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
1973     };
1974
1975     drag.container = function(_) {
1976       return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
1977     };
1978
1979     drag.subject = function(_) {
1980       return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
1981     };
1982
1983     drag.touchable = function(_) {
1984       return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
1985     };
1986
1987     drag.on = function() {
1988       var value = listeners.on.apply(listeners, arguments);
1989       return value === listeners ? drag : value;
1990     };
1991
1992     drag.clickDistance = function(_) {
1993       return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
1994     };
1995
1996     return drag;
1997   }
1998
1999   function define(constructor, factory, prototype) {
2000     constructor.prototype = factory.prototype = prototype;
2001     prototype.constructor = constructor;
2002   }
2003
2004   function extend(parent, definition) {
2005     var prototype = Object.create(parent.prototype);
2006     for (var key in definition) prototype[key] = definition[key];
2007     return prototype;
2008   }
2009
2010   function Color() {}
2011
2012   var darker = 0.7;
2013   var brighter = 1 / darker;
2014
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] + "\\)$");
2026
2027   var named = {
2028     aliceblue: 0xf0f8ff,
2029     antiquewhite: 0xfaebd7,
2030     aqua: 0x00ffff,
2031     aquamarine: 0x7fffd4,
2032     azure: 0xf0ffff,
2033     beige: 0xf5f5dc,
2034     bisque: 0xffe4c4,
2035     black: 0x000000,
2036     blanchedalmond: 0xffebcd,
2037     blue: 0x0000ff,
2038     blueviolet: 0x8a2be2,
2039     brown: 0xa52a2a,
2040     burlywood: 0xdeb887,
2041     cadetblue: 0x5f9ea0,
2042     chartreuse: 0x7fff00,
2043     chocolate: 0xd2691e,
2044     coral: 0xff7f50,
2045     cornflowerblue: 0x6495ed,
2046     cornsilk: 0xfff8dc,
2047     crimson: 0xdc143c,
2048     cyan: 0x00ffff,
2049     darkblue: 0x00008b,
2050     darkcyan: 0x008b8b,
2051     darkgoldenrod: 0xb8860b,
2052     darkgray: 0xa9a9a9,
2053     darkgreen: 0x006400,
2054     darkgrey: 0xa9a9a9,
2055     darkkhaki: 0xbdb76b,
2056     darkmagenta: 0x8b008b,
2057     darkolivegreen: 0x556b2f,
2058     darkorange: 0xff8c00,
2059     darkorchid: 0x9932cc,
2060     darkred: 0x8b0000,
2061     darksalmon: 0xe9967a,
2062     darkseagreen: 0x8fbc8f,
2063     darkslateblue: 0x483d8b,
2064     darkslategray: 0x2f4f4f,
2065     darkslategrey: 0x2f4f4f,
2066     darkturquoise: 0x00ced1,
2067     darkviolet: 0x9400d3,
2068     deeppink: 0xff1493,
2069     deepskyblue: 0x00bfff,
2070     dimgray: 0x696969,
2071     dimgrey: 0x696969,
2072     dodgerblue: 0x1e90ff,
2073     firebrick: 0xb22222,
2074     floralwhite: 0xfffaf0,
2075     forestgreen: 0x228b22,
2076     fuchsia: 0xff00ff,
2077     gainsboro: 0xdcdcdc,
2078     ghostwhite: 0xf8f8ff,
2079     gold: 0xffd700,
2080     goldenrod: 0xdaa520,
2081     gray: 0x808080,
2082     green: 0x008000,
2083     greenyellow: 0xadff2f,
2084     grey: 0x808080,
2085     honeydew: 0xf0fff0,
2086     hotpink: 0xff69b4,
2087     indianred: 0xcd5c5c,
2088     indigo: 0x4b0082,
2089     ivory: 0xfffff0,
2090     khaki: 0xf0e68c,
2091     lavender: 0xe6e6fa,
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,
2110     lime: 0x00ff00,
2111     limegreen: 0x32cd32,
2112     linen: 0xfaf0e6,
2113     magenta: 0xff00ff,
2114     maroon: 0x800000,
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,
2127     moccasin: 0xffe4b5,
2128     navajowhite: 0xffdead,
2129     navy: 0x000080,
2130     oldlace: 0xfdf5e6,
2131     olive: 0x808000,
2132     olivedrab: 0x6b8e23,
2133     orange: 0xffa500,
2134     orangered: 0xff4500,
2135     orchid: 0xda70d6,
2136     palegoldenrod: 0xeee8aa,
2137     palegreen: 0x98fb98,
2138     paleturquoise: 0xafeeee,
2139     palevioletred: 0xdb7093,
2140     papayawhip: 0xffefd5,
2141     peachpuff: 0xffdab9,
2142     peru: 0xcd853f,
2143     pink: 0xffc0cb,
2144     plum: 0xdda0dd,
2145     powderblue: 0xb0e0e6,
2146     purple: 0x800080,
2147     rebeccapurple: 0x663399,
2148     red: 0xff0000,
2149     rosybrown: 0xbc8f8f,
2150     royalblue: 0x4169e1,
2151     saddlebrown: 0x8b4513,
2152     salmon: 0xfa8072,
2153     sandybrown: 0xf4a460,
2154     seagreen: 0x2e8b57,
2155     seashell: 0xfff5ee,
2156     sienna: 0xa0522d,
2157     silver: 0xc0c0c0,
2158     skyblue: 0x87ceeb,
2159     slateblue: 0x6a5acd,
2160     slategray: 0x708090,
2161     slategrey: 0x708090,
2162     snow: 0xfffafa,
2163     springgreen: 0x00ff7f,
2164     steelblue: 0x4682b4,
2165     tan: 0xd2b48c,
2166     teal: 0x008080,
2167     thistle: 0xd8bfd8,
2168     tomato: 0xff6347,
2169     turquoise: 0x40e0d0,
2170     violet: 0xee82ee,
2171     wheat: 0xf5deb3,
2172     white: 0xffffff,
2173     whitesmoke: 0xf5f5f5,
2174     yellow: 0xffff00,
2175     yellowgreen: 0x9acd32
2176   };
2177
2178   define(Color, color, {
2179     displayable: function() {
2180       return this.rgb().displayable();
2181     },
2182     toString: function() {
2183       return this.rgb() + "";
2184     }
2185   });
2186
2187   function color(format) {
2188     var m;
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)
2200         : null;
2201   }
2202
2203   function rgbn(n) {
2204     return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
2205   }
2206
2207   function rgba(r, g, b, a) {
2208     if (a <= 0) r = g = b = NaN;
2209     return new Rgb(r, g, b, a);
2210   }
2211
2212   function rgbConvert(o) {
2213     if (!(o instanceof Color)) o = color(o);
2214     if (!o) return new Rgb;
2215     o = o.rgb();
2216     return new Rgb(o.r, o.g, o.b, o.opacity);
2217   }
2218
2219   function rgb(r, g, b, opacity) {
2220     return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
2221   }
2222
2223   function Rgb(r, g, b, opacity) {
2224     this.r = +r;
2225     this.g = +g;
2226     this.b = +b;
2227     this.opacity = +opacity;
2228   }
2229
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);
2234     },
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);
2238     },
2239     rgb: function() {
2240       return this;
2241     },
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);
2247     },
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 + ")");
2255     }
2256   }));
2257
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);
2263   }
2264
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;
2270     o = o.rgb();
2271     var r = o.r / 255,
2272         g = o.g / 255,
2273         b = o.b / 255,
2274         min = Math.min(r, g, b),
2275         max = Math.max(r, g, b),
2276         h = NaN,
2277         s = max - min,
2278         l = (max + min) / 2;
2279     if (s) {
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;
2284       h *= 60;
2285     } else {
2286       s = l > 0 && l < 1 ? 0 : h;
2287     }
2288     return new Hsl(h, s, l, o.opacity);
2289   }
2290
2291   function hsl(h, s, l, opacity) {
2292     return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
2293   }
2294
2295   function Hsl(h, s, l, opacity) {
2296     this.h = +h;
2297     this.s = +s;
2298     this.l = +l;
2299     this.opacity = +opacity;
2300   }
2301
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);
2306     },
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);
2310     },
2311     rgb: function() {
2312       var h = this.h % 360 + (this.h < 0) * 360,
2313           s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
2314           l = this.l,
2315           m2 = l + (l < 0.5 ? l : 1 - l) * s,
2316           m1 = 2 * l - m2;
2317       return new Rgb(
2318         hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
2319         hsl2rgb(h, m1, m2),
2320         hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
2321         this.opacity
2322       );
2323     },
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);
2328     }
2329   }));
2330
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
2334         : h < 180 ? m2
2335         : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
2336         : m1) * 255;
2337   }
2338
2339   var deg2rad = Math.PI / 180;
2340   var rad2deg = 180 / Math.PI;
2341
2342   var Kn = 18,
2343       Xn = 0.950470, // D65 standard referent
2344       Yn = 1,
2345       Zn = 1.088830,
2346       t0 = 4 / 29,
2347       t1 = 6 / 29,
2348       t2 = 3 * t1 * t1,
2349       t3 = t1 * t1 * t1;
2350
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);
2356     }
2357     if (!(o instanceof Rgb)) o = rgbConvert(o);
2358     var b = rgb2xyz(o.r),
2359         a = rgb2xyz(o.g),
2360         l = rgb2xyz(o.b),
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);
2365   }
2366
2367   function lab(l, a, b, opacity) {
2368     return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
2369   }
2370
2371   function Lab(l, a, b, opacity) {
2372     this.l = +l;
2373     this.a = +a;
2374     this.b = +b;
2375     this.opacity = +opacity;
2376   }
2377
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);
2381     },
2382     darker: function(k) {
2383       return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2384     },
2385     rgb: function() {
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);
2392       return new Rgb(
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),
2396         this.opacity
2397       );
2398     }
2399   }));
2400
2401   function xyz2lab(t) {
2402     return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
2403   }
2404
2405   function lab2xyz(t) {
2406     return t > t1 ? t * t * t : t2 * (t - t0);
2407   }
2408
2409   function xyz2rgb(x) {
2410     return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
2411   }
2412
2413   function rgb2xyz(x) {
2414     return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
2415   }
2416
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);
2422   }
2423
2424   function hcl(h, c, l, opacity) {
2425     return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
2426   }
2427
2428   function Hcl(h, c, l, opacity) {
2429     this.h = +h;
2430     this.c = +c;
2431     this.l = +l;
2432     this.opacity = +opacity;
2433   }
2434
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);
2438     },
2439     darker: function(k) {
2440       return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity);
2441     },
2442     rgb: function() {
2443       return labConvert(this).rgb();
2444     }
2445   }));
2446
2447   var A = -0.14861,
2448       B = +1.78277,
2449       C = -0.29227,
2450       D = -0.90649,
2451       E = +1.97294,
2452       ED = E * D,
2453       EB = E * B,
2454       BC_DA = B * C - D * A;
2455
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);
2459     var r = o.r / 255,
2460         g = o.g / 255,
2461         b = o.b / 255,
2462         l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
2463         bl = b - l,
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);
2468   }
2469
2470   function cubehelix(h, s, l, opacity) {
2471     return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
2472   }
2473
2474   function Cubehelix(h, s, l, opacity) {
2475     this.h = +h;
2476     this.s = +s;
2477     this.l = +l;
2478     this.opacity = +opacity;
2479   }
2480
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);
2485     },
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);
2489     },
2490     rgb: function() {
2491       var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
2492           l = +this.l,
2493           a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
2494           cosh = Math.cos(h),
2495           sinh = Math.sin(h);
2496       return new Rgb(
2497         255 * (l + a * (A * cosh + B * sinh)),
2498         255 * (l + a * (C * cosh + D * sinh)),
2499         255 * (l + a * (E * cosh)),
2500         this.opacity
2501       );
2502     }
2503   }));
2504
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
2510         + t3 * v3) / 6;
2511   }
2512
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),
2517           v1 = values[i],
2518           v2 = values[i + 1],
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);
2522     };
2523   }
2524
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],
2530           v1 = values[i % n],
2531           v2 = values[(i + 1) % n],
2532           v3 = values[(i + 2) % n];
2533       return basis((t - i / n) * n, v0, v1, v2, v3);
2534     };
2535   }
2536
2537   function constant$3(x) {
2538     return function() {
2539       return x;
2540     };
2541   }
2542
2543   function linear(a, d) {
2544     return function(t) {
2545       return a + t * d;
2546     };
2547   }
2548
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);
2552     };
2553   }
2554
2555   function hue(a, b) {
2556     var d = b - a;
2557     return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
2558   }
2559
2560   function gamma(y) {
2561     return (y = +y) === 1 ? nogamma : function(a, b) {
2562       return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a);
2563     };
2564   }
2565
2566   function nogamma(a, b) {
2567     var d = b - a;
2568     return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
2569   }
2570
2571   var interpolateRgb = (function rgbGamma(y) {
2572     var color$$1 = gamma(y);
2573
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) {
2580         start.r = r(t);
2581         start.g = g(t);
2582         start.b = b(t);
2583         start.opacity = opacity(t);
2584         return start + "";
2585       };
2586     }
2587
2588     rgb$$1.gamma = rgbGamma;
2589
2590     return rgb$$1;
2591   })(1);
2592
2593   function rgbSpline(spline) {
2594     return function(colors) {
2595       var n = colors.length,
2596           r = new Array(n),
2597           g = new Array(n),
2598           b = new Array(n),
2599           i, color$$1;
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;
2605       }
2606       r = spline(r);
2607       g = spline(g);
2608       b = spline(b);
2609       color$$1.opacity = 1;
2610       return function(t) {
2611         color$$1.r = r(t);
2612         color$$1.g = g(t);
2613         color$$1.b = b(t);
2614         return color$$1 + "";
2615       };
2616     };
2617   }
2618
2619   var rgbBasis = rgbSpline(basis$1);
2620   var rgbBasisClosed = rgbSpline(basisClosed);
2621
2622   function array$1(a, b) {
2623     var nb = b ? b.length : 0,
2624         na = a ? Math.min(nb, a.length) : 0,
2625         x = new Array(na),
2626         c = new Array(nb),
2627         i;
2628
2629     for (i = 0; i < na; ++i) x[i] = interpolate(a[i], b[i]);
2630     for (; i < nb; ++i) c[i] = b[i];
2631
2632     return function(t) {
2633       for (i = 0; i < na; ++i) c[i] = x[i](t);
2634       return c;
2635     };
2636   }
2637
2638   function date(a, b) {
2639     var d = new Date;
2640     return a = +a, b -= a, function(t) {
2641       return d.setTime(a + b * t), d;
2642     };
2643   }
2644
2645   function interpolateNumber(a, b) {
2646     return a = +a, b -= a, function(t) {
2647       return a + b * t;
2648     };
2649   }
2650
2651   function object(a, b) {
2652     var i = {},
2653         c = {},
2654         k;
2655
2656     if (a === null || typeof a !== "object") a = {};
2657     if (b === null || typeof b !== "object") b = {};
2658
2659     for (k in b) {
2660       if (k in a) {
2661         i[k] = interpolate(a[k], b[k]);
2662       } else {
2663         c[k] = b[k];
2664       }
2665     }
2666
2667     return function(t) {
2668       for (k in i) c[k] = i[k](t);
2669       return c;
2670     };
2671   }
2672
2673   var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
2674       reB = new RegExp(reA.source, "g");
2675
2676   function zero(b) {
2677     return function() {
2678       return b;
2679     };
2680   }
2681
2682   function one(b) {
2683     return function(t) {
2684       return b(t) + "";
2685     };
2686   }
2687
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
2696
2697     // Coerce inputs to strings.
2698     a = a + "", b = b + "";
2699
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
2706         else s[++i] = bs;
2707       }
2708       if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
2709         if (s[i]) s[i] += bm; // coalesce with previous string
2710         else s[++i] = bm;
2711       } else { // interpolate non-matching numbers
2712         s[++i] = null;
2713         q.push({i: i, x: interpolateNumber(am, bm)});
2714       }
2715       bi = reB.lastIndex;
2716     }
2717
2718     // Add remains of b.
2719     if (bi < b.length) {
2720       bs = b.slice(bi);
2721       if (s[i]) s[i] += bs; // coalesce with previous string
2722       else s[++i] = bs;
2723     }
2724
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]
2728         ? one(q[0].x)
2729         : zero(b))
2730         : (b = q.length, function(t) {
2731             for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
2732             return s.join("");
2733           });
2734   }
2735
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);
2746   }
2747
2748   function interpolateRound(a, b) {
2749     return a = +a, b -= a, function(t) {
2750       return Math.round(a + b * t);
2751     };
2752   }
2753
2754   var degrees = 180 / Math.PI;
2755
2756   var identity$2 = {
2757     translateX: 0,
2758     translateY: 0,
2759     rotate: 0,
2760     skewX: 0,
2761     scaleX: 1,
2762     scaleY: 1
2763   };
2764
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;
2771     return {
2772       translateX: e,
2773       translateY: f,
2774       rotate: Math.atan2(b, a) * degrees,
2775       skewX: Math.atan(skewX) * degrees,
2776       scaleX: scaleX,
2777       scaleY: scaleY
2778     };
2779   }
2780
2781   var cssNode,
2782       cssRoot,
2783       cssView,
2784       svgNode;
2785
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]);
2794   }
2795
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);
2803   }
2804
2805   function interpolateTransform(parse, pxComma, pxParen, degParen) {
2806
2807     function pop(s) {
2808       return s.length ? s.pop() + " " : "";
2809     }
2810
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);
2817       }
2818     }
2819
2820     function rotate(a, b, s, q) {
2821       if (a !== b) {
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)});
2824       } else if (b) {
2825         s.push(pop(s) + "rotate(" + b + degParen);
2826       }
2827     }
2828
2829     function skewX(a, b, s, q) {
2830       if (a !== b) {
2831         q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: interpolateNumber(a, b)});
2832       } else if (b) {
2833         s.push(pop(s) + "skewX(" + b + degParen);
2834       }
2835     }
2836
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 + ")");
2843       }
2844     }
2845
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);
2854       a = b = null; // gc
2855       return function(t) {
2856         var i = -1, n = q.length, o;
2857         while (++i < n) s[(o = q[i]).i] = o.x(t);
2858         return s.join("");
2859       };
2860     };
2861   }
2862
2863   var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
2864   var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
2865
2866   var rho = Math.SQRT2,
2867       rho2 = 2,
2868       rho4 = 4,
2869       epsilon2 = 1e-12;
2870
2871   function cosh(x) {
2872     return ((x = Math.exp(x)) + 1 / x) / 2;
2873   }
2874
2875   function sinh(x) {
2876     return ((x = Math.exp(x)) - 1 / x) / 2;
2877   }
2878
2879   function tanh(x) {
2880     return ((x = Math.exp(2 * x)) - 1) / (x + 1);
2881   }
2882
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],
2888         dx = ux1 - ux0,
2889         dy = uy1 - uy0,
2890         d2 = dx * dx + dy * dy,
2891         i,
2892         S;
2893
2894     // Special case for u0 ≅ u1.
2895     if (d2 < epsilon2) {
2896       S = Math.log(w1 / w0) / rho;
2897       i = function(t) {
2898         return [
2899           ux0 + t * dx,
2900           uy0 + t * dy,
2901           w0 * Math.exp(rho * t * S)
2902         ];
2903       };
2904     }
2905
2906     // General case.
2907     else {
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;
2914       i = function(t) {
2915         var s = t * S,
2916             coshr0 = cosh(r0),
2917             u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
2918         return [
2919           ux0 + u * dx,
2920           uy0 + u * dy,
2921           w0 * coshr0 / cosh(rho * s + r0)
2922         ];
2923       };
2924     }
2925
2926     i.duration = S * 1000;
2927
2928     return i;
2929   }
2930
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) {
2938         start.h = h(t);
2939         start.s = s(t);
2940         start.l = l(t);
2941         start.opacity = opacity(t);
2942         return start + "";
2943       };
2944     }
2945   }
2946
2947   var hsl$2 = hsl$1(hue);
2948   var hslLong = hsl$1(nogamma);
2949
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) {
2956       start.l = l(t);
2957       start.a = a(t);
2958       start.b = b(t);
2959       start.opacity = opacity(t);
2960       return start + "";
2961     };
2962   }
2963
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) {
2971         start.h = h(t);
2972         start.c = c(t);
2973         start.l = l(t);
2974         start.opacity = opacity(t);
2975         return start + "";
2976       };
2977     }
2978   }
2979
2980   var hcl$2 = hcl$1(hue);
2981   var hclLong = hcl$1(nogamma);
2982
2983   function cubehelix$1(hue$$1) {
2984     return (function cubehelixGamma(y) {
2985       y = +y;
2986
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) {
2993           start.h = h(t);
2994           start.s = s(t);
2995           start.l = l(Math.pow(t, y));
2996           start.opacity = opacity(t);
2997           return start + "";
2998         };
2999       }
3000
3001       cubehelix$$1.gamma = cubehelixGamma;
3002
3003       return cubehelix$$1;
3004     })(1);
3005   }
3006
3007   var cubehelix$2 = cubehelix$1(hue);
3008   var cubehelixLong = cubehelix$1(nogamma);
3009
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));
3013     return samples;
3014   }
3015
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
3020       taskHead,
3021       taskTail,
3022       clockLast = 0,
3023       clockNow = 0,
3024       clockSkew = 0,
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); };
3027
3028   function now() {
3029     return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
3030   }
3031
3032   function clearNow() {
3033     clockNow = 0;
3034   }
3035
3036   function Timer() {
3037     this._call =
3038     this._time =
3039     this._next = null;
3040   }
3041
3042   Timer.prototype = timer.prototype = {
3043     constructor: Timer,
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;
3050         taskTail = this;
3051       }
3052       this._call = callback;
3053       this._time = time;
3054       sleep();
3055     },
3056     stop: function() {
3057       if (this._call) {
3058         this._call = null;
3059         this._time = Infinity;
3060         sleep();
3061       }
3062     }
3063   };
3064
3065   function timer(callback, delay, time) {
3066     var t = new Timer;
3067     t.restart(callback, delay, time);
3068     return t;
3069   }
3070
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;
3075     while (t) {
3076       if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
3077       t = t._next;
3078     }
3079     --frame;
3080   }
3081
3082   function wake() {
3083     clockNow = (clockLast = clock.now()) + clockSkew;
3084     frame = timeout = 0;
3085     try {
3086       timerFlush();
3087     } finally {
3088       frame = 0;
3089       nap();
3090       clockNow = 0;
3091     }
3092   }
3093
3094   function poke() {
3095     var now = clock.now(), delay = now - clockLast;
3096     if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
3097   }
3098
3099   function nap() {
3100     var t0, t1 = taskHead, t2, time = Infinity;
3101     while (t1) {
3102       if (t1._call) {
3103         if (time > t1._time) time = t1._time;
3104         t0 = t1, t1 = t1._next;
3105       } else {
3106         t2 = t1._next, t1._next = null;
3107         t1 = t0 ? t0._next = t2 : taskHead = t2;
3108       }
3109     }
3110     taskTail = t0;
3111     sleep(time);
3112   }
3113
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.
3118     if (delay > 24) {
3119       if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
3120       if (interval) interval = clearInterval(interval);
3121     } else {
3122       if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
3123       frame = 1, setFrame(wake);
3124     }
3125   }
3126
3127   function timeout$1(callback, delay, time) {
3128     var t = new Timer;
3129     delay = delay == null ? 0 : +delay;
3130     t.restart(function(elapsed) {
3131       t.stop();
3132       callback(elapsed + delay);
3133     }, delay, time);
3134     return t;
3135   }
3136
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) {
3142       elapsed += total;
3143       t.restart(tick, total += delay, time);
3144       callback(elapsed);
3145     }, delay, time);
3146     return t;
3147   }
3148
3149   var emptyOn = dispatch("start", "end", "interrupt");
3150   var emptyTween = [];
3151
3152   var CREATED = 0;
3153   var SCHEDULED = 1;
3154   var STARTING = 2;
3155   var STARTED = 3;
3156   var RUNNING = 4;
3157   var ENDING = 5;
3158   var ENDED = 6;
3159
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, {
3165       name: name,
3166       index: index, // For context during callback.
3167       group: group, // For context during callback.
3168       on: emptyOn,
3169       tween: emptyTween,
3170       time: timing.time,
3171       delay: timing.delay,
3172       duration: timing.duration,
3173       ease: timing.ease,
3174       timer: null,
3175       state: CREATED
3176     });
3177   }
3178
3179   function init(node, id) {
3180     var schedule = get$1(node, id);
3181     if (schedule.state > CREATED) throw new Error("too late; already scheduled");
3182     return schedule;
3183   }
3184
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");
3188     return schedule;
3189   }
3190
3191   function get$1(node, id) {
3192     var schedule = node.__transition;
3193     if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
3194     return schedule;
3195   }
3196
3197   function create$1(node, id, self) {
3198     var schedules = node.__transition,
3199         tween;
3200
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);
3205
3206     function schedule(elapsed) {
3207       self.state = SCHEDULED;
3208       self.timer.restart(start, self.delay, self.time);
3209
3210       // If the elapsed delay is less than our first sleep, start immediately.
3211       if (self.delay <= elapsed) start(elapsed - self.delay);
3212     }
3213
3214     function start(elapsed) {
3215       var i, j, n, o;
3216
3217       // If the state is not SCHEDULED, then we previously errored on start.
3218       if (self.state !== SCHEDULED) return stop();
3219
3220       for (i in schedules) {
3221         o = schedules[i];
3222         if (o.name !== self.name) continue;
3223
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);
3228
3229         // Interrupt the active transition, if any.
3230         // Dispatch the interrupt event.
3231         if (o.state === RUNNING) {
3232           o.state = ENDED;
3233           o.timer.stop();
3234           o.on.call("interrupt", node, node.__data__, o.index, o.group);
3235           delete schedules[i];
3236         }
3237
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!
3241         else if (+i < id) {
3242           o.state = ENDED;
3243           o.timer.stop();
3244           delete schedules[i];
3245         }
3246       }
3247
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);
3256           tick(elapsed);
3257         }
3258       });
3259
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;
3266
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)) {
3271           tween[++j] = o;
3272         }
3273       }
3274       tween.length = j + 1;
3275     }
3276
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),
3279           i = -1,
3280           n = tween.length;
3281
3282       while (++i < n) {
3283         tween[i].call(null, t);
3284       }
3285
3286       // Dispatch the end event.
3287       if (self.state === ENDING) {
3288         self.on.call("end", node, node.__data__, self.index, self.group);
3289         stop();
3290       }
3291     }
3292
3293     function stop() {
3294       self.state = ENDED;
3295       self.timer.stop();
3296       delete schedules[id];
3297       for (var i in schedules) return; // eslint-disable-line no-unused-vars
3298       delete node.__transition;
3299     }
3300   }
3301
3302   function interrupt(node, name) {
3303     var schedules = node.__transition,
3304         schedule$$1,
3305         active,
3306         empty = true,
3307         i;
3308
3309     if (!schedules) return;
3310
3311     name = name == null ? null : name + "";
3312
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];
3320     }
3321
3322     if (empty) delete node.__transition;
3323   }
3324
3325   function selection_interrupt(name) {
3326     return this.each(function() {
3327       interrupt(this, name);
3328     });
3329   }
3330
3331   function tweenRemove(id, name) {
3332     var tween0, tween1;
3333     return function() {
3334       var schedule$$1 = set$1(this, id),
3335           tween = schedule$$1.tween;
3336
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);
3346             break;
3347           }
3348         }
3349       }
3350
3351       schedule$$1.tween = tween1;
3352     };
3353   }
3354
3355   function tweenFunction(id, name, value) {
3356     var tween0, tween1;
3357     if (typeof value !== "function") throw new Error;
3358     return function() {
3359       var schedule$$1 = set$1(this, id),
3360           tween = schedule$$1.tween;
3361
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) {
3369             tween1[i] = t;
3370             break;
3371           }
3372         }
3373         if (i === n) tween1.push(t);
3374       }
3375
3376       schedule$$1.tween = tween1;
3377     };
3378   }
3379
3380   function transition_tween(name, value) {
3381     var id = this._id;
3382
3383     name += "";
3384
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) {
3389           return t.value;
3390         }
3391       }
3392       return null;
3393     }
3394
3395     return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
3396   }
3397
3398   function tweenValue(transition, name, value) {
3399     var id = transition._id;
3400
3401     transition.each(function() {
3402       var schedule$$1 = set$1(this, id);
3403       (schedule$$1.value || (schedule$$1.value = {}))[name] = value.apply(this, arguments);
3404     });
3405
3406     return function(node) {
3407       return get$1(node, id).value[name];
3408     };
3409   }
3410
3411   function interpolate$1(a, b) {
3412     var c;
3413     return (typeof b === "number" ? interpolateNumber
3414         : b instanceof color ? interpolateRgb
3415         : (c = color(b)) ? (b = c, interpolateRgb)
3416         : interpolateString)(a, b);
3417   }
3418
3419   function attrRemove$1(name) {
3420     return function() {
3421       this.removeAttribute(name);
3422     };
3423   }
3424
3425   function attrRemoveNS$1(fullname) {
3426     return function() {
3427       this.removeAttributeNS(fullname.space, fullname.local);
3428     };
3429   }
3430
3431   function attrConstant$1(name, interpolate$$1, value1) {
3432     var value00,
3433         interpolate0;
3434     return function() {
3435       var value0 = this.getAttribute(name);
3436       return value0 === value1 ? null
3437           : value0 === value00 ? interpolate0
3438           : interpolate0 = interpolate$$1(value00 = value0, value1);
3439     };
3440   }
3441
3442   function attrConstantNS$1(fullname, interpolate$$1, value1) {
3443     var value00,
3444         interpolate0;
3445     return function() {
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);
3450     };
3451   }
3452
3453   function attrFunction$1(name, interpolate$$1, value) {
3454     var value00,
3455         value10,
3456         interpolate0;
3457     return function() {
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);
3464     };
3465   }
3466
3467   function attrFunctionNS$1(fullname, interpolate$$1, value) {
3468     var value00,
3469         value10,
3470         interpolate0;
3471     return function() {
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);
3478     };
3479   }
3480
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 + ""));
3487   }
3488
3489   function attrTweenNS(fullname, value) {
3490     function tween() {
3491       var node = this, i = value.apply(node, arguments);
3492       return i && function(t) {
3493         node.setAttributeNS(fullname.space, fullname.local, i(t));
3494       };
3495     }
3496     tween._value = value;
3497     return tween;
3498   }
3499
3500   function attrTween(name, value) {
3501     function tween() {
3502       var node = this, i = value.apply(node, arguments);
3503       return i && function(t) {
3504         node.setAttribute(name, i(t));
3505       };
3506     }
3507     tween._value = value;
3508     return tween;
3509   }
3510
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));
3518   }
3519
3520   function delayFunction(id, value) {
3521     return function() {
3522       init(this, id).delay = +value.apply(this, arguments);
3523     };
3524   }
3525
3526   function delayConstant(id, value) {
3527     return value = +value, function() {
3528       init(this, id).delay = value;
3529     };
3530   }
3531
3532   function transition_delay(value) {
3533     var id = this._id;
3534
3535     return arguments.length
3536         ? this.each((typeof value === "function"
3537             ? delayFunction
3538             : delayConstant)(id, value))
3539         : get$1(this.node(), id).delay;
3540   }
3541
3542   function durationFunction(id, value) {
3543     return function() {
3544       set$1(this, id).duration = +value.apply(this, arguments);
3545     };
3546   }
3547
3548   function durationConstant(id, value) {
3549     return value = +value, function() {
3550       set$1(this, id).duration = value;
3551     };
3552   }
3553
3554   function transition_duration(value) {
3555     var id = this._id;
3556
3557     return arguments.length
3558         ? this.each((typeof value === "function"
3559             ? durationFunction
3560             : durationConstant)(id, value))
3561         : get$1(this.node(), id).duration;
3562   }
3563
3564   function easeConstant(id, value) {
3565     if (typeof value !== "function") throw new Error;
3566     return function() {
3567       set$1(this, id).ease = value;
3568     };
3569   }
3570
3571   function transition_ease(value) {
3572     var id = this._id;
3573
3574     return arguments.length
3575         ? this.each(easeConstant(id, value))
3576         : get$1(this.node(), id).ease;
3577   }
3578
3579   function transition_filter(match) {
3580     if (typeof match !== "function") match = matcher$1(match);
3581
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);
3586         }
3587       }
3588     }
3589
3590     return new Transition(subgroups, this._parents, this._name, this._id);
3591   }
3592
3593   function transition_merge(transition$$1) {
3594     if (transition$$1._id !== this._id) throw new Error;
3595
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]) {
3599           merge[i] = node;
3600         }
3601       }
3602     }
3603
3604     for (; j < m0; ++j) {
3605       merges[j] = groups0[j];
3606     }
3607
3608     return new Transition(merges, this._parents, this._name, this._id);
3609   }
3610
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";
3616     });
3617   }
3618
3619   function onFunction(id, name, listener) {
3620     var on0, on1, sit = start(name) ? init : set$1;
3621     return function() {
3622       var schedule$$1 = sit(this, id),
3623           on = schedule$$1.on;
3624
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);
3629
3630       schedule$$1.on = on1;
3631     };
3632   }
3633
3634   function transition_on(name, listener) {
3635     var id = this._id;
3636
3637     return arguments.length < 2
3638         ? get$1(this.node(), id).on.on(name)
3639         : this.each(onFunction(id, name, listener));
3640   }
3641
3642   function removeFunction(id) {
3643     return function() {
3644       var parent = this.parentNode;
3645       for (var i in this.__transition) if (+i !== id) return;
3646       if (parent) parent.removeChild(this);
3647     };
3648   }
3649
3650   function transition_remove() {
3651     return this.on("end.remove", removeFunction(this._id));
3652   }
3653
3654   function transition_select(select$$1) {
3655     var name = this._name,
3656         id = this._id;
3657
3658     if (typeof select$$1 !== "function") select$$1 = selector(select$$1);
3659
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));
3666         }
3667       }
3668     }
3669
3670     return new Transition(subgroups, this._parents, name, id);
3671   }
3672
3673   function transition_selectAll(select$$1) {
3674     var name = this._name,
3675         id = this._id;
3676
3677     if (typeof select$$1 !== "function") select$$1 = selectorAll(select$$1);
3678
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);
3685             }
3686           }
3687           subgroups.push(children);
3688           parents.push(node);
3689         }
3690       }
3691     }
3692
3693     return new Transition(subgroups, parents, name, id);
3694   }
3695
3696   var Selection$1 = selection.prototype.constructor;
3697
3698   function transition_selection() {
3699     return new Selection$1(this._groups, this._parents);
3700   }
3701
3702   function styleRemove$1(name, interpolate$$1) {
3703     var value00,
3704         value10,
3705         interpolate0;
3706     return function() {
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);
3712     };
3713   }
3714
3715   function styleRemoveEnd(name) {
3716     return function() {
3717       this.style.removeProperty(name);
3718     };
3719   }
3720
3721   function styleConstant$1(name, interpolate$$1, value1) {
3722     var value00,
3723         interpolate0;
3724     return function() {
3725       var value0 = styleValue(this, name);
3726       return value0 === value1 ? null
3727           : value0 === value00 ? interpolate0
3728           : interpolate0 = interpolate$$1(value00 = value0, value1);
3729     };
3730   }
3731
3732   function styleFunction$1(name, interpolate$$1, value) {
3733     var value00,
3734         value10,
3735         interpolate0;
3736     return function() {
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);
3743     };
3744   }
3745
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);
3754   }
3755
3756   function styleTween(name, value, priority) {
3757     function tween() {
3758       var node = this, i = value.apply(node, arguments);
3759       return i && function(t) {
3760         node.style.setProperty(name, i(t), priority);
3761       };
3762     }
3763     tween._value = value;
3764     return tween;
3765   }
3766
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));
3773   }
3774
3775   function textConstant$1(value) {
3776     return function() {
3777       this.textContent = value;
3778     };
3779   }
3780
3781   function textFunction$1(value) {
3782     return function() {
3783       var value1 = value(this);
3784       this.textContent = value1 == null ? "" : value1;
3785     };
3786   }
3787
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 + ""));
3792   }
3793
3794   function transition_transition() {
3795     var name = this._name,
3796         id0 = this._id,
3797         id1 = newId();
3798
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,
3805             delay: 0,
3806             duration: inherit.duration,
3807             ease: inherit.ease
3808           });
3809         }
3810       }
3811     }
3812
3813     return new Transition(groups, this._parents, name, id1);
3814   }
3815
3816   var id = 0;
3817
3818   function Transition(groups, parents, name, id) {
3819     this._groups = groups;
3820     this._parents = parents;
3821     this._name = name;
3822     this._id = id;
3823   }
3824
3825   function transition(name) {
3826     return selection().transition(name);
3827   }
3828
3829   function newId() {
3830     return ++id;
3831   }
3832
3833   var selection_prototype = selection.prototype;
3834
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,
3849     on: transition_on,
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
3860   };
3861
3862   function linear$1(t) {
3863     return +t;
3864   }
3865
3866   function quadIn(t) {
3867     return t * t;
3868   }
3869
3870   function quadOut(t) {
3871     return t * (2 - t);
3872   }
3873
3874   function quadInOut(t) {
3875     return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
3876   }
3877
3878   function cubicIn(t) {
3879     return t * t * t;
3880   }
3881
3882   function cubicOut(t) {
3883     return --t * t * t + 1;
3884   }
3885
3886   function cubicInOut(t) {
3887     return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
3888   }
3889
3890   var exponent = 3;
3891
3892   var polyIn = (function custom(e) {
3893     e = +e;
3894
3895     function polyIn(t) {
3896       return Math.pow(t, e);
3897     }
3898
3899     polyIn.exponent = custom;
3900
3901     return polyIn;
3902   })(exponent);
3903
3904   var polyOut = (function custom(e) {
3905     e = +e;
3906
3907     function polyOut(t) {
3908       return 1 - Math.pow(1 - t, e);
3909     }
3910
3911     polyOut.exponent = custom;
3912
3913     return polyOut;
3914   })(exponent);
3915
3916   var polyInOut = (function custom(e) {
3917     e = +e;
3918
3919     function polyInOut(t) {
3920       return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
3921     }
3922
3923     polyInOut.exponent = custom;
3924
3925     return polyInOut;
3926   })(exponent);
3927
3928   var pi = Math.PI,
3929       halfPi = pi / 2;
3930
3931   function sinIn(t) {
3932     return 1 - Math.cos(t * halfPi);
3933   }
3934
3935   function sinOut(t) {
3936     return Math.sin(t * halfPi);
3937   }
3938
3939   function sinInOut(t) {
3940     return (1 - Math.cos(pi * t)) / 2;
3941   }
3942
3943   function expIn(t) {
3944     return Math.pow(2, 10 * t - 10);
3945   }
3946
3947   function expOut(t) {
3948     return 1 - Math.pow(2, -10 * t);
3949   }
3950
3951   function expInOut(t) {
3952     return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
3953   }
3954
3955   function circleIn(t) {
3956     return 1 - Math.sqrt(1 - t * t);
3957   }
3958
3959   function circleOut(t) {
3960     return Math.sqrt(1 - --t * t);
3961   }
3962
3963   function circleInOut(t) {
3964     return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
3965   }
3966
3967   var b1 = 4 / 11,
3968       b2 = 6 / 11,
3969       b3 = 8 / 11,
3970       b4 = 3 / 4,
3971       b5 = 9 / 11,
3972       b6 = 10 / 11,
3973       b7 = 15 / 16,
3974       b8 = 21 / 22,
3975       b9 = 63 / 64,
3976       b0 = 1 / b1 / b1;
3977
3978   function bounceIn(t) {
3979     return 1 - bounceOut(1 - t);
3980   }
3981
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;
3984   }
3985
3986   function bounceInOut(t) {
3987     return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
3988   }
3989
3990   var overshoot = 1.70158;
3991
3992   var backIn = (function custom(s) {
3993     s = +s;
3994
3995     function backIn(t) {
3996       return t * t * ((s + 1) * t - s);
3997     }
3998
3999     backIn.overshoot = custom;
4000
4001     return backIn;
4002   })(overshoot);
4003
4004   var backOut = (function custom(s) {
4005     s = +s;
4006
4007     function backOut(t) {
4008       return --t * t * ((s + 1) * t + s) + 1;
4009     }
4010
4011     backOut.overshoot = custom;
4012
4013     return backOut;
4014   })(overshoot);
4015
4016   var backInOut = (function custom(s) {
4017     s = +s;
4018
4019     function backInOut(t) {
4020       return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
4021     }
4022
4023     backInOut.overshoot = custom;
4024
4025     return backInOut;
4026   })(overshoot);
4027
4028   var tau = 2 * Math.PI,
4029       amplitude = 1,
4030       period = 0.3;
4031
4032   var elasticIn = (function custom(a, p) {
4033     var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4034
4035     function elasticIn(t) {
4036       return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
4037     }
4038
4039     elasticIn.amplitude = function(a) { return custom(a, p * tau); };
4040     elasticIn.period = function(p) { return custom(a, p); };
4041
4042     return elasticIn;
4043   })(amplitude, period);
4044
4045   var elasticOut = (function custom(a, p) {
4046     var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4047
4048     function elasticOut(t) {
4049       return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
4050     }
4051
4052     elasticOut.amplitude = function(a) { return custom(a, p * tau); };
4053     elasticOut.period = function(p) { return custom(a, p); };
4054
4055     return elasticOut;
4056   })(amplitude, period);
4057
4058   var elasticInOut = (function custom(a, p) {
4059     var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4060
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;
4065     }
4066
4067     elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
4068     elasticInOut.period = function(p) { return custom(a, p); };
4069
4070     return elasticInOut;
4071   })(amplitude, period);
4072
4073   var defaultTiming = {
4074     time: null, // Set on use.
4075     delay: 0,
4076     duration: 250,
4077     ease: cubicInOut
4078   };
4079
4080   function inherit(node, id) {
4081     var timing;
4082     while (!(timing = node.__transition) || !(timing = timing[id])) {
4083       if (!(node = node.parentNode)) {
4084         return defaultTiming.time = now(), defaultTiming;
4085       }
4086     }
4087     return timing;
4088   }
4089
4090   function selection_transition(name) {
4091     var id,
4092         timing;
4093
4094     if (name instanceof Transition) {
4095       id = name._id, name = name._name;
4096     } else {
4097       id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
4098     }
4099
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));
4104         }
4105       }
4106     }
4107
4108     return new Transition(groups, this._parents, name, id);
4109   }
4110
4111   selection.prototype.interrupt = selection_interrupt;
4112   selection.prototype.transition = selection_transition;
4113
4114   var root$1 = [null];
4115
4116   function active(node, name) {
4117     var schedules = node.__transition,
4118         schedule$$1,
4119         i;
4120
4121     if (schedules) {
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);
4126         }
4127       }
4128     }
4129
4130     return null;
4131   }
4132
4133   function constant$4(x) {
4134     return function() {
4135       return x;
4136     };
4137   }
4138
4139   function BrushEvent(target, type, selection) {
4140     this.target = target;
4141     this.type = type;
4142     this.selection = selection;
4143   }
4144
4145   function nopropagation$1() {
4146     event.stopImmediatePropagation();
4147   }
4148
4149   function noevent$1() {
4150     event.preventDefault();
4151     event.stopImmediatePropagation();
4152   }
4153
4154   var MODE_DRAG = {name: "drag"},
4155       MODE_SPACE = {name: "space"},
4156       MODE_HANDLE = {name: "handle"},
4157       MODE_CENTER = {name: "center"};
4158
4159   var X = {
4160     name: "x",
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]]; }
4164   };
4165
4166   var Y = {
4167     name: "y",
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]]; }
4171   };
4172
4173   var XY = {
4174     name: "xy",
4175     handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type),
4176     input: function(xy) { return xy; },
4177     output: function(xy) { return xy; }
4178   };
4179
4180   var cursors = {
4181     overlay: "crosshair",
4182     selection: "move",
4183     n: "ns-resize",
4184     e: "ew-resize",
4185     s: "ns-resize",
4186     w: "ew-resize",
4187     nw: "nwse-resize",
4188     ne: "nesw-resize",
4189     se: "nwse-resize",
4190     sw: "nesw-resize"
4191   };
4192
4193   var flipX = {
4194     e: "w",
4195     w: "e",
4196     nw: "ne",
4197     ne: "nw",
4198     se: "sw",
4199     sw: "se"
4200   };
4201
4202   var flipY = {
4203     n: "s",
4204     s: "n",
4205     nw: "sw",
4206     ne: "se",
4207     se: "ne",
4208     sw: "nw"
4209   };
4210
4211   var signsX = {
4212     overlay: +1,
4213     selection: +1,
4214     n: null,
4215     e: +1,
4216     s: null,
4217     w: -1,
4218     nw: -1,
4219     ne: +1,
4220     se: +1,
4221     sw: -1
4222   };
4223
4224   var signsY = {
4225     overlay: +1,
4226     selection: +1,
4227     n: -1,
4228     e: null,
4229     s: +1,
4230     w: null,
4231     nw: -1,
4232     ne: -1,
4233     se: +1,
4234     sw: +1
4235   };
4236
4237   function type(t) {
4238     return {type: t};
4239   }
4240
4241   // Ignore right-click, since that should open the context menu.
4242   function defaultFilter$1() {
4243     return !event.button;
4244   }
4245
4246   function defaultExtent() {
4247     var svg = this.ownerSVGElement || this;
4248     return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
4249   }
4250
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;
4255   }
4256
4257   function empty$1(extent) {
4258     return extent[0][0] === extent[1][0]
4259         || extent[0][1] === extent[1][1];
4260   }
4261
4262   function brushSelection(node) {
4263     var state = node.__brush;
4264     return state ? state.dim.output(state.selection) : null;
4265   }
4266
4267   function brushX() {
4268     return brush$1(X);
4269   }
4270
4271   function brushY() {
4272     return brush$1(Y);
4273   }
4274
4275   function brush() {
4276     return brush$1(XY);
4277   }
4278
4279   function brush$1(dim) {
4280     var extent = defaultExtent,
4281         filter = defaultFilter$1,
4282         listeners = dispatch(brush, "start", "brush", "end"),
4283         handleSize = 6,
4284         touchending;
4285
4286     function brush(group) {
4287       var overlay = group
4288           .property("__brush", initialize)
4289         .selectAll(".overlay")
4290         .data([type("overlay")]);
4291
4292       overlay.enter().append("rect")
4293           .attr("class", "overlay")
4294           .attr("pointer-events", "all")
4295           .attr("cursor", cursors.overlay)
4296         .merge(overlay)
4297           .each(function() {
4298             var extent = local$1(this).extent;
4299             select(this)
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]);
4304           });
4305
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");
4315
4316       var handle = group.selectAll(".handle")
4317         .data(dim.handles, function(d) { return d.type; });
4318
4319       handle.exit().remove();
4320
4321       handle.enter().append("rect")
4322           .attr("class", function(d) { return "handle handle--" + d.type; })
4323           .attr("cursor", function(d) { return cursors[d.type]; });
4324
4325       group
4326           .each(redraw)
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);
4331     }
4332
4333     brush.move = function(group, selection$$1) {
4334       if (group.selection) {
4335         group
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() {
4339               var that = this,
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);
4345
4346               function tween(t) {
4347                 state.selection = t === 1 && empty$1(selection1) ? null : i(t);
4348                 redraw.call(that);
4349                 emit.brush();
4350               }
4351
4352               return selection0 && selection1 ? tween : tween(1);
4353             });
4354       } else {
4355         group
4356             .each(function() {
4357               var that = this,
4358                   args = arguments,
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();
4362
4363               interrupt(that);
4364               state.selection = selection1 == null || empty$1(selection1) ? null : selection1;
4365               redraw.call(that);
4366               emit.start().brush().end();
4367             });
4368       }
4369     };
4370
4371     function redraw() {
4372       var group = select(this),
4373           selection$$1 = local$1(this).selection;
4374
4375       if (selection$$1) {
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]);
4382
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; });
4389       }
4390
4391       else {
4392         group.selectAll(".selection,.handle")
4393             .style("display", "none")
4394             .attr("x", null)
4395             .attr("y", null)
4396             .attr("width", null)
4397             .attr("height", null);
4398       }
4399     }
4400
4401     function emitter(that, args) {
4402       return that.__brush.emitter || new Emitter(that, args);
4403     }
4404
4405     function Emitter(that, args) {
4406       this.that = that;
4407       this.args = args;
4408       this.state = that.__brush;
4409       this.active = 0;
4410     }
4411
4412     Emitter.prototype = {
4413       beforestart: function() {
4414         if (++this.active === 1) this.state.emitter = this, this.starting = true;
4415         return this;
4416       },
4417       start: function() {
4418         if (this.starting) this.starting = false, this.emit("start");
4419         return this;
4420       },
4421       brush: function() {
4422         this.emit("brush");
4423         return this;
4424       },
4425       end: function() {
4426         if (--this.active === 0) delete this.state.emitter, this.emit("end");
4427         return this;
4428       },
4429       emit: function(type) {
4430         customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
4431       }
4432     };
4433
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;
4438
4439       var that = this,
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,
4451           dx,
4452           dy,
4453           moving,
4454           shifting = signX && signY && event.shiftKey,
4455           lockX,
4456           lockY,
4457           point0 = mouse(that),
4458           point$$1 = point0,
4459           emit = emitter(that, arguments).beforestart();
4460
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]
4465         ];
4466       } else {
4467         w0 = selection$$1[0][0];
4468         n0 = selection$$1[0][1];
4469         e0 = selection$$1[1][0];
4470         s0 = selection$$1[1][1];
4471       }
4472
4473       w1 = w0;
4474       n1 = n0;
4475       e1 = e0;
4476       s1 = s0;
4477
4478       var group = select(that)
4479           .attr("pointer-events", "none");
4480
4481       var overlay = group.selectAll(".overlay")
4482           .attr("cursor", cursors[type]);
4483
4484       if (event.touches) {
4485         group
4486             .on("touchmove.brush", moved, true)
4487             .on("touchend.brush touchcancel.brush", ended, true);
4488       } else {
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);
4494
4495         nodrag(event.view);
4496       }
4497
4498       nopropagation$1();
4499       interrupt(that);
4500       redraw.call(that);
4501       emit.start();
4502
4503       function moved() {
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;
4507           else lockX = true;
4508         }
4509         point$$1 = point1;
4510         moving = true;
4511         noevent$1();
4512         move();
4513       }
4514
4515       function move() {
4516         var t;
4517
4518         dx = point$$1[0] - point0[0];
4519         dy = point$$1[1] - point0[1];
4520
4521         switch (mode) {
4522           case MODE_SPACE:
4523           case MODE_DRAG: {
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;
4526             break;
4527           }
4528           case MODE_HANDLE: {
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;
4533             break;
4534           }
4535           case MODE_CENTER: {
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));
4538             break;
4539           }
4540         }
4541
4542         if (e1 < w1) {
4543           signX *= -1;
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]]);
4547         }
4548
4549         if (s1 < n1) {
4550           signY *= -1;
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]]);
4554         }
4555
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];
4559
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]];
4565           redraw.call(that);
4566           emit.brush();
4567         }
4568       }
4569
4570       function ended() {
4571         nopropagation$1();
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);
4577         } else {
4578           yesdrag(event.view, moving);
4579           view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
4580         }
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);
4585         emit.end();
4586       }
4587
4588       function keydowned() {
4589         switch (event.keyCode) {
4590           case 16: { // SHIFT
4591             shifting = signX && signY;
4592             break;
4593           }
4594           case 18: { // ALT
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;
4598               mode = MODE_CENTER;
4599               move();
4600             }
4601             break;
4602           }
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;
4607               mode = MODE_SPACE;
4608               overlay.attr("cursor", cursors.selection);
4609               move();
4610             }
4611             break;
4612           }
4613           default: return;
4614         }
4615         noevent$1();
4616       }
4617
4618       function keyupped() {
4619         switch (event.keyCode) {
4620           case 16: { // SHIFT
4621             if (shifting) {
4622               lockX = lockY = shifting = false;
4623               move();
4624             }
4625             break;
4626           }
4627           case 18: { // ALT
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;
4631               mode = MODE_HANDLE;
4632               move();
4633             }
4634             break;
4635           }
4636           case 32: { // SPACE
4637             if (mode === MODE_SPACE) {
4638               if (event.altKey) {
4639                 if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4640                 if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4641                 mode = MODE_CENTER;
4642               } else {
4643                 if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4644                 if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4645                 mode = MODE_HANDLE;
4646               }
4647               overlay.attr("cursor", cursors[type]);
4648               move();
4649             }
4650             break;
4651           }
4652           default: return;
4653         }
4654         noevent$1();
4655       }
4656     }
4657
4658     function initialize() {
4659       var state = this.__brush || {selection: null};
4660       state.extent = extent.apply(this, arguments);
4661       state.dim = dim;
4662       return state;
4663     }
4664
4665     brush.extent = function(_) {
4666       return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;
4667     };
4668
4669     brush.filter = function(_) {
4670       return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter;
4671     };
4672
4673     brush.handleSize = function(_) {
4674       return arguments.length ? (handleSize = +_, brush) : handleSize;
4675     };
4676
4677     brush.on = function() {
4678       var value = listeners.on.apply(listeners, arguments);
4679       return value === listeners ? brush : value;
4680     };
4681
4682     return brush;
4683   }
4684
4685   var cos = Math.cos;
4686   var sin = Math.sin;
4687   var pi$1 = Math.PI;
4688   var halfPi$1 = pi$1 / 2;
4689   var tau$1 = pi$1 * 2;
4690   var max$1 = Math.max;
4691
4692   function compareValue(compare) {
4693     return function(a, b) {
4694       return compare(
4695         a.source.value + a.target.value,
4696         b.source.value + b.target.value
4697       );
4698     };
4699   }
4700
4701   function chord() {
4702     var padAngle = 0,
4703         sortGroups = null,
4704         sortSubgroups = null,
4705         sortChords = null;
4706
4707     function chord(matrix) {
4708       var n = matrix.length,
4709           groupSums = [],
4710           groupIndex = range(n),
4711           subgroupIndex = [],
4712           chords = [],
4713           groups = chords.groups = new Array(n),
4714           subgroups = new Array(n * n),
4715           k,
4716           x,
4717           x0,
4718           dx,
4719           i,
4720           j;
4721
4722       // Compute the sum.
4723       k = 0, i = -1; while (++i < n) {
4724         x = 0, j = -1; while (++j < n) {
4725           x += matrix[i][j];
4726         }
4727         groupSums.push(x);
4728         subgroupIndex.push(range(n));
4729         k += x;
4730       }
4731
4732       // Sort groups…
4733       if (sortGroups) groupIndex.sort(function(a, b) {
4734         return sortGroups(groupSums[a], groupSums[b]);
4735       });
4736
4737       // Sort subgroups…
4738       if (sortSubgroups) subgroupIndex.forEach(function(d, i) {
4739         d.sort(function(a, b) {
4740           return sortSubgroups(matrix[i][a], matrix[i][b]);
4741         });
4742       });
4743
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;
4749
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],
4756               v = matrix[di][dj],
4757               a0 = x,
4758               a1 = x += v * k;
4759           subgroups[dj * n + di] = {
4760             index: di,
4761             subindex: dj,
4762             startAngle: a0,
4763             endAngle: a1,
4764             value: v
4765           };
4766         }
4767         groups[di] = {
4768           index: di,
4769           startAngle: x0,
4770           endAngle: x,
4771           value: groupSums[di]
4772         };
4773         x += dx;
4774       }
4775
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});
4785           }
4786         }
4787       }
4788
4789       return sortChords ? chords.sort(sortChords) : chords;
4790     }
4791
4792     chord.padAngle = function(_) {
4793       return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle;
4794     };
4795
4796     chord.sortGroups = function(_) {
4797       return arguments.length ? (sortGroups = _, chord) : sortGroups;
4798     };
4799
4800     chord.sortSubgroups = function(_) {
4801       return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
4802     };
4803
4804     chord.sortChords = function(_) {
4805       return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;
4806     };
4807
4808     return chord;
4809   }
4810
4811   var slice$2 = Array.prototype.slice;
4812
4813   function constant$5(x) {
4814     return function() {
4815       return x;
4816     };
4817   }
4818
4819   var pi$2 = Math.PI,
4820       tau$2 = 2 * pi$2,
4821       epsilon$1 = 1e-6,
4822       tauEpsilon = tau$2 - epsilon$1;
4823
4824   function Path() {
4825     this._x0 = this._y0 = // start of current subpath
4826     this._x1 = this._y1 = null; // end of current subpath
4827     this._ = "";
4828   }
4829
4830   function path() {
4831     return new Path;
4832   }
4833
4834   Path.prototype = path.prototype = {
4835     constructor: Path,
4836     moveTo: function(x, y) {
4837       this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
4838     },
4839     closePath: function() {
4840       if (this._x1 !== null) {
4841         this._x1 = this._x0, this._y1 = this._y0;
4842         this._ += "Z";
4843       }
4844     },
4845     lineTo: function(x, y) {
4846       this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
4847     },
4848     quadraticCurveTo: function(x1, y1, x, y) {
4849       this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4850     },
4851     bezierCurveTo: function(x1, y1, x2, y2, x, y) {
4852       this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4853     },
4854     arcTo: function(x1, y1, x2, y2, r) {
4855       x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
4856       var x0 = this._x1,
4857           y0 = this._y1,
4858           x21 = x2 - x1,
4859           y21 = y2 - y1,
4860           x01 = x0 - x1,
4861           y01 = y0 - y1,
4862           l01_2 = x01 * x01 + y01 * y01;
4863
4864       // Is the radius negative? Error.
4865       if (r < 0) throw new Error("negative radius: " + r);
4866
4867       // Is this path empty? Move to (x1,y1).
4868       if (this._x1 === null) {
4869         this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
4870       }
4871
4872       // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
4873       else if (!(l01_2 > epsilon$1)) ;
4874
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);
4880       }
4881
4882       // Otherwise, draw an arc!
4883       else {
4884         var x20 = x2 - x0,
4885             y20 = y2 - y0,
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),
4891             t01 = l / l01,
4892             t21 = l / l21;
4893
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);
4897         }
4898
4899         this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
4900       }
4901     },
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),
4906           x0 = x + dx,
4907           y0 = y + dy,
4908           cw = 1 ^ ccw,
4909           da = ccw ? a0 - a1 : a1 - a0;
4910
4911       // Is the radius negative? Error.
4912       if (r < 0) throw new Error("negative radius: " + r);
4913
4914       // Is this path empty? Move to (x0,y0).
4915       if (this._x1 === null) {
4916         this._ += "M" + x0 + "," + y0;
4917       }
4918
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;
4922       }
4923
4924       // Is this arc empty? We’re done.
4925       if (!r) return;
4926
4927       // Does the angle go the wrong way? Flip the direction.
4928       if (da < 0) da = da % tau$2 + tau$2;
4929
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);
4933       }
4934
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));
4938       }
4939     },
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";
4942     },
4943     toString: function() {
4944       return this._;
4945     }
4946   };
4947
4948   function defaultSource(d) {
4949     return d.source;
4950   }
4951
4952   function defaultTarget(d) {
4953     return d.target;
4954   }
4955
4956   function defaultRadius(d) {
4957     return d.radius;
4958   }
4959
4960   function defaultStartAngle(d) {
4961     return d.startAngle;
4962   }
4963
4964   function defaultEndAngle(d) {
4965     return d.endAngle;
4966   }
4967
4968   function ribbon() {
4969     var source = defaultSource,
4970         target = defaultTarget,
4971         radius = defaultRadius,
4972         startAngle = defaultStartAngle,
4973         endAngle = defaultEndAngle,
4974         context = null;
4975
4976     function ribbon() {
4977       var buffer,
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;
4989
4990       if (!context) context = buffer = path();
4991
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);
4997       }
4998       context.quadraticCurveTo(0, 0, sx0, sy0);
4999       context.closePath();
5000
5001       if (buffer) return context = null, buffer + "" || null;
5002     }
5003
5004     ribbon.radius = function(_) {
5005       return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius;
5006     };
5007
5008     ribbon.startAngle = function(_) {
5009       return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle;
5010     };
5011
5012     ribbon.endAngle = function(_) {
5013       return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle;
5014     };
5015
5016     ribbon.source = function(_) {
5017       return arguments.length ? (source = _, ribbon) : source;
5018     };
5019
5020     ribbon.target = function(_) {
5021       return arguments.length ? (target = _, ribbon) : target;
5022     };
5023
5024     ribbon.context = function(_) {
5025       return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;
5026     };
5027
5028     return ribbon;
5029   }
5030
5031   var prefix = "$";
5032
5033   function Map() {}
5034
5035   Map.prototype = map$1.prototype = {
5036     constructor: Map,
5037     has: function(key) {
5038       return (prefix + key) in this;
5039     },
5040     get: function(key) {
5041       return this[prefix + key];
5042     },
5043     set: function(key, value) {
5044       this[prefix + key] = value;
5045       return this;
5046     },
5047     remove: function(key) {
5048       var property = prefix + key;
5049       return property in this && delete this[property];
5050     },
5051     clear: function() {
5052       for (var property in this) if (property[0] === prefix) delete this[property];
5053     },
5054     keys: function() {
5055       var keys = [];
5056       for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
5057       return keys;
5058     },
5059     values: function() {
5060       var values = [];
5061       for (var property in this) if (property[0] === prefix) values.push(this[property]);
5062       return values;
5063     },
5064     entries: function() {
5065       var entries = [];
5066       for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
5067       return entries;
5068     },
5069     size: function() {
5070       var size = 0;
5071       for (var property in this) if (property[0] === prefix) ++size;
5072       return size;
5073     },
5074     empty: function() {
5075       for (var property in this) if (property[0] === prefix) return false;
5076       return true;
5077     },
5078     each: function(f) {
5079       for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
5080     }
5081   };
5082
5083   function map$1(object, f) {
5084     var map = new Map;
5085
5086     // Copy constructor.
5087     if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });
5088
5089     // Index array by numeric index or specified key function.
5090     else if (Array.isArray(object)) {
5091       var i = -1,
5092           n = object.length,
5093           o;
5094
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);
5097     }
5098
5099     // Convert object to map.
5100     else if (object) for (var key in object) map.set(key, object[key]);
5101
5102     return map;
5103   }
5104
5105   function nest() {
5106     var keys = [],
5107         sortKeys = [],
5108         sortValues,
5109         rollup,
5110         nest;
5111
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;
5116       }
5117
5118       var i = -1,
5119           n = array.length,
5120           key = keys[depth++],
5121           keyValue,
5122           value,
5123           valuesByKey = map$1(),
5124           values,
5125           result = createResult();
5126
5127       while (++i < n) {
5128         if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
5129           values.push(value);
5130         } else {
5131           valuesByKey.set(keyValue, [value]);
5132         }
5133       }
5134
5135       valuesByKey.each(function(values, key) {
5136         setResult(result, key, apply(values, depth, createResult, setResult));
5137       });
5138
5139       return result;
5140     }
5141
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;
5148     }
5149
5150     return nest = {
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; }
5158     };
5159   }
5160
5161   function createObject() {
5162     return {};
5163   }
5164
5165   function setObject(object, key, value) {
5166     object[key] = value;
5167   }
5168
5169   function createMap() {
5170     return map$1();
5171   }
5172
5173   function setMap(map, key, value) {
5174     map.set(key, value);
5175   }
5176
5177   function Set() {}
5178
5179   var proto = map$1.prototype;
5180
5181   Set.prototype = set$2.prototype = {
5182     constructor: Set,
5183     has: proto.has,
5184     add: function(value) {
5185       value += "";
5186       this[prefix + value] = value;
5187       return this;
5188     },
5189     remove: proto.remove,
5190     clear: proto.clear,
5191     values: proto.keys,
5192     size: proto.size,
5193     empty: proto.empty,
5194     each: proto.each
5195   };
5196
5197   function set$2(object, f) {
5198     var set = new Set;
5199
5200     // Copy constructor.
5201     if (object instanceof Set) object.each(function(value) { set.add(value); });
5202
5203     // Otherwise, assume it’s an array.
5204     else if (object) {
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));
5208     }
5209
5210     return set;
5211   }
5212
5213   function keys(map) {
5214     var keys = [];
5215     for (var key in map) keys.push(key);
5216     return keys;
5217   }
5218
5219   function values(map) {
5220     var values = [];
5221     for (var key in map) values.push(map[key]);
5222     return values;
5223   }
5224
5225   function entries(map) {
5226     var entries = [];
5227     for (var key in map) entries.push({key: key, value: map[key]});
5228     return entries;
5229   }
5230
5231   var EOL = {},
5232       EOF = {},
5233       QUOTE = 34,
5234       NEWLINE = 10,
5235       RETURN = 13;
5236
5237   function objectConverter(columns) {
5238     return new Function("d", "return {" + columns.map(function(name, i) {
5239       return JSON.stringify(name) + ": d[" + i + "]";
5240     }).join(",") + "}");
5241   }
5242
5243   function customConverter(columns, f) {
5244     var object = objectConverter(columns);
5245     return function(row, i) {
5246       return f(object(row), i, columns);
5247     };
5248   }
5249
5250   // Compute unique columns in order of discovery.
5251   function inferColumns(rows) {
5252     var columnSet = Object.create(null),
5253         columns = [];
5254
5255     rows.forEach(function(row) {
5256       for (var column in row) {
5257         if (!(column in columnSet)) {
5258           columns.push(columnSet[column] = column);
5259         }
5260       }
5261     });
5262
5263     return columns;
5264   }
5265
5266   function dsv(delimiter) {
5267     var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
5268         DELIMITER = delimiter.charCodeAt(0);
5269
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);
5274       });
5275       rows.columns = columns || [];
5276       return rows;
5277     }
5278
5279     function parseRows(text, f) {
5280       var rows = [], // output rows
5281           N = text.length,
5282           I = 0, // current character index
5283           n = 0, // current line number
5284           t, // current token
5285           eof = N <= 0, // current token followed by EOF?
5286           eol = false; // current token followed by EOL?
5287
5288       // Strip the trailing newline.
5289       if (text.charCodeAt(N - 1) === NEWLINE) --N;
5290       if (text.charCodeAt(N - 1) === RETURN) --N;
5291
5292       function token() {
5293         if (eof) return EOF;
5294         if (eol) return eol = false, EOL;
5295
5296         // Unescape quotes.
5297         var i, j = I, c;
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, "\"");
5304         }
5305
5306         // Find next delimiter or newline.
5307         while (I < N) {
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);
5312         }
5313
5314         // Return last token before EOF.
5315         return eof = true, text.slice(j, N);
5316       }
5317
5318       while ((t = token()) !== EOF) {
5319         var row = [];
5320         while (t !== EOL && t !== EOF) row.push(t), t = token();
5321         if (f && (row = f(row, n++)) == null) continue;
5322         rows.push(row);
5323       }
5324
5325       return rows;
5326     }
5327
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]);
5333         }).join(delimiter);
5334       })).join("\n");
5335     }
5336
5337     function formatRows(rows) {
5338       return rows.map(formatRow).join("\n");
5339     }
5340
5341     function formatRow(row) {
5342       return row.map(formatValue).join(delimiter);
5343     }
5344
5345     function formatValue(text) {
5346       return text == null ? ""
5347           : reFormat.test(text += "") ? "\"" + text.replace(/"/g, "\"\"") + "\""
5348           : text;
5349     }
5350
5351     return {
5352       parse: parse,
5353       parseRows: parseRows,
5354       format: format,
5355       formatRows: formatRows
5356     };
5357   }
5358
5359   var csv = dsv(",");
5360
5361   var csvParse = csv.parse;
5362   var csvParseRows = csv.parseRows;
5363   var csvFormat = csv.format;
5364   var csvFormatRows = csv.formatRows;
5365
5366   var tsv = dsv("\t");
5367
5368   var tsvParse = tsv.parse;
5369   var tsvParseRows = tsv.parseRows;
5370   var tsvFormat = tsv.format;
5371   var tsvFormatRows = tsv.formatRows;
5372
5373   function center$1(x, y) {
5374     var nodes;
5375
5376     if (x == null) x = 0;
5377     if (y == null) y = 0;
5378
5379     function force() {
5380       var i,
5381           n = nodes.length,
5382           node,
5383           sx = 0,
5384           sy = 0;
5385
5386       for (i = 0; i < n; ++i) {
5387         node = nodes[i], sx += node.x, sy += node.y;
5388       }
5389
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;
5392       }
5393     }
5394
5395     force.initialize = function(_) {
5396       nodes = _;
5397     };
5398
5399     force.x = function(_) {
5400       return arguments.length ? (x = +_, force) : x;
5401     };
5402
5403     force.y = function(_) {
5404       return arguments.length ? (y = +_, force) : y;
5405     };
5406
5407     return force;
5408   }
5409
5410   function constant$6(x) {
5411     return function() {
5412       return x;
5413     };
5414   }
5415
5416   function jiggle() {
5417     return (Math.random() - 0.5) * 1e-6;
5418   }
5419
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);
5424   }
5425
5426   function add(tree, x, y, d) {
5427     if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
5428
5429     var parent,
5430         node = tree._root,
5431         leaf = {data: d},
5432         x0 = tree._x0,
5433         y0 = tree._y0,
5434         x1 = tree._x1,
5435         y1 = tree._y1,
5436         xm,
5437         ym,
5438         xp,
5439         yp,
5440         right,
5441         bottom,
5442         i,
5443         j;
5444
5445     // If the tree is empty, initialize the root as a leaf.
5446     if (!node) return tree._root = leaf, tree;
5447
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;
5453     }
5454
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;
5459
5460     // Otherwise, split the leaf node until the old and new point are separated.
5461     do {
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;
5467   }
5468
5469   function addAll(data) {
5470     var d, i, n = data.length,
5471         x,
5472         y,
5473         xz = new Array(n),
5474         yz = new Array(n),
5475         x0 = Infinity,
5476         y0 = Infinity,
5477         x1 = -Infinity,
5478         y1 = -Infinity;
5479
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;
5483       xz[i] = x;
5484       yz[i] = y;
5485       if (x < x0) x0 = x;
5486       if (x > x1) x1 = x;
5487       if (y < y0) y0 = y;
5488       if (y > y1) y1 = y;
5489     }
5490
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;
5494
5495     // Expand the tree to cover the new points.
5496     this.cover(x0, y0).cover(x1, y1);
5497
5498     // Add the new points.
5499     for (i = 0; i < n; ++i) {
5500       add(this, xz[i], yz[i], data[i]);
5501     }
5502
5503     return this;
5504   }
5505
5506   function tree_cover(x, y) {
5507     if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
5508
5509     var x0 = this._x0,
5510         y0 = this._y0,
5511         x1 = this._x1,
5512         y1 = this._y1;
5513
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!
5517     if (isNaN(x0)) {
5518       x1 = (x0 = Math.floor(x)) + 1;
5519       y1 = (y0 = Math.floor(y)) + 1;
5520     }
5521
5522     // Otherwise, double repeatedly to cover.
5523     else if (x0 > x || x > x1 || y0 > y || y > y1) {
5524       var z = x1 - x0,
5525           node = this._root,
5526           parent,
5527           i;
5528
5529       switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {
5530         case 0: {
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);
5533           break;
5534         }
5535         case 1: {
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);
5538           break;
5539         }
5540         case 2: {
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);
5543           break;
5544         }
5545         case 3: {
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);
5548           break;
5549         }
5550       }
5551
5552       if (this._root && this._root.length) this._root = node;
5553     }
5554
5555     // If the quadtree covers the point already, just return.
5556     else return this;
5557
5558     this._x0 = x0;
5559     this._y0 = y0;
5560     this._x1 = x1;
5561     this._y1 = y1;
5562     return this;
5563   }
5564
5565   function tree_data() {
5566     var data = [];
5567     this.visit(function(node) {
5568       if (!node.length) do data.push(node.data); while (node = node.next)
5569     });
5570     return data;
5571   }
5572
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]];
5577   }
5578
5579   function Quad(node, x0, y0, x1, y1) {
5580     this.node = node;
5581     this.x0 = x0;
5582     this.y0 = y0;
5583     this.x1 = x1;
5584     this.y1 = y1;
5585   }
5586
5587   function tree_find(x, y, radius) {
5588     var data,
5589         x0 = this._x0,
5590         y0 = this._y0,
5591         x1,
5592         y1,
5593         x2,
5594         y2,
5595         x3 = this._x1,
5596         y3 = this._y1,
5597         quads = [],
5598         node = this._root,
5599         q,
5600         i;
5601
5602     if (node) quads.push(new Quad(node, x0, y0, x3, y3));
5603     if (radius == null) radius = Infinity;
5604     else {
5605       x0 = x - radius, y0 = y - radius;
5606       x3 = x + radius, y3 = y + radius;
5607       radius *= radius;
5608     }
5609
5610     while (q = quads.pop()) {
5611
5612       // Stop searching if this quadrant can’t contain a closer node.
5613       if (!(node = q.node)
5614           || (x1 = q.x0) > x3
5615           || (y1 = q.y0) > y3
5616           || (x2 = q.x1) < x0
5617           || (y2 = q.y1) < y0) continue;
5618
5619       // Bisect the current quadrant.
5620       if (node.length) {
5621         var xm = (x1 + x2) / 2,
5622             ym = (y1 + y2) / 2;
5623
5624         quads.push(
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)
5629         );
5630
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;
5636         }
5637       }
5638
5639       // Visit this point. (Visiting coincident points isn’t necessary!)
5640       else {
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;
5644         if (d2 < radius) {
5645           var d = Math.sqrt(radius = d2);
5646           x0 = x - d, y0 = y - d;
5647           x3 = x + d, y3 = y + d;
5648           data = node.data;
5649         }
5650       }
5651     }
5652
5653     return data;
5654   }
5655
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
5658
5659     var parent,
5660         node = this._root,
5661         retainer,
5662         previous,
5663         next,
5664         x0 = this._x0,
5665         y0 = this._y0,
5666         x1 = this._x1,
5667         y1 = this._y1,
5668         x,
5669         y,
5670         xm,
5671         ym,
5672         right,
5673         bottom,
5674         i,
5675         j;
5676
5677     // If the tree is empty, initialize the root as a leaf.
5678     if (!node) return this;
5679
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;
5688     }
5689
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;
5693
5694     // If there are multiple coincident points, remove just the point.
5695     if (previous) return (next ? previous.next = next : delete previous.next), this;
5696
5697     // If this is the root point, remove it.
5698     if (!parent) return this._root = next, this;
5699
5700     // Remove this leaf.
5701     next ? parent[i] = next : delete parent[i];
5702
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])
5706         && !node.length) {
5707       if (retainer) retainer[j] = node;
5708       else this._root = node;
5709     }
5710
5711     return this;
5712   }
5713
5714   function removeAll(data) {
5715     for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
5716     return this;
5717   }
5718
5719   function tree_root() {
5720     return this._root;
5721   }
5722
5723   function tree_size() {
5724     var size = 0;
5725     this.visit(function(node) {
5726       if (!node.length) do ++size; while (node = node.next)
5727     });
5728     return size;
5729   }
5730
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));
5741       }
5742     }
5743     return this;
5744   }
5745
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()) {
5750       var node = q.node;
5751       if (node.length) {
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));
5757       }
5758       next.push(q);
5759     }
5760     while (q = next.pop()) {
5761       callback(q.node, q.x0, q.y0, q.x1, q.y1);
5762     }
5763     return this;
5764   }
5765
5766   function defaultX(d) {
5767     return d[0];
5768   }
5769
5770   function tree_x(_) {
5771     return arguments.length ? (this._x = _, this) : this._x;
5772   }
5773
5774   function defaultY(d) {
5775     return d[1];
5776   }
5777
5778   function tree_y(_) {
5779     return arguments.length ? (this._y = _, this) : this._y;
5780   }
5781
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);
5785   }
5786
5787   function Quadtree(x, y, x0, y0, x1, y1) {
5788     this._x = x;
5789     this._y = y;
5790     this._x0 = x0;
5791     this._y0 = y0;
5792     this._x1 = x1;
5793     this._y1 = y1;
5794     this._root = undefined;
5795   }
5796
5797   function leaf_copy(leaf) {
5798     var copy = {data: leaf.data}, next = copy;
5799     while (leaf = leaf.next) next = next.next = {data: leaf.data};
5800     return copy;
5801   }
5802
5803   var treeProto = quadtree.prototype = Quadtree.prototype;
5804
5805   treeProto.copy = function() {
5806     var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
5807         node = this._root,
5808         nodes,
5809         child;
5810
5811     if (!node) return copy;
5812
5813     if (!node.length) return copy._root = leaf_copy(node), copy;
5814
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);
5821         }
5822       }
5823     }
5824
5825     return copy;
5826   };
5827
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;
5842
5843   function x(d) {
5844     return d.x + d.vx;
5845   }
5846
5847   function y(d) {
5848     return d.y + d.vy;
5849   }
5850
5851   function collide(radius) {
5852     var nodes,
5853         radii,
5854         strength = 1,
5855         iterations = 1;
5856
5857     if (typeof radius !== "function") radius = constant$6(radius == null ? 1 : +radius);
5858
5859     function force() {
5860       var i, n = nodes.length,
5861           tree,
5862           node,
5863           xi,
5864           yi,
5865           ri,
5866           ri2;
5867
5868       for (var k = 0; k < iterations; ++k) {
5869         tree = quadtree(nodes, x, y).visitAfter(prepare);
5870         for (i = 0; i < n; ++i) {
5871           node = nodes[i];
5872           ri = radii[node.index], ri2 = ri * ri;
5873           xi = node.x + node.vx;
5874           yi = node.y + node.vy;
5875           tree.visit(apply);
5876         }
5877       }
5878
5879       function apply(quad, x0, y0, x1, y1) {
5880         var data = quad.data, rj = quad.r, r = ri + rj;
5881         if (data) {
5882           if (data.index > node.index) {
5883             var x = xi - data.x - data.vx,
5884                 y = yi - data.y - data.vy,
5885                 l = x * x + y * y;
5886             if (l < r * r) {
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);
5893               data.vy -= y * r;
5894             }
5895           }
5896           return;
5897         }
5898         return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
5899       }
5900     }
5901
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) {
5906           quad.r = quad[i].r;
5907         }
5908       }
5909     }
5910
5911     function initialize() {
5912       if (!nodes) return;
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);
5916     }
5917
5918     force.initialize = function(_) {
5919       nodes = _;
5920       initialize();
5921     };
5922
5923     force.iterations = function(_) {
5924       return arguments.length ? (iterations = +_, force) : iterations;
5925     };
5926
5927     force.strength = function(_) {
5928       return arguments.length ? (strength = +_, force) : strength;
5929     };
5930
5931     force.radius = function(_) {
5932       return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
5933     };
5934
5935     return force;
5936   }
5937
5938   function index(d) {
5939     return d.index;
5940   }
5941
5942   function find(nodeById, nodeId) {
5943     var node = nodeById.get(nodeId);
5944     if (!node) throw new Error("missing: " + nodeId);
5945     return node;
5946   }
5947
5948   function link(links) {
5949     var id = index,
5950         strength = defaultStrength,
5951         strengths,
5952         distance = constant$6(30),
5953         distances,
5954         nodes,
5955         count,
5956         bias,
5957         iterations = 1;
5958
5959     if (links == null) links = [];
5960
5961     function defaultStrength(link) {
5962       return 1 / Math.min(count[link.source.index], count[link.target.index]);
5963     }
5964
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];
5973           x *= l, y *= l;
5974           target.vx -= x * (b = bias[i]);
5975           target.vy -= y * b;
5976           source.vx += x * (b = 1 - b);
5977           source.vy += y * b;
5978         }
5979       }
5980     }
5981
5982     function initialize() {
5983       if (!nodes) return;
5984
5985       var i,
5986           n = nodes.length,
5987           m = links.length,
5988           nodeById = map$1(nodes, id),
5989           link;
5990
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;
5997       }
5998
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]);
6001       }
6002
6003       strengths = new Array(m), initializeStrength();
6004       distances = new Array(m), initializeDistance();
6005     }
6006
6007     function initializeStrength() {
6008       if (!nodes) return;
6009
6010       for (var i = 0, n = links.length; i < n; ++i) {
6011         strengths[i] = +strength(links[i], i, links);
6012       }
6013     }
6014
6015     function initializeDistance() {
6016       if (!nodes) return;
6017
6018       for (var i = 0, n = links.length; i < n; ++i) {
6019         distances[i] = +distance(links[i], i, links);
6020       }
6021     }
6022
6023     force.initialize = function(_) {
6024       nodes = _;
6025       initialize();
6026     };
6027
6028     force.links = function(_) {
6029       return arguments.length ? (links = _, initialize(), force) : links;
6030     };
6031
6032     force.id = function(_) {
6033       return arguments.length ? (id = _, force) : id;
6034     };
6035
6036     force.iterations = function(_) {
6037       return arguments.length ? (iterations = +_, force) : iterations;
6038     };
6039
6040     force.strength = function(_) {
6041       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initializeStrength(), force) : strength;
6042     };
6043
6044     force.distance = function(_) {
6045       return arguments.length ? (distance = typeof _ === "function" ? _ : constant$6(+_), initializeDistance(), force) : distance;
6046     };
6047
6048     return force;
6049   }
6050
6051   function x$1(d) {
6052     return d.x;
6053   }
6054
6055   function y$1(d) {
6056     return d.y;
6057   }
6058
6059   var initialRadius = 10,
6060       initialAngle = Math.PI * (3 - Math.sqrt(5));
6061
6062   function simulation(nodes) {
6063     var simulation,
6064         alpha = 1,
6065         alphaMin = 0.001,
6066         alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
6067         alphaTarget = 0,
6068         velocityDecay = 0.6,
6069         forces = map$1(),
6070         stepper = timer(step),
6071         event = dispatch("tick", "end");
6072
6073     if (nodes == null) nodes = [];
6074
6075     function step() {
6076       tick();
6077       event.call("tick", simulation);
6078       if (alpha < alphaMin) {
6079         stepper.stop();
6080         event.call("end", simulation);
6081       }
6082     }
6083
6084     function tick() {
6085       var i, n = nodes.length, node;
6086
6087       alpha += (alphaTarget - alpha) * alphaDecay;
6088
6089       forces.each(function(force) {
6090         force(alpha);
6091       });
6092
6093       for (i = 0; i < n; ++i) {
6094         node = nodes[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;
6099       }
6100     }
6101
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);
6109         }
6110         if (isNaN(node.vx) || isNaN(node.vy)) {
6111           node.vx = node.vy = 0;
6112         }
6113       }
6114     }
6115
6116     function initializeForce(force) {
6117       if (force.initialize) force.initialize(nodes);
6118       return force;
6119     }
6120
6121     initializeNodes();
6122
6123     return simulation = {
6124       tick: tick,
6125
6126       restart: function() {
6127         return stepper.restart(step), simulation;
6128       },
6129
6130       stop: function() {
6131         return stepper.stop(), simulation;
6132       },
6133
6134       nodes: function(_) {
6135         return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
6136       },
6137
6138       alpha: function(_) {
6139         return arguments.length ? (alpha = +_, simulation) : alpha;
6140       },
6141
6142       alphaMin: function(_) {
6143         return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
6144       },
6145
6146       alphaDecay: function(_) {
6147         return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
6148       },
6149
6150       alphaTarget: function(_) {
6151         return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
6152       },
6153
6154       velocityDecay: function(_) {
6155         return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
6156       },
6157
6158       force: function(name, _) {
6159         return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
6160       },
6161
6162       find: function(x, y, radius) {
6163         var i = 0,
6164             n = nodes.length,
6165             dx,
6166             dy,
6167             d2,
6168             node,
6169             closest;
6170
6171         if (radius == null) radius = Infinity;
6172         else radius *= radius;
6173
6174         for (i = 0; i < n; ++i) {
6175           node = nodes[i];
6176           dx = x - node.x;
6177           dy = y - node.y;
6178           d2 = dx * dx + dy * dy;
6179           if (d2 < radius) closest = node, radius = d2;
6180         }
6181
6182         return closest;
6183       },
6184
6185       on: function(name, _) {
6186         return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
6187       }
6188     };
6189   }
6190
6191   function manyBody() {
6192     var nodes,
6193         node,
6194         alpha,
6195         strength = constant$6(-30),
6196         strengths,
6197         distanceMin2 = 1,
6198         distanceMax2 = Infinity,
6199         theta2 = 0.81;
6200
6201     function force(_) {
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);
6204     }
6205
6206     function initialize() {
6207       if (!nodes) return;
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);
6211     }
6212
6213     function accumulate(quad) {
6214       var strength = 0, q, c, weight = 0, x, y, i;
6215
6216       // For internal nodes, accumulate forces from child quadrants.
6217       if (quad.length) {
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;
6221           }
6222         }
6223         quad.x = x / weight;
6224         quad.y = y / weight;
6225       }
6226
6227       // For leaf nodes, accumulate forces from coincident quadrants.
6228       else {
6229         q = quad;
6230         q.x = q.data.x;
6231         q.y = q.data.y;
6232         do strength += strengths[q.data.index];
6233         while (q = q.next);
6234       }
6235
6236       quad.value = strength;
6237     }
6238
6239     function apply(quad, x1, _, x2) {
6240       if (!quad.value) return true;
6241
6242       var x = quad.x - node.x,
6243           y = quad.y - node.y,
6244           w = x2 - x1,
6245           l = x * x + y * y;
6246
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;
6256         }
6257         return true;
6258       }
6259
6260       // Otherwise, process points directly.
6261       else if (quad.length || l >= distanceMax2) return;
6262
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);
6268       }
6269
6270       do if (quad.data !== node) {
6271         w = strengths[quad.data.index] * alpha / l;
6272         node.vx += x * w;
6273         node.vy += y * w;
6274       } while (quad = quad.next);
6275     }
6276
6277     force.initialize = function(_) {
6278       nodes = _;
6279       initialize();
6280     };
6281
6282     force.strength = function(_) {
6283       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6284     };
6285
6286     force.distanceMin = function(_) {
6287       return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
6288     };
6289
6290     force.distanceMax = function(_) {
6291       return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
6292     };
6293
6294     force.theta = function(_) {
6295       return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
6296     };
6297
6298     return force;
6299   }
6300
6301   function radial(radius, x, y) {
6302     var nodes,
6303         strength = constant$6(0.1),
6304         strengths,
6305         radiuses;
6306
6307     if (typeof radius !== "function") radius = constant$6(+radius);
6308     if (x == null) x = 0;
6309     if (y == null) y = 0;
6310
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;
6318         node.vx += dx * k;
6319         node.vy += dy * k;
6320       }
6321     }
6322
6323     function initialize() {
6324       if (!nodes) return;
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);
6331       }
6332     }
6333
6334     force.initialize = function(_) {
6335       nodes = _, initialize();
6336     };
6337
6338     force.strength = function(_) {
6339       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6340     };
6341
6342     force.radius = function(_) {
6343       return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
6344     };
6345
6346     force.x = function(_) {
6347       return arguments.length ? (x = +_, force) : x;
6348     };
6349
6350     force.y = function(_) {
6351       return arguments.length ? (y = +_, force) : y;
6352     };
6353
6354     return force;
6355   }
6356
6357   function x$2(x) {
6358     var strength = constant$6(0.1),
6359         nodes,
6360         strengths,
6361         xz;
6362
6363     if (typeof x !== "function") x = constant$6(x == null ? 0 : +x);
6364
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;
6368       }
6369     }
6370
6371     function initialize() {
6372       if (!nodes) return;
6373       var i, n = nodes.length;
6374       strengths = new Array(n);
6375       xz = 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);
6378       }
6379     }
6380
6381     force.initialize = function(_) {
6382       nodes = _;
6383       initialize();
6384     };
6385
6386     force.strength = function(_) {
6387       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6388     };
6389
6390     force.x = function(_) {
6391       return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : x;
6392     };
6393
6394     return force;
6395   }
6396
6397   function y$2(y) {
6398     var strength = constant$6(0.1),
6399         nodes,
6400         strengths,
6401         yz;
6402
6403     if (typeof y !== "function") y = constant$6(y == null ? 0 : +y);
6404
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;
6408       }
6409     }
6410
6411     function initialize() {
6412       if (!nodes) return;
6413       var i, n = nodes.length;
6414       strengths = new Array(n);
6415       yz = 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);
6418       }
6419     }
6420
6421     force.initialize = function(_) {
6422       nodes = _;
6423       initialize();
6424     };
6425
6426     force.strength = function(_) {
6427       return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6428     };
6429
6430     force.y = function(_) {
6431       return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : y;
6432     };
6433
6434     return force;
6435   }
6436
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);
6443
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).
6446     return [
6447       coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
6448       +x.slice(i + 1)
6449     ];
6450   }
6451
6452   function exponent$1(x) {
6453     return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
6454   }
6455
6456   function formatGroup(grouping, thousands) {
6457     return function(value, width) {
6458       var i = value.length,
6459           t = [],
6460           j = 0,
6461           g = grouping[0],
6462           length = 0;
6463
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];
6469       }
6470
6471       return t.reverse().join(thousands);
6472     };
6473   }
6474
6475   function formatNumerals(numerals) {
6476     return function(value) {
6477       return value.replace(/[0-9]/g, function(i) {
6478         return numerals[+i];
6479       });
6480     };
6481   }
6482
6483   function formatDefault(x, p) {
6484     x = x.toPrecision(p);
6485
6486     out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) {
6487       switch (x[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;
6492       }
6493     }
6494
6495     return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;
6496   }
6497
6498   var prefixExponent;
6499
6500   function formatPrefixAuto(x, p) {
6501     var d = formatDecimal(x, p);
6502     if (!d) return x + "";
6503     var coefficient = d[0],
6504         exponent = d[1],
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!
6511   }
6512
6513   function formatRounded(x, p) {
6514     var d = formatDecimal(x, p);
6515     if (!d) return x + "";
6516     var coefficient = d[0],
6517         exponent = d[1];
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");
6521   }
6522
6523   var formatTypes = {
6524     "": formatDefault,
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); },
6534     "r": formatRounded,
6535     "s": formatPrefixAuto,
6536     "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
6537     "x": function(x) { return Math.round(x).toString(16); }
6538   };
6539
6540   // [[fill]align][sign][symbol][0][width][,][.precision][type]
6541   var re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;
6542
6543   function formatSpecifier(specifier) {
6544     return new FormatSpecifier(specifier);
6545   }
6546
6547   formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
6548
6549   function FormatSpecifier(specifier) {
6550     if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
6551
6552     var match,
6553         fill = match[1] || " ",
6554         align = match[2] || ">",
6555         sign = match[3] || "-",
6556         symbol = match[4] || "",
6557         zero = !!match[5],
6558         width = match[6] && +match[6],
6559         comma = !!match[7],
6560         precision = match[8] && +match[8].slice(1),
6561         type = match[9] || "";
6562
6563     // The "n" type is an alias for ",g".
6564     if (type === "n") comma = true, type = "g";
6565
6566     // Map invalid types to the default format.
6567     else if (!formatTypes[type]) type = "";
6568
6569     // If zero fill is specified, padding goes after sign and before digits.
6570     if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
6571
6572     this.fill = fill;
6573     this.align = align;
6574     this.sign = sign;
6575     this.symbol = symbol;
6576     this.zero = zero;
6577     this.width = width;
6578     this.comma = comma;
6579     this.precision = precision;
6580     this.type = type;
6581   }
6582
6583   FormatSpecifier.prototype.toString = function() {
6584     return this.fill
6585         + this.align
6586         + this.sign
6587         + this.symbol
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))
6592         + this.type;
6593   };
6594
6595   function identity$3(x) {
6596     return x;
6597   }
6598
6599   var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
6600
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 || "%";
6607
6608     function newFormat(specifier) {
6609       specifier = formatSpecifier(specifier);
6610
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;
6620
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 : "";
6625
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);
6631
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));
6639
6640       function format(value) {
6641         var valuePrefix = prefix,
6642             valueSuffix = suffix,
6643             i, n, c;
6644
6645         if (type === "c") {
6646           valueSuffix = formatType(value) + valueSuffix;
6647           value = "";
6648         } else {
6649           value = +value;
6650
6651           // Perform the initial formatting.
6652           var valueNegative = value < 0;
6653           value = formatType(Math.abs(value), precision);
6654
6655           // If a negative value rounds to zero during formatting, treat as positive.
6656           if (valueNegative && +value === 0) valueNegative = false;
6657
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 === "(" ? ")" : "");
6661
6662           // Break the formatted value into the integer “value” part that can be
6663           // grouped, and fractional or exponential “suffix” part that is not.
6664           if (maybeSuffix) {
6665             i = -1, n = value.length;
6666             while (++i < n) {
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);
6670                 break;
6671               }
6672             }
6673           }
6674         }
6675
6676         // If the fill character is not "0", grouping is applied before padding.
6677         if (comma && !zero) value = group(value, Infinity);
6678
6679         // Compute the padding.
6680         var length = valuePrefix.length + value.length + valueSuffix.length,
6681             padding = length < width ? new Array(width - length + 1).join(fill) : "";
6682
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 = "";
6685
6686         // Reconstruct the final output based on the desired alignment.
6687         switch (align) {
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;
6692         }
6693
6694         return numerals(value);
6695       }
6696
6697       format.toString = function() {
6698         return specifier + "";
6699       };
6700
6701       return format;
6702     }
6703
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;
6711       };
6712     }
6713
6714     return {
6715       format: newFormat,
6716       formatPrefix: formatPrefix
6717     };
6718   }
6719
6720   var locale;
6721   var format;
6722   var formatPrefix;
6723
6724   defaultLocale({
6725     decimal: ".",
6726     thousands: ",",
6727     grouping: [3],
6728     currency: ["$", ""]
6729   });
6730
6731   function defaultLocale(definition) {
6732     locale = formatLocale(definition);
6733     format = locale.format;
6734     formatPrefix = locale.formatPrefix;
6735     return locale;
6736   }
6737
6738   function precisionFixed(step) {
6739     return Math.max(0, -exponent$1(Math.abs(step)));
6740   }
6741
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)));
6744   }
6745
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;
6749   }
6750
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)
6754   // 305–363 (1997).
6755   // Code adapted from GeographicLib by Charles F. F. Karney,
6756   // http://geographiclib.sourceforge.net/
6757
6758   function adder() {
6759     return new Adder;
6760   }
6761
6762   function Adder() {
6763     this.reset();
6764   }
6765
6766   Adder.prototype = {
6767     constructor: Adder,
6768     reset: function() {
6769       this.s = // rounded value
6770       this.t = 0; // exact error
6771     },
6772     add: function(y) {
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;
6777     },
6778     valueOf: function() {
6779       return this.s;
6780     }
6781   };
6782
6783   var temp = new Adder;
6784
6785   function add$1(adder, a, b) {
6786     var x = adder.s = a + b,
6787         bv = x - a,
6788         av = x - bv;
6789     adder.t = (a - av) + (b - bv);
6790   }
6791
6792   var epsilon$2 = 1e-6;
6793   var epsilon2$1 = 1e-12;
6794   var pi$3 = Math.PI;
6795   var halfPi$2 = pi$3 / 2;
6796   var quarterPi = pi$3 / 4;
6797   var tau$3 = pi$3 * 2;
6798
6799   var degrees$1 = 180 / pi$3;
6800   var radians = pi$3 / 180;
6801
6802   var abs = Math.abs;
6803   var atan = Math.atan;
6804   var atan2 = Math.atan2;
6805   var cos$1 = Math.cos;
6806   var ceil = Math.ceil;
6807   var exp = Math.exp;
6808   var log = Math.log;
6809   var pow = Math.pow;
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;
6813   var tan = Math.tan;
6814
6815   function acos(x) {
6816     return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
6817   }
6818
6819   function asin(x) {
6820     return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
6821   }
6822
6823   function haversin(x) {
6824     return (x = sin$1(x / 2)) * x;
6825   }
6826
6827   function noop$1() {}
6828
6829   function streamGeometry(geometry, stream) {
6830     if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
6831       streamGeometryType[geometry.type](geometry, stream);
6832     }
6833   }
6834
6835   var streamObjectType = {
6836     Feature: function(object, stream) {
6837       streamGeometry(object.geometry, stream);
6838     },
6839     FeatureCollection: function(object, stream) {
6840       var features = object.features, i = -1, n = features.length;
6841       while (++i < n) streamGeometry(features[i].geometry, stream);
6842     }
6843   };
6844
6845   var streamGeometryType = {
6846     Sphere: function(object, stream) {
6847       stream.sphere();
6848     },
6849     Point: function(object, stream) {
6850       object = object.coordinates;
6851       stream.point(object[0], object[1], object[2]);
6852     },
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]);
6856     },
6857     LineString: function(object, stream) {
6858       streamLine(object.coordinates, stream, 0);
6859     },
6860     MultiLineString: function(object, stream) {
6861       var coordinates = object.coordinates, i = -1, n = coordinates.length;
6862       while (++i < n) streamLine(coordinates[i], stream, 0);
6863     },
6864     Polygon: function(object, stream) {
6865       streamPolygon(object.coordinates, stream);
6866     },
6867     MultiPolygon: function(object, stream) {
6868       var coordinates = object.coordinates, i = -1, n = coordinates.length;
6869       while (++i < n) streamPolygon(coordinates[i], stream);
6870     },
6871     GeometryCollection: function(object, stream) {
6872       var geometries = object.geometries, i = -1, n = geometries.length;
6873       while (++i < n) streamGeometry(geometries[i], stream);
6874     }
6875   };
6876
6877   function streamLine(coordinates, stream, closed) {
6878     var i = -1, n = coordinates.length - closed, coordinate;
6879     stream.lineStart();
6880     while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
6881     stream.lineEnd();
6882   }
6883
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();
6889   }
6890
6891   function geoStream(object, stream) {
6892     if (object && streamObjectType.hasOwnProperty(object.type)) {
6893       streamObjectType[object.type](object, stream);
6894     } else {
6895       streamGeometry(object, stream);
6896     }
6897   }
6898
6899   var areaRingSum = adder();
6900
6901   var areaSum = adder(),
6902       lambda00,
6903       phi00,
6904       lambda0,
6905       cosPhi0,
6906       sinPhi0;
6907
6908   var areaStream = {
6909     point: noop$1,
6910     lineStart: noop$1,
6911     lineEnd: noop$1,
6912     polygonStart: function() {
6913       areaRingSum.reset();
6914       areaStream.lineStart = areaRingStart;
6915       areaStream.lineEnd = areaRingEnd;
6916     },
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;
6921     },
6922     sphere: function() {
6923       areaSum.add(tau$3);
6924     }
6925   };
6926
6927   function areaRingStart() {
6928     areaStream.point = areaPointFirst;
6929   }
6930
6931   function areaRingEnd() {
6932     areaPoint(lambda00, phi00);
6933   }
6934
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);
6940   }
6941
6942   function areaPoint(lambda, phi) {
6943     lambda *= radians, phi *= radians;
6944     phi = phi / 2 + quarterPi; // half the angular distance from south pole
6945
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));
6958
6959     // Advance the previous points.
6960     lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
6961   }
6962
6963   function d3_geoArea(object) {
6964     areaSum.reset();
6965     geoStream(object, areaStream);
6966     return areaSum * 2;
6967   }
6968
6969   function spherical(cartesian) {
6970     return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
6971   }
6972
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)];
6976   }
6977
6978   function cartesianDot(a, b) {
6979     return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
6980   }
6981
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]];
6984   }
6985
6986   // TODO return a
6987   function cartesianAddInPlace(a, b) {
6988     a[0] += b[0], a[1] += b[1], a[2] += b[2];
6989   }
6990
6991   function cartesianScale(vector, k) {
6992     return [vector[0] * k, vector[1] * k, vector[2] * k];
6993   }
6994
6995   // TODO return d
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;
6999   }
7000
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
7005       deltaSum = adder(),
7006       ranges,
7007       range$1;
7008
7009   var boundsStream = {
7010     point: boundsPoint,
7011     lineStart: boundsLineStart,
7012     lineEnd: boundsLineEnd,
7013     polygonStart: function() {
7014       boundsStream.point = boundsRingPoint;
7015       boundsStream.lineStart = boundsRingStart;
7016       boundsStream.lineEnd = boundsRingEnd;
7017       deltaSum.reset();
7018       areaStream.polygonStart();
7019     },
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;
7029     }
7030   };
7031
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;
7036   }
7037
7038   function linePoint(lambda, phi) {
7039     var p = cartesian([lambda * radians, phi * radians]);
7040     if (p0) {
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,
7049           phii,
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;
7057       } else {
7058         if (phi < phi0) phi0 = phi;
7059         if (phi > phi1) phi1 = phi;
7060       }
7061       if (antimeridian) {
7062         if (lambda < lambda2) {
7063           if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7064         } else {
7065           if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7066         }
7067       } else {
7068         if (lambda1 >= lambda0$1) {
7069           if (lambda < lambda0$1) lambda0$1 = lambda;
7070           if (lambda > lambda1) lambda1 = lambda;
7071         } else {
7072           if (lambda > lambda2) {
7073             if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7074           } else {
7075             if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7076           }
7077         }
7078       }
7079     } else {
7080       ranges.push(range$1 = [lambda0$1 = lambda, lambda1 = lambda]);
7081     }
7082     if (phi < phi0) phi0 = phi;
7083     if (phi > phi1) phi1 = phi;
7084     p0 = p, lambda2 = lambda;
7085   }
7086
7087   function boundsLineStart() {
7088     boundsStream.point = linePoint;
7089   }
7090
7091   function boundsLineEnd() {
7092     range$1[0] = lambda0$1, range$1[1] = lambda1;
7093     boundsStream.point = boundsPoint;
7094     p0 = null;
7095   }
7096
7097   function boundsRingPoint(lambda, phi) {
7098     if (p0) {
7099       var delta = lambda - lambda2;
7100       deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
7101     } else {
7102       lambda00$1 = lambda, phi00$1 = phi;
7103     }
7104     areaStream.point(lambda, phi);
7105     linePoint(lambda, phi);
7106   }
7107
7108   function boundsRingStart() {
7109     areaStream.lineStart();
7110   }
7111
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;
7117     p0 = null;
7118   }
7119
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;
7125   }
7126
7127   function rangeCompare(a, b) {
7128     return a[0] - b[0];
7129   }
7130
7131   function rangeContains(range, x) {
7132     return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
7133   }
7134
7135   function d3_geoBounds(feature) {
7136     var i, n, a, b, merged, deltaMax, delta;
7137
7138     phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
7139     ranges = [];
7140     geoStream(feature, boundsStream);
7141
7142     // First, sort ranges by their minimum longitudes.
7143     if (n = ranges.length) {
7144       ranges.sort(rangeCompare);
7145
7146       // Then, merge any ranges that overlap.
7147       for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
7148         b = ranges[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];
7152         } else {
7153           merged.push(a = b);
7154         }
7155       }
7156
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) {
7160         b = merged[i];
7161         if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
7162       }
7163     }
7164
7165     ranges = range$1 = null;
7166
7167     return lambda0$1 === Infinity || phi0 === Infinity
7168         ? [[NaN, NaN], [NaN, NaN]]
7169         : [[lambda0$1, phi0], [lambda1, phi1]];
7170   }
7171
7172   var W0, W1,
7173       X0, Y0, Z0,
7174       X1, Y1, Z1,
7175       X2, Y2, Z2,
7176       lambda00$2, phi00$2, // first point
7177       x0, y0, z0; // previous point
7178
7179   var centroidStream = {
7180     sphere: noop$1,
7181     point: centroidPoint,
7182     lineStart: centroidLineStart,
7183     lineEnd: centroidLineEnd,
7184     polygonStart: function() {
7185       centroidStream.lineStart = centroidRingStart;
7186       centroidStream.lineEnd = centroidRingEnd;
7187     },
7188     polygonEnd: function() {
7189       centroidStream.lineStart = centroidLineStart;
7190       centroidStream.lineEnd = centroidLineEnd;
7191     }
7192   };
7193
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));
7199   }
7200
7201   function centroidPointCartesian(x, y, z) {
7202     ++W0;
7203     X0 += (x - X0) / W0;
7204     Y0 += (y - Y0) / W0;
7205     Z0 += (z - Z0) / W0;
7206   }
7207
7208   function centroidLineStart() {
7209     centroidStream.point = centroidLinePointFirst;
7210   }
7211
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);
7217     z0 = sin$1(phi);
7218     centroidStream.point = centroidLinePoint;
7219     centroidPointCartesian(x0, y0, z0);
7220   }
7221
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),
7227         z = sin$1(phi),
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);
7229     W1 += w;
7230     X1 += w * (x0 + (x0 = x));
7231     Y1 += w * (y0 + (y0 = y));
7232     Z1 += w * (z0 + (z0 = z));
7233     centroidPointCartesian(x0, y0, z0);
7234   }
7235
7236   function centroidLineEnd() {
7237     centroidStream.point = centroidPoint;
7238   }
7239
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;
7244   }
7245
7246   function centroidRingEnd() {
7247     centroidRingPoint(lambda00$2, phi00$2);
7248     centroidStream.point = centroidPoint;
7249   }
7250
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);
7258     z0 = sin$1(phi);
7259     centroidPointCartesian(x0, y0, z0);
7260   }
7261
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),
7267         z = sin$1(phi),
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
7274     X2 += v * cx;
7275     Y2 += v * cy;
7276     Z2 += v * cz;
7277     W1 += w;
7278     X1 += w * (x0 + (x0 = x));
7279     Y1 += w * (y0 + (y0 = y));
7280     Z1 += w * (z0 + (z0 = z));
7281     centroidPointCartesian(x0, y0, z0);
7282   }
7283
7284   function d3_geoCentroid(object) {
7285     W0 = W1 =
7286     X0 = Y0 = Z0 =
7287     X1 = Y1 = Z1 =
7288     X2 = Y2 = Z2 = 0;
7289     geoStream(object, centroidStream);
7290
7291     var x = X2,
7292         y = Y2,
7293         z = Z2,
7294         m = x * x + y * y + z * z;
7295
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];
7304     }
7305
7306     return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1];
7307   }
7308
7309   function constant$7(x) {
7310     return function() {
7311       return x;
7312     };
7313   }
7314
7315   function compose(a, b) {
7316
7317     function compose(x, y) {
7318       return x = a(x, y), b(x[0], x[1]);
7319     }
7320
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]);
7323     };
7324
7325     return compose;
7326   }
7327
7328   function rotationIdentity(lambda, phi) {
7329     return [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7330   }
7331
7332   rotationIdentity.invert = rotationIdentity;
7333
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);
7339   }
7340
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];
7344     };
7345   }
7346
7347   function rotationLambda(deltaLambda) {
7348     var rotation = forwardRotationLambda(deltaLambda);
7349     rotation.invert = forwardRotationLambda(-deltaLambda);
7350     return rotation;
7351   }
7352
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);
7358
7359     function rotation(lambda, phi) {
7360       var cosPhi = cos$1(phi),
7361           x = cos$1(lambda) * cosPhi,
7362           y = sin$1(lambda) * cosPhi,
7363           z = sin$1(phi),
7364           k = z * cosDeltaPhi + x * sinDeltaPhi;
7365       return [
7366         atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
7367         asin(k * cosDeltaGamma + y * sinDeltaGamma)
7368       ];
7369     }
7370
7371     rotation.invert = function(lambda, phi) {
7372       var cosPhi = cos$1(phi),
7373           x = cos$1(lambda) * cosPhi,
7374           y = sin$1(lambda) * cosPhi,
7375           z = sin$1(phi),
7376           k = z * cosDeltaGamma - y * sinDeltaGamma;
7377       return [
7378         atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
7379         asin(k * cosDeltaPhi - x * sinDeltaPhi)
7380       ];
7381     };
7382
7383     return rotation;
7384   }
7385
7386   function rotation(rotate) {
7387     rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
7388
7389     function forward(coordinates) {
7390       coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
7391       return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7392     }
7393
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;
7397     };
7398
7399     return forward;
7400   }
7401
7402   // Generates a circle centered at [0°, 0°], with a given radius and precision.
7403   function circleStream(stream, radius, delta, direction, t0, t1) {
7404     if (!delta) return;
7405     var cosRadius = cos$1(radius),
7406         sinRadius = sin$1(radius),
7407         step = direction * delta;
7408     if (t0 == null) {
7409       t0 = radius + direction * tau$3;
7410       t1 = radius - step / 2;
7411     } else {
7412       t0 = circleRadius(cosRadius, t0);
7413       t1 = circleRadius(cosRadius, t1);
7414       if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3;
7415     }
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]);
7419     }
7420   }
7421
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;
7428   }
7429
7430   function circle() {
7431     var center = constant$7([0, 0]),
7432         radius = constant$7(90),
7433         precision = constant$7(6),
7434         ring,
7435         rotate,
7436         stream = {point: point};
7437
7438     function point(x, y) {
7439       ring.push(x = rotate(x, y));
7440       x[0] *= degrees$1, x[1] *= degrees$1;
7441     }
7442
7443     function circle() {
7444       var c = center.apply(this, arguments),
7445           r = radius.apply(this, arguments) * radians,
7446           p = precision.apply(this, arguments) * radians;
7447       ring = [];
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;
7452       return c;
7453     }
7454
7455     circle.center = function(_) {
7456       return arguments.length ? (center = typeof _ === "function" ? _ : constant$7([+_[0], +_[1]]), circle) : center;
7457     };
7458
7459     circle.radius = function(_) {
7460       return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), circle) : radius;
7461     };
7462
7463     circle.precision = function(_) {
7464       return arguments.length ? (precision = typeof _ === "function" ? _ : constant$7(+_), circle) : precision;
7465     };
7466
7467     return circle;
7468   }
7469
7470   function clipBuffer() {
7471     var lines = [],
7472         line;
7473     return {
7474       point: function(x, y) {
7475         line.push([x, y]);
7476       },
7477       lineStart: function() {
7478         lines.push(line = []);
7479       },
7480       lineEnd: noop$1,
7481       rejoin: function() {
7482         if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
7483       },
7484       result: function() {
7485         var result = lines;
7486         lines = [];
7487         line = null;
7488         return result;
7489       }
7490     };
7491   }
7492
7493   function pointEqual(a, b) {
7494     return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2;
7495   }
7496
7497   function Intersection(point, points, other, entry) {
7498     this.x = point;
7499     this.z = points;
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
7504   }
7505
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) {
7510     var subject = [],
7511         clip = [],
7512         i,
7513         n;
7514
7515     segments.forEach(function(segment) {
7516       if ((n = segment.length - 1) <= 0) return;
7517       var n, p0 = segment[0], p1 = segment[n], x;
7518
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)) {
7523         stream.lineStart();
7524         for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
7525         stream.lineEnd();
7526         return;
7527       }
7528
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));
7533     });
7534
7535     if (!subject.length) return;
7536
7537     clip.sort(compareIntersection);
7538     link$1(subject);
7539     link$1(clip);
7540
7541     for (i = 0, n = clip.length; i < n; ++i) {
7542       clip[i].e = startInside = !startInside;
7543     }
7544
7545     var start = subject[0],
7546         points,
7547         point;
7548
7549     while (1) {
7550       // Find first unvisited intersection.
7551       var current = start,
7552           isSubject = true;
7553       while (current.v) if ((current = current.n) === start) return;
7554       points = current.z;
7555       stream.lineStart();
7556       do {
7557         current.v = current.o.v = true;
7558         if (current.e) {
7559           if (isSubject) {
7560             for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
7561           } else {
7562             interpolate(current.x, current.n.x, 1, stream);
7563           }
7564           current = current.n;
7565         } else {
7566           if (isSubject) {
7567             points = current.p.z;
7568             for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
7569           } else {
7570             interpolate(current.x, current.p.x, -1, stream);
7571           }
7572           current = current.p;
7573         }
7574         current = current.o;
7575         points = current.z;
7576         isSubject = !isSubject;
7577       } while (!current.v);
7578       stream.lineEnd();
7579     }
7580   }
7581
7582   function link$1(array) {
7583     if (!(n = array.length)) return;
7584     var n,
7585         i = 0,
7586         a = array[0],
7587         b;
7588     while (++i < n) {
7589       a.n = b = array[i];
7590       b.p = a;
7591       a = b;
7592     }
7593     a.n = b = array[0];
7594     b.p = a;
7595   }
7596
7597   var sum$1 = adder();
7598
7599   function polygonContains(polygon, point) {
7600     var lambda = point[0],
7601         phi = point[1],
7602         normal = [sin$1(lambda), -cos$1(lambda), 0],
7603         angle = 0,
7604         winding = 0;
7605
7606     sum$1.reset();
7607
7608     for (var i = 0, n = polygon.length; i < n; ++i) {
7609       if (!(m = (ring = polygon[i]).length)) continue;
7610       var ring,
7611           m,
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);
7617
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;
7629
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;
7632
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;
7643           }
7644         }
7645       }
7646     }
7647
7648     // First, determine whether the South pole is inside or outside:
7649     //
7650     // It is inside if:
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.
7654     //
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.
7658
7659     return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1);
7660   }
7661
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,
7668           polygon,
7669           segments,
7670           ring;
7671
7672       var clip = {
7673         point: point,
7674         lineStart: lineStart,
7675         lineEnd: lineEnd,
7676         polygonStart: function() {
7677           clip.point = pointRing;
7678           clip.lineStart = ringStart;
7679           clip.lineEnd = ringEnd;
7680           segments = [];
7681           polygon = [];
7682         },
7683         polygonEnd: function() {
7684           clip.point = point;
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;
7694             sink.lineStart();
7695             interpolate(null, null, 1, sink);
7696             sink.lineEnd();
7697           }
7698           if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
7699           segments = polygon = null;
7700         },
7701         sphere: function() {
7702           sink.polygonStart();
7703           sink.lineStart();
7704           interpolate(null, null, 1, sink);
7705           sink.lineEnd();
7706           sink.polygonEnd();
7707         }
7708       };
7709
7710       function point(lambda, phi) {
7711         if (pointVisible(lambda, phi)) sink.point(lambda, phi);
7712       }
7713
7714       function pointLine(lambda, phi) {
7715         line.point(lambda, phi);
7716       }
7717
7718       function lineStart() {
7719         clip.point = pointLine;
7720         line.lineStart();
7721       }
7722
7723       function lineEnd() {
7724         clip.point = point;
7725         line.lineEnd();
7726       }
7727
7728       function pointRing(lambda, phi) {
7729         ring.push([lambda, phi]);
7730         ringSink.point(lambda, phi);
7731       }
7732
7733       function ringStart() {
7734         ringSink.lineStart();
7735         ring = [];
7736       }
7737
7738       function ringEnd() {
7739         pointRing(ring[0][0], ring[0][1]);
7740         ringSink.lineEnd();
7741
7742         var clean = ringSink.clean(),
7743             ringSegments = ringBuffer.result(),
7744             i, n = ringSegments.length, m,
7745             segment,
7746             point;
7747
7748         ring.pop();
7749         polygon.push(ring);
7750         ring = null;
7751
7752         if (!n) return;
7753
7754         // No intersections.
7755         if (clean & 1) {
7756           segment = ringSegments[0];
7757           if ((m = segment.length - 1) > 0) {
7758             if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7759             sink.lineStart();
7760             for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
7761             sink.lineEnd();
7762           }
7763           return;
7764         }
7765
7766         // Rejoin connected segments.
7767         // TODO reuse ringBuffer.rejoin()?
7768         if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
7769
7770         segments.push(ringSegments.filter(validSegment));
7771       }
7772
7773       return clip;
7774     };
7775   }
7776
7777   function validSegment(segment) {
7778     return segment.length > 1;
7779   }
7780
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]);
7786   }
7787
7788   var clipAntimeridian = clip(
7789     function() { return true; },
7790     clipAntimeridianLine,
7791     clipAntimeridianInterpolate,
7792     [-pi$3, -halfPi$2]
7793   );
7794
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) {
7799     var lambda0 = NaN,
7800         phi0 = NaN,
7801         sign0 = NaN,
7802         clean; // no intersections
7803
7804     return {
7805       lineStart: function() {
7806         stream.lineStart();
7807         clean = 1;
7808       },
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);
7815           stream.lineEnd();
7816           stream.lineStart();
7817           stream.point(sign1, phi0);
7818           stream.point(lambda1, phi0);
7819           clean = 0;
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);
7825           stream.lineEnd();
7826           stream.lineStart();
7827           stream.point(sign1, phi0);
7828           clean = 0;
7829         }
7830         stream.point(lambda0 = lambda1, phi0 = phi1);
7831         sign0 = sign1;
7832       },
7833       lineEnd: function() {
7834         stream.lineEnd();
7835         lambda0 = phi0 = NaN;
7836       },
7837       clean: function() {
7838         return 2 - clean; // if intersections, rejoin first and last segments
7839       }
7840     };
7841   }
7842
7843   function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
7844     var cosPhi0,
7845         cosPhi1,
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;
7852   }
7853
7854   function clipAntimeridianInterpolate(from, to, direction, stream) {
7855     var phi;
7856     if (from == null) {
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);
7873     } else {
7874       stream.point(to[0], to[1]);
7875     }
7876   }
7877
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
7883
7884     function interpolate(from, to, direction, stream) {
7885       circleStream(stream, radius, delta, direction, from, to);
7886     }
7887
7888     function visible(lambda, phi) {
7889       return cos$1(lambda) * cos$1(phi) > cr;
7890     }
7891
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
7902       return {
7903         lineStart: function() {
7904           v00 = v0 = false;
7905           clean = 1;
7906         },
7907         point: function(lambda, phi) {
7908           var point1 = [lambda, phi],
7909               point2,
7910               v = visible(lambda, phi),
7911               c = smallRadius
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.
7917           if (v !== v0) {
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]);
7923             }
7924           }
7925           if (v !== v0) {
7926             clean = 0;
7927             if (v) {
7928               // outside going in
7929               stream.lineStart();
7930               point2 = intersect(point1, point0);
7931               stream.point(point2[0], point2[1]);
7932             } else {
7933               // inside going out
7934               point2 = intersect(point0, point1);
7935               stream.point(point2[0], point2[1]);
7936               stream.lineEnd();
7937             }
7938             point0 = point2;
7939           } else if (notHemisphere && point0 && smallRadius ^ v) {
7940             var t;
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))) {
7944               clean = 0;
7945               if (smallRadius) {
7946                 stream.lineStart();
7947                 stream.point(t[0][0], t[0][1]);
7948                 stream.point(t[1][0], t[1][1]);
7949                 stream.lineEnd();
7950               } else {
7951                 stream.point(t[1][0], t[1][1]);
7952                 stream.lineEnd();
7953                 stream.lineStart();
7954                 stream.point(t[0][0], t[0][1]);
7955               }
7956             }
7957           }
7958           if (v && (!point0 || !pointEqual(point0, point1))) {
7959             stream.point(point1[0], point1[1]);
7960           }
7961           point0 = point1, v0 = v, c0 = c;
7962         },
7963         lineEnd: function() {
7964           if (v0) stream.lineEnd();
7965           point0 = null;
7966         },
7967         // Rejoin first and last segments if there were intersections and the first
7968         // and last points were visible.
7969         clean: function() {
7970           return clean | ((v00 && v0) << 1);
7971         }
7972       };
7973     }
7974
7975     // Intersects the great circle between a and b with the clip circle.
7976     function intersect(a, b, two) {
7977       var pa = cartesian(a),
7978           pb = cartesian(b);
7979
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;
7987
7988       // Two polar points.
7989       if (!determinant) return !two && a;
7990
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);
7997
7998       // Solve |p(t)|^2 = 1.
7999       var u = n1xn2,
8000           w = cartesianDot(A, u),
8001           uu = cartesianDot(u, u),
8002           t2 = w * w - uu * (cartesianDot(A, A) - 1);
8003
8004       if (t2 < 0) return;
8005
8006       var t = sqrt(t2),
8007           q = cartesianScale(u, (-w - t) / uu);
8008       cartesianAddInPlace(q, A);
8009       q = spherical(q);
8010
8011       if (!two) return q;
8012
8013       // Two intersection points.
8014       var lambda0 = a[0],
8015           lambda1 = b[0],
8016           phi0 = a[1],
8017           phi1 = b[1],
8018           z;
8019
8020       if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
8021
8022       var delta = lambda1 - lambda0,
8023           polar = abs(delta - pi$3) < epsilon$2,
8024           meridian = polar || delta < epsilon$2;
8025
8026       if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
8027
8028       // Check that the first point is between a and b.
8029       if (meridian
8030           ? polar
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)];
8037       }
8038     }
8039
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,
8044           code = 0;
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
8049       return code;
8050     }
8051
8052     return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
8053   }
8054
8055   function clipLine(a, b, x0, y0, x1, y1) {
8056     var ax = a[0],
8057         ay = a[1],
8058         bx = b[0],
8059         by = b[1],
8060         t0 = 0,
8061         t1 = 1,
8062         dx = bx - ax,
8063         dy = by - ay,
8064         r;
8065
8066     r = x0 - ax;
8067     if (!dx && r > 0) return;
8068     r /= dx;
8069     if (dx < 0) {
8070       if (r < t0) return;
8071       if (r < t1) t1 = r;
8072     } else if (dx > 0) {
8073       if (r > t1) return;
8074       if (r > t0) t0 = r;
8075     }
8076
8077     r = x1 - ax;
8078     if (!dx && r < 0) return;
8079     r /= dx;
8080     if (dx < 0) {
8081       if (r > t1) return;
8082       if (r > t0) t0 = r;
8083     } else if (dx > 0) {
8084       if (r < t0) return;
8085       if (r < t1) t1 = r;
8086     }
8087
8088     r = y0 - ay;
8089     if (!dy && r > 0) return;
8090     r /= dy;
8091     if (dy < 0) {
8092       if (r < t0) return;
8093       if (r < t1) t1 = r;
8094     } else if (dy > 0) {
8095       if (r > t1) return;
8096       if (r > t0) t0 = r;
8097     }
8098
8099     r = y1 - ay;
8100     if (!dy && r < 0) return;
8101     r /= dy;
8102     if (dy < 0) {
8103       if (r > t1) return;
8104       if (r > t0) t0 = r;
8105     } else if (dy > 0) {
8106       if (r < t0) return;
8107       if (r < t1) t1 = r;
8108     }
8109
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;
8112     return true;
8113   }
8114
8115   var clipMax = 1e9, clipMin = -clipMax;
8116
8117   // TODO Use d3-polygon’s polygonContains here for the ring check?
8118   // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
8119
8120   function clipRectangle(x0, y0, x1, y1) {
8121
8122     function visible(x, y) {
8123       return x0 <= x && x <= x1 && y0 <= y && y <= y1;
8124     }
8125
8126     function interpolate(from, to, direction, stream) {
8127       var a = 0, a1 = 0;
8128       if (from == null
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);
8133       } else {
8134         stream.point(to[0], to[1]);
8135       }
8136     }
8137
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
8143     }
8144
8145     function compareIntersection(a, b) {
8146       return comparePoint(a.x, b.x);
8147     }
8148
8149     function comparePoint(a, b) {
8150       var ca = corner(a, 1),
8151           cb = corner(b, 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]
8156           : b[0] - a[0];
8157     }
8158
8159     return function(stream) {
8160       var activeStream = stream,
8161           bufferStream = clipBuffer(),
8162           segments,
8163           polygon,
8164           ring,
8165           x__, y__, v__, // first point
8166           x_, y_, v_, // previous point
8167           first,
8168           clean;
8169
8170       var clipStream = {
8171         point: point,
8172         lineStart: lineStart,
8173         lineEnd: lineEnd,
8174         polygonStart: polygonStart,
8175         polygonEnd: polygonEnd
8176       };
8177
8178       function point(x, y) {
8179         if (visible(x, y)) activeStream.point(x, y);
8180       }
8181
8182       function polygonInside() {
8183         var winding = 0;
8184
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; }
8190           }
8191         }
8192
8193         return winding;
8194       }
8195
8196       // Buffer geometry within a polygon and then clip it en masse.
8197       function polygonStart() {
8198         activeStream = bufferStream, segments = [], polygon = [], clean = true;
8199       }
8200
8201       function polygonEnd() {
8202         var startInside = polygonInside(),
8203             cleanInside = clean && startInside,
8204             visible = (segments = merge(segments)).length;
8205         if (cleanInside || visible) {
8206           stream.polygonStart();
8207           if (cleanInside) {
8208             stream.lineStart();
8209             interpolate(null, null, 1, stream);
8210             stream.lineEnd();
8211           }
8212           if (visible) {
8213             clipRejoin(segments, compareIntersection, startInside, interpolate, stream);
8214           }
8215           stream.polygonEnd();
8216         }
8217         activeStream = stream, segments = polygon = ring = null;
8218       }
8219
8220       function lineStart() {
8221         clipStream.point = linePoint;
8222         if (polygon) polygon.push(ring = []);
8223         first = true;
8224         v_ = false;
8225         x_ = y_ = NaN;
8226       }
8227
8228       // TODO rather than special-case polygons, simply handle them separately.
8229       // Ideally, coincident intersection points should be jittered to avoid
8230       // clipping issues.
8231       function lineEnd() {
8232         if (segments) {
8233           linePoint(x__, y__);
8234           if (v__ && v_) bufferStream.rejoin();
8235           segments.push(bufferStream.result());
8236         }
8237         clipStream.point = point;
8238         if (v_) activeStream.lineEnd();
8239       }
8240
8241       function linePoint(x, y) {
8242         var v = visible(x, y);
8243         if (polygon) ring.push([x, y]);
8244         if (first) {
8245           x__ = x, y__ = y, v__ = v;
8246           first = false;
8247           if (v) {
8248             activeStream.lineStart();
8249             activeStream.point(x, y);
8250           }
8251         } else {
8252           if (v && v_) activeStream.point(x, y);
8253           else {
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)) {
8257               if (!v_) {
8258                 activeStream.lineStart();
8259                 activeStream.point(a[0], a[1]);
8260               }
8261               activeStream.point(b[0], b[1]);
8262               if (!v) activeStream.lineEnd();
8263               clean = false;
8264             } else if (v) {
8265               activeStream.lineStart();
8266               activeStream.point(x, y);
8267               clean = false;
8268             }
8269           }
8270         }
8271         x_ = x, y_ = y, v_ = v;
8272       }
8273
8274       return clipStream;
8275     };
8276   }
8277
8278   function extent$1() {
8279     var x0 = 0,
8280         y0 = 0,
8281         x1 = 960,
8282         y1 = 500,
8283         cache,
8284         cacheStream,
8285         clip;
8286
8287     return clip = {
8288       stream: function(stream) {
8289         return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);
8290       },
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]];
8293       }
8294     };
8295   }
8296
8297   var lengthSum = adder(),
8298       lambda0$2,
8299       sinPhi0$1,
8300       cosPhi0$1;
8301
8302   var lengthStream = {
8303     sphere: noop$1,
8304     point: noop$1,
8305     lineStart: lengthLineStart,
8306     lineEnd: noop$1,
8307     polygonStart: noop$1,
8308     polygonEnd: noop$1
8309   };
8310
8311   function lengthLineStart() {
8312     lengthStream.point = lengthPointFirst;
8313     lengthStream.lineEnd = lengthLineEnd;
8314   }
8315
8316   function lengthLineEnd() {
8317     lengthStream.point = lengthStream.lineEnd = noop$1;
8318   }
8319
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;
8324   }
8325
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;
8338   }
8339
8340   function length$1(object) {
8341     lengthSum.reset();
8342     geoStream(object, lengthStream);
8343     return +lengthSum;
8344   }
8345
8346   var coordinates = [null, null],
8347       object$1 = {type: "LineString", coordinates: coordinates};
8348
8349   function distance(a, b) {
8350     coordinates[0] = a;
8351     coordinates[1] = b;
8352     return length$1(object$1);
8353   }
8354
8355   var containsObjectType = {
8356     Feature: function(object, point) {
8357       return containsGeometry(object.geometry, point);
8358     },
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;
8362       return false;
8363     }
8364   };
8365
8366   var containsGeometryType = {
8367     Sphere: function() {
8368       return true;
8369     },
8370     Point: function(object, point) {
8371       return containsPoint(object.coordinates, point);
8372     },
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;
8376       return false;
8377     },
8378     LineString: function(object, point) {
8379       return containsLine(object.coordinates, point);
8380     },
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;
8384       return false;
8385     },
8386     Polygon: function(object, point) {
8387       return containsPolygon(object.coordinates, point);
8388     },
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;
8392       return false;
8393     },
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;
8397       return false;
8398     }
8399   };
8400
8401   function containsGeometry(geometry, point) {
8402     return geometry && containsGeometryType.hasOwnProperty(geometry.type)
8403         ? containsGeometryType[geometry.type](geometry, point)
8404         : false;
8405   }
8406
8407   function containsPoint(coordinates, point) {
8408     return distance(coordinates, point) === 0;
8409   }
8410
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;
8416   }
8417
8418   function containsPolygon(coordinates, point) {
8419     return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
8420   }
8421
8422   function ringRadians(ring) {
8423     return ring = ring.map(pointRadians), ring.pop(), ring;
8424   }
8425
8426   function pointRadians(point) {
8427     return [point[0] * radians, point[1] * radians];
8428   }
8429
8430   function contains(object, point) {
8431     return (object && containsObjectType.hasOwnProperty(object.type)
8432         ? containsObjectType[object.type]
8433         : containsGeometry)(object, point);
8434   }
8435
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]; }); };
8439   }
8440
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]; }); };
8444   }
8445
8446   function graticule() {
8447     var x1, x0, X1, X0,
8448         y1, y0, Y1, Y0,
8449         dx = 10, dy = dx, DX = 90, DY = 360,
8450         x, y, X, Y,
8451         precision = 2.5;
8452
8453     function graticule() {
8454       return {type: "MultiLineString", coordinates: lines()};
8455     }
8456
8457     function 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));
8462     }
8463
8464     graticule.lines = function() {
8465       return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
8466     };
8467
8468     graticule.outline = function() {
8469       return {
8470         type: "Polygon",
8471         coordinates: [
8472           X(X0).concat(
8473           Y(Y1).slice(1),
8474           X(X1).reverse().slice(1),
8475           Y(Y0).reverse().slice(1))
8476         ]
8477       };
8478     };
8479
8480     graticule.extent = function(_) {
8481       if (!arguments.length) return graticule.extentMinor();
8482       return graticule.extentMajor(_).extentMinor(_);
8483     };
8484
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);
8492     };
8493
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);
8501     };
8502
8503     graticule.step = function(_) {
8504       if (!arguments.length) return graticule.stepMinor();
8505       return graticule.stepMajor(_).stepMinor(_);
8506     };
8507
8508     graticule.stepMajor = function(_) {
8509       if (!arguments.length) return [DX, DY];
8510       DX = +_[0], DY = +_[1];
8511       return graticule;
8512     };
8513
8514     graticule.stepMinor = function(_) {
8515       if (!arguments.length) return [dx, dy];
8516       dx = +_[0], dy = +_[1];
8517       return graticule;
8518     };
8519
8520     graticule.precision = function(_) {
8521       if (!arguments.length) return precision;
8522       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);
8527       return graticule;
8528     };
8529
8530     return graticule
8531         .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]])
8532         .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]);
8533   }
8534
8535   function graticule10() {
8536     return graticule()();
8537   }
8538
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,
8544         cy0 = cos$1(y0),
8545         sy0 = sin$1(y0),
8546         cy1 = cos$1(y1),
8547         sy1 = sin$1(y1),
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))),
8553         k = sin$1(d);
8554
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;
8561       return [
8562         atan2(y, x) * degrees$1,
8563         atan2(z, sqrt(x * x + y * y)) * degrees$1
8564       ];
8565     } : function() {
8566       return [x0 * degrees$1, y0 * degrees$1];
8567     };
8568
8569     interpolate.distance = d;
8570
8571     return interpolate;
8572   }
8573
8574   function identity$4(x) {
8575     return x;
8576   }
8577
8578   var areaSum$1 = adder(),
8579       areaRingSum$1 = adder(),
8580       x00,
8581       y00,
8582       x0$1,
8583       y0$1;
8584
8585   var areaStream$1 = {
8586     point: noop$1,
8587     lineStart: noop$1,
8588     lineEnd: noop$1,
8589     polygonStart: function() {
8590       areaStream$1.lineStart = areaRingStart$1;
8591       areaStream$1.lineEnd = areaRingEnd$1;
8592     },
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();
8597     },
8598     result: function() {
8599       var area = areaSum$1 / 2;
8600       areaSum$1.reset();
8601       return area;
8602     }
8603   };
8604
8605   function areaRingStart$1() {
8606     areaStream$1.point = areaPointFirst$1;
8607   }
8608
8609   function areaPointFirst$1(x, y) {
8610     areaStream$1.point = areaPoint$1;
8611     x00 = x0$1 = x, y00 = y0$1 = y;
8612   }
8613
8614   function areaPoint$1(x, y) {
8615     areaRingSum$1.add(y0$1 * x - x0$1 * y);
8616     x0$1 = x, y0$1 = y;
8617   }
8618
8619   function areaRingEnd$1() {
8620     areaPoint$1(x00, y00);
8621   }
8622
8623   var x0$2 = Infinity,
8624       y0$2 = x0$2,
8625       x1 = -x0$2,
8626       y1 = x1;
8627
8628   var boundsStream$1 = {
8629     point: boundsPoint$1,
8630     lineStart: noop$1,
8631     lineEnd: noop$1,
8632     polygonStart: noop$1,
8633     polygonEnd: noop$1,
8634     result: function() {
8635       var bounds = [[x0$2, y0$2], [x1, y1]];
8636       x1 = y1 = -(y0$2 = x0$2 = Infinity);
8637       return bounds;
8638     }
8639   };
8640
8641   function boundsPoint$1(x, y) {
8642     if (x < x0$2) x0$2 = x;
8643     if (x > x1) x1 = x;
8644     if (y < y0$2) y0$2 = y;
8645     if (y > y1) y1 = y;
8646   }
8647
8648   // TODO Enforce positive area for exterior, negative area for interior?
8649
8650   var X0$1 = 0,
8651       Y0$1 = 0,
8652       Z0$1 = 0,
8653       X1$1 = 0,
8654       Y1$1 = 0,
8655       Z1$1 = 0,
8656       X2$1 = 0,
8657       Y2$1 = 0,
8658       Z2$1 = 0,
8659       x00$1,
8660       y00$1,
8661       x0$3,
8662       y0$3;
8663
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;
8671     },
8672     polygonEnd: function() {
8673       centroidStream$1.point = centroidPoint$1;
8674       centroidStream$1.lineStart = centroidLineStart$1;
8675       centroidStream$1.lineEnd = centroidLineEnd$1;
8676     },
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]
8681           : [NaN, NaN];
8682       X0$1 = Y0$1 = Z0$1 =
8683       X1$1 = Y1$1 = Z1$1 =
8684       X2$1 = Y2$1 = Z2$1 = 0;
8685       return centroid;
8686     }
8687   };
8688
8689   function centroidPoint$1(x, y) {
8690     X0$1 += x;
8691     Y0$1 += y;
8692     ++Z0$1;
8693   }
8694
8695   function centroidLineStart$1() {
8696     centroidStream$1.point = centroidPointFirstLine;
8697   }
8698
8699   function centroidPointFirstLine(x, y) {
8700     centroidStream$1.point = centroidPointLine;
8701     centroidPoint$1(x0$3 = x, y0$3 = y);
8702   }
8703
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;
8708     Z1$1 += z;
8709     centroidPoint$1(x0$3 = x, y0$3 = y);
8710   }
8711
8712   function centroidLineEnd$1() {
8713     centroidStream$1.point = centroidPoint$1;
8714   }
8715
8716   function centroidRingStart$1() {
8717     centroidStream$1.point = centroidPointFirstRing;
8718   }
8719
8720   function centroidRingEnd$1() {
8721     centroidPointRing(x00$1, y00$1);
8722   }
8723
8724   function centroidPointFirstRing(x, y) {
8725     centroidStream$1.point = centroidPointRing;
8726     centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
8727   }
8728
8729   function centroidPointRing(x, y) {
8730     var dx = x - x0$3,
8731         dy = y - y0$3,
8732         z = sqrt(dx * dx + dy * dy);
8733
8734     X1$1 += z * (x0$3 + x) / 2;
8735     Y1$1 += z * (y0$3 + y) / 2;
8736     Z1$1 += z;
8737
8738     z = y0$3 * x - x0$3 * y;
8739     X2$1 += z * (x0$3 + x);
8740     Y2$1 += z * (y0$3 + y);
8741     Z2$1 += z * 3;
8742     centroidPoint$1(x0$3 = x, y0$3 = y);
8743   }
8744
8745   function PathContext(context) {
8746     this._context = context;
8747   }
8748
8749   PathContext.prototype = {
8750     _radius: 4.5,
8751     pointRadius: function(_) {
8752       return this._radius = _, this;
8753     },
8754     polygonStart: function() {
8755       this._line = 0;
8756     },
8757     polygonEnd: function() {
8758       this._line = NaN;
8759     },
8760     lineStart: function() {
8761       this._point = 0;
8762     },
8763     lineEnd: function() {
8764       if (this._line === 0) this._context.closePath();
8765       this._point = NaN;
8766     },
8767     point: function(x, y) {
8768       switch (this._point) {
8769         case 0: {
8770           this._context.moveTo(x, y);
8771           this._point = 1;
8772           break;
8773         }
8774         case 1: {
8775           this._context.lineTo(x, y);
8776           break;
8777         }
8778         default: {
8779           this._context.moveTo(x + this._radius, y);
8780           this._context.arc(x, y, this._radius, 0, tau$3);
8781           break;
8782         }
8783       }
8784     },
8785     result: noop$1
8786   };
8787
8788   var lengthSum$1 = adder(),
8789       lengthRing,
8790       x00$2,
8791       y00$2,
8792       x0$4,
8793       y0$4;
8794
8795   var lengthStream$1 = {
8796     point: noop$1,
8797     lineStart: function() {
8798       lengthStream$1.point = lengthPointFirst$1;
8799     },
8800     lineEnd: function() {
8801       if (lengthRing) lengthPoint$1(x00$2, y00$2);
8802       lengthStream$1.point = noop$1;
8803     },
8804     polygonStart: function() {
8805       lengthRing = true;
8806     },
8807     polygonEnd: function() {
8808       lengthRing = null;
8809     },
8810     result: function() {
8811       var length = +lengthSum$1;
8812       lengthSum$1.reset();
8813       return length;
8814     }
8815   };
8816
8817   function lengthPointFirst$1(x, y) {
8818     lengthStream$1.point = lengthPoint$1;
8819     x00$2 = x0$4 = x, y00$2 = y0$4 = y;
8820   }
8821
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));
8825     x0$4 = x, y0$4 = y;
8826   }
8827
8828   function PathString() {
8829     this._string = [];
8830   }
8831
8832   PathString.prototype = {
8833     _radius: 4.5,
8834     _circle: circle$1(4.5),
8835     pointRadius: function(_) {
8836       if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
8837       return this;
8838     },
8839     polygonStart: function() {
8840       this._line = 0;
8841     },
8842     polygonEnd: function() {
8843       this._line = NaN;
8844     },
8845     lineStart: function() {
8846       this._point = 0;
8847     },
8848     lineEnd: function() {
8849       if (this._line === 0) this._string.push("Z");
8850       this._point = NaN;
8851     },
8852     point: function(x, y) {
8853       switch (this._point) {
8854         case 0: {
8855           this._string.push("M", x, ",", y);
8856           this._point = 1;
8857           break;
8858         }
8859         case 1: {
8860           this._string.push("L", x, ",", y);
8861           break;
8862         }
8863         default: {
8864           if (this._circle == null) this._circle = circle$1(this._radius);
8865           this._string.push("M", x, ",", y, this._circle);
8866           break;
8867         }
8868       }
8869     },
8870     result: function() {
8871       if (this._string.length) {
8872         var result = this._string.join("");
8873         this._string = [];
8874         return result;
8875       } else {
8876         return null;
8877       }
8878     }
8879   };
8880
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
8885         + "z";
8886   }
8887
8888   function d3_geoPath(projection, context) {
8889     var pointRadius = 4.5,
8890         projectionStream,
8891         contextStream;
8892
8893     function path(object) {
8894       if (object) {
8895         if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
8896         geoStream(object, projectionStream(contextStream));
8897       }
8898       return contextStream.result();
8899     }
8900
8901     path.area = function(object) {
8902       geoStream(object, projectionStream(areaStream$1));
8903       return areaStream$1.result();
8904     };
8905
8906     path.measure = function(object) {
8907       geoStream(object, projectionStream(lengthStream$1));
8908       return lengthStream$1.result();
8909     };
8910
8911     path.bounds = function(object) {
8912       geoStream(object, projectionStream(boundsStream$1));
8913       return boundsStream$1.result();
8914     };
8915
8916     path.centroid = function(object) {
8917       geoStream(object, projectionStream(centroidStream$1));
8918       return centroidStream$1.result();
8919     };
8920
8921     path.projection = function(_) {
8922       return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
8923     };
8924
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);
8929       return path;
8930     };
8931
8932     path.pointRadius = function(_) {
8933       if (!arguments.length) return pointRadius;
8934       pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
8935       return path;
8936     };
8937
8938     return path.projection(projection).context(context);
8939   }
8940
8941   function d3_geoTransform(methods) {
8942     return {
8943       stream: transformer(methods)
8944     };
8945   }
8946
8947   function transformer(methods) {
8948     return function(stream) {
8949       var s = new TransformStream;
8950       for (var key in methods) s[key] = methods[key];
8951       s.stream = stream;
8952       return s;
8953     };
8954   }
8955
8956   function TransformStream() {}
8957
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(); }
8966   };
8967
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);
8975     return projection;
8976   }
8977
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]);
8986     }, object);
8987   }
8988
8989   function fitSize(projection, size, object) {
8990     return fitExtent(projection, [[0, 0], size], object);
8991   }
8992
8993   function fitWidth(projection, width, object) {
8994     return fit(projection, function(b) {
8995       var w = +width,
8996           k = w / (b[1][0] - b[0][0]),
8997           x = (w - k * (b[1][0] + b[0][0])) / 2,
8998           y = -k * b[0][1];
8999       projection.scale(150 * k).translate([x, y]);
9000     }, object);
9001   }
9002
9003   function fitHeight(projection, height, object) {
9004     return fit(projection, function(b) {
9005       var h = +height,
9006           k = h / (b[1][1] - b[0][1]),
9007           x = -k * b[0][0],
9008           y = (h - k * (b[1][1] + b[0][1])) / 2;
9009       projection.scale(150 * k).translate([x, y]);
9010     }, object);
9011   }
9012
9013   var maxDepth = 16, // maximum depth of subdivision
9014       cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance)
9015
9016   function resample(project, delta2) {
9017     return +delta2 ? resample$1(project, delta2) : resampleNone(project);
9018   }
9019
9020   function resampleNone(project) {
9021     return transformer({
9022       point: function(x, y) {
9023         x = project(x, y);
9024         this.stream.point(x[0], x[1]);
9025       }
9026     });
9027   }
9028
9029   function resample$1(project, delta2) {
9030
9031     function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
9032       var dx = x1 - x0,
9033           dy = y1 - y0,
9034           d2 = dx * dx + dy * dy;
9035       if (d2 > 4 * delta2 && depth--) {
9036         var a = a0 + a1,
9037             b = b0 + b1,
9038             c = c0 + c1,
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),
9043             x2 = p[0],
9044             y2 = p[1],
9045             dx2 = x2 - x0,
9046             dy2 = y2 - y0,
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);
9054         }
9055       }
9056     }
9057     return function(stream) {
9058       var lambda00, x00, y00, a00, b00, c00, // first point
9059           lambda0, x0, y0, a0, b0, c0; // previous point
9060
9061       var resampleStream = {
9062         point: point,
9063         lineStart: lineStart,
9064         lineEnd: lineEnd,
9065         polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
9066         polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
9067       };
9068
9069       function point(x, y) {
9070         x = project(x, y);
9071         stream.point(x[0], x[1]);
9072       }
9073
9074       function lineStart() {
9075         x0 = NaN;
9076         resampleStream.point = linePoint;
9077         stream.lineStart();
9078       }
9079
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);
9084       }
9085
9086       function lineEnd() {
9087         resampleStream.point = point;
9088         stream.lineEnd();
9089       }
9090
9091       function ringStart() {
9092         lineStart();
9093         resampleStream.point = ringPoint;
9094         resampleStream.lineEnd = ringEnd;
9095       }
9096
9097       function ringPoint(lambda, phi) {
9098         linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
9099         resampleStream.point = linePoint;
9100       }
9101
9102       function ringEnd() {
9103         resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
9104         resampleStream.lineEnd = lineEnd;
9105         lineEnd();
9106       }
9107
9108       return resampleStream;
9109     };
9110   }
9111
9112   var transformRadians = transformer({
9113     point: function(x, y) {
9114       this.stream.point(x * radians, y * radians);
9115     }
9116   });
9117
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]);
9123       }
9124     });
9125   }
9126
9127   function projection(project) {
9128     return projectionMutator(function() { return project; })();
9129   }
9130
9131   function projectionMutator(projectAt) {
9132     var project,
9133         k = 150, // scale
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
9140         cache,
9141         cacheStream;
9142
9143     function projection(point) {
9144       point = projectRotate(point[0] * radians, point[1] * radians);
9145       return [point[0] * k + dx, dy - point[1] * k];
9146     }
9147
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];
9151     }
9152
9153     function projectTransform(x, y) {
9154       return x = project(x, y), [x[0] * k + dx, dy - x[1] * k];
9155     }
9156
9157     projection.stream = function(stream) {
9158       return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
9159     };
9160
9161     projection.preclip = function(_) {
9162       return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
9163     };
9164
9165     projection.postclip = function(_) {
9166       return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9167     };
9168
9169     projection.clipAngle = function(_) {
9170       return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
9171     };
9172
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]];
9175     };
9176
9177     projection.scale = function(_) {
9178       return arguments.length ? (k = +_, recenter()) : k;
9179     };
9180
9181     projection.translate = function(_) {
9182       return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
9183     };
9184
9185     projection.center = function(_) {
9186       return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
9187     };
9188
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];
9191     };
9192
9193     projection.precision = function(_) {
9194       return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
9195     };
9196
9197     projection.fitExtent = function(extent, object) {
9198       return fitExtent(projection, extent, object);
9199     };
9200
9201     projection.fitSize = function(size, object) {
9202       return fitSize(projection, size, object);
9203     };
9204
9205     projection.fitWidth = function(width, object) {
9206       return fitWidth(projection, width, object);
9207     };
9208
9209     projection.fitHeight = function(height, object) {
9210       return fitHeight(projection, height, object);
9211     };
9212
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;
9218       return reset();
9219     }
9220
9221     function reset() {
9222       cache = cacheStream = null;
9223       return projection;
9224     }
9225
9226     return function() {
9227       project = projectAt.apply(this, arguments);
9228       projection.invert = project.invert && invert;
9229       return recenter();
9230     };
9231   }
9232
9233   function conicProjection(projectAt) {
9234     var phi0 = 0,
9235         phi1 = pi$3 / 3,
9236         m = projectionMutator(projectAt),
9237         p = m(phi0, phi1);
9238
9239     p.parallels = function(_) {
9240       return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1];
9241     };
9242
9243     return p;
9244   }
9245
9246   function cylindricalEqualAreaRaw(phi0) {
9247     var cosPhi0 = cos$1(phi0);
9248
9249     function forward(lambda, phi) {
9250       return [lambda * cosPhi0, sin$1(phi) / cosPhi0];
9251     }
9252
9253     forward.invert = function(x, y) {
9254       return [x / cosPhi0, asin(y * cosPhi0)];
9255     };
9256
9257     return forward;
9258   }
9259
9260   function conicEqualAreaRaw(y0, y1) {
9261     var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2;
9262
9263     // Are the parallels symmetrical around the Equator?
9264     if (abs(n) < epsilon$2) return cylindricalEqualAreaRaw(y0);
9265
9266     var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;
9267
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)];
9271     }
9272
9273     project.invert = function(x, y) {
9274       var r0y = r0 - y;
9275       return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
9276     };
9277
9278     return project;
9279   }
9280
9281   function conicEqualArea() {
9282     return conicProjection(conicEqualAreaRaw)
9283         .scale(155.424)
9284         .center([0, 33.6442]);
9285   }
9286
9287   function albers() {
9288     return conicEqualArea()
9289         .parallels([29.5, 45.5])
9290         .scale(1070)
9291         .translate([480, 250])
9292         .rotate([96, 0])
9293         .center([-0.6, 38.7]);
9294   }
9295
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;
9300     return {
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(); }
9307     };
9308   }
9309
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() {
9316     var cache,
9317         cacheStream,
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]; }};
9322
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);
9329     }
9330
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);
9339     };
9340
9341     albersUsa.stream = function(stream) {
9342       return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
9343     };
9344
9345     albersUsa.precision = function(_) {
9346       if (!arguments.length) return lower48.precision();
9347       lower48.precision(_), alaska.precision(_), hawaii.precision(_);
9348       return reset();
9349     };
9350
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());
9355     };
9356
9357     albersUsa.translate = function(_) {
9358       if (!arguments.length) return lower48.translate();
9359       var k = lower48.scale(), x = +_[0], y = +_[1];
9360
9361       lower48Point = lower48
9362           .translate(_)
9363           .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
9364           .stream(pointStream);
9365
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);
9370
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);
9375
9376       return reset();
9377     };
9378
9379     albersUsa.fitExtent = function(extent, object) {
9380       return fitExtent(albersUsa, extent, object);
9381     };
9382
9383     albersUsa.fitSize = function(size, object) {
9384       return fitSize(albersUsa, size, object);
9385     };
9386
9387     albersUsa.fitWidth = function(width, object) {
9388       return fitWidth(albersUsa, width, object);
9389     };
9390
9391     albersUsa.fitHeight = function(height, object) {
9392       return fitHeight(albersUsa, height, object);
9393     };
9394
9395     function reset() {
9396       cache = cacheStream = null;
9397       return albersUsa;
9398     }
9399
9400     return albersUsa.scale(1070);
9401   }
9402
9403   function azimuthalRaw(scale) {
9404     return function(x, y) {
9405       var cx = cos$1(x),
9406           cy = cos$1(y),
9407           k = scale(cx * cy);
9408       return [
9409         k * cy * sin$1(x),
9410         k * sin$1(y)
9411       ];
9412     }
9413   }
9414
9415   function azimuthalInvert(angle) {
9416     return function(x, y) {
9417       var z = sqrt(x * x + y * y),
9418           c = angle(z),
9419           sc = sin$1(c),
9420           cc = cos$1(c);
9421       return [
9422         atan2(x * sc, z * cc),
9423         asin(z && y * sc / z)
9424       ];
9425     }
9426   }
9427
9428   var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
9429     return sqrt(2 / (1 + cxcy));
9430   });
9431
9432   azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
9433     return 2 * asin(z / 2);
9434   });
9435
9436   function azimuthalEqualArea() {
9437     return projection(azimuthalEqualAreaRaw)
9438         .scale(124.75)
9439         .clipAngle(180 - 1e-3);
9440   }
9441
9442   var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
9443     return (c = acos(c)) && c / sin$1(c);
9444   });
9445
9446   azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
9447     return z;
9448   });
9449
9450   function azimuthalEquidistant() {
9451     return projection(azimuthalEquidistantRaw)
9452         .scale(79.4188)
9453         .clipAngle(180 - 1e-3);
9454   }
9455
9456   function mercatorRaw(lambda, phi) {
9457     return [lambda, log(tan((halfPi$2 + phi) / 2))];
9458   }
9459
9460   mercatorRaw.invert = function(x, y) {
9461     return [x, 2 * atan(exp(y)) - halfPi$2];
9462   };
9463
9464   function mercator() {
9465     return mercatorProjection(mercatorRaw)
9466         .scale(961 / tau$3);
9467   }
9468
9469   function mercatorProjection(project) {
9470     var m = projection(project),
9471         center = m.center,
9472         scale = m.scale,
9473         translate = m.translate,
9474         clipExtent = m.clipExtent,
9475         x0 = null, y0, x1, y1; // clip extent
9476
9477     m.scale = function(_) {
9478       return arguments.length ? (scale(_), reclip()) : scale();
9479     };
9480
9481     m.translate = function(_) {
9482       return arguments.length ? (translate(_), reclip()) : translate();
9483     };
9484
9485     m.center = function(_) {
9486       return arguments.length ? (center(_), reclip()) : center();
9487     };
9488
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]];
9491     };
9492
9493     function reclip() {
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)]]);
9500     }
9501
9502     return reclip();
9503   }
9504
9505   function tany(y) {
9506     return tan((halfPi$2 + y) / 2);
9507   }
9508
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;
9513
9514     if (!n) return mercatorRaw;
9515
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)];
9521     }
9522
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];
9526     };
9527
9528     return project;
9529   }
9530
9531   function conicConformal() {
9532     return conicProjection(conicConformalRaw)
9533         .scale(109.5)
9534         .parallels([30, 30]);
9535   }
9536
9537   function equirectangularRaw(lambda, phi) {
9538     return [lambda, phi];
9539   }
9540
9541   equirectangularRaw.invert = equirectangularRaw;
9542
9543   function equirectangular() {
9544     return projection(equirectangularRaw)
9545         .scale(152.63);
9546   }
9547
9548   function conicEquidistantRaw(y0, y1) {
9549     var cy0 = cos$1(y0),
9550         n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
9551         g = cy0 / n + y0;
9552
9553     if (abs(n) < epsilon$2) return equirectangularRaw;
9554
9555     function project(x, y) {
9556       var gy = g - y, nx = n * x;
9557       return [gy * sin$1(nx), g - gy * cos$1(nx)];
9558     }
9559
9560     project.invert = function(x, y) {
9561       var gy = g - y;
9562       return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];
9563     };
9564
9565     return project;
9566   }
9567
9568   function conicEquidistant() {
9569     return conicProjection(conicEquidistantRaw)
9570         .scale(131.154)
9571         .center([0, 13.9389]);
9572   }
9573
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];
9577   }
9578
9579   gnomonicRaw.invert = azimuthalInvert(atan);
9580
9581   function gnomonic() {
9582     return projection(gnomonicRaw)
9583         .scale(144.049)
9584         .clipAngle(60);
9585   }
9586
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);
9591       }
9592     });
9593   }
9594
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,
9599         cache,
9600         cacheStream,
9601         projection;
9602
9603     function reset() {
9604       cache = cacheStream = null;
9605       return projection;
9606     }
9607
9608     return projection = {
9609       stream: function(stream) {
9610         return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
9611       },
9612       postclip: function(_) {
9613         return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9614       },
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]];
9617       },
9618       scale: function(_) {
9619         return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;
9620       },
9621       translate: function(_) {
9622         return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
9623       },
9624       reflectX: function(_) {
9625         return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
9626       },
9627       reflectY: function(_) {
9628         return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
9629       },
9630       fitExtent: function(extent, object) {
9631         return fitExtent(projection, extent, object);
9632       },
9633       fitSize: function(size, object) {
9634         return fitSize(projection, size, object);
9635       },
9636       fitWidth: function(width, object) {
9637         return fitWidth(projection, width, object);
9638       },
9639       fitHeight: function(height, object) {
9640         return fitHeight(projection, height, object);
9641       }
9642     };
9643   }
9644
9645   function naturalEarth1Raw(lambda, phi) {
9646     var phi2 = phi * phi, phi4 = phi2 * phi2;
9647     return [
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)))
9650     ];
9651   }
9652
9653   naturalEarth1Raw.invert = function(x, y) {
9654     var phi = y, i = 25, delta;
9655     do {
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);
9660     return [
9661       x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
9662       phi
9663     ];
9664   };
9665
9666   function naturalEarth1() {
9667     return projection(naturalEarth1Raw)
9668         .scale(175.295);
9669   }
9670
9671   function orthographicRaw(x, y) {
9672     return [cos$1(y) * sin$1(x), sin$1(y)];
9673   }
9674
9675   orthographicRaw.invert = azimuthalInvert(asin);
9676
9677   function orthographic() {
9678     return projection(orthographicRaw)
9679         .scale(249.5)
9680         .clipAngle(90 + epsilon$2);
9681   }
9682
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];
9686   }
9687
9688   stereographicRaw.invert = azimuthalInvert(function(z) {
9689     return 2 * atan(z);
9690   });
9691
9692   function stereographic() {
9693     return projection(stereographicRaw)
9694         .scale(250)
9695         .clipAngle(142);
9696   }
9697
9698   function transverseMercatorRaw(lambda, phi) {
9699     return [log(tan((halfPi$2 + phi) / 2)), -lambda];
9700   }
9701
9702   transverseMercatorRaw.invert = function(x, y) {
9703     return [-y, 2 * atan(exp(x)) - halfPi$2];
9704   };
9705
9706   function transverseMercator() {
9707     var m = mercatorProjection(transverseMercatorRaw),
9708         center = m.center,
9709         rotate = m.rotate;
9710
9711     m.center = function(_) {
9712       return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
9713     };
9714
9715     m.rotate = function(_) {
9716       return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
9717     };
9718
9719     return rotate([0, 0, 90])
9720         .scale(159.155);
9721   }
9722
9723   function defaultSeparation(a, b) {
9724     return a.parent === b.parent ? 1 : 2;
9725   }
9726
9727   function meanX(children) {
9728     return children.reduce(meanXReduce, 0) / children.length;
9729   }
9730
9731   function meanXReduce(x, c) {
9732     return x + c.x;
9733   }
9734
9735   function maxY(children) {
9736     return 1 + children.reduce(maxYReduce, 0);
9737   }
9738
9739   function maxYReduce(y, c) {
9740     return Math.max(y, c.y);
9741   }
9742
9743   function leafLeft(node) {
9744     var children;
9745     while (children = node.children) node = children[0];
9746     return node;
9747   }
9748
9749   function leafRight(node) {
9750     var children;
9751     while (children = node.children) node = children[children.length - 1];
9752     return node;
9753   }
9754
9755   function cluster() {
9756     var separation = defaultSeparation,
9757         dx = 1,
9758         dy = 1,
9759         nodeSize = false;
9760
9761     function cluster(root) {
9762       var previousNode,
9763           x = 0;
9764
9765       // First walk, computing the initial x & y values.
9766       root.eachAfter(function(node) {
9767         var children = node.children;
9768         if (children) {
9769           node.x = meanX(children);
9770           node.y = maxY(children);
9771         } else {
9772           node.x = previousNode ? x += separation(node, previousNode) : 0;
9773           node.y = 0;
9774           previousNode = node;
9775         }
9776       });
9777
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;
9782
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;
9790       });
9791     }
9792
9793     cluster.separation = function(x) {
9794       return arguments.length ? (separation = x, cluster) : separation;
9795     };
9796
9797     cluster.size = function(x) {
9798       return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
9799     };
9800
9801     cluster.nodeSize = function(x) {
9802       return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
9803     };
9804
9805     return cluster;
9806   }
9807
9808   function count(node) {
9809     var sum = 0,
9810         children = node.children,
9811         i = children && children.length;
9812     if (!i) sum = 1;
9813     else while (--i >= 0) sum += children[i].value;
9814     node.value = sum;
9815   }
9816
9817   function node_count() {
9818     return this.eachAfter(count);
9819   }
9820
9821   function node_each(callback) {
9822     var node = this, current, next = [node], children, i, n;
9823     do {
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]);
9829         }
9830       }
9831     } while (next.length);
9832     return this;
9833   }
9834
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]);
9841       }
9842     }
9843     return this;
9844   }
9845
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]);
9852       }
9853     }
9854     while (node = next.pop()) {
9855       callback(node);
9856     }
9857     return this;
9858   }
9859
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;
9866       node.value = sum;
9867     });
9868   }
9869
9870   function node_sort(compare) {
9871     return this.eachBefore(function(node) {
9872       if (node.children) {
9873         node.children.sort(compare);
9874       }
9875     });
9876   }
9877
9878   function node_path(end) {
9879     var start = this,
9880         ancestor = leastCommonAncestor(start, end),
9881         nodes = [start];
9882     while (start !== ancestor) {
9883       start = start.parent;
9884       nodes.push(start);
9885     }
9886     var k = nodes.length;
9887     while (end !== ancestor) {
9888       nodes.splice(k, 0, end);
9889       end = end.parent;
9890     }
9891     return nodes;
9892   }
9893
9894   function leastCommonAncestor(a, b) {
9895     if (a === b) return a;
9896     var aNodes = a.ancestors(),
9897         bNodes = b.ancestors(),
9898         c = null;
9899     a = aNodes.pop();
9900     b = bNodes.pop();
9901     while (a === b) {
9902       c = a;
9903       a = aNodes.pop();
9904       b = bNodes.pop();
9905     }
9906     return c;
9907   }
9908
9909   function node_ancestors() {
9910     var node = this, nodes = [node];
9911     while (node = node.parent) {
9912       nodes.push(node);
9913     }
9914     return nodes;
9915   }
9916
9917   function node_descendants() {
9918     var nodes = [];
9919     this.each(function(node) {
9920       nodes.push(node);
9921     });
9922     return nodes;
9923   }
9924
9925   function node_leaves() {
9926     var leaves = [];
9927     this.eachBefore(function(node) {
9928       if (!node.children) {
9929         leaves.push(node);
9930       }
9931     });
9932     return leaves;
9933   }
9934
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});
9940       }
9941     });
9942     return links;
9943   }
9944
9945   function hierarchy(data, children) {
9946     var root = new Node(data),
9947         valued = +data.value && (root.value = data.value),
9948         node,
9949         nodes = [root],
9950         child,
9951         childs,
9952         i,
9953         n;
9954
9955     if (children == null) children = defaultChildren;
9956
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;
9965         }
9966       }
9967     }
9968
9969     return root.eachBefore(computeHeight);
9970   }
9971
9972   function node_copy() {
9973     return hierarchy(this).eachBefore(copyData);
9974   }
9975
9976   function defaultChildren(d) {
9977     return d.children;
9978   }
9979
9980   function copyData(node) {
9981     node.data = node.data.data;
9982   }
9983
9984   function computeHeight(node) {
9985     var height = 0;
9986     do node.height = height;
9987     while ((node = node.parent) && (node.height < ++height));
9988   }
9989
9990   function Node(data) {
9991     this.data = data;
9992     this.depth =
9993     this.height = 0;
9994     this.parent = null;
9995   }
9996
9997   Node.prototype = hierarchy.prototype = {
9998     constructor: Node,
9999     count: node_count,
10000     each: node_each,
10001     eachAfter: node_eachAfter,
10002     eachBefore: node_eachBefore,
10003     sum: node_sum,
10004     sort: node_sort,
10005     path: node_path,
10006     ancestors: node_ancestors,
10007     descendants: node_descendants,
10008     leaves: node_leaves,
10009     links: node_links,
10010     copy: node_copy
10011   };
10012
10013   var slice$3 = Array.prototype.slice;
10014
10015   function shuffle$1(array) {
10016     var m = array.length,
10017         t,
10018         i;
10019
10020     while (m) {
10021       i = Math.random() * m-- | 0;
10022       t = array[m];
10023       array[m] = array[i];
10024       array[i] = t;
10025     }
10026
10027     return array;
10028   }
10029
10030   function enclose(circles) {
10031     var i = 0, n = (circles = shuffle$1(slice$3.call(circles))).length, B = [], p, e;
10032
10033     while (i < n) {
10034       p = circles[i];
10035       if (e && enclosesWeak(e, p)) ++i;
10036       else e = encloseBasis(B = extendBasis(B, p)), i = 0;
10037     }
10038
10039     return e;
10040   }
10041
10042   function extendBasis(B, p) {
10043     var i, j;
10044
10045     if (enclosesWeakAll(p, B)) return [p];
10046
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)) {
10051         return [B[i], p];
10052       }
10053     }
10054
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];
10063         }
10064       }
10065     }
10066
10067     // If we get here then something is very wrong.
10068     throw new Error;
10069   }
10070
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;
10074   }
10075
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;
10079   }
10080
10081   function enclosesWeakAll(a, B) {
10082     for (var i = 0; i < B.length; ++i) {
10083       if (!enclosesWeak(a, B[i])) {
10084         return false;
10085       }
10086     }
10087     return true;
10088   }
10089
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]);
10095     }
10096   }
10097
10098   function encloseBasis1(a) {
10099     return {
10100       x: a.x,
10101       y: a.y,
10102       r: a.r
10103     };
10104   }
10105
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);
10111     return {
10112       x: (x1 + x2 + x21 / l * r21) / 2,
10113       y: (y1 + y2 + y21 / l * r21) / 2,
10114       r: (l + r1 + r2) / 2
10115     };
10116   }
10117
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,
10122         a2 = x1 - x2,
10123         a3 = x1 - x3,
10124         b2 = y1 - y2,
10125         b3 = y1 - y3,
10126         c2 = r2 - r1,
10127         c3 = r3 - r1,
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);
10140     return {
10141       x: x1 + xa + xb * r,
10142       y: y1 + ya + yb * r,
10143       r: r
10144     };
10145   }
10146
10147   function place(a, b, c) {
10148     var ax = a.x,
10149         ay = a.y,
10150         da = b.r + c.r,
10151         db = a.r + c.r,
10152         dx = b.x - ax,
10153         dy = b.y - ay,
10154         dc = dx * dx + dy * dy;
10155     if (dc) {
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;
10160     } else {
10161       c.x = ax + db;
10162       c.y = ay;
10163     }
10164   }
10165
10166   function intersects(a, b) {
10167     var dx = b.x - a.x,
10168         dy = b.y - a.y,
10169         dr = a.r + b.r;
10170     return dr * dr - 1e-6 > dx * dx + dy * dy;
10171   }
10172
10173   function score(node) {
10174     var a = node._,
10175         b = node.next._,
10176         ab = a.r + b.r,
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;
10180   }
10181
10182   function Node$1(circle) {
10183     this._ = circle;
10184     this.next = null;
10185     this.previous = null;
10186   }
10187
10188   function packEnclose(circles) {
10189     if (!(n = circles.length)) return 0;
10190
10191     var a, b, c, n, aa, ca, i, j, k, sj, sk;
10192
10193     // Place the first circle.
10194     a = circles[0], a.x = 0, a.y = 0;
10195     if (!(n > 1)) return a.r;
10196
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;
10200
10201     // Place the third circle.
10202     place(b, a, c = circles[2]);
10203
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;
10209
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);
10213
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;
10218       do {
10219         if (sj <= sk) {
10220           if (intersects(j._, c._)) {
10221             b = j, a.next = b, b.previous = a, --i;
10222             continue pack;
10223           }
10224           sj += j._.r, j = j.next;
10225         } else {
10226           if (intersects(k._, c._)) {
10227             a = k, a.next = b, b.previous = a, --i;
10228             continue pack;
10229           }
10230           sk += k._.r, k = k.previous;
10231         }
10232       } while (j !== k.next);
10233
10234       // Success! Insert the new circle c between a and b.
10235       c.previous = a, c.next = b, a.next = b.previous = b = c;
10236
10237       // Compute the new closest circle pair to the centroid.
10238       aa = score(a);
10239       while ((c = c.next) !== b) {
10240         if ((ca = score(c)) < aa) {
10241           a = c, aa = ca;
10242         }
10243       }
10244       b = a.next;
10245     }
10246
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);
10249
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;
10252
10253     return c.r;
10254   }
10255
10256   function siblings(circles) {
10257     packEnclose(circles);
10258     return circles;
10259   }
10260
10261   function optional(f) {
10262     return f == null ? null : required(f);
10263   }
10264
10265   function required(f) {
10266     if (typeof f !== "function") throw new Error;
10267     return f;
10268   }
10269
10270   function constantZero() {
10271     return 0;
10272   }
10273
10274   function constant$8(x) {
10275     return function() {
10276       return x;
10277     };
10278   }
10279
10280   function defaultRadius$1(d) {
10281     return Math.sqrt(d.value);
10282   }
10283
10284   function index$1() {
10285     var radius = null,
10286         dx = 1,
10287         dy = 1,
10288         padding = constantZero;
10289
10290     function pack(root) {
10291       root.x = dx / 2, root.y = dy / 2;
10292       if (radius) {
10293         root.eachBefore(radiusLeaf(radius))
10294             .eachAfter(packChildren(padding, 0.5))
10295             .eachBefore(translateChild(1));
10296       } else {
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)));
10301       }
10302       return root;
10303     }
10304
10305     pack.radius = function(x) {
10306       return arguments.length ? (radius = optional(x), pack) : radius;
10307     };
10308
10309     pack.size = function(x) {
10310       return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
10311     };
10312
10313     pack.padding = function(x) {
10314       return arguments.length ? (padding = typeof x === "function" ? x : constant$8(+x), pack) : padding;
10315     };
10316
10317     return pack;
10318   }
10319
10320   function radiusLeaf(radius) {
10321     return function(node) {
10322       if (!node.children) {
10323         node.r = Math.max(0, +radius(node) || 0);
10324       }
10325     };
10326   }
10327
10328   function packChildren(padding, k) {
10329     return function(node) {
10330       if (children = node.children) {
10331         var children,
10332             i,
10333             n = children.length,
10334             r = padding(node) * k || 0,
10335             e;
10336
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;
10340         node.r = e + r;
10341       }
10342     };
10343   }
10344
10345   function translateChild(k) {
10346     return function(node) {
10347       var parent = node.parent;
10348       node.r *= k;
10349       if (parent) {
10350         node.x = parent.x + k * node.x;
10351         node.y = parent.y + k * node.y;
10352       }
10353     };
10354   }
10355
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);
10361   }
10362
10363   function treemapDice(parent, x0, y0, x1, y1) {
10364     var nodes = parent.children,
10365         node,
10366         i = -1,
10367         n = nodes.length,
10368         k = parent.value && (x1 - x0) / parent.value;
10369
10370     while (++i < n) {
10371       node = nodes[i], node.y0 = y0, node.y1 = y1;
10372       node.x0 = x0, node.x1 = x0 += node.value * k;
10373     }
10374   }
10375
10376   function partition() {
10377     var dx = 1,
10378         dy = 1,
10379         padding = 0,
10380         round = false;
10381
10382     function partition(root) {
10383       var n = root.height + 1;
10384       root.x0 =
10385       root.y0 = padding;
10386       root.x1 = dx;
10387       root.y1 = dy / n;
10388       root.eachBefore(positionNode(dy, n));
10389       if (round) root.eachBefore(roundNode);
10390       return root;
10391     }
10392
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);
10397         }
10398         var x0 = node.x0,
10399             y0 = node.y0,
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;
10404         node.x0 = x0;
10405         node.y0 = y0;
10406         node.x1 = x1;
10407         node.y1 = y1;
10408       };
10409     }
10410
10411     partition.round = function(x) {
10412       return arguments.length ? (round = !!x, partition) : round;
10413     };
10414
10415     partition.size = function(x) {
10416       return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
10417     };
10418
10419     partition.padding = function(x) {
10420       return arguments.length ? (padding = +x, partition) : padding;
10421     };
10422
10423     return partition;
10424   }
10425
10426   var keyPrefix$1 = "$", // Protect against keys like “__proto__”.
10427       preroot = {depth: -1},
10428       ambiguous = {};
10429
10430   function defaultId(d) {
10431     return d.id;
10432   }
10433
10434   function defaultParentId(d) {
10435     return d.parentId;
10436   }
10437
10438   function stratify() {
10439     var id = defaultId,
10440         parentId = defaultParentId;
10441
10442     function stratify(data) {
10443       var d,
10444           i,
10445           n = data.length,
10446           root,
10447           parent,
10448           node,
10449           nodes = new Array(n),
10450           nodeId,
10451           nodeKey,
10452           nodeByKey = {};
10453
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;
10459         }
10460       }
10461
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");
10466           root = node;
10467         } else {
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;
10474         }
10475       }
10476
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");
10482
10483       return root;
10484     }
10485
10486     stratify.id = function(x) {
10487       return arguments.length ? (id = required(x), stratify) : id;
10488     };
10489
10490     stratify.parentId = function(x) {
10491       return arguments.length ? (parentId = required(x), stratify) : parentId;
10492     };
10493
10494     return stratify;
10495   }
10496
10497   function defaultSeparation$1(a, b) {
10498     return a.parent === b.parent ? 1 : 2;
10499   }
10500
10501   // function radialSeparation(a, b) {
10502   //   return (a.parent === b.parent ? 1 : 2) / a.depth;
10503   // }
10504
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;
10512   }
10513
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;
10518   }
10519
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);
10524     wp.c -= change;
10525     wp.s += shift;
10526     wm.c += change;
10527     wp.z += shift;
10528     wp.m += shift;
10529   }
10530
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) {
10535     var shift = 0,
10536         change = 0,
10537         children = v.children,
10538         i = children.length,
10539         w;
10540     while (--i >= 0) {
10541       w = children[i];
10542       w.z += shift;
10543       w.m += shift;
10544       shift += w.s + (change += w.c);
10545     }
10546   }
10547
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;
10552   }
10553
10554   function TreeNode(node, i) {
10555     this._ = node;
10556     this.parent = null;
10557     this.children = null;
10558     this.A = null; // default ancestor
10559     this.a = this; // ancestor
10560     this.z = 0; // prelim
10561     this.m = 0; // mod
10562     this.c = 0; // change
10563     this.s = 0; // shift
10564     this.t = null; // thread
10565     this.i = i; // number
10566   }
10567
10568   TreeNode.prototype = Object.create(Node.prototype);
10569
10570   function treeRoot(root) {
10571     var tree = new TreeNode(root, 0),
10572         node,
10573         nodes = [tree],
10574         child,
10575         children,
10576         i,
10577         n;
10578
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;
10585         }
10586       }
10587     }
10588
10589     (tree.parent = new TreeNode(null, 0)).children = [tree];
10590     return tree;
10591   }
10592
10593   // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
10594   function tree() {
10595     var separation = defaultSeparation$1,
10596         dx = 1,
10597         dy = 1,
10598         nodeSize = null;
10599
10600     function tree(root) {
10601       var t = treeRoot(root);
10602
10603       // Compute the layout using Buchheim et al.’s algorithm.
10604       t.eachAfter(firstWalk), t.parent.m = -t.z;
10605       t.eachBefore(secondWalk);
10606
10607       // If a fixed node size is specified, scale x and y.
10608       if (nodeSize) root.eachBefore(sizeNode);
10609
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.
10612       else {
10613         var left = root,
10614             right = root,
10615             bottom = root;
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;
10620         });
10621         var s = left === right ? 1 : separation(left, right) / 2,
10622             tx = s - left.x,
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;
10628         });
10629       }
10630
10631       return root;
10632     }
10633
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;
10642       if (children) {
10643         executeShifts(v);
10644         var midpoint = (children[0].z + children[children.length - 1].z) / 2;
10645         if (w) {
10646           v.z = w.z + separation(v._, w._);
10647           v.m = v.z - midpoint;
10648         } else {
10649           v.z = midpoint;
10650         }
10651       } else if (w) {
10652         v.z = w.z + separation(v._, w._);
10653       }
10654       v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
10655     }
10656
10657     // Computes all real x-coordinates by summing up the modifiers recursively.
10658     function secondWalk(v) {
10659       v._.x = v.z + v.parent.m;
10660       v.m += v.parent.m;
10661     }
10662
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) {
10675       if (w) {
10676         var vip = v,
10677             vop = v,
10678             vim = w,
10679             vom = vip.parent.children[0],
10680             sip = vip.m,
10681             sop = vop.m,
10682             sim = vim.m,
10683             som = vom.m,
10684             shift;
10685         while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
10686           vom = nextLeft(vom);
10687           vop = nextRight(vop);
10688           vop.a = v;
10689           shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
10690           if (shift > 0) {
10691             moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
10692             sip += shift;
10693             sop += shift;
10694           }
10695           sim += vim.m;
10696           sip += vip.m;
10697           som += vom.m;
10698           sop += vop.m;
10699         }
10700         if (vim && !nextRight(vop)) {
10701           vop.t = vim;
10702           vop.m += sim - sop;
10703         }
10704         if (vip && !nextLeft(vom)) {
10705           vom.t = vip;
10706           vom.m += sip - som;
10707           ancestor = v;
10708         }
10709       }
10710       return ancestor;
10711     }
10712
10713     function sizeNode(node) {
10714       node.x *= dx;
10715       node.y = node.depth * dy;
10716     }
10717
10718     tree.separation = function(x) {
10719       return arguments.length ? (separation = x, tree) : separation;
10720     };
10721
10722     tree.size = function(x) {
10723       return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
10724     };
10725
10726     tree.nodeSize = function(x) {
10727       return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
10728     };
10729
10730     return tree;
10731   }
10732
10733   function treemapSlice(parent, x0, y0, x1, y1) {
10734     var nodes = parent.children,
10735         node,
10736         i = -1,
10737         n = nodes.length,
10738         k = parent.value && (y1 - y0) / parent.value;
10739
10740     while (++i < n) {
10741       node = nodes[i], node.x0 = x0, node.x1 = x1;
10742       node.y0 = y0, node.y1 = y0 += node.value * k;
10743     }
10744   }
10745
10746   var phi = (1 + Math.sqrt(5)) / 2;
10747
10748   function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
10749     var rows = [],
10750         nodes = parent.children,
10751         row,
10752         nodeValue,
10753         i0 = 0,
10754         i1 = 0,
10755         n = nodes.length,
10756         dx, dy,
10757         value = parent.value,
10758         sumValue,
10759         minValue,
10760         maxValue,
10761         newRatio,
10762         minRatio,
10763         alpha,
10764         beta;
10765
10766     while (i0 < n) {
10767       dx = x1 - x0, dy = y1 - y0;
10768
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);
10775
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;
10785       }
10786
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;
10792     }
10793
10794     return rows;
10795   }
10796
10797   var squarify = (function custom(ratio) {
10798
10799     function squarify(parent, x0, y0, x1, y1) {
10800       squarifyRatio(ratio, parent, x0, y0, x1, y1);
10801     }
10802
10803     squarify.ratio = function(x) {
10804       return custom((x = +x) > 1 ? x : 1);
10805     };
10806
10807     return squarify;
10808   })(phi);
10809
10810   function index$2() {
10811     var tile = squarify,
10812         round = false,
10813         dx = 1,
10814         dy = 1,
10815         paddingStack = [0],
10816         paddingInner = constantZero,
10817         paddingTop = constantZero,
10818         paddingRight = constantZero,
10819         paddingBottom = constantZero,
10820         paddingLeft = constantZero;
10821
10822     function treemap(root) {
10823       root.x0 =
10824       root.y0 = 0;
10825       root.x1 = dx;
10826       root.y1 = dy;
10827       root.eachBefore(positionNode);
10828       paddingStack = [0];
10829       if (round) root.eachBefore(roundNode);
10830       return root;
10831     }
10832
10833     function positionNode(node) {
10834       var p = paddingStack[node.depth],
10835           x0 = node.x0 + p,
10836           y0 = node.y0 + p,
10837           x1 = node.x1 - p,
10838           y1 = node.y1 - p;
10839       if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10840       if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10841       node.x0 = x0;
10842       node.y0 = y0;
10843       node.x1 = x1;
10844       node.y1 = y1;
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);
10854       }
10855     }
10856
10857     treemap.round = function(x) {
10858       return arguments.length ? (round = !!x, treemap) : round;
10859     };
10860
10861     treemap.size = function(x) {
10862       return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
10863     };
10864
10865     treemap.tile = function(x) {
10866       return arguments.length ? (tile = required(x), treemap) : tile;
10867     };
10868
10869     treemap.padding = function(x) {
10870       return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
10871     };
10872
10873     treemap.paddingInner = function(x) {
10874       return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$8(+x), treemap) : paddingInner;
10875     };
10876
10877     treemap.paddingOuter = function(x) {
10878       return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
10879     };
10880
10881     treemap.paddingTop = function(x) {
10882       return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$8(+x), treemap) : paddingTop;
10883     };
10884
10885     treemap.paddingRight = function(x) {
10886       return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$8(+x), treemap) : paddingRight;
10887     };
10888
10889     treemap.paddingBottom = function(x) {
10890       return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$8(+x), treemap) : paddingBottom;
10891     };
10892
10893     treemap.paddingLeft = function(x) {
10894       return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$8(+x), treemap) : paddingLeft;
10895     };
10896
10897     return treemap;
10898   }
10899
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);
10904
10905     for (sums[0] = sum = i = 0; i < n; ++i) {
10906       sums[i + 1] = sum += nodes[i].value;
10907     }
10908
10909     partition(0, n, parent.value, x0, y0, x1, y1);
10910
10911     function partition(i, j, value, x0, y0, x1, y1) {
10912       if (i >= j - 1) {
10913         var node = nodes[i];
10914         node.x0 = x0, node.y0 = y0;
10915         node.x1 = x1, node.y1 = y1;
10916         return;
10917       }
10918
10919       var valueOffset = sums[i],
10920           valueTarget = (value / 2) + valueOffset,
10921           k = i + 1,
10922           hi = j - 1;
10923
10924       while (k < hi) {
10925         var mid = k + hi >>> 1;
10926         if (sums[mid] < valueTarget) k = mid + 1;
10927         else hi = mid;
10928       }
10929
10930       if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
10931
10932       var valueLeft = sums[k] - valueOffset,
10933           valueRight = value - valueLeft;
10934
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);
10939       } else {
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);
10943       }
10944     }
10945   }
10946
10947   function sliceDice(parent, x0, y0, x1, y1) {
10948     (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
10949   }
10950
10951   var resquarify = (function custom(ratio) {
10952
10953     function resquarify(parent, x0, y0, x1, y1) {
10954       if ((rows = parent._squarify) && (rows.ratio === ratio)) {
10955         var rows,
10956             row,
10957             nodes,
10958             i,
10959             j = -1,
10960             n,
10961             m = rows.length,
10962             value = parent.value;
10963
10964         while (++j < m) {
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;
10970         }
10971       } else {
10972         parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
10973         rows.ratio = ratio;
10974       }
10975     }
10976
10977     resquarify.ratio = function(x) {
10978       return custom((x = +x) > 1 ? x : 1);
10979     };
10980
10981     return resquarify;
10982   })(phi);
10983
10984   function d3_polygonArea(polygon) {
10985     var i = -1,
10986         n = polygon.length,
10987         a,
10988         b = polygon[n - 1],
10989         area = 0;
10990
10991     while (++i < n) {
10992       a = b;
10993       b = polygon[i];
10994       area += a[1] * b[0] - a[0] * b[1];
10995     }
10996
10997     return area / 2;
10998   }
10999
11000   function d3_polygonCentroid(polygon) {
11001     var i = -1,
11002         n = polygon.length,
11003         x = 0,
11004         y = 0,
11005         a,
11006         b = polygon[n - 1],
11007         c,
11008         k = 0;
11009
11010     while (++i < n) {
11011       a = b;
11012       b = polygon[i];
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;
11016     }
11017
11018     return k *= 3, [x / k, y / k];
11019   }
11020
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]);
11027   }
11028
11029   function lexicographicOrder(a, b) {
11030     return a[0] - b[0] || a[1] - b[1];
11031   }
11032
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,
11038         indexes = [0, 1],
11039         size = 2;
11040
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;
11044     }
11045
11046     return indexes.slice(0, size); // remove popped points
11047   }
11048
11049   function d3_polygonHull(points) {
11050     if ((n = points.length) < 3) return null;
11051
11052     var i,
11053         n,
11054         sortedPoints = new Array(n),
11055         flippedPoints = new Array(n);
11056
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]];
11060
11061     var upperIndexes = computeUpperHullIndexes(sortedPoints),
11062         lowerIndexes = computeUpperHullIndexes(flippedPoints);
11063
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],
11067         hull = [];
11068
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]]);
11073
11074     return hull;
11075   }
11076
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],
11082         x1, y1,
11083         inside = false;
11084
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;
11088       x0 = x1, y0 = y1;
11089     }
11090
11091     return inside;
11092   }
11093
11094   function length$2(polygon) {
11095     var i = -1,
11096         n = polygon.length,
11097         b = polygon[n - 1],
11098         xa,
11099         ya,
11100         xb = b[0],
11101         yb = b[1],
11102         perimeter = 0;
11103
11104     while (++i < n) {
11105       xa = xb;
11106       ya = yb;
11107       b = polygon[i];
11108       xb = b[0];
11109       yb = b[1];
11110       xa -= xb;
11111       ya -= yb;
11112       perimeter += Math.sqrt(xa * xa + ya * ya);
11113     }
11114
11115     return perimeter;
11116   }
11117
11118   var slice$4 = [].slice;
11119
11120   var noabort = {};
11121
11122   function Queue(size) {
11123     this._size = size;
11124     this._call =
11125     this._error = null;
11126     this._tasks = [];
11127     this._data = [];
11128     this._waiting =
11129     this._active =
11130     this._ended =
11131     this._start = 0; // inside a synchronous task callback?
11132   }
11133
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);
11141       t.push(callback);
11142       ++this._waiting, this._tasks.push(t);
11143       poke$1(this);
11144       return this;
11145     },
11146     abort: function() {
11147       if (this._error == null) abort(this, new Error("abort"));
11148       return this;
11149     },
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)); };
11154       maybeNotify(this);
11155       return this;
11156     },
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;
11161       maybeNotify(this);
11162       return this;
11163     }
11164   };
11165
11166   function poke$1(q) {
11167     if (!q._start) {
11168       try { start$1(q); } // let the current task complete
11169       catch (e) {
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
11172       }
11173     }
11174   }
11175
11176   function start$1(q) {
11177     while (q._start = q._waiting && q._active < q._size) {
11178       var i = q._ended + q._active,
11179           t = q._tasks[i],
11180           j = t.length - 1,
11181           c = t[j];
11182       t[j] = end(q, i);
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;
11187     }
11188   }
11189
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
11196       if (e != null) {
11197         abort(q, e);
11198       } else {
11199         q._data[i] = r;
11200         if (q._waiting) poke$1(q);
11201         else maybeNotify(q);
11202       }
11203     };
11204   }
11205
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
11211
11212     while (--i >= 0) {
11213       if (t = q._tasks[i]) {
11214         q._tasks[i] = null;
11215         if (t.abort) {
11216           try { t.abort(); }
11217           catch (e) { /* ignore */ }
11218         }
11219       }
11220     }
11221
11222     q._active = NaN; // allow notification
11223     maybeNotify(q);
11224   }
11225
11226   function maybeNotify(q) {
11227     if (!q._active && q._call) {
11228       var d = q._data;
11229       q._data = undefined; // allow gc
11230       q._call(q._error, d);
11231     }
11232   }
11233
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);
11238   }
11239
11240   function defaultSource$1() {
11241     return Math.random();
11242   }
11243
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;
11249       else max -= min;
11250       return function() {
11251         return source() * max + min;
11252       };
11253     }
11254
11255     randomUniform.source = sourceRandomUniform;
11256
11257     return randomUniform;
11258   })(defaultSource$1);
11259
11260   var normal = (function sourceRandomNormal(source) {
11261     function randomNormal(mu, sigma) {
11262       var x, r;
11263       mu = mu == null ? 0 : +mu;
11264       sigma = sigma == null ? 1 : +sigma;
11265       return function() {
11266         var y;
11267
11268         // If available, use the second previously-generated uniform random.
11269         if (x != null) y = x, x = null;
11270
11271         // Otherwise, generate a new x and y.
11272         else do {
11273           x = source() * 2 - 1;
11274           y = source() * 2 - 1;
11275           r = x * x + y * y;
11276         } while (!r || r > 1);
11277
11278         return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
11279       };
11280     }
11281
11282     randomNormal.source = sourceRandomNormal;
11283
11284     return randomNormal;
11285   })(defaultSource$1);
11286
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());
11292       };
11293     }
11294
11295     randomLogNormal.source = sourceRandomLogNormal;
11296
11297     return randomLogNormal;
11298   })(defaultSource$1);
11299
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();
11304         return sum;
11305       };
11306     }
11307
11308     randomIrwinHall.source = sourceRandomIrwinHall;
11309
11310     return randomIrwinHall;
11311   })(defaultSource$1);
11312
11313   var bates = (function sourceRandomBates(source) {
11314     function randomBates(n) {
11315       var randomIrwinHall = irwinHall.source(source)(n);
11316       return function() {
11317         return randomIrwinHall() / n;
11318       };
11319     }
11320
11321     randomBates.source = sourceRandomBates;
11322
11323     return randomBates;
11324   })(defaultSource$1);
11325
11326   var exponential$1 = (function sourceRandomExponential(source) {
11327     function randomExponential(lambda) {
11328       return function() {
11329         return -Math.log(1 - source()) / lambda;
11330       };
11331     }
11332
11333     randomExponential.source = sourceRandomExponential;
11334
11335     return randomExponential;
11336   })(defaultSource$1);
11337
11338   function request(url, callback) {
11339     var request,
11340         event = dispatch("beforesend", "progress", "load", "error"),
11341         mimeType,
11342         headers = map$1(),
11343         xhr = new XMLHttpRequest,
11344         user = null,
11345         password = null,
11346         response,
11347         responseType,
11348         timeout = 0;
11349
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;
11354
11355     "onload" in xhr
11356         ? xhr.onload = xhr.onerror = xhr.ontimeout = respond
11357         : xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); };
11358
11359     function respond(o) {
11360       var status = xhr.status, result;
11361       if (!status && hasResponse(xhr)
11362           || status >= 200 && status < 300
11363           || status === 304) {
11364         if (response) {
11365           try {
11366             result = response.call(request, xhr);
11367           } catch (e) {
11368             event.call("error", request, e);
11369             return;
11370           }
11371         } else {
11372           result = xhr;
11373         }
11374         event.call("load", request, result);
11375       } else {
11376         event.call("error", request, o);
11377       }
11378     }
11379
11380     xhr.onprogress = function(e) {
11381       event.call("progress", request, e);
11382     };
11383
11384     request = {
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 + "");
11390         return request;
11391       },
11392
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 + "";
11397         return request;
11398       },
11399
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;
11405         return request;
11406       },
11407
11408       timeout: function(value) {
11409         if (!arguments.length) return timeout;
11410         timeout = +value;
11411         return request;
11412       },
11413
11414       user: function(value) {
11415         return arguments.length < 1 ? user : (user = value == null ? null : value + "", request);
11416       },
11417
11418       password: function(value) {
11419         return arguments.length < 1 ? password : (password = value == null ? null : value + "", request);
11420       },
11421
11422       // Specify how to convert the response content to a specific type;
11423       // changes the callback value on "load" events.
11424       response: function(value) {
11425         response = value;
11426         return request;
11427       },
11428
11429       // Alias for send("GET", …).
11430       get: function(data, callback) {
11431         return request.send("GET", data, callback);
11432       },
11433
11434       // Alias for send("POST", …).
11435       post: function(data, callback) {
11436         return request.send("POST", data, callback);
11437       },
11438
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);
11452         return request;
11453       },
11454
11455       abort: function() {
11456         xhr.abort();
11457         return request;
11458       },
11459
11460       on: function() {
11461         var value = event.on.apply(event, arguments);
11462         return value === event ? request : value;
11463       }
11464     };
11465
11466     if (callback != null) {
11467       if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11468       return request.get(callback);
11469     }
11470
11471     return request;
11472   }
11473
11474   function fixCallback(callback) {
11475     return function(error, xhr) {
11476       callback(error == null ? xhr : null);
11477     };
11478   }
11479
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
11485   }
11486
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);
11493       }
11494       return r;
11495     };
11496   }
11497
11498   var html = type$1("text/html", function(xhr) {
11499     return document.createRange().createContextualFragment(xhr.responseText);
11500   });
11501
11502   var d3_json = type$1("application/json", function(xhr) {
11503     return JSON.parse(xhr.responseText);
11504   });
11505
11506   var d3_text = type$1("text/plain", function(xhr) {
11507     return xhr.responseText;
11508   });
11509
11510   var d3_xml = type$1("application/xml", function(xhr) {
11511     var xml = xhr.responseXML;
11512     if (!xml) throw new Error("parse error");
11513     return xml;
11514   });
11515
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; };
11521       r.row(row);
11522       return callback ? r.get(callback) : r;
11523     };
11524   }
11525
11526   function responseOf(parse, row) {
11527     return function(request$$1) {
11528       return parse(request$$1.responseText, row);
11529     };
11530   }
11531
11532   var csv$1 = dsv$1("text/csv", csvParse);
11533
11534   var tsv$1 = dsv$1("text/tab-separated-values", tsvParse);
11535
11536   var array$2 = Array.prototype;
11537
11538   var map$2 = array$2.map;
11539   var slice$5 = array$2.slice;
11540
11541   var implicit = {name: "implicit"};
11542
11543   function ordinal(range) {
11544     var index = map$1(),
11545         domain = [],
11546         unknown = implicit;
11547
11548     range = range == null ? [] : slice$5.call(range);
11549
11550     function scale(d) {
11551       var key = d + "", i = index.get(key);
11552       if (!i) {
11553         if (unknown !== implicit) return unknown;
11554         index.set(key, i = domain.push(d));
11555       }
11556       return range[(i - 1) % range.length];
11557     }
11558
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));
11564       return scale;
11565     };
11566
11567     scale.range = function(_) {
11568       return arguments.length ? (range = slice$5.call(_), scale) : range.slice();
11569     };
11570
11571     scale.unknown = function(_) {
11572       return arguments.length ? (unknown = _, scale) : unknown;
11573     };
11574
11575     scale.copy = function() {
11576       return ordinal()
11577           .domain(domain)
11578           .range(range)
11579           .unknown(unknown);
11580     };
11581
11582     return scale;
11583   }
11584
11585   function band() {
11586     var scale = ordinal().unknown(undefined),
11587         domain = scale.domain,
11588         ordinalRange = scale.range,
11589         range$$1 = [0, 1],
11590         step,
11591         bandwidth,
11592         round = false,
11593         paddingInner = 0,
11594         paddingOuter = 0,
11595         align = 0.5;
11596
11597     delete scale.unknown;
11598
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);
11611     }
11612
11613     scale.domain = function(_) {
11614       return arguments.length ? (domain(_), rescale()) : domain();
11615     };
11616
11617     scale.range = function(_) {
11618       return arguments.length ? (range$$1 = [+_[0], +_[1]], rescale()) : range$$1.slice();
11619     };
11620
11621     scale.rangeRound = function(_) {
11622       return range$$1 = [+_[0], +_[1]], round = true, rescale();
11623     };
11624
11625     scale.bandwidth = function() {
11626       return bandwidth;
11627     };
11628
11629     scale.step = function() {
11630       return step;
11631     };
11632
11633     scale.round = function(_) {
11634       return arguments.length ? (round = !!_, rescale()) : round;
11635     };
11636
11637     scale.padding = function(_) {
11638       return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11639     };
11640
11641     scale.paddingInner = function(_) {
11642       return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11643     };
11644
11645     scale.paddingOuter = function(_) {
11646       return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
11647     };
11648
11649     scale.align = function(_) {
11650       return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
11651     };
11652
11653     scale.copy = function() {
11654       return band()
11655           .domain(domain())
11656           .range(range$$1)
11657           .round(round)
11658           .paddingInner(paddingInner)
11659           .paddingOuter(paddingOuter)
11660           .align(align);
11661     };
11662
11663     return rescale();
11664   }
11665
11666   function pointish(scale) {
11667     var copy = scale.copy;
11668
11669     scale.padding = scale.paddingOuter;
11670     delete scale.paddingInner;
11671     delete scale.paddingOuter;
11672
11673     scale.copy = function() {
11674       return pointish(copy());
11675     };
11676
11677     return scale;
11678   }
11679
11680   function point$1() {
11681     return pointish(band().paddingInner(1));
11682   }
11683
11684   function constant$9(x) {
11685     return function() {
11686       return x;
11687     };
11688   }
11689
11690   function number$2(x) {
11691     return +x;
11692   }
11693
11694   var unit = [0, 1];
11695
11696   function deinterpolateLinear(a, b) {
11697     return (b -= (a = +a))
11698         ? function(x) { return (x - a) / b; }
11699         : constant$9(b);
11700   }
11701
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); };
11706     };
11707   }
11708
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); };
11713     };
11714   }
11715
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)); };
11721   }
11722
11723   function polymap(domain, range$$1, deinterpolate, reinterpolate) {
11724     var j = Math.min(domain.length, range$$1.length) - 1,
11725         d = new Array(j),
11726         r = new Array(j),
11727         i = -1;
11728
11729     // Reverse descending domains.
11730     if (domain[j] < domain[0]) {
11731       domain = domain.slice().reverse();
11732       range$$1 = range$$1.slice().reverse();
11733     }
11734
11735     while (++i < j) {
11736       d[i] = deinterpolate(domain[i], domain[i + 1]);
11737       r[i] = reinterpolate(range$$1[i], range$$1[i + 1]);
11738     }
11739
11740     return function(x) {
11741       var i = bisectRight(domain, x, 1, j) - 1;
11742       return r[i](d[i](x));
11743     };
11744   }
11745
11746   function copy(source, target) {
11747     return target
11748         .domain(source.domain())
11749         .range(source.range())
11750         .interpolate(source.interpolate())
11751         .clamp(source.clamp());
11752   }
11753
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) {
11757     var domain = unit,
11758         range$$1 = unit,
11759         interpolate$$1 = interpolate,
11760         clamp = false,
11761         piecewise,
11762         output,
11763         input;
11764
11765     function rescale() {
11766       piecewise = Math.min(domain.length, range$$1.length) > 2 ? polymap : bimap;
11767       output = input = null;
11768       return scale;
11769     }
11770
11771     function scale(x) {
11772       return (output || (output = piecewise(domain, range$$1, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate$$1)))(+x);
11773     }
11774
11775     scale.invert = function(y) {
11776       return (input || (input = piecewise(range$$1, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
11777     };
11778
11779     scale.domain = function(_) {
11780       return arguments.length ? (domain = map$2.call(_, number$2), rescale()) : domain.slice();
11781     };
11782
11783     scale.range = function(_) {
11784       return arguments.length ? (range$$1 = slice$5.call(_), rescale()) : range$$1.slice();
11785     };
11786
11787     scale.rangeRound = function(_) {
11788       return range$$1 = slice$5.call(_), interpolate$$1 = interpolateRound, rescale();
11789     };
11790
11791     scale.clamp = function(_) {
11792       return arguments.length ? (clamp = !!_, rescale()) : clamp;
11793     };
11794
11795     scale.interpolate = function(_) {
11796       return arguments.length ? (interpolate$$1 = _, rescale()) : interpolate$$1;
11797     };
11798
11799     return rescale();
11800   }
11801
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),
11806         precision;
11807     specifier = formatSpecifier(specifier == null ? ",f" : specifier);
11808     switch (specifier.type) {
11809       case "s": {
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);
11813       }
11814       case "":
11815       case "e":
11816       case "g":
11817       case "p":
11818       case "r": {
11819         if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
11820         break;
11821       }
11822       case "f":
11823       case "%": {
11824         if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
11825         break;
11826       }
11827     }
11828     return format(specifier);
11829   }
11830
11831   function linearish(scale) {
11832     var domain = scale.domain;
11833
11834     scale.ticks = function(count) {
11835       var d = domain();
11836       return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
11837     };
11838
11839     scale.tickFormat = function(count, specifier) {
11840       return tickFormat(domain(), count, specifier);
11841     };
11842
11843     scale.nice = function(count) {
11844       if (count == null) count = 10;
11845
11846       var d = domain(),
11847           i0 = 0,
11848           i1 = d.length - 1,
11849           start = d[i0],
11850           stop = d[i1],
11851           step;
11852
11853       if (stop < start) {
11854         step = start, start = stop, stop = step;
11855         step = i0, i0 = i1, i1 = step;
11856       }
11857
11858       step = tickIncrement(start, stop, count);
11859
11860       if (step > 0) {
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);
11868       }
11869
11870       if (step > 0) {
11871         d[i0] = Math.floor(start / step) * step;
11872         d[i1] = Math.ceil(stop / step) * step;
11873         domain(d);
11874       } else if (step < 0) {
11875         d[i0] = Math.ceil(start * step) / step;
11876         d[i1] = Math.floor(stop * step) / step;
11877         domain(d);
11878       }
11879
11880       return scale;
11881     };
11882
11883     return scale;
11884   }
11885
11886   function linear$2() {
11887     var scale = continuous(deinterpolateLinear, interpolateNumber);
11888
11889     scale.copy = function() {
11890       return copy(scale, linear$2());
11891     };
11892
11893     return linearish(scale);
11894   }
11895
11896   function identity$5() {
11897     var domain = [0, 1];
11898
11899     function scale(x) {
11900       return +x;
11901     }
11902
11903     scale.invert = scale;
11904
11905     scale.domain = scale.range = function(_) {
11906       return arguments.length ? (domain = map$2.call(_, number$2), scale) : domain.slice();
11907     };
11908
11909     scale.copy = function() {
11910       return identity$5().domain(domain);
11911     };
11912
11913     return linearish(scale);
11914   }
11915
11916   function nice(domain, interval) {
11917     domain = domain.slice();
11918
11919     var i0 = 0,
11920         i1 = domain.length - 1,
11921         x0 = domain[i0],
11922         x1 = domain[i1],
11923         t;
11924
11925     if (x1 < x0) {
11926       t = i0, i0 = i1, i1 = t;
11927       t = x0, x0 = x1, x1 = t;
11928     }
11929
11930     domain[i0] = interval.floor(x0);
11931     domain[i1] = interval.ceil(x1);
11932     return domain;
11933   }
11934
11935   function deinterpolate(a, b) {
11936     return (b = Math.log(b / a))
11937         ? function(x) { return Math.log(x / a) / b; }
11938         : constant$9(b);
11939   }
11940
11941   function reinterpolate(a, b) {
11942     return a < 0
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); };
11945   }
11946
11947   function pow10(x) {
11948     return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
11949   }
11950
11951   function powp(base) {
11952     return base === 10 ? pow10
11953         : base === Math.E ? Math.exp
11954         : function(x) { return Math.pow(base, x); };
11955   }
11956
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; });
11962   }
11963
11964   function reflect(f) {
11965     return function(x) {
11966       return -f(-x);
11967     };
11968   }
11969
11970   function log$1() {
11971     var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),
11972         domain = scale.domain,
11973         base = 10,
11974         logs = logp(10),
11975         pows = powp(10);
11976
11977     function rescale() {
11978       logs = logp(base), pows = powp(base);
11979       if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);
11980       return scale;
11981     }
11982
11983     scale.base = function(_) {
11984       return arguments.length ? (base = +_, rescale()) : base;
11985     };
11986
11987     scale.domain = function(_) {
11988       return arguments.length ? (domain(_), rescale()) : domain();
11989     };
11990
11991     scale.ticks = function(count) {
11992       var d = domain(),
11993           u = d[0],
11994           v = d[d.length - 1],
11995           r;
11996
11997       if (r = v < u) i = u, u = v, v = i;
11998
11999       var i = logs(u),
12000           j = logs(v),
12001           p,
12002           k,
12003           t,
12004           n = count == null ? 10 : +count,
12005           z = [];
12006
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) {
12011             t = p * k;
12012             if (t < u) continue;
12013             if (t > v) break;
12014             z.push(t);
12015           }
12016         } else for (; i < j; ++i) {
12017           for (k = base - 1, p = pows(i); k >= 1; --k) {
12018             t = p * k;
12019             if (t < u) continue;
12020             if (t > v) break;
12021             z.push(t);
12022           }
12023         }
12024       } else {
12025         z = ticks(i, j, Math.min(j - i, n)).map(pows);
12026       }
12027
12028       return r ? z.reverse() : z;
12029     };
12030
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) : "";
12041       };
12042     };
12043
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))); }
12048       }));
12049     };
12050
12051     scale.copy = function() {
12052       return copy(scale, log$1().base(base));
12053     };
12054
12055     return scale;
12056   }
12057
12058   function raise$1(x, exponent) {
12059     return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
12060   }
12061
12062   function pow$1() {
12063     var exponent = 1,
12064         scale = continuous(deinterpolate, reinterpolate),
12065         domain = scale.domain;
12066
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; }
12070           : constant$9(b);
12071     }
12072
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); };
12076     }
12077
12078     scale.exponent = function(_) {
12079       return arguments.length ? (exponent = +_, domain(domain())) : exponent;
12080     };
12081
12082     scale.copy = function() {
12083       return copy(scale, pow$1().exponent(exponent));
12084     };
12085
12086     return linearish(scale);
12087   }
12088
12089   function sqrt$1() {
12090     return pow$1().exponent(0.5);
12091   }
12092
12093   function quantile$1() {
12094     var domain = [],
12095         range$$1 = [],
12096         thresholds = [];
12097
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);
12102       return scale;
12103     }
12104
12105     function scale(x) {
12106       if (!isNaN(x = +x)) return range$$1[bisectRight(thresholds, x)];
12107     }
12108
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]
12114       ];
12115     };
12116
12117     scale.domain = function(_) {
12118       if (!arguments.length) return domain.slice();
12119       domain = [];
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);
12122       return rescale();
12123     };
12124
12125     scale.range = function(_) {
12126       return arguments.length ? (range$$1 = slice$5.call(_), rescale()) : range$$1.slice();
12127     };
12128
12129     scale.quantiles = function() {
12130       return thresholds.slice();
12131     };
12132
12133     scale.copy = function() {
12134       return quantile$1()
12135           .domain(domain)
12136           .range(range$$1);
12137     };
12138
12139     return scale;
12140   }
12141
12142   function quantize() {
12143     var x0 = 0,
12144         x1 = 1,
12145         n = 1,
12146         domain = [0.5],
12147         range$$1 = [0, 1];
12148
12149     function scale(x) {
12150       if (x <= x) return range$$1[bisectRight(domain, x, 0, n)];
12151     }
12152
12153     function rescale() {
12154       var i = -1;
12155       domain = new Array(n);
12156       while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
12157       return scale;
12158     }
12159
12160     scale.domain = function(_) {
12161       return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
12162     };
12163
12164     scale.range = function(_) {
12165       return arguments.length ? (n = (range$$1 = slice$5.call(_)).length - 1, rescale()) : range$$1.slice();
12166     };
12167
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]];
12174     };
12175
12176     scale.copy = function() {
12177       return quantize()
12178           .domain([x0, x1])
12179           .range(range$$1);
12180     };
12181
12182     return linearish(scale);
12183   }
12184
12185   function threshold() {
12186     var domain = [0.5],
12187         range$$1 = [0, 1],
12188         n = 1;
12189
12190     function scale(x) {
12191       if (x <= x) return range$$1[bisectRight(domain, x, 0, n)];
12192     }
12193
12194     scale.domain = function(_) {
12195       return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : domain.slice();
12196     };
12197
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();
12200     };
12201
12202     scale.invertExtent = function(y) {
12203       var i = range$$1.indexOf(y);
12204       return [domain[i - 1], domain[i]];
12205     };
12206
12207     scale.copy = function() {
12208       return threshold()
12209           .domain(domain)
12210           .range(range$$1);
12211     };
12212
12213     return scale;
12214   }
12215
12216   var t0$1 = new Date,
12217       t1$1 = new Date;
12218
12219   function newInterval(floori, offseti, count, field) {
12220
12221     function interval(date) {
12222       return floori(date = new Date(+date)), date;
12223     }
12224
12225     interval.floor = interval;
12226
12227     interval.ceil = function(date) {
12228       return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
12229     };
12230
12231     interval.round = function(date) {
12232       var d0 = interval(date),
12233           d1 = interval.ceil(date);
12234       return date - d0 < d1 - date ? d0 : d1;
12235     };
12236
12237     interval.offset = function(date, step) {
12238       return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
12239     };
12240
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);
12248       return range;
12249     };
12250
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
12260           }
12261         }
12262       });
12263     };
12264
12265     if (count) {
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));
12270       };
12271
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; });
12279       };
12280     }
12281
12282     return interval;
12283   }
12284
12285   var millisecond = newInterval(function() {
12286     // noop
12287   }, function(date, step) {
12288     date.setTime(+date + step);
12289   }, function(start, end) {
12290     return end - start;
12291   });
12292
12293   // An optimized implementation for this simple case.
12294   millisecond.every = function(k) {
12295     k = Math.floor(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;
12304     });
12305   };
12306   var milliseconds = millisecond.range;
12307
12308   var durationSecond = 1e3;
12309   var durationMinute = 6e4;
12310   var durationHour = 36e5;
12311   var durationDay = 864e5;
12312   var durationWeek = 6048e5;
12313
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();
12322   });
12323   var seconds = second.range;
12324
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();
12333   });
12334   var minutes = minute.range;
12335
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();
12346   });
12347   var hours = hour.range;
12348
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;
12357   });
12358   var days = day.range;
12359
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;
12368     });
12369   }
12370
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);
12378
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;
12386
12387   var month = newInterval(function(date) {
12388     date.setDate(1);
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();
12396   });
12397   var months = month.range;
12398
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();
12408   });
12409
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);
12418     });
12419   };
12420   var years = year.range;
12421
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();
12430   });
12431   var utcMinutes = utcMinute.range;
12432
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();
12441   });
12442   var utcHours = utcHour.range;
12443
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;
12452   });
12453   var utcDays = utcDay.range;
12454
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;
12463     });
12464   }
12465
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);
12473
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;
12481
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();
12491   });
12492   var utcMonths = utcMonth.range;
12493
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();
12503   });
12504
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);
12513     });
12514   };
12515   var utcYears = utcYear.range;
12516
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);
12521       return date;
12522     }
12523     return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
12524   }
12525
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);
12530       return date;
12531     }
12532     return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
12533   }
12534
12535   function newYear(y) {
12536     return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
12537   }
12538
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;
12548
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);
12559
12560     var formats = {
12561       "a": formatShortWeekday,
12562       "A": formatWeekday,
12563       "b": formatShortMonth,
12564       "B": formatMonth,
12565       "c": null,
12566       "d": formatDayOfMonth,
12567       "e": formatDayOfMonth,
12568       "f": formatMicroseconds,
12569       "H": formatHour24,
12570       "I": formatHour12,
12571       "j": formatDayOfYear,
12572       "L": formatMilliseconds,
12573       "m": formatMonthNumber,
12574       "M": formatMinutes,
12575       "p": formatPeriod,
12576       "Q": formatUnixTimestamp,
12577       "s": formatUnixTimestampSeconds,
12578       "S": formatSeconds,
12579       "u": formatWeekdayNumberMonday,
12580       "U": formatWeekNumberSunday,
12581       "V": formatWeekNumberISO,
12582       "w": formatWeekdayNumberSunday,
12583       "W": formatWeekNumberMonday,
12584       "x": null,
12585       "X": null,
12586       "y": formatYear,
12587       "Y": formatFullYear,
12588       "Z": formatZone,
12589       "%": formatLiteralPercent
12590     };
12591
12592     var utcFormats = {
12593       "a": formatUTCShortWeekday,
12594       "A": formatUTCWeekday,
12595       "b": formatUTCShortMonth,
12596       "B": formatUTCMonth,
12597       "c": null,
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,
12616       "x": null,
12617       "X": null,
12618       "y": formatUTCYear,
12619       "Y": formatUTCFullYear,
12620       "Z": formatUTCZone,
12621       "%": formatLiteralPercent
12622     };
12623
12624     var parses = {
12625       "a": parseShortWeekday,
12626       "A": parseWeekday,
12627       "b": parseShortMonth,
12628       "B": parseMonth,
12629       "c": parseLocaleDateTime,
12630       "d": parseDayOfMonth,
12631       "e": parseDayOfMonth,
12632       "f": parseMicroseconds,
12633       "H": parseHour24,
12634       "I": parseHour24,
12635       "j": parseDayOfYear,
12636       "L": parseMilliseconds,
12637       "m": parseMonthNumber,
12638       "M": parseMinutes,
12639       "p": parsePeriod,
12640       "Q": parseUnixTimestamp,
12641       "s": parseUnixTimestampSeconds,
12642       "S": parseSeconds,
12643       "u": parseWeekdayNumberMonday,
12644       "U": parseWeekNumberSunday,
12645       "V": parseWeekNumberISO,
12646       "w": parseWeekdayNumberSunday,
12647       "W": parseWeekNumberMonday,
12648       "x": parseLocaleDate,
12649       "X": parseLocaleTime,
12650       "y": parseYear,
12651       "Y": parseFullYear,
12652       "Z": parseZone,
12653       "%": parseLiteralPercent
12654     };
12655
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);
12663
12664     function newFormat(specifier, formats) {
12665       return function(date) {
12666         var string = [],
12667             i = -1,
12668             j = 0,
12669             n = specifier.length,
12670             c,
12671             pad,
12672             format;
12673
12674         if (!(date instanceof Date)) date = new Date(+date);
12675
12676         while (++i < n) {
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);
12682             string.push(c);
12683             j = i + 1;
12684           }
12685         }
12686
12687         string.push(specifier.slice(j, i));
12688         return string.join("");
12689       };
12690     }
12691
12692     function newParse(specifier, newDate) {
12693       return function(string) {
12694         var d = newYear(1900),
12695             i = parseSpecifier(d, specifier, string += "", 0),
12696             week, day$$1;
12697         if (i != string.length) return null;
12698
12699         // If a UNIX timestamp is specified, return it.
12700         if ("Q" in d) return new Date(d.Q);
12701
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;
12704
12705         // Convert day-of-week and week-of-year to day-of-year.
12706         if ("V" in d) {
12707           if (d.V < 1 || d.V > 53) return null;
12708           if (!("w" in d)) d.w = 1;
12709           if ("Z" in d) {
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;
12716           } else {
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;
12723           }
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();
12727           d.m = 0;
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;
12729         }
12730
12731         // If a time zone is specified, all fields are interpreted as UTC and then
12732         // offset according to the specified time zone.
12733         if ("Z" in d) {
12734           d.H += d.Z / 100 | 0;
12735           d.M += d.Z % 100;
12736           return utcDate(d);
12737         }
12738
12739         // Otherwise, all fields are in local time.
12740         return newDate(d);
12741       };
12742     }
12743
12744     function parseSpecifier(d, specifier, string, j) {
12745       var i = 0,
12746           n = specifier.length,
12747           m = string.length,
12748           c,
12749           parse;
12750
12751       while (i < n) {
12752         if (j >= m) return -1;
12753         c = specifier.charCodeAt(i++);
12754         if (c === 37) {
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++)) {
12759           return -1;
12760         }
12761       }
12762
12763       return j;
12764     }
12765
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;
12769     }
12770
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;
12774     }
12775
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;
12779     }
12780
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;
12784     }
12785
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;
12789     }
12790
12791     function parseLocaleDateTime(d, string, i) {
12792       return parseSpecifier(d, locale_dateTime, string, i);
12793     }
12794
12795     function parseLocaleDate(d, string, i) {
12796       return parseSpecifier(d, locale_date, string, i);
12797     }
12798
12799     function parseLocaleTime(d, string, i) {
12800       return parseSpecifier(d, locale_time, string, i);
12801     }
12802
12803     function formatShortWeekday(d) {
12804       return locale_shortWeekdays[d.getDay()];
12805     }
12806
12807     function formatWeekday(d) {
12808       return locale_weekdays[d.getDay()];
12809     }
12810
12811     function formatShortMonth(d) {
12812       return locale_shortMonths[d.getMonth()];
12813     }
12814
12815     function formatMonth(d) {
12816       return locale_months[d.getMonth()];
12817     }
12818
12819     function formatPeriod(d) {
12820       return locale_periods[+(d.getHours() >= 12)];
12821     }
12822
12823     function formatUTCShortWeekday(d) {
12824       return locale_shortWeekdays[d.getUTCDay()];
12825     }
12826
12827     function formatUTCWeekday(d) {
12828       return locale_weekdays[d.getUTCDay()];
12829     }
12830
12831     function formatUTCShortMonth(d) {
12832       return locale_shortMonths[d.getUTCMonth()];
12833     }
12834
12835     function formatUTCMonth(d) {
12836       return locale_months[d.getUTCMonth()];
12837     }
12838
12839     function formatUTCPeriod(d) {
12840       return locale_periods[+(d.getUTCHours() >= 12)];
12841     }
12842
12843     return {
12844       format: function(specifier) {
12845         var f = newFormat(specifier += "", formats);
12846         f.toString = function() { return specifier; };
12847         return f;
12848       },
12849       parse: function(specifier) {
12850         var p = newParse(specifier += "", localDate);
12851         p.toString = function() { return specifier; };
12852         return p;
12853       },
12854       utcFormat: function(specifier) {
12855         var f = newFormat(specifier += "", utcFormats);
12856         f.toString = function() { return specifier; };
12857         return f;
12858       },
12859       utcParse: function(specifier) {
12860         var p = newParse(specifier, utcDate);
12861         p.toString = function() { return specifier; };
12862         return p;
12863       }
12864     };
12865   }
12866
12867   var pads = {"-": "", "_": " ", "0": "0"},
12868       numberRe = /^\s*\d+/, // note: ignores next directive
12869       percentRe = /^%/,
12870       requoteRe = /[\\^$*+?|[\]().{}]/g;
12871
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);
12877   }
12878
12879   function requote(s) {
12880     return s.replace(requoteRe, "\\$&");
12881   }
12882
12883   function formatRe(names) {
12884     return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
12885   }
12886
12887   function formatLookup(names) {
12888     var map = {}, i = -1, n = names.length;
12889     while (++i < n) map[names[i].toLowerCase()] = i;
12890     return map;
12891   }
12892
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;
12896   }
12897
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;
12901   }
12902
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;
12906   }
12907
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;
12911   }
12912
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;
12916   }
12917
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;
12921   }
12922
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;
12926   }
12927
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;
12931   }
12932
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;
12936   }
12937
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;
12941   }
12942
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;
12946   }
12947
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;
12951   }
12952
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;
12956   }
12957
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;
12961   }
12962
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;
12966   }
12967
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;
12971   }
12972
12973   function parseLiteralPercent(d, string, i) {
12974     var n = percentRe.exec(string.slice(i, i + 1));
12975     return n ? i + n[0].length : -1;
12976   }
12977
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;
12981   }
12982
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;
12986   }
12987
12988   function formatDayOfMonth(d, p) {
12989     return pad(d.getDate(), p, 2);
12990   }
12991
12992   function formatHour24(d, p) {
12993     return pad(d.getHours(), p, 2);
12994   }
12995
12996   function formatHour12(d, p) {
12997     return pad(d.getHours() % 12 || 12, p, 2);
12998   }
12999
13000   function formatDayOfYear(d, p) {
13001     return pad(1 + day.count(year(d), d), p, 3);
13002   }
13003
13004   function formatMilliseconds(d, p) {
13005     return pad(d.getMilliseconds(), p, 3);
13006   }
13007
13008   function formatMicroseconds(d, p) {
13009     return formatMilliseconds(d, p) + "000";
13010   }
13011
13012   function formatMonthNumber(d, p) {
13013     return pad(d.getMonth() + 1, p, 2);
13014   }
13015
13016   function formatMinutes(d, p) {
13017     return pad(d.getMinutes(), p, 2);
13018   }
13019
13020   function formatSeconds(d, p) {
13021     return pad(d.getSeconds(), p, 2);
13022   }
13023
13024   function formatWeekdayNumberMonday(d) {
13025     var day$$1 = d.getDay();
13026     return day$$1 === 0 ? 7 : day$$1;
13027   }
13028
13029   function formatWeekNumberSunday(d, p) {
13030     return pad(sunday.count(year(d), d), p, 2);
13031   }
13032
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);
13037   }
13038
13039   function formatWeekdayNumberSunday(d) {
13040     return d.getDay();
13041   }
13042
13043   function formatWeekNumberMonday(d, p) {
13044     return pad(monday.count(year(d), d), p, 2);
13045   }
13046
13047   function formatYear(d, p) {
13048     return pad(d.getFullYear() % 100, p, 2);
13049   }
13050
13051   function formatFullYear(d, p) {
13052     return pad(d.getFullYear() % 10000, p, 4);
13053   }
13054
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);
13060   }
13061
13062   function formatUTCDayOfMonth(d, p) {
13063     return pad(d.getUTCDate(), p, 2);
13064   }
13065
13066   function formatUTCHour24(d, p) {
13067     return pad(d.getUTCHours(), p, 2);
13068   }
13069
13070   function formatUTCHour12(d, p) {
13071     return pad(d.getUTCHours() % 12 || 12, p, 2);
13072   }
13073
13074   function formatUTCDayOfYear(d, p) {
13075     return pad(1 + utcDay.count(utcYear(d), d), p, 3);
13076   }
13077
13078   function formatUTCMilliseconds(d, p) {
13079     return pad(d.getUTCMilliseconds(), p, 3);
13080   }
13081
13082   function formatUTCMicroseconds(d, p) {
13083     return formatUTCMilliseconds(d, p) + "000";
13084   }
13085
13086   function formatUTCMonthNumber(d, p) {
13087     return pad(d.getUTCMonth() + 1, p, 2);
13088   }
13089
13090   function formatUTCMinutes(d, p) {
13091     return pad(d.getUTCMinutes(), p, 2);
13092   }
13093
13094   function formatUTCSeconds(d, p) {
13095     return pad(d.getUTCSeconds(), p, 2);
13096   }
13097
13098   function formatUTCWeekdayNumberMonday(d) {
13099     var dow = d.getUTCDay();
13100     return dow === 0 ? 7 : dow;
13101   }
13102
13103   function formatUTCWeekNumberSunday(d, p) {
13104     return pad(utcSunday.count(utcYear(d), d), p, 2);
13105   }
13106
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);
13111   }
13112
13113   function formatUTCWeekdayNumberSunday(d) {
13114     return d.getUTCDay();
13115   }
13116
13117   function formatUTCWeekNumberMonday(d, p) {
13118     return pad(utcMonday.count(utcYear(d), d), p, 2);
13119   }
13120
13121   function formatUTCYear(d, p) {
13122     return pad(d.getUTCFullYear() % 100, p, 2);
13123   }
13124
13125   function formatUTCFullYear(d, p) {
13126     return pad(d.getUTCFullYear() % 10000, p, 4);
13127   }
13128
13129   function formatUTCZone() {
13130     return "+0000";
13131   }
13132
13133   function formatLiteralPercent() {
13134     return "%";
13135   }
13136
13137   function formatUnixTimestamp(d) {
13138     return +d;
13139   }
13140
13141   function formatUnixTimestampSeconds(d) {
13142     return Math.floor(+d / 1000);
13143   }
13144
13145   var locale$1;
13146   var timeFormat;
13147   var timeParse;
13148   var utcFormat;
13149   var utcParse;
13150
13151   defaultLocale$1({
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"]
13160   });
13161
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;
13168     return locale$1;
13169   }
13170
13171   var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
13172
13173   function formatIsoNative(date) {
13174     return date.toISOString();
13175   }
13176
13177   var formatIso = Date.prototype.toISOString
13178       ? formatIsoNative
13179       : utcFormat(isoSpecifier);
13180
13181   function parseIsoNative(string) {
13182     var date = new Date(string);
13183     return isNaN(date) ? null : date;
13184   }
13185
13186   var parseIso = +new Date("2000-01-01T00:00:00.000Z")
13187       ? parseIsoNative
13188       : utcParse(isoSpecifier);
13189
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;
13197
13198   function date$1(t) {
13199     return new Date(t);
13200   }
13201
13202   function number$3(t) {
13203     return t instanceof Date ? +t : +new Date(+t);
13204   }
13205
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;
13210
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");
13219
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  ]
13239     ];
13240
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);
13249     }
13250
13251     function tickInterval(interval, start, stop, step) {
13252       if (interval == null) interval = 10;
13253
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;
13263         } else if (i) {
13264           i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
13265           step = i[1];
13266           interval = i[0];
13267         } else {
13268           step = Math.max(tickStep(start, stop, interval), 1);
13269           interval = millisecond$$1;
13270         }
13271       }
13272
13273       return step == null ? interval : interval.every(step);
13274     }
13275
13276     scale.invert = function(y) {
13277       return new Date(invert(y));
13278     };
13279
13280     scale.domain = function(_) {
13281       return arguments.length ? domain(map$2.call(_, number$3)) : domain().map(date$1);
13282     };
13283
13284     scale.ticks = function(interval, step) {
13285       var d = domain(),
13286           t0 = d[0],
13287           t1 = d[d.length - 1],
13288           r = t1 < t0,
13289           t;
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;
13294     };
13295
13296     scale.tickFormat = function(count, specifier) {
13297       return specifier == null ? tickFormat : format(specifier);
13298     };
13299
13300     scale.nice = function(interval, step) {
13301       var d = domain();
13302       return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
13303           ? domain(nice(d, interval))
13304           : scale;
13305     };
13306
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));
13309     };
13310
13311     return scale;
13312   }
13313
13314   function time() {
13315     return calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);
13316   }
13317
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)]);
13320   }
13321
13322   function colors(s) {
13323     return s.match(/.{6}/g).map(function(x) {
13324       return "#" + x;
13325     });
13326   }
13327
13328   var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
13329
13330   var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6");
13331
13332   var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9");
13333
13334   var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5");
13335
13336   var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
13337
13338   var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13339
13340   var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13341
13342   var rainbow = cubehelix();
13343
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 + "";
13351   }
13352
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)))];
13357     };
13358   }
13359
13360   var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
13361
13362   var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
13363
13364   var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
13365
13366   var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
13367
13368   function sequential(interpolator) {
13369     var x0 = 0,
13370         x1 = 1,
13371         clamp = false;
13372
13373     function scale(x) {
13374       var t = (x - x0) / (x1 - x0);
13375       return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
13376     }
13377
13378     scale.domain = function(_) {
13379       return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];
13380     };
13381
13382     scale.clamp = function(_) {
13383       return arguments.length ? (clamp = !!_, scale) : clamp;
13384     };
13385
13386     scale.interpolator = function(_) {
13387       return arguments.length ? (interpolator = _, scale) : interpolator;
13388     };
13389
13390     scale.copy = function() {
13391       return sequential(interpolator).domain([x0, x1]).clamp(clamp);
13392     };
13393
13394     return linearish(scale);
13395   }
13396
13397   function constant$a(x) {
13398     return function constant() {
13399       return x;
13400     };
13401   }
13402
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;
13410
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;
13415
13416   function acos$1(x) {
13417     return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
13418   }
13419
13420   function asin$1(x) {
13421     return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
13422   }
13423
13424   function arcInnerRadius(d) {
13425     return d.innerRadius;
13426   }
13427
13428   function arcOuterRadius(d) {
13429     return d.outerRadius;
13430   }
13431
13432   function arcStartAngle(d) {
13433     return d.startAngle;
13434   }
13435
13436   function arcEndAngle(d) {
13437     return d.endAngle;
13438   }
13439
13440   function arcPadAngle(d) {
13441     return d && d.padAngle; // Note: optional!
13442   }
13443
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];
13449   }
13450
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) {
13454     var x01 = x0 - x1,
13455         y01 = y0 - y1,
13456         lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
13457         ox = lo * y01,
13458         oy = -lo * x01,
13459         x11 = x0 + ox,
13460         y11 = y0 + oy,
13461         x10 = x1 + ox,
13462         y10 = y1 + oy,
13463         x00 = (x11 + x10) / 2,
13464         y00 = (y11 + y10) / 2,
13465         dx = x10 - x11,
13466         dy = y10 - y11,
13467         d2 = dx * dx + dy * dy,
13468         r = r1 - rc,
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,
13475         dx0 = cx0 - x00,
13476         dy0 = cy0 - y00,
13477         dx1 = cx1 - x00,
13478         dy1 = cy1 - y00;
13479
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;
13483
13484     return {
13485       cx: cx0,
13486       cy: cy0,
13487       x01: -ox,
13488       y01: -oy,
13489       x11: cx0 * (r1 / r - 1),
13490       y11: cy0 * (r1 / r - 1)
13491     };
13492   }
13493
13494   function arc() {
13495     var innerRadius = arcInnerRadius,
13496         outerRadius = arcOuterRadius,
13497         cornerRadius = constant$a(0),
13498         padRadius = null,
13499         startAngle = arcStartAngle,
13500         endAngle = arcEndAngle,
13501         padAngle = arcPadAngle,
13502         context = null;
13503
13504     function arc() {
13505       var buffer,
13506           r,
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),
13512           cw = a1 > a0;
13513
13514       if (!context) context = buffer = path();
13515
13516       // Ensure that the outer radius is always larger than the inner radius.
13517       if (r1 < r0) r = r1, r1 = r0, r0 = r;
13518
13519       // Is it a point?
13520       if (!(r1 > epsilon$3)) context.moveTo(0, 0);
13521
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);
13529         }
13530       }
13531
13532       // Or is it a circular or annular sector?
13533       else {
13534         var a01 = a0,
13535             a11 = a1,
13536             a00 = a0,
13537             a10 = a1,
13538             da0 = da,
13539             da1 = da,
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)),
13543             rc0 = rc,
13544             rc1 = rc,
13545             t0,
13546             t1;
13547
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;
13556         }
13557
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);
13562
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);
13569
13570           // Restrict the corner radius according to the sector angle.
13571           if (da < pi$4) {
13572             var oc = da0 > epsilon$3 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],
13573                 ax = x01 - oc[0],
13574                 ay = y01 - oc[1],
13575                 bx = x11 - oc[0],
13576                 by = y11 - oc[1],
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));
13581           }
13582         }
13583
13584         // Is the sector collapsed to a line?
13585         if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
13586
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);
13591
13592           context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
13593
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);
13596
13597           // Otherwise, draw the two corners and the ring.
13598           else {
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);
13602           }
13603         }
13604
13605         // Or is the outer ring just a circular arc?
13606         else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
13607
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);
13611
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);
13616
13617           context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
13618
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);
13621
13622           // Otherwise, draw the two corners and the ring.
13623           else {
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);
13627           }
13628         }
13629
13630         // Or is the inner ring just a circular arc?
13631         else context.arc(0, 0, r0, a10, a00, cw);
13632       }
13633
13634       context.closePath();
13635
13636       if (buffer) return context = null, buffer + "" || null;
13637     }
13638
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];
13643     };
13644
13645     arc.innerRadius = function(_) {
13646       return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : innerRadius;
13647     };
13648
13649     arc.outerRadius = function(_) {
13650       return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : outerRadius;
13651     };
13652
13653     arc.cornerRadius = function(_) {
13654       return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : cornerRadius;
13655     };
13656
13657     arc.padRadius = function(_) {
13658       return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), arc) : padRadius;
13659     };
13660
13661     arc.startAngle = function(_) {
13662       return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : startAngle;
13663     };
13664
13665     arc.endAngle = function(_) {
13666       return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : endAngle;
13667     };
13668
13669     arc.padAngle = function(_) {
13670       return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : padAngle;
13671     };
13672
13673     arc.context = function(_) {
13674       return arguments.length ? ((context = _ == null ? null : _), arc) : context;
13675     };
13676
13677     return arc;
13678   }
13679
13680   function Linear(context) {
13681     this._context = context;
13682   }
13683
13684   Linear.prototype = {
13685     areaStart: function() {
13686       this._line = 0;
13687     },
13688     areaEnd: function() {
13689       this._line = NaN;
13690     },
13691     lineStart: function() {
13692       this._point = 0;
13693     },
13694     lineEnd: function() {
13695       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
13696       this._line = 1 - this._line;
13697     },
13698     point: function(x, y) {
13699       x = +x, y = +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;
13704       }
13705     }
13706   };
13707
13708   function curveLinear(context) {
13709     return new Linear(context);
13710   }
13711
13712   function x$3(p) {
13713     return p[0];
13714   }
13715
13716   function y$3(p) {
13717     return p[1];
13718   }
13719
13720   function line() {
13721     var x$$1 = x$3,
13722         y$$1 = y$3,
13723         defined = constant$a(true),
13724         context = null,
13725         curve = curveLinear,
13726         output = null;
13727
13728     function line(data) {
13729       var i,
13730           n = data.length,
13731           d,
13732           defined0 = false,
13733           buffer;
13734
13735       if (context == null) output = curve(buffer = path());
13736
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();
13741         }
13742         if (defined0) output.point(+x$$1(d, i, data), +y$$1(d, i, data));
13743       }
13744
13745       if (buffer) return output = null, buffer + "" || null;
13746     }
13747
13748     line.x = function(_) {
13749       return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$a(+_), line) : x$$1;
13750     };
13751
13752     line.y = function(_) {
13753       return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$a(+_), line) : y$$1;
13754     };
13755
13756     line.defined = function(_) {
13757       return arguments.length ? (defined = typeof _ === "function" ? _ : constant$a(!!_), line) : defined;
13758     };
13759
13760     line.curve = function(_) {
13761       return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
13762     };
13763
13764     line.context = function(_) {
13765       return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
13766     };
13767
13768     return line;
13769   }
13770
13771   function area() {
13772     var x0 = x$3,
13773         x1 = null,
13774         y0 = constant$a(0),
13775         y1 = y$3,
13776         defined = constant$a(true),
13777         context = null,
13778         curve = curveLinear,
13779         output = null;
13780
13781     function area(data) {
13782       var i,
13783           j,
13784           k,
13785           n = data.length,
13786           d,
13787           defined0 = false,
13788           buffer,
13789           x0z = new Array(n),
13790           y0z = new Array(n);
13791
13792       if (context == null) output = curve(buffer = path());
13793
13794       for (i = 0; i <= n; ++i) {
13795         if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13796           if (defined0 = !defined0) {
13797             j = i;
13798             output.areaStart();
13799             output.lineStart();
13800           } else {
13801             output.lineEnd();
13802             output.lineStart();
13803             for (k = i - 1; k >= j; --k) {
13804               output.point(x0z[k], y0z[k]);
13805             }
13806             output.lineEnd();
13807             output.areaEnd();
13808           }
13809         }
13810         if (defined0) {
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]);
13813         }
13814       }
13815
13816       if (buffer) return output = null, buffer + "" || null;
13817     }
13818
13819     function arealine() {
13820       return line().defined(defined).curve(curve).context(context);
13821     }
13822
13823     area.x = function(_) {
13824       return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$a(+_), x1 = null, area) : x0;
13825     };
13826
13827     area.x0 = function(_) {
13828       return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$a(+_), area) : x0;
13829     };
13830
13831     area.x1 = function(_) {
13832       return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), area) : x1;
13833     };
13834
13835     area.y = function(_) {
13836       return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$a(+_), y1 = null, area) : y0;
13837     };
13838
13839     area.y0 = function(_) {
13840       return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$a(+_), area) : y0;
13841     };
13842
13843     area.y1 = function(_) {
13844       return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), area) : y1;
13845     };
13846
13847     area.lineX0 =
13848     area.lineY0 = function() {
13849       return arealine().x(x0).y(y0);
13850     };
13851
13852     area.lineY1 = function() {
13853       return arealine().x(x0).y(y1);
13854     };
13855
13856     area.lineX1 = function() {
13857       return arealine().x(x1).y(y0);
13858     };
13859
13860     area.defined = function(_) {
13861       return arguments.length ? (defined = typeof _ === "function" ? _ : constant$a(!!_), area) : defined;
13862     };
13863
13864     area.curve = function(_) {
13865       return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
13866     };
13867
13868     area.context = function(_) {
13869       return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
13870     };
13871
13872     return area;
13873   }
13874
13875   function descending(a, b) {
13876     return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
13877   }
13878
13879   function identity$6(d) {
13880     return d;
13881   }
13882
13883   function pie() {
13884     var value = identity$6,
13885         sortValues = descending,
13886         sort = null,
13887         startAngle = constant$a(0),
13888         endAngle = constant$a(tau$4),
13889         padAngle = constant$a(0);
13890
13891     function pie(data) {
13892       var i,
13893           n = data.length,
13894           j,
13895           k,
13896           sum = 0,
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)),
13901           a1,
13902           p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
13903           pa = p * (da < 0 ? -1 : 1),
13904           v;
13905
13906       for (i = 0; i < n; ++i) {
13907         if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
13908           sum += v;
13909         }
13910       }
13911
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]); });
13915
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] = {
13919           data: data[j],
13920           index: i,
13921           value: v,
13922           startAngle: a0,
13923           endAngle: a1,
13924           padAngle: p
13925         };
13926       }
13927
13928       return arcs;
13929     }
13930
13931     pie.value = function(_) {
13932       return arguments.length ? (value = typeof _ === "function" ? _ : constant$a(+_), pie) : value;
13933     };
13934
13935     pie.sortValues = function(_) {
13936       return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
13937     };
13938
13939     pie.sort = function(_) {
13940       return arguments.length ? (sort = _, sortValues = null, pie) : sort;
13941     };
13942
13943     pie.startAngle = function(_) {
13944       return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : startAngle;
13945     };
13946
13947     pie.endAngle = function(_) {
13948       return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : endAngle;
13949     };
13950
13951     pie.padAngle = function(_) {
13952       return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : padAngle;
13953     };
13954
13955     return pie;
13956   }
13957
13958   var curveRadialLinear = curveRadial(curveLinear);
13959
13960   function Radial(curve) {
13961     this._curve = curve;
13962   }
13963
13964   Radial.prototype = {
13965     areaStart: function() {
13966       this._curve.areaStart();
13967     },
13968     areaEnd: function() {
13969       this._curve.areaEnd();
13970     },
13971     lineStart: function() {
13972       this._curve.lineStart();
13973     },
13974     lineEnd: function() {
13975       this._curve.lineEnd();
13976     },
13977     point: function(a, r) {
13978       this._curve.point(r * Math.sin(a), r * -Math.cos(a));
13979     }
13980   };
13981
13982   function curveRadial(curve) {
13983
13984     function radial(context) {
13985       return new Radial(curve(context));
13986     }
13987
13988     radial._curve = curve;
13989
13990     return radial;
13991   }
13992
13993   function lineRadial(l) {
13994     var c = l.curve;
13995
13996     l.angle = l.x, delete l.x;
13997     l.radius = l.y, delete l.y;
13998
13999     l.curve = function(_) {
14000       return arguments.length ? c(curveRadial(_)) : c()._curve;
14001     };
14002
14003     return l;
14004   }
14005
14006   function lineRadial$1() {
14007     return lineRadial(line().curve(curveRadialLinear));
14008   }
14009
14010   function areaRadial() {
14011     var a = area().curve(curveRadialLinear),
14012         c = a.curve,
14013         x0 = a.lineX0,
14014         x1 = a.lineX1,
14015         y0 = a.lineY0,
14016         y1 = a.lineY1;
14017
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;
14028
14029     a.curve = function(_) {
14030       return arguments.length ? c(curveRadial(_)) : c()._curve;
14031     };
14032
14033     return a;
14034   }
14035
14036   function pointRadial(x, y) {
14037     return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
14038   }
14039
14040   var slice$6 = Array.prototype.slice;
14041
14042   function linkSource(d) {
14043     return d.source;
14044   }
14045
14046   function linkTarget(d) {
14047     return d.target;
14048   }
14049
14050   function link$2(curve) {
14051     var source = linkSource,
14052         target = linkTarget,
14053         x$$1 = x$3,
14054         y$$1 = y$3,
14055         context = null;
14056
14057     function link() {
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;
14062     }
14063
14064     link.source = function(_) {
14065       return arguments.length ? (source = _, link) : source;
14066     };
14067
14068     link.target = function(_) {
14069       return arguments.length ? (target = _, link) : target;
14070     };
14071
14072     link.x = function(_) {
14073       return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$a(+_), link) : x$$1;
14074     };
14075
14076     link.y = function(_) {
14077       return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$a(+_), link) : y$$1;
14078     };
14079
14080     link.context = function(_) {
14081       return arguments.length ? ((context = _ == null ? null : _), link) : context;
14082     };
14083
14084     return link;
14085   }
14086
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);
14090   }
14091
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);
14095   }
14096
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]);
14104   }
14105
14106   function linkHorizontal() {
14107     return link$2(curveHorizontal);
14108   }
14109
14110   function linkVertical() {
14111     return link$2(curveVertical);
14112   }
14113
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;
14118     return l;
14119   }
14120
14121   var circle$2 = {
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);
14126     }
14127   };
14128
14129   var cross$2 = {
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();
14145     }
14146   };
14147
14148   var tan30 = Math.sqrt(1 / 3),
14149       tan30_2 = tan30 * 2;
14150
14151   var diamond = {
14152     draw: function(context, size) {
14153       var y = Math.sqrt(size / tan30_2),
14154           x = y * tan30;
14155       context.moveTo(0, -y);
14156       context.lineTo(x, 0);
14157       context.lineTo(0, y);
14158       context.lineTo(-x, 0);
14159       context.closePath();
14160     }
14161   };
14162
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;
14167
14168   var star = {
14169     draw: function(context, size) {
14170       var r = Math.sqrt(size * ka),
14171           x = kx * r,
14172           y = ky * r;
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,
14177             c = Math.cos(a),
14178             s = Math.sin(a);
14179         context.lineTo(s * r, -c * r);
14180         context.lineTo(c * x - s * y, s * x + c * y);
14181       }
14182       context.closePath();
14183     }
14184   };
14185
14186   var square = {
14187     draw: function(context, size) {
14188       var w = Math.sqrt(size),
14189           x = -w / 2;
14190       context.rect(x, x, w, w);
14191     }
14192   };
14193
14194   var sqrt3 = Math.sqrt(3);
14195
14196   var triangle = {
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();
14203     }
14204   };
14205
14206   var c = -0.5,
14207       s = Math.sqrt(3) / 2,
14208       k = 1 / Math.sqrt(12),
14209       a = (k / 2 + 1) * 3;
14210
14211   var wye = {
14212     draw: function(context, size) {
14213       var r = Math.sqrt(size / a),
14214           x0 = r / 2,
14215           y0 = r * k,
14216           x1 = x0,
14217           y1 = r * k + r,
14218           x2 = -x1,
14219           y2 = y1;
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();
14230     }
14231   };
14232
14233   var symbols = [
14234     circle$2,
14235     cross$2,
14236     diamond,
14237     square,
14238     star,
14239     triangle,
14240     wye
14241   ];
14242
14243   function symbol() {
14244     var type = constant$a(circle$2),
14245         size = constant$a(64),
14246         context = null;
14247
14248     function symbol() {
14249       var buffer;
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;
14253     }
14254
14255     symbol.type = function(_) {
14256       return arguments.length ? (type = typeof _ === "function" ? _ : constant$a(_), symbol) : type;
14257     };
14258
14259     symbol.size = function(_) {
14260       return arguments.length ? (size = typeof _ === "function" ? _ : constant$a(+_), symbol) : size;
14261     };
14262
14263     symbol.context = function(_) {
14264       return arguments.length ? (context = _ == null ? null : _, symbol) : context;
14265     };
14266
14267     return symbol;
14268   }
14269
14270   function noop$2() {}
14271
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
14280     );
14281   }
14282
14283   function Basis(context) {
14284     this._context = context;
14285   }
14286
14287   Basis.prototype = {
14288     areaStart: function() {
14289       this._line = 0;
14290     },
14291     areaEnd: function() {
14292       this._line = NaN;
14293     },
14294     lineStart: function() {
14295       this._x0 = this._x1 =
14296       this._y0 = this._y1 = NaN;
14297       this._point = 0;
14298     },
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;
14303       }
14304       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14305       this._line = 1 - this._line;
14306     },
14307     point: function(x, y) {
14308       x = +x, y = +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;
14314       }
14315       this._x0 = this._x1, this._x1 = x;
14316       this._y0 = this._y1, this._y1 = y;
14317     }
14318   };
14319
14320   function basis$2(context) {
14321     return new Basis(context);
14322   }
14323
14324   function BasisClosed(context) {
14325     this._context = context;
14326   }
14327
14328   BasisClosed.prototype = {
14329     areaStart: noop$2,
14330     areaEnd: noop$2,
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;
14334       this._point = 0;
14335     },
14336     lineEnd: function() {
14337       switch (this._point) {
14338         case 1: {
14339           this._context.moveTo(this._x2, this._y2);
14340           this._context.closePath();
14341           break;
14342         }
14343         case 2: {
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();
14347           break;
14348         }
14349         case 3: {
14350           this.point(this._x2, this._y2);
14351           this.point(this._x3, this._y3);
14352           this.point(this._x4, this._y4);
14353           break;
14354         }
14355       }
14356     },
14357     point: function(x, y) {
14358       x = +x, y = +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;
14364       }
14365       this._x0 = this._x1, this._x1 = x;
14366       this._y0 = this._y1, this._y1 = y;
14367     }
14368   };
14369
14370   function basisClosed$1(context) {
14371     return new BasisClosed(context);
14372   }
14373
14374   function BasisOpen(context) {
14375     this._context = context;
14376   }
14377
14378   BasisOpen.prototype = {
14379     areaStart: function() {
14380       this._line = 0;
14381     },
14382     areaEnd: function() {
14383       this._line = NaN;
14384     },
14385     lineStart: function() {
14386       this._x0 = this._x1 =
14387       this._y0 = this._y1 = NaN;
14388       this._point = 0;
14389     },
14390     lineEnd: function() {
14391       if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14392       this._line = 1 - this._line;
14393     },
14394     point: function(x, y) {
14395       x = +x, y = +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;
14402       }
14403       this._x0 = this._x1, this._x1 = x;
14404       this._y0 = this._y1, this._y1 = y;
14405     }
14406   };
14407
14408   function basisOpen(context) {
14409     return new BasisOpen(context);
14410   }
14411
14412   function Bundle(context, beta) {
14413     this._basis = new Basis(context);
14414     this._beta = beta;
14415   }
14416
14417   Bundle.prototype = {
14418     lineStart: function() {
14419       this._x = [];
14420       this._y = [];
14421       this._basis.lineStart();
14422     },
14423     lineEnd: function() {
14424       var x = this._x,
14425           y = this._y,
14426           j = x.length - 1;
14427
14428       if (j > 0) {
14429         var x0 = x[0],
14430             y0 = y[0],
14431             dx = x[j] - x0,
14432             dy = y[j] - y0,
14433             i = -1,
14434             t;
14435
14436         while (++i <= j) {
14437           t = i / j;
14438           this._basis.point(
14439             this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
14440             this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
14441           );
14442         }
14443       }
14444
14445       this._x = this._y = null;
14446       this._basis.lineEnd();
14447     },
14448     point: function(x, y) {
14449       this._x.push(+x);
14450       this._y.push(+y);
14451     }
14452   };
14453
14454   var bundle = (function custom(beta) {
14455
14456     function bundle(context) {
14457       return beta === 1 ? new Basis(context) : new Bundle(context, beta);
14458     }
14459
14460     bundle.beta = function(beta) {
14461       return custom(+beta);
14462     };
14463
14464     return bundle;
14465   })(0.85);
14466
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),
14473       that._x2,
14474       that._y2
14475     );
14476   }
14477
14478   function Cardinal(context, tension) {
14479     this._context = context;
14480     this._k = (1 - tension) / 6;
14481   }
14482
14483   Cardinal.prototype = {
14484     areaStart: function() {
14485       this._line = 0;
14486     },
14487     areaEnd: function() {
14488       this._line = NaN;
14489     },
14490     lineStart: function() {
14491       this._x0 = this._x1 = this._x2 =
14492       this._y0 = this._y1 = this._y2 = NaN;
14493       this._point = 0;
14494     },
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;
14499       }
14500       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14501       this._line = 1 - this._line;
14502     },
14503     point: function(x, y) {
14504       x = +x, y = +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;
14510       }
14511       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14512       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14513     }
14514   };
14515
14516   var cardinal = (function custom(tension) {
14517
14518     function cardinal(context) {
14519       return new Cardinal(context, tension);
14520     }
14521
14522     cardinal.tension = function(tension) {
14523       return custom(+tension);
14524     };
14525
14526     return cardinal;
14527   })(0);
14528
14529   function CardinalClosed(context, tension) {
14530     this._context = context;
14531     this._k = (1 - tension) / 6;
14532   }
14533
14534   CardinalClosed.prototype = {
14535     areaStart: noop$2,
14536     areaEnd: noop$2,
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;
14540       this._point = 0;
14541     },
14542     lineEnd: function() {
14543       switch (this._point) {
14544         case 1: {
14545           this._context.moveTo(this._x3, this._y3);
14546           this._context.closePath();
14547           break;
14548         }
14549         case 2: {
14550           this._context.lineTo(this._x3, this._y3);
14551           this._context.closePath();
14552           break;
14553         }
14554         case 3: {
14555           this.point(this._x3, this._y3);
14556           this.point(this._x4, this._y4);
14557           this.point(this._x5, this._y5);
14558           break;
14559         }
14560       }
14561     },
14562     point: function(x, y) {
14563       x = +x, y = +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;
14569       }
14570       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14571       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14572     }
14573   };
14574
14575   var cardinalClosed = (function custom(tension) {
14576
14577     function cardinal$$1(context) {
14578       return new CardinalClosed(context, tension);
14579     }
14580
14581     cardinal$$1.tension = function(tension) {
14582       return custom(+tension);
14583     };
14584
14585     return cardinal$$1;
14586   })(0);
14587
14588   function CardinalOpen(context, tension) {
14589     this._context = context;
14590     this._k = (1 - tension) / 6;
14591   }
14592
14593   CardinalOpen.prototype = {
14594     areaStart: function() {
14595       this._line = 0;
14596     },
14597     areaEnd: function() {
14598       this._line = NaN;
14599     },
14600     lineStart: function() {
14601       this._x0 = this._x1 = this._x2 =
14602       this._y0 = this._y1 = this._y2 = NaN;
14603       this._point = 0;
14604     },
14605     lineEnd: function() {
14606       if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14607       this._line = 1 - this._line;
14608     },
14609     point: function(x, y) {
14610       x = +x, y = +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;
14617       }
14618       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14619       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14620     }
14621   };
14622
14623   var cardinalOpen = (function custom(tension) {
14624
14625     function cardinal$$1(context) {
14626       return new CardinalOpen(context, tension);
14627     }
14628
14629     cardinal$$1.tension = function(tension) {
14630       return custom(+tension);
14631     };
14632
14633     return cardinal$$1;
14634   })(0);
14635
14636   function point$4(that, x, y) {
14637     var x1 = that._x1,
14638         y1 = that._y1,
14639         x2 = that._x2,
14640         y2 = that._y2;
14641
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;
14647     }
14648
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;
14654     }
14655
14656     that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
14657   }
14658
14659   function CatmullRom(context, alpha) {
14660     this._context = context;
14661     this._alpha = alpha;
14662   }
14663
14664   CatmullRom.prototype = {
14665     areaStart: function() {
14666       this._line = 0;
14667     },
14668     areaEnd: function() {
14669       this._line = NaN;
14670     },
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 =
14676       this._point = 0;
14677     },
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;
14682       }
14683       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14684       this._line = 1 - this._line;
14685     },
14686     point: function(x, y) {
14687       x = +x, y = +y;
14688
14689       if (this._point) {
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));
14693       }
14694
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;
14700       }
14701
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;
14706     }
14707   };
14708
14709   var catmullRom = (function custom(alpha) {
14710
14711     function catmullRom(context) {
14712       return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
14713     }
14714
14715     catmullRom.alpha = function(alpha) {
14716       return custom(+alpha);
14717     };
14718
14719     return catmullRom;
14720   })(0.5);
14721
14722   function CatmullRomClosed(context, alpha) {
14723     this._context = context;
14724     this._alpha = alpha;
14725   }
14726
14727   CatmullRomClosed.prototype = {
14728     areaStart: noop$2,
14729     areaEnd: noop$2,
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 =
14735       this._point = 0;
14736     },
14737     lineEnd: function() {
14738       switch (this._point) {
14739         case 1: {
14740           this._context.moveTo(this._x3, this._y3);
14741           this._context.closePath();
14742           break;
14743         }
14744         case 2: {
14745           this._context.lineTo(this._x3, this._y3);
14746           this._context.closePath();
14747           break;
14748         }
14749         case 3: {
14750           this.point(this._x3, this._y3);
14751           this.point(this._x4, this._y4);
14752           this.point(this._x5, this._y5);
14753           break;
14754         }
14755       }
14756     },
14757     point: function(x, y) {
14758       x = +x, y = +y;
14759
14760       if (this._point) {
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));
14764       }
14765
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;
14771       }
14772
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;
14777     }
14778   };
14779
14780   var catmullRomClosed = (function custom(alpha) {
14781
14782     function catmullRom$$1(context) {
14783       return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
14784     }
14785
14786     catmullRom$$1.alpha = function(alpha) {
14787       return custom(+alpha);
14788     };
14789
14790     return catmullRom$$1;
14791   })(0.5);
14792
14793   function CatmullRomOpen(context, alpha) {
14794     this._context = context;
14795     this._alpha = alpha;
14796   }
14797
14798   CatmullRomOpen.prototype = {
14799     areaStart: function() {
14800       this._line = 0;
14801     },
14802     areaEnd: function() {
14803       this._line = NaN;
14804     },
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 =
14810       this._point = 0;
14811     },
14812     lineEnd: function() {
14813       if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14814       this._line = 1 - this._line;
14815     },
14816     point: function(x, y) {
14817       x = +x, y = +y;
14818
14819       if (this._point) {
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));
14823       }
14824
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;
14831       }
14832
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;
14837     }
14838   };
14839
14840   var catmullRomOpen = (function custom(alpha) {
14841
14842     function catmullRom$$1(context) {
14843       return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
14844     }
14845
14846     catmullRom$$1.alpha = function(alpha) {
14847       return custom(+alpha);
14848     };
14849
14850     return catmullRom$$1;
14851   })(0.5);
14852
14853   function LinearClosed(context) {
14854     this._context = context;
14855   }
14856
14857   LinearClosed.prototype = {
14858     areaStart: noop$2,
14859     areaEnd: noop$2,
14860     lineStart: function() {
14861       this._point = 0;
14862     },
14863     lineEnd: function() {
14864       if (this._point) this._context.closePath();
14865     },
14866     point: function(x, y) {
14867       x = +x, y = +y;
14868       if (this._point) this._context.lineTo(x, y);
14869       else this._point = 1, this._context.moveTo(x, y);
14870     }
14871   };
14872
14873   function linearClosed(context) {
14874     return new LinearClosed(context);
14875   }
14876
14877   function sign$1(x) {
14878     return x < 0 ? -1 : 1;
14879   }
14880
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;
14892   }
14893
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;
14898   }
14899
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) {
14904     var x0 = that._x0,
14905         y0 = that._y0,
14906         x1 = that._x1,
14907         y1 = that._y1,
14908         dx = (x1 - x0) / 3;
14909     that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
14910   }
14911
14912   function MonotoneX(context) {
14913     this._context = context;
14914   }
14915
14916   MonotoneX.prototype = {
14917     areaStart: function() {
14918       this._line = 0;
14919     },
14920     areaEnd: function() {
14921       this._line = NaN;
14922     },
14923     lineStart: function() {
14924       this._x0 = this._x1 =
14925       this._y0 = this._y1 =
14926       this._t0 = NaN;
14927       this._point = 0;
14928     },
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;
14933       }
14934       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14935       this._line = 1 - this._line;
14936     },
14937     point: function(x, y) {
14938       var t1 = NaN;
14939
14940       x = +x, y = +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;
14947       }
14948
14949       this._x0 = this._x1, this._x1 = x;
14950       this._y0 = this._y1, this._y1 = y;
14951       this._t0 = t1;
14952     }
14953   };
14954
14955   function MonotoneY(context) {
14956     this._context = new ReflectContext(context);
14957   }
14958
14959   (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
14960     MonotoneX.prototype.point.call(this, y, x);
14961   };
14962
14963   function ReflectContext(context) {
14964     this._context = context;
14965   }
14966
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); }
14972   };
14973
14974   function monotoneX(context) {
14975     return new MonotoneX(context);
14976   }
14977
14978   function monotoneY(context) {
14979     return new MonotoneY(context);
14980   }
14981
14982   function Natural(context) {
14983     this._context = context;
14984   }
14985
14986   Natural.prototype = {
14987     areaStart: function() {
14988       this._line = 0;
14989     },
14990     areaEnd: function() {
14991       this._line = NaN;
14992     },
14993     lineStart: function() {
14994       this._x = [];
14995       this._y = [];
14996     },
14997     lineEnd: function() {
14998       var x = this._x,
14999           y = this._y,
15000           n = x.length;
15001
15002       if (n) {
15003         this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
15004         if (n === 2) {
15005           this._context.lineTo(x[1], y[1]);
15006         } else {
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]);
15011           }
15012         }
15013       }
15014
15015       if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
15016       this._line = 1 - this._line;
15017       this._x = this._y = null;
15018     },
15019     point: function(x, y) {
15020       this._x.push(+x);
15021       this._y.push(+y);
15022     }
15023   };
15024
15025   // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
15026   function controlPoints(x) {
15027     var i,
15028         n = x.length - 1,
15029         m,
15030         a = new Array(n),
15031         b = new Array(n),
15032         r = new Array(n);
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];
15041     return [a, b];
15042   }
15043
15044   function natural(context) {
15045     return new Natural(context);
15046   }
15047
15048   function Step(context, t) {
15049     this._context = context;
15050     this._t = t;
15051   }
15052
15053   Step.prototype = {
15054     areaStart: function() {
15055       this._line = 0;
15056     },
15057     areaEnd: function() {
15058       this._line = NaN;
15059     },
15060     lineStart: function() {
15061       this._x = this._y = NaN;
15062       this._point = 0;
15063     },
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;
15068     },
15069     point: function(x, y) {
15070       x = +x, y = +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
15074         default: {
15075           if (this._t <= 0) {
15076             this._context.lineTo(this._x, y);
15077             this._context.lineTo(x, y);
15078           } else {
15079             var x1 = this._x * (1 - this._t) + x * this._t;
15080             this._context.lineTo(x1, this._y);
15081             this._context.lineTo(x1, y);
15082           }
15083           break;
15084         }
15085       }
15086       this._x = x, this._y = y;
15087     }
15088   };
15089
15090   function step(context) {
15091     return new Step(context, 0.5);
15092   }
15093
15094   function stepBefore(context) {
15095     return new Step(context, 0);
15096   }
15097
15098   function stepAfter(context) {
15099     return new Step(context, 1);
15100   }
15101
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];
15108       }
15109     }
15110   }
15111
15112   function none$2(series) {
15113     var n = series.length, o = new Array(n);
15114     while (--n >= 0) o[n] = n;
15115     return o;
15116   }
15117
15118   function stackValue(d, key) {
15119     return d[key];
15120   }
15121
15122   function stack() {
15123     var keys = constant$a([]),
15124         order = none$2,
15125         offset = none$1,
15126         value = stackValue;
15127
15128     function stack(data) {
15129       var kz = keys.apply(this, arguments),
15130           i,
15131           m = data.length,
15132           n = kz.length,
15133           sz = new Array(n),
15134           oz;
15135
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];
15140         }
15141         si.key = ki;
15142       }
15143
15144       for (i = 0, oz = order(sz); i < n; ++i) {
15145         sz[oz[i]].index = i;
15146       }
15147
15148       offset(sz, oz);
15149       return sz;
15150     }
15151
15152     stack.keys = function(_) {
15153       return arguments.length ? (keys = typeof _ === "function" ? _ : constant$a(slice$6.call(_)), stack) : keys;
15154     };
15155
15156     stack.value = function(_) {
15157       return arguments.length ? (value = typeof _ === "function" ? _ : constant$a(+_), stack) : value;
15158     };
15159
15160     stack.order = function(_) {
15161       return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$a(slice$6.call(_)), stack) : order;
15162     };
15163
15164     stack.offset = function(_) {
15165       return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
15166     };
15167
15168     return stack;
15169   }
15170
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;
15176     }
15177     none$1(series, order);
15178   }
15179
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;
15188         } else {
15189           d[0] = yp;
15190         }
15191       }
15192     }
15193   }
15194
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;
15200     }
15201     none$1(series, order);
15202   }
15203
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;
15216           s3 += skj0 - skj1;
15217         }
15218         s1 += sij0, s2 += s3 * sij0;
15219       }
15220       s0[j - 1][1] += s0[j - 1][0] = y;
15221       if (s1) y -= s2 / s1;
15222     }
15223     s0[j - 1][1] += s0[j - 1][0] = y;
15224     none$1(series, order);
15225   }
15226
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]; });
15230   }
15231
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;
15235     return s;
15236   }
15237
15238   function descending$1(series) {
15239     return ascending$2(series).reverse();
15240   }
15241
15242   function insideOut(series) {
15243     var n = series.length,
15244         i,
15245         j,
15246         sums = series.map(sum$2),
15247         order = none$2(series).sort(function(a, b) { return sums[b] - sums[a]; }),
15248         top = 0,
15249         bottom = 0,
15250         tops = [],
15251         bottoms = [];
15252
15253     for (i = 0; i < n; ++i) {
15254       j = order[i];
15255       if (top < bottom) {
15256         top += sums[j];
15257         tops.push(j);
15258       } else {
15259         bottom += sums[j];
15260         bottoms.push(j);
15261       }
15262     }
15263
15264     return bottoms.reverse().concat(tops);
15265   }
15266
15267   function reverse(series) {
15268     return none$2(series).reverse();
15269   }
15270
15271   function constant$b(x) {
15272     return function() {
15273       return x;
15274     };
15275   }
15276
15277   function x$4(d) {
15278     return d[0];
15279   }
15280
15281   function y$4(d) {
15282     return d[1];
15283   }
15284
15285   function RedBlackTree() {
15286     this._ = null; // root node
15287   }
15288
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
15296   }
15297
15298   RedBlackTree.prototype = {
15299     constructor: RedBlackTree,
15300
15301     insert: function(after, node) {
15302       var parent, grandpa, uncle;
15303
15304       if (after) {
15305         node.P = after;
15306         node.N = after.N;
15307         if (after.N) after.N.P = node;
15308         after.N = node;
15309         if (after.R) {
15310           after = after.R;
15311           while (after.L) after = after.L;
15312           after.L = node;
15313         } else {
15314           after.R = node;
15315         }
15316         parent = after;
15317       } else if (this._) {
15318         after = RedBlackFirst(this._);
15319         node.P = null;
15320         node.N = after;
15321         after.P = after.L = node;
15322         parent = after;
15323       } else {
15324         node.P = node.N = null;
15325         this._ = node;
15326         parent = null;
15327       }
15328       node.L = node.R = null;
15329       node.U = parent;
15330       node.C = true;
15331
15332       after = node;
15333       while (parent && parent.C) {
15334         grandpa = parent.U;
15335         if (parent === grandpa.L) {
15336           uncle = grandpa.R;
15337           if (uncle && uncle.C) {
15338             parent.C = uncle.C = false;
15339             grandpa.C = true;
15340             after = grandpa;
15341           } else {
15342             if (after === parent.R) {
15343               RedBlackRotateLeft(this, parent);
15344               after = parent;
15345               parent = after.U;
15346             }
15347             parent.C = false;
15348             grandpa.C = true;
15349             RedBlackRotateRight(this, grandpa);
15350           }
15351         } else {
15352           uncle = grandpa.L;
15353           if (uncle && uncle.C) {
15354             parent.C = uncle.C = false;
15355             grandpa.C = true;
15356             after = grandpa;
15357           } else {
15358             if (after === parent.L) {
15359               RedBlackRotateRight(this, parent);
15360               after = parent;
15361               parent = after.U;
15362             }
15363             parent.C = false;
15364             grandpa.C = true;
15365             RedBlackRotateLeft(this, grandpa);
15366           }
15367         }
15368         parent = after.U;
15369       }
15370       this._.C = false;
15371     },
15372
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;
15377
15378       var parent = node.U,
15379           sibling,
15380           left = node.L,
15381           right = node.R,
15382           next,
15383           red;
15384
15385       if (!left) next = right;
15386       else if (!right) next = left;
15387       else next = RedBlackFirst(right);
15388
15389       if (parent) {
15390         if (parent.L === node) parent.L = next;
15391         else parent.R = next;
15392       } else {
15393         this._ = next;
15394       }
15395
15396       if (left && right) {
15397         red = next.C;
15398         next.C = node.C;
15399         next.L = left;
15400         left.U = next;
15401         if (next !== right) {
15402           parent = next.U;
15403           next.U = node.U;
15404           node = next.R;
15405           parent.L = node;
15406           next.R = right;
15407           right.U = next;
15408         } else {
15409           next.U = parent;
15410           parent = next;
15411           node = next.R;
15412         }
15413       } else {
15414         red = node.C;
15415         node = next;
15416       }
15417
15418       if (node) node.U = parent;
15419       if (red) return;
15420       if (node && node.C) { node.C = false; return; }
15421
15422       do {
15423         if (node === this._) break;
15424         if (node === parent.L) {
15425           sibling = parent.R;
15426           if (sibling.C) {
15427             sibling.C = false;
15428             parent.C = true;
15429             RedBlackRotateLeft(this, parent);
15430             sibling = parent.R;
15431           }
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;
15436               sibling.C = true;
15437               RedBlackRotateRight(this, sibling);
15438               sibling = parent.R;
15439             }
15440             sibling.C = parent.C;
15441             parent.C = sibling.R.C = false;
15442             RedBlackRotateLeft(this, parent);
15443             node = this._;
15444             break;
15445           }
15446         } else {
15447           sibling = parent.L;
15448           if (sibling.C) {
15449             sibling.C = false;
15450             parent.C = true;
15451             RedBlackRotateRight(this, parent);
15452             sibling = parent.L;
15453           }
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;
15458               sibling.C = true;
15459               RedBlackRotateLeft(this, sibling);
15460               sibling = parent.L;
15461             }
15462             sibling.C = parent.C;
15463             parent.C = sibling.L.C = false;
15464             RedBlackRotateRight(this, parent);
15465             node = this._;
15466             break;
15467           }
15468         }
15469         sibling.C = true;
15470         node = parent;
15471         parent = parent.U;
15472       } while (!node.C);
15473
15474       if (node) node.C = false;
15475     }
15476   };
15477
15478   function RedBlackRotateLeft(tree, node) {
15479     var p = node,
15480         q = node.R,
15481         parent = p.U;
15482
15483     if (parent) {
15484       if (parent.L === p) parent.L = q;
15485       else parent.R = q;
15486     } else {
15487       tree._ = q;
15488     }
15489
15490     q.U = parent;
15491     p.U = q;
15492     p.R = q.L;
15493     if (p.R) p.R.U = p;
15494     q.L = p;
15495   }
15496
15497   function RedBlackRotateRight(tree, node) {
15498     var p = node,
15499         q = node.L,
15500         parent = p.U;
15501
15502     if (parent) {
15503       if (parent.L === p) parent.L = q;
15504       else parent.R = q;
15505     } else {
15506       tree._ = q;
15507     }
15508
15509     q.U = parent;
15510     p.U = q;
15511     p.L = q.R;
15512     if (p.L) p.L.U = p;
15513     q.R = p;
15514   }
15515
15516   function RedBlackFirst(node) {
15517     while (node.L) node = node.L;
15518     return node;
15519   }
15520
15521   function createEdge(left, right, v0, v1) {
15522     var edge = [null, null],
15523         index = edges.push(edge) - 1;
15524     edge.left = left;
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);
15530     return edge;
15531   }
15532
15533   function createBorderEdge(left, v0, v1) {
15534     var edge = [v0, v1];
15535     edge.left = left;
15536     return edge;
15537   }
15538
15539   function setEdgeEnd(edge, left, right, vertex) {
15540     if (!edge[0] && !edge[1]) {
15541       edge[0] = vertex;
15542       edge.left = left;
15543       edge.right = right;
15544     } else if (edge.left === right) {
15545       edge[1] = vertex;
15546     } else {
15547       edge[0] = vertex;
15548     }
15549   }
15550
15551   // Liang–Barsky line clipping.
15552   function clipEdge(edge, x0, y0, x1, y1) {
15553     var a = edge[0],
15554         b = edge[1],
15555         ax = a[0],
15556         ay = a[1],
15557         bx = b[0],
15558         by = b[1],
15559         t0 = 0,
15560         t1 = 1,
15561         dx = bx - ax,
15562         dy = by - ay,
15563         r;
15564
15565     r = x0 - ax;
15566     if (!dx && r > 0) return;
15567     r /= dx;
15568     if (dx < 0) {
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;
15574     }
15575
15576     r = x1 - ax;
15577     if (!dx && r < 0) return;
15578     r /= dx;
15579     if (dx < 0) {
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;
15585     }
15586
15587     r = y0 - ay;
15588     if (!dy && r > 0) return;
15589     r /= dy;
15590     if (dy < 0) {
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;
15596     }
15597
15598     r = y1 - ay;
15599     if (!dy && r < 0) return;
15600     r /= dy;
15601     if (dy < 0) {
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;
15607     }
15608
15609     if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
15610
15611     if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
15612     if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
15613     return true;
15614   }
15615
15616   function connectEdge(edge, x0, y0, x1, y1) {
15617     var v1 = edge[1];
15618     if (v1) return true;
15619
15620     var v0 = edge[0],
15621         left = edge.left,
15622         right = edge.right,
15623         lx = left[0],
15624         ly = left[1],
15625         rx = right[0],
15626         ry = right[1],
15627         fx = (lx + rx) / 2,
15628         fy = (ly + ry) / 2,
15629         fm,
15630         fb;
15631
15632     if (ry === ly) {
15633       if (fx < x0 || fx >= x1) return;
15634       if (lx > rx) {
15635         if (!v0) v0 = [fx, y0];
15636         else if (v0[1] >= y1) return;
15637         v1 = [fx, y1];
15638       } else {
15639         if (!v0) v0 = [fx, y1];
15640         else if (v0[1] < y0) return;
15641         v1 = [fx, y0];
15642       }
15643     } else {
15644       fm = (lx - rx) / (ry - ly);
15645       fb = fy - fm * fx;
15646       if (fm < -1 || fm > 1) {
15647         if (lx > rx) {
15648           if (!v0) v0 = [(y0 - fb) / fm, y0];
15649           else if (v0[1] >= y1) return;
15650           v1 = [(y1 - fb) / fm, y1];
15651         } else {
15652           if (!v0) v0 = [(y1 - fb) / fm, y1];
15653           else if (v0[1] < y0) return;
15654           v1 = [(y0 - fb) / fm, y0];
15655         }
15656       } else {
15657         if (ly < ry) {
15658           if (!v0) v0 = [x0, fm * x0 + fb];
15659           else if (v0[0] >= x1) return;
15660           v1 = [x1, fm * x1 + fb];
15661         } else {
15662           if (!v0) v0 = [x1, fm * x1 + fb];
15663           else if (v0[0] < x0) return;
15664           v1 = [x0, fm * x0 + fb];
15665         }
15666       }
15667     }
15668
15669     edge[0] = v0;
15670     edge[1] = v1;
15671     return true;
15672   }
15673
15674   function clipEdges(x0, y0, x1, y1) {
15675     var i = edges.length,
15676         edge;
15677
15678     while (i--) {
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)) {
15683         delete edges[i];
15684       }
15685     }
15686   }
15687
15688   function createCell(site) {
15689     return cells[site.index] = {
15690       site: site,
15691       halfedges: []
15692     };
15693   }
15694
15695   function cellHalfedgeAngle(cell, edge) {
15696     var site = cell.site,
15697         va = edge.left,
15698         vb = edge.right;
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]);
15704   }
15705
15706   function cellHalfedgeStart(cell, edge) {
15707     return edge[+(edge.left !== cell.site)];
15708   }
15709
15710   function cellHalfedgeEnd(cell, edge) {
15711     return edge[+(edge.left === cell.site)];
15712   }
15713
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];
15723       }
15724     }
15725   }
15726
15727   function clipCells(x0, y0, x1, y1) {
15728     var nCells = cells.length,
15729         iCell,
15730         cell,
15731         site,
15732         iHalfedge,
15733         halfedges,
15734         nHalfedges,
15735         start,
15736         startX,
15737         startY,
15738         end,
15739         endX,
15740         endY,
15741         cover = true;
15742
15743     for (iCell = 0; iCell < nCells; ++iCell) {
15744       if (cell = cells[iCell]) {
15745         site = cell.site;
15746         halfedges = cell.halfedges;
15747         iHalfedge = halfedges.length;
15748
15749         // Remove any dangling clipped edges.
15750         while (iHalfedge--) {
15751           if (!edges[halfedges[iHalfedge]]) {
15752             halfedges.splice(iHalfedge, 1);
15753           }
15754         }
15755
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]
15767                 : null)) - 1);
15768             ++nHalfedges;
15769           }
15770         }
15771
15772         if (nHalfedges) cover = false;
15773       }
15774     }
15775
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!
15778     if (cover) {
15779       var dx, dy, d2, dc = Infinity;
15780
15781       for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
15782         if (cell = cells[iCell]) {
15783           site = cell.site;
15784           dx = site[0] - x0;
15785           dy = site[1] - y0;
15786           d2 = dx * dx + dy * dy;
15787           if (d2 < dc) dc = d2, cover = cell;
15788         }
15789       }
15790
15791       if (cover) {
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
15798         );
15799       }
15800     }
15801
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];
15807         }
15808       }
15809     }
15810   }
15811
15812   var circlePool = [];
15813
15814   var firstCircle;
15815
15816   function Circle() {
15817     RedBlackNode(this);
15818     this.x =
15819     this.y =
15820     this.arc =
15821     this.site =
15822     this.cy = null;
15823   }
15824
15825   function attachCircle(arc) {
15826     var lArc = arc.P,
15827         rArc = arc.N;
15828
15829     if (!lArc || !rArc) return;
15830
15831     var lSite = lArc.site,
15832         cSite = arc.site,
15833         rSite = rArc.site;
15834
15835     if (lSite === rSite) return;
15836
15837     var bx = cSite[0],
15838         by = cSite[1],
15839         ax = lSite[0] - bx,
15840         ay = lSite[1] - by,
15841         cx = rSite[0] - bx,
15842         cy = rSite[1] - by;
15843
15844     var d = 2 * (ax * cy - ay * cx);
15845     if (d >= -epsilon2$2) return;
15846
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;
15851
15852     var circle = circlePool.pop() || new Circle;
15853     circle.arc = arc;
15854     circle.site = cSite;
15855     circle.x = x + bx;
15856     circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
15857
15858     arc.circle = circle;
15859
15860     var before = null,
15861         node = circles._;
15862
15863     while (node) {
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; }
15867       } else {
15868         if (node.R) node = node.R;
15869         else { before = node; break; }
15870       }
15871     }
15872
15873     circles.insert(before, circle);
15874     if (!before) firstCircle = circle;
15875   }
15876
15877   function detachCircle(arc) {
15878     var circle = arc.circle;
15879     if (circle) {
15880       if (!circle.P) firstCircle = circle.N;
15881       circles.remove(circle);
15882       circlePool.push(circle);
15883       RedBlackNode(circle);
15884       arc.circle = null;
15885     }
15886   }
15887
15888   var beachPool = [];
15889
15890   function Beach() {
15891     RedBlackNode(this);
15892     this.edge =
15893     this.site =
15894     this.circle = null;
15895   }
15896
15897   function createBeach(site) {
15898     var beach = beachPool.pop() || new Beach;
15899     beach.site = site;
15900     return beach;
15901   }
15902
15903   function detachBeach(beach) {
15904     detachCircle(beach);
15905     beaches.remove(beach);
15906     beachPool.push(beach);
15907     RedBlackNode(beach);
15908   }
15909
15910   function removeBeach(beach) {
15911     var circle = beach.circle,
15912         x = circle.x,
15913         y = circle.cy,
15914         vertex = [x, y],
15915         previous = beach.P,
15916         next = beach.N,
15917         disappearing = [beach];
15918
15919     detachBeach(beach);
15920
15921     var lArc = previous;
15922     while (lArc.circle
15923         && Math.abs(x - lArc.circle.x) < epsilon$4
15924         && Math.abs(y - lArc.circle.cy) < epsilon$4) {
15925       previous = lArc.P;
15926       disappearing.unshift(lArc);
15927       detachBeach(lArc);
15928       lArc = previous;
15929     }
15930
15931     disappearing.unshift(lArc);
15932     detachCircle(lArc);
15933
15934     var rArc = next;
15935     while (rArc.circle
15936         && Math.abs(x - rArc.circle.x) < epsilon$4
15937         && Math.abs(y - rArc.circle.cy) < epsilon$4) {
15938       next = rArc.N;
15939       disappearing.push(rArc);
15940       detachBeach(rArc);
15941       rArc = next;
15942     }
15943
15944     disappearing.push(rArc);
15945     detachCircle(rArc);
15946
15947     var nArcs = disappearing.length,
15948         iArc;
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);
15953     }
15954
15955     lArc = disappearing[0];
15956     rArc = disappearing[nArcs - 1];
15957     rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
15958
15959     attachCircle(lArc);
15960     attachCircle(rArc);
15961   }
15962
15963   function addBeach(site) {
15964     var x = site[0],
15965         directrix = site[1],
15966         lArc,
15967         rArc,
15968         dxl,
15969         dxr,
15970         node = beaches._;
15971
15972     while (node) {
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) {
15977           if (!node.R) {
15978             lArc = node;
15979             break;
15980           }
15981           node = node.R;
15982         } else {
15983           if (dxl > -epsilon$4) {
15984             lArc = node.P;
15985             rArc = node;
15986           } else if (dxr > -epsilon$4) {
15987             lArc = node;
15988             rArc = node.N;
15989           } else {
15990             lArc = rArc = node;
15991           }
15992           break;
15993         }
15994       }
15995     }
15996
15997     createCell(site);
15998     var newArc = createBeach(site);
15999     beaches.insert(lArc, newArc);
16000
16001     if (!lArc && !rArc) return;
16002
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);
16010       return;
16011     }
16012
16013     if (!rArc) { // && lArc
16014       newArc.edge = createEdge(lArc.site, newArc.site);
16015       return;
16016     }
16017
16018     // else lArc !== rArc
16019     detachCircle(lArc);
16020     detachCircle(rArc);
16021
16022     var lSite = lArc.site,
16023         ax = lSite[0],
16024         ay = lSite[1],
16025         bx = site[0] - ax,
16026         by = site[1] - ay,
16027         rSite = rArc.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];
16034
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);
16040   }
16041
16042   function leftBreakPoint(arc, directrix) {
16043     var site = arc.site,
16044         rfocx = site[0],
16045         rfocy = site[1],
16046         pby2 = rfocy - directrix;
16047
16048     if (!pby2) return rfocx;
16049
16050     var lArc = arc.P;
16051     if (!lArc) return -Infinity;
16052
16053     site = lArc.site;
16054     var lfocx = site[0],
16055         lfocy = site[1],
16056         plby2 = lfocy - directrix;
16057
16058     if (!plby2) return lfocx;
16059
16060     var hl = lfocx - rfocx,
16061         aby2 = 1 / pby2 - 1 / plby2,
16062         b = hl / plby2;
16063
16064     if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
16065
16066     return (rfocx + lfocx) / 2;
16067   }
16068
16069   function rightBreakPoint(arc, directrix) {
16070     var rArc = arc.N;
16071     if (rArc) return leftBreakPoint(rArc, directrix);
16072     var site = arc.site;
16073     return site[1] === directrix ? site[0] : Infinity;
16074   }
16075
16076   var epsilon$4 = 1e-6;
16077   var epsilon2$2 = 1e-12;
16078   var beaches;
16079   var cells;
16080   var circles;
16081   var edges;
16082
16083   function triangleArea(a, b, c) {
16084     return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
16085   }
16086
16087   function lexicographic(a, b) {
16088     return b[1] - a[1]
16089         || b[0] - a[0];
16090   }
16091
16092   function Diagram(sites, extent) {
16093     var site = sites.sort(lexicographic).pop(),
16094         x,
16095         y,
16096         circle;
16097
16098     edges = [];
16099     cells = new Array(sites.length);
16100     beaches = new RedBlackTree;
16101     circles = new RedBlackTree;
16102
16103     while (true) {
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) {
16107           addBeach(site);
16108           x = site[0], y = site[1];
16109         }
16110         site = sites.pop();
16111       } else if (circle) {
16112         removeBeach(circle.arc);
16113       } else {
16114         break;
16115       }
16116     }
16117
16118     sortCellHalfedges();
16119
16120     if (extent) {
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);
16127     }
16128
16129     this.edges = edges;
16130     this.cells = cells;
16131
16132     beaches =
16133     circles =
16134     edges =
16135     cells = null;
16136   }
16137
16138   Diagram.prototype = {
16139     constructor: Diagram,
16140
16141     polygons: function() {
16142       var edges = this.edges;
16143
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;
16147         return polygon;
16148       });
16149     },
16150
16151     triangles: function() {
16152       var triangles = [],
16153           edges = this.edges;
16154
16155       this.cells.forEach(function(cell, i) {
16156         if (!(m = (halfedges = cell.halfedges).length)) return;
16157         var site = cell.site,
16158             halfedges,
16159             j = -1,
16160             m,
16161             s0,
16162             e1 = edges[halfedges[m - 1]],
16163             s1 = e1.left === site ? e1.right : e1.left;
16164
16165         while (++j < m) {
16166           s0 = s1;
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]);
16171           }
16172         }
16173       });
16174
16175       return triangles;
16176     },
16177
16178     links: function() {
16179       return this.edges.filter(function(edge) {
16180         return edge.right;
16181       }).map(function(edge) {
16182         return {
16183           source: edge.left.data,
16184           target: edge.right.data
16185         };
16186       });
16187     },
16188
16189     find: function(x, y, radius) {
16190       var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
16191
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;
16195
16196       // Traverse the half-edges to find a closer cell, if any.
16197       do {
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;
16204         });
16205       } while (i1 !== null);
16206
16207       that._found = i0;
16208
16209       return radius == null || d2 <= radius * radius ? cell.site : null;
16210     }
16211   };
16212
16213   function voronoi() {
16214     var x$$1 = x$4,
16215         y$$1 = y$4,
16216         extent = null;
16217
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];
16221         s.index = i;
16222         s.data = d;
16223         return s;
16224       }), extent);
16225     }
16226
16227     voronoi.polygons = function(data) {
16228       return voronoi(data).polygons();
16229     };
16230
16231     voronoi.links = function(data) {
16232       return voronoi(data).links();
16233     };
16234
16235     voronoi.triangles = function(data) {
16236       return voronoi(data).triangles();
16237     };
16238
16239     voronoi.x = function(_) {
16240       return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$b(+_), voronoi) : x$$1;
16241     };
16242
16243     voronoi.y = function(_) {
16244       return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$b(+_), voronoi) : y$$1;
16245     };
16246
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]]];
16249     };
16250
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]];
16253     };
16254
16255     return voronoi;
16256   }
16257
16258   function constant$c(x) {
16259     return function() {
16260       return x;
16261     };
16262   }
16263
16264   function ZoomEvent(target, type, transform) {
16265     this.target = target;
16266     this.type = type;
16267     this.transform = transform;
16268   }
16269
16270   function Transform(k, x, y) {
16271     this.k = k;
16272     this.x = x;
16273     this.y = y;
16274   }
16275
16276   Transform.prototype = {
16277     constructor: Transform,
16278     scale: function(k) {
16279       return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
16280     },
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);
16283     },
16284     apply: function(point) {
16285       return [point[0] * this.k + this.x, point[1] * this.k + this.y];
16286     },
16287     applyX: function(x) {
16288       return x * this.k + this.x;
16289     },
16290     applyY: function(y) {
16291       return y * this.k + this.y;
16292     },
16293     invert: function(location) {
16294       return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
16295     },
16296     invertX: function(x) {
16297       return (x - this.x) / this.k;
16298     },
16299     invertY: function(y) {
16300       return (y - this.y) / this.k;
16301     },
16302     rescaleX: function(x) {
16303       return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
16304     },
16305     rescaleY: function(y) {
16306       return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
16307     },
16308     toString: function() {
16309       return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
16310     }
16311   };
16312
16313   var identity$7 = new Transform(1, 0, 0);
16314
16315   transform.prototype = Transform.prototype;
16316
16317   function transform(node) {
16318     return node.__zoom || identity$7;
16319   }
16320
16321   function nopropagation$2() {
16322     event.stopImmediatePropagation();
16323   }
16324
16325   function noevent$2() {
16326     event.preventDefault();
16327     event.stopImmediatePropagation();
16328   }
16329
16330   // Ignore right-click, since that should open the context menu.
16331   function defaultFilter$2() {
16332     return !event.button;
16333   }
16334
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;
16341     } else {
16342       w = e.clientWidth;
16343       h = e.clientHeight;
16344     }
16345     return [[0, 0], [w, h]];
16346   }
16347
16348   function defaultTransform() {
16349     return this.__zoom || identity$7;
16350   }
16351
16352   function defaultWheelDelta() {
16353     return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
16354   }
16355
16356   function defaultTouchable$1() {
16357     return "ontouchstart" in this;
16358   }
16359
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)
16368     );
16369   }
16370
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]],
16379         duration = 250,
16380         interpolate$$1 = interpolateZoom,
16381         gestures = [],
16382         listeners = dispatch("start", "zoom", "end"),
16383         touchstarting,
16384         touchending,
16385         touchDelay = 500,
16386         wheelDelay = 150,
16387         clickDistance2 = 0;
16388
16389     function zoom(selection$$1) {
16390       selection$$1
16391           .property("__zoom", defaultTransform)
16392           .on("wheel.zoom", wheeled)
16393           .on("mousedown.zoom", mousedowned)
16394           .on("dblclick.zoom", dblclicked)
16395         .filter(touchable)
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)");
16401     }
16402
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);
16408       } else {
16409         selection$$1.interrupt().each(function() {
16410           gesture(this, arguments)
16411               .start()
16412               .zoom(null, typeof transform$$1 === "function" ? transform$$1.apply(this, arguments) : transform$$1)
16413               .end();
16414         });
16415       }
16416     };
16417
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;
16422         return k0 * k1;
16423       });
16424     };
16425
16426     zoom.scaleTo = function(selection$$1, k) {
16427       zoom.transform(selection$$1, function() {
16428         var e = extent.apply(this, arguments),
16429             t0 = this.__zoom,
16430             p0 = centroid(e),
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);
16434       });
16435     };
16436
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);
16443       });
16444     };
16445
16446     zoom.translateTo = function(selection$$1, x, y) {
16447       zoom.transform(selection$$1, function() {
16448         var e = extent.apply(this, arguments),
16449             t = this.__zoom,
16450             p = centroid(e);
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);
16455       });
16456     };
16457
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);
16461     }
16462
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);
16466     }
16467
16468     function centroid(extent) {
16469       return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
16470     }
16471
16472     function schedule(transition$$1, transform$$1, center) {
16473       transition$$1
16474           .on("start.zoom", function() { gesture(this, arguments).start(); })
16475           .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
16476           .tween("zoom", function() {
16477             var that = this,
16478                 args = arguments,
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]),
16483                 a = that.__zoom,
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); }
16489               g.zoom(null, t);
16490             };
16491           });
16492     }
16493
16494     function gesture(that, args) {
16495       for (var i = 0, n = gestures.length, g; i < n; ++i) {
16496         if ((g = gestures[i]).that === that) {
16497           return g;
16498         }
16499       }
16500       return new Gesture(that, args);
16501     }
16502
16503     function Gesture(that, args) {
16504       this.that = that;
16505       this.args = args;
16506       this.index = -1;
16507       this.active = 0;
16508       this.extent = extent.apply(that, args);
16509     }
16510
16511     Gesture.prototype = {
16512       start: function() {
16513         if (++this.active === 1) {
16514           this.index = gestures.push(this) - 1;
16515           this.emit("start");
16516         }
16517         return this;
16518       },
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;
16524         this.emit("zoom");
16525         return this;
16526       },
16527       end: function() {
16528         if (--this.active === 0) {
16529           gestures.splice(this.index, 1);
16530           this.index = -1;
16531           this.emit("end");
16532         }
16533         return this;
16534       },
16535       emit: function(type) {
16536         customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
16537       }
16538     };
16539
16540     function wheeled() {
16541       if (!filter.apply(this, arguments)) return;
16542       var g = gesture(this, arguments),
16543           t = this.__zoom,
16544           k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
16545           p = mouse(this);
16546
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.
16549       if (g.wheel) {
16550         if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
16551           g.mouse[1] = t.invert(g.mouse[0] = p);
16552         }
16553         clearTimeout(g.wheel);
16554       }
16555
16556       // If this wheel event won’t trigger a transform change, ignore it.
16557       else if (t.k === k) return;
16558
16559       // Otherwise, capture the mouse point and location at the start.
16560       else {
16561         g.mouse = [p, t.invert(p)];
16562         interrupt(this);
16563         g.start();
16564       }
16565
16566       noevent$2();
16567       g.wheel = setTimeout(wheelidled, wheelDelay);
16568       g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
16569
16570       function wheelidled() {
16571         g.wheel = null;
16572         g.end();
16573       }
16574     }
16575
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),
16580           p = mouse(this),
16581           x0 = event.clientX,
16582           y0 = event.clientY;
16583
16584       nodrag(event.view);
16585       nopropagation$2();
16586       g.mouse = [p, this.__zoom.invert(p)];
16587       interrupt(this);
16588       g.start();
16589
16590       function mousemoved() {
16591         noevent$2();
16592         if (!g.moved) {
16593           var dx = event.clientX - x0, dy = event.clientY - y0;
16594           g.moved = dx * dx + dy * dy > clickDistance2;
16595         }
16596         g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent, translateExtent));
16597       }
16598
16599       function mouseupped() {
16600         v.on("mousemove.zoom mouseup.zoom", null);
16601         yesdrag(event.view, g.moved);
16602         noevent$2();
16603         g.end();
16604       }
16605     }
16606
16607     function dblclicked() {
16608       if (!filter.apply(this, arguments)) return;
16609       var t0 = this.__zoom,
16610           p0 = mouse(this),
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);
16614
16615       noevent$2();
16616       if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0);
16617       else select(this).call(zoom.transform, t1);
16618     }
16619
16620     function touchstarted() {
16621       if (!filter.apply(this, arguments)) return;
16622       var g = gesture(this, arguments),
16623           touches = event.changedTouches,
16624           started,
16625           n = touches.length, i, t, p;
16626
16627       nopropagation$2();
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;
16633       }
16634
16635       // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
16636       if (touchstarting) {
16637         touchstarting = clearTimeout(touchstarting);
16638         if (!g.touch1) {
16639           g.end();
16640           p = select(this).on("dblclick.zoom");
16641           if (p) p.apply(this, arguments);
16642           return;
16643         }
16644       }
16645
16646       if (started) {
16647         touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
16648         interrupt(this);
16649         g.start();
16650       }
16651     }
16652
16653     function touchmoved() {
16654       var g = gesture(this, arguments),
16655           touches = event.changedTouches,
16656           n = touches.length, i, t, p, l;
16657
16658       noevent$2();
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;
16664       }
16665       t = g.that.__zoom;
16666       if (g.touch1) {
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];
16674       }
16675       else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
16676       else return;
16677       g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
16678     }
16679
16680     function touchended() {
16681       var g = gesture(this, arguments),
16682           touches = event.changedTouches,
16683           n = touches.length, i, t;
16684
16685       nopropagation$2();
16686       if (touchending) clearTimeout(touchending);
16687       touchending = setTimeout(function() { touchending = null; }, touchDelay);
16688       for (i = 0; i < n; ++i) {
16689         t = touches[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;
16692       }
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]);
16695       else g.end();
16696     }
16697
16698     zoom.wheelDelta = function(_) {
16699       return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$c(+_), zoom) : wheelDelta;
16700     };
16701
16702     zoom.filter = function(_) {
16703       return arguments.length ? (filter = typeof _ === "function" ? _ : constant$c(!!_), zoom) : filter;
16704     };
16705
16706     zoom.touchable = function(_) {
16707       return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$c(!!_), zoom) : touchable;
16708     };
16709
16710     zoom.extent = function(_) {
16711       return arguments.length ? (extent = typeof _ === "function" ? _ : constant$c([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
16712     };
16713
16714     zoom.scaleExtent = function(_) {
16715       return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
16716     };
16717
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]]];
16720     };
16721
16722     zoom.constrain = function(_) {
16723       return arguments.length ? (constrain = _, zoom) : constrain;
16724     };
16725
16726     zoom.duration = function(_) {
16727       return arguments.length ? (duration = +_, zoom) : duration;
16728     };
16729
16730     zoom.interpolate = function(_) {
16731       return arguments.length ? (interpolate$$1 = _, zoom) : interpolate$$1;
16732     };
16733
16734     zoom.on = function() {
16735       var value = listeners.on.apply(listeners, arguments);
16736       return value === listeners ? zoom : value;
16737     };
16738
16739     zoom.clickDistance = function(_) {
16740       return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
16741     };
16742
16743     return zoom;
16744   }
16745
16746
16747
16748   var index$3 = /*#__PURE__*/Object.freeze({
16749     version: version,
16750     bisect: bisectRight,
16751     bisectRight: bisectRight,
16752     bisectLeft: bisectLeft,
16753     ascending: ascending,
16754     bisector: bisector,
16755     cross: cross,
16756     descending: d3_descending,
16757     deviation: deviation,
16758     extent: extent,
16759     histogram: histogram,
16760     thresholdFreedmanDiaconis: freedmanDiaconis,
16761     thresholdScott: scott,
16762     thresholdSturges: sturges,
16763     max: max,
16764     mean: mean,
16765     median: d3_median,
16766     merge: merge,
16767     min: min,
16768     pairs: pairs,
16769     permute: permute,
16770     quantile: quantile,
16771     range: range,
16772     scan: scan,
16773     shuffle: shuffle,
16774     sum: sum,
16775     ticks: ticks,
16776     tickIncrement: tickIncrement,
16777     tickStep: tickStep,
16778     transpose: transpose,
16779     variance: variance,
16780     zip: zip,
16781     axisTop: axisTop,
16782     axisRight: axisRight,
16783     axisBottom: axisBottom,
16784     axisLeft: axisLeft,
16785     brush: brush,
16786     brushX: brushX,
16787     brushY: brushY,
16788     brushSelection: brushSelection,
16789     chord: chord,
16790     ribbon: ribbon,
16791     nest: nest,
16792     set: set$2,
16793     map: map$1,
16794     keys: keys,
16795     values: values,
16796     entries: entries,
16797     color: color,
16798     rgb: rgb,
16799     hsl: hsl,
16800     lab: lab,
16801     hcl: hcl,
16802     cubehelix: cubehelix,
16803     dispatch: dispatch,
16804     drag: drag,
16805     dragDisable: nodrag,
16806     dragEnable: yesdrag,
16807     dsvFormat: dsv,
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,
16829     easeSin: sinInOut,
16830     easeSinIn: sinIn,
16831     easeSinOut: sinOut,
16832     easeSinInOut: sinInOut,
16833     easeExp: expInOut,
16834     easeExpIn: expIn,
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,
16855     forceLink: link,
16856     forceManyBody: manyBody,
16857     forceRadial: radial,
16858     forceSimulation: simulation,
16859     forceX: x$2,
16860     forceY: y$2,
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,
16872     geoCircle: circle,
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,
16884     geoAlbers: albers,
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,
16916     cluster: cluster,
16917     hierarchy: hierarchy,
16918     pack: index$1,
16919     packSiblings: siblings,
16920     packEnclose: enclose,
16921     partition: partition,
16922     stratify: stratify,
16923     tree: tree,
16924     treemap: index$2,
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,
16954     path: path,
16955     polygonArea: d3_polygonArea,
16956     polygonCentroid: d3_polygonCentroid,
16957     polygonHull: d3_polygonHull,
16958     polygonContains: contains$1,
16959     polygonLength: length$2,
16960     quadtree: quadtree,
16961     queue: queue,
16962     randomUniform: uniform,
16963     randomNormal: normal,
16964     randomLogNormal: logNormal,
16965     randomBates: bates,
16966     randomIrwinHall: irwinHall,
16967     randomExponential: exponential$1,
16968     request: request,
16969     html: html,
16970     json: d3_json,
16971     text: d3_text,
16972     xml: d3_xml,
16973     csv: csv$1,
16974     tsv: tsv$1,
16975     scaleBand: band,
16976     scalePoint: point$1,
16977     scaleIdentity: identity$5,
16978     scaleLinear: linear$2,
16979     scaleLog: log$1,
16980     scaleOrdinal: ordinal,
16981     scaleImplicit: implicit,
16982     scalePow: pow$1,
16983     scaleSqrt: sqrt$1,
16984     scaleQuantile: quantile$1,
16985     scaleQuantize: quantize,
16986     scaleThreshold: threshold,
16987     scaleTime: time,
16988     scaleUtc: utcTime,
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,
17002     create: create,
17003     creator: creator,
17004     local: local,
17005     matcher: matcher$1,
17006     mouse: mouse,
17007     namespace: namespace,
17008     namespaces: namespaces,
17009     clientPoint: point,
17010     select: select,
17011     selectAll: d3_selectAll,
17012     selection: selection,
17013     selector: selector,
17014     selectorAll: selectorAll,
17015     style: styleValue,
17016     touch: touch,
17017     touches: d3_touches,
17018     window: defaultView,
17019     get event () { return event; },
17020     customEvent: customEvent,
17021     arc: arc,
17022     area: area,
17023     line: line,
17024     pie: pie,
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,
17033     symbol: symbol,
17034     symbols: symbols,
17035     symbolCircle: circle$2,
17036     symbolCross: cross$2,
17037     symbolDiamond: diamond,
17038     symbolSquare: square,
17039     symbolStar: star,
17040     symbolTriangle: triangle,
17041     symbolWye: wye,
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,
17057     curveStep: step,
17058     curveStepAfter: stepAfter,
17059     curveStepBefore: stepBefore,
17060     stack: stack,
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,
17078     utcSecond: second,
17079     utcSeconds: seconds,
17080     timeMinute: minute,
17081     timeMinutes: minutes,
17082     timeHour: hour,
17083     timeHours: hours,
17084     timeDay: day,
17085     timeDays: days,
17086     timeWeek: sunday,
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,
17102     timeMonth: month,
17103     timeMonths: months,
17104     timeYear: year,
17105     timeYears: years,
17106     utcMinute: utcMinute,
17107     utcMinutes: utcMinutes,
17108     utcHour: utcHour,
17109     utcHours: utcHours,
17110     utcDay: utcDay,
17111     utcDays: utcDays,
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,
17130     utcYear: utcYear,
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,
17140     now: now,
17141     timer: timer,
17142     timerFlush: timerFlush,
17143     timeout: timeout$1,
17144     interval: interval$1,
17145     transition: transition,
17146     active: active,
17147     interrupt: interrupt,
17148     voronoi: voronoi,
17149     zoom: d3_zoom,
17150     zoomTransform: transform,
17151     zoomIdentity: identity$7
17152   });
17153
17154   function actionAddEntity(way) {
17155       return function(graph) {
17156           return graph.replace(way);
17157       };
17158   }
17159
17160   /**
17161    * Removes all key-value entries from the list cache.
17162    *
17163    * @private
17164    * @name clear
17165    * @memberOf ListCache
17166    */
17167   function listCacheClear() {
17168     this.__data__ = [];
17169     this.size = 0;
17170   }
17171
17172   /**
17173    * Performs a
17174    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
17175    * comparison between two values to determine if they are equivalent.
17176    *
17177    * @static
17178    * @memberOf _
17179    * @since 4.0.0
17180    * @category Lang
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`.
17184    * @example
17185    *
17186    * var object = { 'a': 1 };
17187    * var other = { 'a': 1 };
17188    *
17189    * _.eq(object, object);
17190    * // => true
17191    *
17192    * _.eq(object, other);
17193    * // => false
17194    *
17195    * _.eq('a', 'a');
17196    * // => true
17197    *
17198    * _.eq('a', Object('a'));
17199    * // => false
17200    *
17201    * _.eq(NaN, NaN);
17202    * // => true
17203    */
17204   function eq(value, other) {
17205     return value === other || (value !== value && other !== other);
17206   }
17207
17208   /**
17209    * Gets the index at which the `key` is found in `array` of key-value pairs.
17210    *
17211    * @private
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`.
17215    */
17216   function assocIndexOf(array, key) {
17217     var length = array.length;
17218     while (length--) {
17219       if (eq(array[length][0], key)) {
17220         return length;
17221       }
17222     }
17223     return -1;
17224   }
17225
17226   /** Used for built-in method references. */
17227   var arrayProto = Array.prototype;
17228
17229   /** Built-in value references. */
17230   var splice = arrayProto.splice;
17231
17232   /**
17233    * Removes `key` and its value from the list cache.
17234    *
17235    * @private
17236    * @name delete
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`.
17240    */
17241   function listCacheDelete(key) {
17242     var data = this.__data__,
17243         index = assocIndexOf(data, key);
17244
17245     if (index < 0) {
17246       return false;
17247     }
17248     var lastIndex = data.length - 1;
17249     if (index == lastIndex) {
17250       data.pop();
17251     } else {
17252       splice.call(data, index, 1);
17253     }
17254     --this.size;
17255     return true;
17256   }
17257
17258   /**
17259    * Gets the list cache value for `key`.
17260    *
17261    * @private
17262    * @name get
17263    * @memberOf ListCache
17264    * @param {string} key The key of the value to get.
17265    * @returns {*} Returns the entry value.
17266    */
17267   function listCacheGet(key) {
17268     var data = this.__data__,
17269         index = assocIndexOf(data, key);
17270
17271     return index < 0 ? undefined : data[index][1];
17272   }
17273
17274   /**
17275    * Checks if a list cache value for `key` exists.
17276    *
17277    * @private
17278    * @name has
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`.
17282    */
17283   function listCacheHas(key) {
17284     return assocIndexOf(this.__data__, key) > -1;
17285   }
17286
17287   /**
17288    * Sets the list cache `key` to `value`.
17289    *
17290    * @private
17291    * @name set
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.
17296    */
17297   function listCacheSet(key, value) {
17298     var data = this.__data__,
17299         index = assocIndexOf(data, key);
17300
17301     if (index < 0) {
17302       ++this.size;
17303       data.push([key, value]);
17304     } else {
17305       data[index][1] = value;
17306     }
17307     return this;
17308   }
17309
17310   /**
17311    * Creates an list cache object.
17312    *
17313    * @private
17314    * @constructor
17315    * @param {Array} [entries] The key-value pairs to cache.
17316    */
17317   function ListCache(entries) {
17318     var index = -1,
17319         length = entries == null ? 0 : entries.length;
17320
17321     this.clear();
17322     while (++index < length) {
17323       var entry = entries[index];
17324       this.set(entry[0], entry[1]);
17325     }
17326   }
17327
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;
17334
17335   /**
17336    * Removes all key-value entries from the stack.
17337    *
17338    * @private
17339    * @name clear
17340    * @memberOf Stack
17341    */
17342   function stackClear() {
17343     this.__data__ = new ListCache;
17344     this.size = 0;
17345   }
17346
17347   /**
17348    * Removes `key` and its value from the stack.
17349    *
17350    * @private
17351    * @name delete
17352    * @memberOf Stack
17353    * @param {string} key The key of the value to remove.
17354    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17355    */
17356   function stackDelete(key) {
17357     var data = this.__data__,
17358         result = data['delete'](key);
17359
17360     this.size = data.size;
17361     return result;
17362   }
17363
17364   /**
17365    * Gets the stack value for `key`.
17366    *
17367    * @private
17368    * @name get
17369    * @memberOf Stack
17370    * @param {string} key The key of the value to get.
17371    * @returns {*} Returns the entry value.
17372    */
17373   function stackGet(key) {
17374     return this.__data__.get(key);
17375   }
17376
17377   /**
17378    * Checks if a stack value for `key` exists.
17379    *
17380    * @private
17381    * @name has
17382    * @memberOf Stack
17383    * @param {string} key The key of the entry to check.
17384    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17385    */
17386   function stackHas(key) {
17387     return this.__data__.has(key);
17388   }
17389
17390   /** Detect free variable `global` from Node.js. */
17391   var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
17392
17393   /** Detect free variable `self`. */
17394   var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
17395
17396   /** Used as a reference to the global object. */
17397   var root$2 = freeGlobal || freeSelf || Function('return this')();
17398
17399   /** Built-in value references. */
17400   var Symbol = root$2.Symbol;
17401
17402   /** Used for built-in method references. */
17403   var objectProto = Object.prototype;
17404
17405   /** Used to check objects for own properties. */
17406   var hasOwnProperty = objectProto.hasOwnProperty;
17407
17408   /**
17409    * Used to resolve the
17410    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17411    * of values.
17412    */
17413   var nativeObjectToString = objectProto.toString;
17414
17415   /** Built-in value references. */
17416   var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
17417
17418   /**
17419    * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
17420    *
17421    * @private
17422    * @param {*} value The value to query.
17423    * @returns {string} Returns the raw `toStringTag`.
17424    */
17425   function getRawTag(value) {
17426     var isOwn = hasOwnProperty.call(value, symToStringTag),
17427         tag = value[symToStringTag];
17428
17429     try {
17430       value[symToStringTag] = undefined;
17431     } catch (e) {}
17432
17433     var result = nativeObjectToString.call(value);
17434     {
17435       if (isOwn) {
17436         value[symToStringTag] = tag;
17437       } else {
17438         delete value[symToStringTag];
17439       }
17440     }
17441     return result;
17442   }
17443
17444   /** Used for built-in method references. */
17445   var objectProto$1 = Object.prototype;
17446
17447   /**
17448    * Used to resolve the
17449    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17450    * of values.
17451    */
17452   var nativeObjectToString$1 = objectProto$1.toString;
17453
17454   /**
17455    * Converts `value` to a string using `Object.prototype.toString`.
17456    *
17457    * @private
17458    * @param {*} value The value to convert.
17459    * @returns {string} Returns the converted string.
17460    */
17461   function objectToString(value) {
17462     return nativeObjectToString$1.call(value);
17463   }
17464
17465   /** `Object#toString` result references. */
17466   var nullTag = '[object Null]',
17467       undefinedTag = '[object Undefined]';
17468
17469   /** Built-in value references. */
17470   var symToStringTag$1 = Symbol ? Symbol.toStringTag : undefined;
17471
17472   /**
17473    * The base implementation of `getTag` without fallbacks for buggy environments.
17474    *
17475    * @private
17476    * @param {*} value The value to query.
17477    * @returns {string} Returns the `toStringTag`.
17478    */
17479   function baseGetTag(value) {
17480     if (value == null) {
17481       return value === undefined ? undefinedTag : nullTag;
17482     }
17483     return (symToStringTag$1 && symToStringTag$1 in Object(value))
17484       ? getRawTag(value)
17485       : objectToString(value);
17486   }
17487
17488   /**
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('')`)
17492    *
17493    * @static
17494    * @memberOf _
17495    * @since 0.1.0
17496    * @category Lang
17497    * @param {*} value The value to check.
17498    * @returns {boolean} Returns `true` if `value` is an object, else `false`.
17499    * @example
17500    *
17501    * _.isObject({});
17502    * // => true
17503    *
17504    * _.isObject([1, 2, 3]);
17505    * // => true
17506    *
17507    * _.isObject(_.noop);
17508    * // => true
17509    *
17510    * _.isObject(null);
17511    * // => false
17512    */
17513   function isObject(value) {
17514     var type = typeof value;
17515     return value != null && (type == 'object' || type == 'function');
17516   }
17517
17518   /** `Object#toString` result references. */
17519   var asyncTag = '[object AsyncFunction]',
17520       funcTag = '[object Function]',
17521       genTag = '[object GeneratorFunction]',
17522       proxyTag = '[object Proxy]';
17523
17524   /**
17525    * Checks if `value` is classified as a `Function` object.
17526    *
17527    * @static
17528    * @memberOf _
17529    * @since 0.1.0
17530    * @category Lang
17531    * @param {*} value The value to check.
17532    * @returns {boolean} Returns `true` if `value` is a function, else `false`.
17533    * @example
17534    *
17535    * _.isFunction(_);
17536    * // => true
17537    *
17538    * _.isFunction(/abc/);
17539    * // => false
17540    */
17541   function isFunction(value) {
17542     if (!isObject(value)) {
17543       return false;
17544     }
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;
17549   }
17550
17551   /** Used to detect overreaching core-js shims. */
17552   var coreJsData = root$2['__core-js_shared__'];
17553
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) : '';
17558   }());
17559
17560   /**
17561    * Checks if `func` has its source masked.
17562    *
17563    * @private
17564    * @param {Function} func The function to check.
17565    * @returns {boolean} Returns `true` if `func` is masked, else `false`.
17566    */
17567   function isMasked(func) {
17568     return !!maskSrcKey && (maskSrcKey in func);
17569   }
17570
17571   /** Used for built-in method references. */
17572   var funcProto = Function.prototype;
17573
17574   /** Used to resolve the decompiled source of functions. */
17575   var funcToString = funcProto.toString;
17576
17577   /**
17578    * Converts `func` to its source code.
17579    *
17580    * @private
17581    * @param {Function} func The function to convert.
17582    * @returns {string} Returns the source code.
17583    */
17584   function toSource(func) {
17585     if (func != null) {
17586       try {
17587         return funcToString.call(func);
17588       } catch (e) {}
17589       try {
17590         return (func + '');
17591       } catch (e) {}
17592     }
17593     return '';
17594   }
17595
17596   /**
17597    * Used to match `RegExp`
17598    * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
17599    */
17600   var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
17601
17602   /** Used to detect host constructors (Safari). */
17603   var reIsHostCtor = /^\[object .+?Constructor\]$/;
17604
17605   /** Used for built-in method references. */
17606   var funcProto$1 = Function.prototype,
17607       objectProto$2 = Object.prototype;
17608
17609   /** Used to resolve the decompiled source of functions. */
17610   var funcToString$1 = funcProto$1.toString;
17611
17612   /** Used to check objects for own properties. */
17613   var hasOwnProperty$1 = objectProto$2.hasOwnProperty;
17614
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.*?') + '$'
17619   );
17620
17621   /**
17622    * The base implementation of `_.isNative` without bad shim checks.
17623    *
17624    * @private
17625    * @param {*} value The value to check.
17626    * @returns {boolean} Returns `true` if `value` is a native function,
17627    *  else `false`.
17628    */
17629   function baseIsNative(value) {
17630     if (!isObject(value) || isMasked(value)) {
17631       return false;
17632     }
17633     var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
17634     return pattern.test(toSource(value));
17635   }
17636
17637   /**
17638    * Gets the value at `key` of `object`.
17639    *
17640    * @private
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.
17644    */
17645   function getValue(object, key) {
17646     return object == null ? undefined : object[key];
17647   }
17648
17649   /**
17650    * Gets the native function at `key` of `object`.
17651    *
17652    * @private
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`.
17656    */
17657   function getNative(object, key) {
17658     var value = getValue(object, key);
17659     return baseIsNative(value) ? value : undefined;
17660   }
17661
17662   /* Built-in method references that are verified to be native. */
17663   var Map$1 = getNative(root$2, 'Map');
17664
17665   /* Built-in method references that are verified to be native. */
17666   var nativeCreate = getNative(Object, 'create');
17667
17668   /**
17669    * Removes all key-value entries from the hash.
17670    *
17671    * @private
17672    * @name clear
17673    * @memberOf Hash
17674    */
17675   function hashClear() {
17676     this.__data__ = nativeCreate ? nativeCreate(null) : {};
17677     this.size = 0;
17678   }
17679
17680   /**
17681    * Removes `key` and its value from the hash.
17682    *
17683    * @private
17684    * @name delete
17685    * @memberOf 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`.
17689    */
17690   function hashDelete(key) {
17691     var result = this.has(key) && delete this.__data__[key];
17692     this.size -= result ? 1 : 0;
17693     return result;
17694   }
17695
17696   /** Used to stand-in for `undefined` hash values. */
17697   var HASH_UNDEFINED = '__lodash_hash_undefined__';
17698
17699   /** Used for built-in method references. */
17700   var objectProto$3 = Object.prototype;
17701
17702   /** Used to check objects for own properties. */
17703   var hasOwnProperty$2 = objectProto$3.hasOwnProperty;
17704
17705   /**
17706    * Gets the hash value for `key`.
17707    *
17708    * @private
17709    * @name get
17710    * @memberOf Hash
17711    * @param {string} key The key of the value to get.
17712    * @returns {*} Returns the entry value.
17713    */
17714   function hashGet(key) {
17715     var data = this.__data__;
17716     if (nativeCreate) {
17717       var result = data[key];
17718       return result === HASH_UNDEFINED ? undefined : result;
17719     }
17720     return hasOwnProperty$2.call(data, key) ? data[key] : undefined;
17721   }
17722
17723   /** Used for built-in method references. */
17724   var objectProto$4 = Object.prototype;
17725
17726   /** Used to check objects for own properties. */
17727   var hasOwnProperty$3 = objectProto$4.hasOwnProperty;
17728
17729   /**
17730    * Checks if a hash value for `key` exists.
17731    *
17732    * @private
17733    * @name has
17734    * @memberOf Hash
17735    * @param {string} key The key of the entry to check.
17736    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17737    */
17738   function hashHas(key) {
17739     var data = this.__data__;
17740     return nativeCreate ? (data[key] !== undefined) : hasOwnProperty$3.call(data, key);
17741   }
17742
17743   /** Used to stand-in for `undefined` hash values. */
17744   var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
17745
17746   /**
17747    * Sets the hash `key` to `value`.
17748    *
17749    * @private
17750    * @name set
17751    * @memberOf Hash
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.
17755    */
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;
17760     return this;
17761   }
17762
17763   /**
17764    * Creates a hash object.
17765    *
17766    * @private
17767    * @constructor
17768    * @param {Array} [entries] The key-value pairs to cache.
17769    */
17770   function Hash(entries) {
17771     var index = -1,
17772         length = entries == null ? 0 : entries.length;
17773
17774     this.clear();
17775     while (++index < length) {
17776       var entry = entries[index];
17777       this.set(entry[0], entry[1]);
17778     }
17779   }
17780
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;
17787
17788   /**
17789    * Removes all key-value entries from the map.
17790    *
17791    * @private
17792    * @name clear
17793    * @memberOf MapCache
17794    */
17795   function mapCacheClear() {
17796     this.size = 0;
17797     this.__data__ = {
17798       'hash': new Hash,
17799       'map': new (Map$1 || ListCache),
17800       'string': new Hash
17801     };
17802   }
17803
17804   /**
17805    * Checks if `value` is suitable for use as unique object key.
17806    *
17807    * @private
17808    * @param {*} value The value to check.
17809    * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
17810    */
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);
17816   }
17817
17818   /**
17819    * Gets the data for `map`.
17820    *
17821    * @private
17822    * @param {Object} map The map to query.
17823    * @param {string} key The reference key.
17824    * @returns {*} Returns the map data.
17825    */
17826   function getMapData(map, key) {
17827     var data = map.__data__;
17828     return isKeyable(key)
17829       ? data[typeof key == 'string' ? 'string' : 'hash']
17830       : data.map;
17831   }
17832
17833   /**
17834    * Removes `key` and its value from the map.
17835    *
17836    * @private
17837    * @name delete
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`.
17841    */
17842   function mapCacheDelete(key) {
17843     var result = getMapData(this, key)['delete'](key);
17844     this.size -= result ? 1 : 0;
17845     return result;
17846   }
17847
17848   /**
17849    * Gets the map value for `key`.
17850    *
17851    * @private
17852    * @name get
17853    * @memberOf MapCache
17854    * @param {string} key The key of the value to get.
17855    * @returns {*} Returns the entry value.
17856    */
17857   function mapCacheGet(key) {
17858     return getMapData(this, key).get(key);
17859   }
17860
17861   /**
17862    * Checks if a map value for `key` exists.
17863    *
17864    * @private
17865    * @name has
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`.
17869    */
17870   function mapCacheHas(key) {
17871     return getMapData(this, key).has(key);
17872   }
17873
17874   /**
17875    * Sets the map `key` to `value`.
17876    *
17877    * @private
17878    * @name set
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.
17883    */
17884   function mapCacheSet(key, value) {
17885     var data = getMapData(this, key),
17886         size = data.size;
17887
17888     data.set(key, value);
17889     this.size += data.size == size ? 0 : 1;
17890     return this;
17891   }
17892
17893   /**
17894    * Creates a map cache object to store key-value pairs.
17895    *
17896    * @private
17897    * @constructor
17898    * @param {Array} [entries] The key-value pairs to cache.
17899    */
17900   function MapCache(entries) {
17901     var index = -1,
17902         length = entries == null ? 0 : entries.length;
17903
17904     this.clear();
17905     while (++index < length) {
17906       var entry = entries[index];
17907       this.set(entry[0], entry[1]);
17908     }
17909   }
17910
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;
17917
17918   /** Used as the size to enable large array optimizations. */
17919   var LARGE_ARRAY_SIZE = 200;
17920
17921   /**
17922    * Sets the stack `key` to `value`.
17923    *
17924    * @private
17925    * @name set
17926    * @memberOf Stack
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.
17930    */
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;
17938         return this;
17939       }
17940       data = this.__data__ = new MapCache(pairs);
17941     }
17942     data.set(key, value);
17943     this.size = data.size;
17944     return this;
17945   }
17946
17947   /**
17948    * Creates a stack cache object to store key-value pairs.
17949    *
17950    * @private
17951    * @constructor
17952    * @param {Array} [entries] The key-value pairs to cache.
17953    */
17954   function Stack(entries) {
17955     var data = this.__data__ = new ListCache(entries);
17956     this.size = data.size;
17957   }
17958
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;
17965
17966   /**
17967    * A specialized version of `_.forEach` for arrays without support for
17968    * iteratee shorthands.
17969    *
17970    * @private
17971    * @param {Array} [array] The array to iterate over.
17972    * @param {Function} iteratee The function invoked per iteration.
17973    * @returns {Array} Returns `array`.
17974    */
17975   function arrayEach(array, iteratee) {
17976     var index = -1,
17977         length = array == null ? 0 : array.length;
17978
17979     while (++index < length) {
17980       if (iteratee(array[index], index, array) === false) {
17981         break;
17982       }
17983     }
17984     return array;
17985   }
17986
17987   var defineProperty = (function() {
17988     try {
17989       var func = getNative(Object, 'defineProperty');
17990       func({}, '', {});
17991       return func;
17992     } catch (e) {}
17993   }());
17994
17995   /**
17996    * The base implementation of `assignValue` and `assignMergeValue` without
17997    * value checks.
17998    *
17999    * @private
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.
18003    */
18004   function baseAssignValue(object, key, value) {
18005     if (key == '__proto__' && defineProperty) {
18006       defineProperty(object, key, {
18007         'configurable': true,
18008         'enumerable': true,
18009         'value': value,
18010         'writable': true
18011       });
18012     } else {
18013       object[key] = value;
18014     }
18015   }
18016
18017   /** Used for built-in method references. */
18018   var objectProto$5 = Object.prototype;
18019
18020   /** Used to check objects for own properties. */
18021   var hasOwnProperty$4 = objectProto$5.hasOwnProperty;
18022
18023   /**
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.
18027    *
18028    * @private
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.
18032    */
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);
18038     }
18039   }
18040
18041   /**
18042    * Copies properties of `source` to `object`.
18043    *
18044    * @private
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`.
18050    */
18051   function copyObject(source, props, object, customizer) {
18052     var isNew = !object;
18053     object || (object = {});
18054
18055     var index = -1,
18056         length = props.length;
18057
18058     while (++index < length) {
18059       var key = props[index];
18060
18061       var newValue = customizer
18062         ? customizer(object[key], source[key], key, object, source)
18063         : undefined;
18064
18065       if (newValue === undefined) {
18066         newValue = source[key];
18067       }
18068       if (isNew) {
18069         baseAssignValue(object, key, newValue);
18070       } else {
18071         assignValue(object, key, newValue);
18072       }
18073     }
18074     return object;
18075   }
18076
18077   /**
18078    * The base implementation of `_.times` without support for iteratee shorthands
18079    * or max array length checks.
18080    *
18081    * @private
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.
18085    */
18086   function baseTimes(n, iteratee) {
18087     var index = -1,
18088         result = Array(n);
18089
18090     while (++index < n) {
18091       result[index] = iteratee(index);
18092     }
18093     return result;
18094   }
18095
18096   /**
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".
18099    *
18100    * @static
18101    * @memberOf _
18102    * @since 4.0.0
18103    * @category Lang
18104    * @param {*} value The value to check.
18105    * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
18106    * @example
18107    *
18108    * _.isObjectLike({});
18109    * // => true
18110    *
18111    * _.isObjectLike([1, 2, 3]);
18112    * // => true
18113    *
18114    * _.isObjectLike(_.noop);
18115    * // => false
18116    *
18117    * _.isObjectLike(null);
18118    * // => false
18119    */
18120   function isObjectLike(value) {
18121     return value != null && typeof value == 'object';
18122   }
18123
18124   /** `Object#toString` result references. */
18125   var argsTag = '[object Arguments]';
18126
18127   /**
18128    * The base implementation of `_.isArguments`.
18129    *
18130    * @private
18131    * @param {*} value The value to check.
18132    * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18133    */
18134   function baseIsArguments(value) {
18135     return isObjectLike(value) && baseGetTag(value) == argsTag;
18136   }
18137
18138   /** Used for built-in method references. */
18139   var objectProto$6 = Object.prototype;
18140
18141   /** Used to check objects for own properties. */
18142   var hasOwnProperty$5 = objectProto$6.hasOwnProperty;
18143
18144   /** Built-in value references. */
18145   var propertyIsEnumerable = objectProto$6.propertyIsEnumerable;
18146
18147   /**
18148    * Checks if `value` is likely an `arguments` object.
18149    *
18150    * @static
18151    * @memberOf _
18152    * @since 0.1.0
18153    * @category Lang
18154    * @param {*} value The value to check.
18155    * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18156    *  else `false`.
18157    * @example
18158    *
18159    * _.isArguments(function() { return arguments; }());
18160    * // => true
18161    *
18162    * _.isArguments([1, 2, 3]);
18163    * // => false
18164    */
18165   var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
18166     return isObjectLike(value) && hasOwnProperty$5.call(value, 'callee') &&
18167       !propertyIsEnumerable.call(value, 'callee');
18168   };
18169
18170   /**
18171    * Checks if `value` is classified as an `Array` object.
18172    *
18173    * @static
18174    * @memberOf _
18175    * @since 0.1.0
18176    * @category Lang
18177    * @param {*} value The value to check.
18178    * @returns {boolean} Returns `true` if `value` is an array, else `false`.
18179    * @example
18180    *
18181    * _.isArray([1, 2, 3]);
18182    * // => true
18183    *
18184    * _.isArray(document.body.children);
18185    * // => false
18186    *
18187    * _.isArray('abc');
18188    * // => false
18189    *
18190    * _.isArray(_.noop);
18191    * // => false
18192    */
18193   var isArray = Array.isArray;
18194
18195   /**
18196    * This method returns `false`.
18197    *
18198    * @static
18199    * @memberOf _
18200    * @since 4.13.0
18201    * @category Util
18202    * @returns {boolean} Returns `false`.
18203    * @example
18204    *
18205    * _.times(2, _.stubFalse);
18206    * // => [false, false]
18207    */
18208   function stubFalse() {
18209     return false;
18210   }
18211
18212   /** Detect free variable `exports`. */
18213   var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
18214
18215   /** Detect free variable `module`. */
18216   var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
18217
18218   /** Detect the popular CommonJS extension `module.exports`. */
18219   var moduleExports = freeModule && freeModule.exports === freeExports;
18220
18221   /** Built-in value references. */
18222   var Buffer = moduleExports ? root$2.Buffer : undefined;
18223
18224   /* Built-in method references for those with the same name as other `lodash` methods. */
18225   var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
18226
18227   /**
18228    * Checks if `value` is a buffer.
18229    *
18230    * @static
18231    * @memberOf _
18232    * @since 4.3.0
18233    * @category Lang
18234    * @param {*} value The value to check.
18235    * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
18236    * @example
18237    *
18238    * _.isBuffer(new Buffer(2));
18239    * // => true
18240    *
18241    * _.isBuffer(new Uint8Array(2));
18242    * // => false
18243    */
18244   var isBuffer = nativeIsBuffer || stubFalse;
18245
18246   /** Used as references for various `Number` constants. */
18247   var MAX_SAFE_INTEGER = 9007199254740991;
18248
18249   /** Used to detect unsigned integer values. */
18250   var reIsUint = /^(?:0|[1-9]\d*)$/;
18251
18252   /**
18253    * Checks if `value` is a valid array-like index.
18254    *
18255    * @private
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`.
18259    */
18260   function isIndex(value, length) {
18261     var type = typeof value;
18262     length = length == null ? MAX_SAFE_INTEGER : length;
18263
18264     return !!length &&
18265       (type == 'number' ||
18266         (type != 'symbol' && reIsUint.test(value))) &&
18267           (value > -1 && value % 1 == 0 && value < length);
18268   }
18269
18270   /** Used as references for various `Number` constants. */
18271   var MAX_SAFE_INTEGER$1 = 9007199254740991;
18272
18273   /**
18274    * Checks if `value` is a valid array-like length.
18275    *
18276    * **Note:** This method is loosely based on
18277    * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
18278    *
18279    * @static
18280    * @memberOf _
18281    * @since 4.0.0
18282    * @category Lang
18283    * @param {*} value The value to check.
18284    * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
18285    * @example
18286    *
18287    * _.isLength(3);
18288    * // => true
18289    *
18290    * _.isLength(Number.MIN_VALUE);
18291    * // => false
18292    *
18293    * _.isLength(Infinity);
18294    * // => false
18295    *
18296    * _.isLength('3');
18297    * // => false
18298    */
18299   function isLength(value) {
18300     return typeof value == 'number' &&
18301       value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1;
18302   }
18303
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]';
18318
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]';
18330
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;
18346
18347   /**
18348    * The base implementation of `_.isTypedArray` without Node.js optimizations.
18349    *
18350    * @private
18351    * @param {*} value The value to check.
18352    * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18353    */
18354   function baseIsTypedArray(value) {
18355     return isObjectLike(value) &&
18356       isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
18357   }
18358
18359   /**
18360    * The base implementation of `_.unary` without support for storing metadata.
18361    *
18362    * @private
18363    * @param {Function} func The function to cap arguments for.
18364    * @returns {Function} Returns the new capped function.
18365    */
18366   function baseUnary(func) {
18367     return function(value) {
18368       return func(value);
18369     };
18370   }
18371
18372   /** Detect free variable `exports`. */
18373   var freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18374
18375   /** Detect free variable `module`. */
18376   var freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module;
18377
18378   /** Detect the popular CommonJS extension `module.exports`. */
18379   var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;
18380
18381   /** Detect free variable `process` from Node.js. */
18382   var freeProcess = moduleExports$1 && freeGlobal.process;
18383
18384   /** Used to access faster Node.js helpers. */
18385   var nodeUtil = (function() {
18386     try {
18387       // Use `util.types` for Node.js 10+.
18388       var types = freeModule$1 && freeModule$1.require && freeModule$1.require('util').types;
18389
18390       if (types) {
18391         return types;
18392       }
18393
18394       // Legacy `process.binding('util')` for Node.js < 10.
18395       return freeProcess && freeProcess.binding && freeProcess.binding('util');
18396     } catch (e) {}
18397   }());
18398
18399   /* Node.js helper references. */
18400   var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
18401
18402   /**
18403    * Checks if `value` is classified as a typed array.
18404    *
18405    * @static
18406    * @memberOf _
18407    * @since 3.0.0
18408    * @category Lang
18409    * @param {*} value The value to check.
18410    * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18411    * @example
18412    *
18413    * _.isTypedArray(new Uint8Array);
18414    * // => true
18415    *
18416    * _.isTypedArray([]);
18417    * // => false
18418    */
18419   var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
18420
18421   /** Used for built-in method references. */
18422   var objectProto$7 = Object.prototype;
18423
18424   /** Used to check objects for own properties. */
18425   var hasOwnProperty$6 = objectProto$7.hasOwnProperty;
18426
18427   /**
18428    * Creates an array of the enumerable property names of the array-like `value`.
18429    *
18430    * @private
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.
18434    */
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;
18443
18444     for (var key in value) {
18445       if ((inherited || hasOwnProperty$6.call(value, key)) &&
18446           !(skipIndexes && (
18447              // Safari 9 has enumerable `arguments.length` in strict mode.
18448              key == 'length' ||
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)
18455           ))) {
18456         result.push(key);
18457       }
18458     }
18459     return result;
18460   }
18461
18462   /** Used for built-in method references. */
18463   var objectProto$8 = Object.prototype;
18464
18465   /**
18466    * Checks if `value` is likely a prototype object.
18467    *
18468    * @private
18469    * @param {*} value The value to check.
18470    * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
18471    */
18472   function isPrototype(value) {
18473     var Ctor = value && value.constructor,
18474         proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$8;
18475
18476     return value === proto;
18477   }
18478
18479   /**
18480    * Creates a unary function that invokes `func` with its argument transformed.
18481    *
18482    * @private
18483    * @param {Function} func The function to wrap.
18484    * @param {Function} transform The argument transform.
18485    * @returns {Function} Returns the new function.
18486    */
18487   function overArg(func, transform) {
18488     return function(arg) {
18489       return func(transform(arg));
18490     };
18491   }
18492
18493   /* Built-in method references for those with the same name as other `lodash` methods. */
18494   var nativeKeys = overArg(Object.keys, Object);
18495
18496   /** Used for built-in method references. */
18497   var objectProto$9 = Object.prototype;
18498
18499   /** Used to check objects for own properties. */
18500   var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
18501
18502   /**
18503    * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
18504    *
18505    * @private
18506    * @param {Object} object The object to query.
18507    * @returns {Array} Returns the array of property names.
18508    */
18509   function baseKeys(object) {
18510     if (!isPrototype(object)) {
18511       return nativeKeys(object);
18512     }
18513     var result = [];
18514     for (var key in Object(object)) {
18515       if (hasOwnProperty$7.call(object, key) && key != 'constructor') {
18516         result.push(key);
18517       }
18518     }
18519     return result;
18520   }
18521
18522   /**
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`.
18526    *
18527    * @static
18528    * @memberOf _
18529    * @since 4.0.0
18530    * @category Lang
18531    * @param {*} value The value to check.
18532    * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
18533    * @example
18534    *
18535    * _.isArrayLike([1, 2, 3]);
18536    * // => true
18537    *
18538    * _.isArrayLike(document.body.children);
18539    * // => true
18540    *
18541    * _.isArrayLike('abc');
18542    * // => true
18543    *
18544    * _.isArrayLike(_.noop);
18545    * // => false
18546    */
18547   function isArrayLike(value) {
18548     return value != null && isLength(value.length) && !isFunction(value);
18549   }
18550
18551   /**
18552    * Creates an array of the own enumerable property names of `object`.
18553    *
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.
18557    *
18558    * @static
18559    * @since 0.1.0
18560    * @memberOf _
18561    * @category Object
18562    * @param {Object} object The object to query.
18563    * @returns {Array} Returns the array of property names.
18564    * @example
18565    *
18566    * function Foo() {
18567    *   this.a = 1;
18568    *   this.b = 2;
18569    * }
18570    *
18571    * Foo.prototype.c = 3;
18572    *
18573    * _.keys(new Foo);
18574    * // => ['a', 'b'] (iteration order is not guaranteed)
18575    *
18576    * _.keys('hi');
18577    * // => ['0', '1']
18578    */
18579   function keys$1(object) {
18580     return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
18581   }
18582
18583   /**
18584    * The base implementation of `_.assign` without support for multiple sources
18585    * or `customizer` functions.
18586    *
18587    * @private
18588    * @param {Object} object The destination object.
18589    * @param {Object} source The source object.
18590    * @returns {Object} Returns `object`.
18591    */
18592   function baseAssign(object, source) {
18593     return object && copyObject(source, keys$1(source), object);
18594   }
18595
18596   /**
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.
18600    *
18601    * @private
18602    * @param {Object} object The object to query.
18603    * @returns {Array} Returns the array of property names.
18604    */
18605   function nativeKeysIn(object) {
18606     var result = [];
18607     if (object != null) {
18608       for (var key in Object(object)) {
18609         result.push(key);
18610       }
18611     }
18612     return result;
18613   }
18614
18615   /** Used for built-in method references. */
18616   var objectProto$a = Object.prototype;
18617
18618   /** Used to check objects for own properties. */
18619   var hasOwnProperty$8 = objectProto$a.hasOwnProperty;
18620
18621   /**
18622    * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
18623    *
18624    * @private
18625    * @param {Object} object The object to query.
18626    * @returns {Array} Returns the array of property names.
18627    */
18628   function baseKeysIn(object) {
18629     if (!isObject(object)) {
18630       return nativeKeysIn(object);
18631     }
18632     var isProto = isPrototype(object),
18633         result = [];
18634
18635     for (var key in object) {
18636       if (!(key == 'constructor' && (isProto || !hasOwnProperty$8.call(object, key)))) {
18637         result.push(key);
18638       }
18639     }
18640     return result;
18641   }
18642
18643   /**
18644    * Creates an array of the own and inherited enumerable property names of `object`.
18645    *
18646    * **Note:** Non-object values are coerced to objects.
18647    *
18648    * @static
18649    * @memberOf _
18650    * @since 3.0.0
18651    * @category Object
18652    * @param {Object} object The object to query.
18653    * @returns {Array} Returns the array of property names.
18654    * @example
18655    *
18656    * function Foo() {
18657    *   this.a = 1;
18658    *   this.b = 2;
18659    * }
18660    *
18661    * Foo.prototype.c = 3;
18662    *
18663    * _.keysIn(new Foo);
18664    * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
18665    */
18666   function keysIn$1(object) {
18667     return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
18668   }
18669
18670   /**
18671    * The base implementation of `_.assignIn` without support for multiple sources
18672    * or `customizer` functions.
18673    *
18674    * @private
18675    * @param {Object} object The destination object.
18676    * @param {Object} source The source object.
18677    * @returns {Object} Returns `object`.
18678    */
18679   function baseAssignIn(object, source) {
18680     return object && copyObject(source, keysIn$1(source), object);
18681   }
18682
18683   /** Detect free variable `exports`. */
18684   var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18685
18686   /** Detect free variable `module`. */
18687   var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
18688
18689   /** Detect the popular CommonJS extension `module.exports`. */
18690   var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
18691
18692   /** Built-in value references. */
18693   var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined,
18694       allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
18695
18696   /**
18697    * Creates a clone of  `buffer`.
18698    *
18699    * @private
18700    * @param {Buffer} buffer The buffer to clone.
18701    * @param {boolean} [isDeep] Specify a deep clone.
18702    * @returns {Buffer} Returns the cloned buffer.
18703    */
18704   function cloneBuffer(buffer, isDeep) {
18705     if (isDeep) {
18706       return buffer.slice();
18707     }
18708     var length = buffer.length,
18709         result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
18710
18711     buffer.copy(result);
18712     return result;
18713   }
18714
18715   /**
18716    * Copies the values of `source` to `array`.
18717    *
18718    * @private
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`.
18722    */
18723   function copyArray(source, array) {
18724     var index = -1,
18725         length = source.length;
18726
18727     array || (array = Array(length));
18728     while (++index < length) {
18729       array[index] = source[index];
18730     }
18731     return array;
18732   }
18733
18734   /**
18735    * A specialized version of `_.filter` for arrays without support for
18736    * iteratee shorthands.
18737    *
18738    * @private
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.
18742    */
18743   function arrayFilter(array, predicate) {
18744     var index = -1,
18745         length = array == null ? 0 : array.length,
18746         resIndex = 0,
18747         result = [];
18748
18749     while (++index < length) {
18750       var value = array[index];
18751       if (predicate(value, index, array)) {
18752         result[resIndex++] = value;
18753       }
18754     }
18755     return result;
18756   }
18757
18758   /**
18759    * This method returns a new empty array.
18760    *
18761    * @static
18762    * @memberOf _
18763    * @since 4.13.0
18764    * @category Util
18765    * @returns {Array} Returns the new empty array.
18766    * @example
18767    *
18768    * var arrays = _.times(2, _.stubArray);
18769    *
18770    * console.log(arrays);
18771    * // => [[], []]
18772    *
18773    * console.log(arrays[0] === arrays[1]);
18774    * // => false
18775    */
18776   function stubArray() {
18777     return [];
18778   }
18779
18780   /** Used for built-in method references. */
18781   var objectProto$b = Object.prototype;
18782
18783   /** Built-in value references. */
18784   var propertyIsEnumerable$1 = objectProto$b.propertyIsEnumerable;
18785
18786   /* Built-in method references for those with the same name as other `lodash` methods. */
18787   var nativeGetSymbols = Object.getOwnPropertySymbols;
18788
18789   /**
18790    * Creates an array of the own enumerable symbols of `object`.
18791    *
18792    * @private
18793    * @param {Object} object The object to query.
18794    * @returns {Array} Returns the array of symbols.
18795    */
18796   var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
18797     if (object == null) {
18798       return [];
18799     }
18800     object = Object(object);
18801     return arrayFilter(nativeGetSymbols(object), function(symbol) {
18802       return propertyIsEnumerable$1.call(object, symbol);
18803     });
18804   };
18805
18806   /**
18807    * Copies own symbols of `source` to `object`.
18808    *
18809    * @private
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`.
18813    */
18814   function copySymbols(source, object) {
18815     return copyObject(source, getSymbols(source), object);
18816   }
18817
18818   /**
18819    * Appends the elements of `values` to `array`.
18820    *
18821    * @private
18822    * @param {Array} array The array to modify.
18823    * @param {Array} values The values to append.
18824    * @returns {Array} Returns `array`.
18825    */
18826   function arrayPush(array, values) {
18827     var index = -1,
18828         length = values.length,
18829         offset = array.length;
18830
18831     while (++index < length) {
18832       array[offset + index] = values[index];
18833     }
18834     return array;
18835   }
18836
18837   /** Built-in value references. */
18838   var getPrototype = overArg(Object.getPrototypeOf, Object);
18839
18840   /* Built-in method references for those with the same name as other `lodash` methods. */
18841   var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
18842
18843   /**
18844    * Creates an array of the own and inherited enumerable symbols of `object`.
18845    *
18846    * @private
18847    * @param {Object} object The object to query.
18848    * @returns {Array} Returns the array of symbols.
18849    */
18850   var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
18851     var result = [];
18852     while (object) {
18853       arrayPush(result, getSymbols(object));
18854       object = getPrototype(object);
18855     }
18856     return result;
18857   };
18858
18859   /**
18860    * Copies own and inherited symbols of `source` to `object`.
18861    *
18862    * @private
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`.
18866    */
18867   function copySymbolsIn(source, object) {
18868     return copyObject(source, getSymbolsIn(source), object);
18869   }
18870
18871   /**
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`.
18875    *
18876    * @private
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.
18881    */
18882   function baseGetAllKeys(object, keysFunc, symbolsFunc) {
18883     var result = keysFunc(object);
18884     return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
18885   }
18886
18887   /**
18888    * Creates an array of own enumerable property names and symbols of `object`.
18889    *
18890    * @private
18891    * @param {Object} object The object to query.
18892    * @returns {Array} Returns the array of property names and symbols.
18893    */
18894   function getAllKeys(object) {
18895     return baseGetAllKeys(object, keys$1, getSymbols);
18896   }
18897
18898   /**
18899    * Creates an array of own and inherited enumerable property names and
18900    * symbols of `object`.
18901    *
18902    * @private
18903    * @param {Object} object The object to query.
18904    * @returns {Array} Returns the array of property names and symbols.
18905    */
18906   function getAllKeysIn(object) {
18907     return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
18908   }
18909
18910   /* Built-in method references that are verified to be native. */
18911   var DataView = getNative(root$2, 'DataView');
18912
18913   /* Built-in method references that are verified to be native. */
18914   var Promise = getNative(root$2, 'Promise');
18915
18916   /* Built-in method references that are verified to be native. */
18917   var Set$1 = getNative(root$2, 'Set');
18918
18919   /* Built-in method references that are verified to be native. */
18920   var WeakMap = getNative(root$2, 'WeakMap');
18921
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]';
18928
18929   var dataViewTag$1 = '[object DataView]';
18930
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);
18937
18938   /**
18939    * Gets the `toStringTag` of `value`.
18940    *
18941    * @private
18942    * @param {*} value The value to query.
18943    * @returns {string} Returns the `toStringTag`.
18944    */
18945   var getTag = baseGetTag;
18946
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) : '';
18957
18958       if (ctorString) {
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;
18965         }
18966       }
18967       return result;
18968     };
18969   }
18970
18971   var getTag$1 = getTag;
18972
18973   /** Used for built-in method references. */
18974   var objectProto$c = Object.prototype;
18975
18976   /** Used to check objects for own properties. */
18977   var hasOwnProperty$9 = objectProto$c.hasOwnProperty;
18978
18979   /**
18980    * Initializes an array clone.
18981    *
18982    * @private
18983    * @param {Array} array The array to clone.
18984    * @returns {Array} Returns the initialized clone.
18985    */
18986   function initCloneArray(array) {
18987     var length = array.length,
18988         result = new array.constructor(length);
18989
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;
18994     }
18995     return result;
18996   }
18997
18998   /** Built-in value references. */
18999   var Uint8Array = root$2.Uint8Array;
19000
19001   /**
19002    * Creates a clone of `arrayBuffer`.
19003    *
19004    * @private
19005    * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
19006    * @returns {ArrayBuffer} Returns the cloned array buffer.
19007    */
19008   function cloneArrayBuffer(arrayBuffer) {
19009     var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
19010     new Uint8Array(result).set(new Uint8Array(arrayBuffer));
19011     return result;
19012   }
19013
19014   /**
19015    * Creates a clone of `dataView`.
19016    *
19017    * @private
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.
19021    */
19022   function cloneDataView(dataView, isDeep) {
19023     var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
19024     return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
19025   }
19026
19027   /** Used to match `RegExp` flags from their coerced string values. */
19028   var reFlags = /\w*$/;
19029
19030   /**
19031    * Creates a clone of `regexp`.
19032    *
19033    * @private
19034    * @param {Object} regexp The regexp to clone.
19035    * @returns {Object} Returns the cloned regexp.
19036    */
19037   function cloneRegExp(regexp) {
19038     var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
19039     result.lastIndex = regexp.lastIndex;
19040     return result;
19041   }
19042
19043   /** Used to convert symbols to primitives and strings. */
19044   var symbolProto = Symbol ? Symbol.prototype : undefined,
19045       symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
19046
19047   /**
19048    * Creates a clone of the `symbol` object.
19049    *
19050    * @private
19051    * @param {Object} symbol The symbol object to clone.
19052    * @returns {Object} Returns the cloned symbol object.
19053    */
19054   function cloneSymbol(symbol) {
19055     return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
19056   }
19057
19058   /**
19059    * Creates a clone of `typedArray`.
19060    *
19061    * @private
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.
19065    */
19066   function cloneTypedArray(typedArray, isDeep) {
19067     var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
19068     return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
19069   }
19070
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]';
19080
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]';
19092
19093   /**
19094    * Initializes an object clone based on its `toStringTag`.
19095    *
19096    * **Note:** This function only supports cloning values with tags of
19097    * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
19098    *
19099    * @private
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.
19104    */
19105   function initCloneByTag(object, tag, isDeep) {
19106     var Ctor = object.constructor;
19107     switch (tag) {
19108       case arrayBufferTag$1:
19109         return cloneArrayBuffer(object);
19110
19111       case boolTag$1:
19112       case dateTag$1:
19113         return new Ctor(+object);
19114
19115       case dataViewTag$2:
19116         return cloneDataView(object, isDeep);
19117
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);
19122
19123       case mapTag$2:
19124         return new Ctor;
19125
19126       case numberTag$1:
19127       case stringTag$1:
19128         return new Ctor(object);
19129
19130       case regexpTag$1:
19131         return cloneRegExp(object);
19132
19133       case setTag$2:
19134         return new Ctor;
19135
19136       case symbolTag:
19137         return cloneSymbol(object);
19138     }
19139   }
19140
19141   /** Built-in value references. */
19142   var objectCreate = Object.create;
19143
19144   /**
19145    * The base implementation of `_.create` without support for assigning
19146    * properties to the created object.
19147    *
19148    * @private
19149    * @param {Object} proto The object to inherit from.
19150    * @returns {Object} Returns the new object.
19151    */
19152   var baseCreate = (function() {
19153     function object() {}
19154     return function(proto) {
19155       if (!isObject(proto)) {
19156         return {};
19157       }
19158       if (objectCreate) {
19159         return objectCreate(proto);
19160       }
19161       object.prototype = proto;
19162       var result = new object;
19163       object.prototype = undefined;
19164       return result;
19165     };
19166   }());
19167
19168   /**
19169    * Initializes an object clone.
19170    *
19171    * @private
19172    * @param {Object} object The object to clone.
19173    * @returns {Object} Returns the initialized clone.
19174    */
19175   function initCloneObject(object) {
19176     return (typeof object.constructor == 'function' && !isPrototype(object))
19177       ? baseCreate(getPrototype(object))
19178       : {};
19179   }
19180
19181   /** `Object#toString` result references. */
19182   var mapTag$3 = '[object Map]';
19183
19184   /**
19185    * The base implementation of `_.isMap` without Node.js optimizations.
19186    *
19187    * @private
19188    * @param {*} value The value to check.
19189    * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19190    */
19191   function baseIsMap(value) {
19192     return isObjectLike(value) && getTag$1(value) == mapTag$3;
19193   }
19194
19195   /* Node.js helper references. */
19196   var nodeIsMap = nodeUtil && nodeUtil.isMap;
19197
19198   /**
19199    * Checks if `value` is classified as a `Map` object.
19200    *
19201    * @static
19202    * @memberOf _
19203    * @since 4.3.0
19204    * @category Lang
19205    * @param {*} value The value to check.
19206    * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19207    * @example
19208    *
19209    * _.isMap(new Map);
19210    * // => true
19211    *
19212    * _.isMap(new WeakMap);
19213    * // => false
19214    */
19215   var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
19216
19217   /** `Object#toString` result references. */
19218   var setTag$3 = '[object Set]';
19219
19220   /**
19221    * The base implementation of `_.isSet` without Node.js optimizations.
19222    *
19223    * @private
19224    * @param {*} value The value to check.
19225    * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19226    */
19227   function baseIsSet(value) {
19228     return isObjectLike(value) && getTag$1(value) == setTag$3;
19229   }
19230
19231   /* Node.js helper references. */
19232   var nodeIsSet = nodeUtil && nodeUtil.isSet;
19233
19234   /**
19235    * Checks if `value` is classified as a `Set` object.
19236    *
19237    * @static
19238    * @memberOf _
19239    * @since 4.3.0
19240    * @category Lang
19241    * @param {*} value The value to check.
19242    * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19243    * @example
19244    *
19245    * _.isSet(new Set);
19246    * // => true
19247    *
19248    * _.isSet(new WeakSet);
19249    * // => false
19250    */
19251   var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
19252
19253   /** Used to compose bitmasks for cloning. */
19254   var CLONE_DEEP_FLAG = 1,
19255       CLONE_FLAT_FLAG = 2,
19256       CLONE_SYMBOLS_FLAG = 4;
19257
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]';
19274
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]';
19286
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;
19302
19303   /**
19304    * The base implementation of `_.clone` and `_.cloneDeep` which tracks
19305    * traversed objects.
19306    *
19307    * @private
19308    * @param {*} value The value to clone.
19309    * @param {boolean} bitmask The bitmask flags.
19310    *  1 - Deep clone
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.
19318    */
19319   function baseClone(value, bitmask, customizer, key, object, stack) {
19320     var result,
19321         isDeep = bitmask & CLONE_DEEP_FLAG,
19322         isFlat = bitmask & CLONE_FLAT_FLAG,
19323         isFull = bitmask & CLONE_SYMBOLS_FLAG;
19324
19325     if (customizer) {
19326       result = object ? customizer(value, key, object, stack) : customizer(value);
19327     }
19328     if (result !== undefined) {
19329       return result;
19330     }
19331     if (!isObject(value)) {
19332       return value;
19333     }
19334     var isArr = isArray(value);
19335     if (isArr) {
19336       result = initCloneArray(value);
19337       if (!isDeep) {
19338         return copyArray(value, result);
19339       }
19340     } else {
19341       var tag = getTag$1(value),
19342           isFunc = tag == funcTag$2 || tag == genTag$1;
19343
19344       if (isBuffer(value)) {
19345         return cloneBuffer(value, isDeep);
19346       }
19347       if (tag == objectTag$2 || tag == argsTag$2 || (isFunc && !object)) {
19348         result = (isFlat || isFunc) ? {} : initCloneObject(value);
19349         if (!isDeep) {
19350           return isFlat
19351             ? copySymbolsIn(value, baseAssignIn(result, value))
19352             : copySymbols(value, baseAssign(result, value));
19353         }
19354       } else {
19355         if (!cloneableTags[tag]) {
19356           return object ? value : {};
19357         }
19358         result = initCloneByTag(value, tag, isDeep);
19359       }
19360     }
19361     // Check for circular references and return its corresponding clone.
19362     stack || (stack = new Stack);
19363     var stacked = stack.get(value);
19364     if (stacked) {
19365       return stacked;
19366     }
19367     stack.set(value, result);
19368
19369     if (isSet(value)) {
19370       value.forEach(function(subValue) {
19371         result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
19372       });
19373
19374       return result;
19375     }
19376
19377     if (isMap(value)) {
19378       value.forEach(function(subValue, key) {
19379         result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
19380       });
19381
19382       return result;
19383     }
19384
19385     var keysFunc = isFull
19386       ? (isFlat ? getAllKeysIn : getAllKeys)
19387       : (isFlat ? keysIn : keys$1);
19388
19389     var props = isArr ? undefined : keysFunc(value);
19390     arrayEach(props || value, function(subValue, key) {
19391       if (props) {
19392         key = subValue;
19393         subValue = value[key];
19394       }
19395       // Recursively populate clone (susceptible to call stack limits).
19396       assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
19397     });
19398     return result;
19399   }
19400
19401   /** Used to compose bitmasks for cloning. */
19402   var CLONE_SYMBOLS_FLAG$1 = 4;
19403
19404   /**
19405    * Creates a shallow clone of `value`.
19406    *
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.
19414    *
19415    * @static
19416    * @memberOf _
19417    * @since 0.1.0
19418    * @category Lang
19419    * @param {*} value The value to clone.
19420    * @returns {*} Returns the cloned value.
19421    * @see _.cloneDeep
19422    * @example
19423    *
19424    * var objects = [{ 'a': 1 }, { 'b': 2 }];
19425    *
19426    * var shallow = _.clone(objects);
19427    * console.log(shallow[0] === objects[0]);
19428    * // => true
19429    */
19430   function clone(value) {
19431     return baseClone(value, CLONE_SYMBOLS_FLAG$1);
19432   }
19433
19434   /**
19435    * A specialized version of `baseAggregator` for arrays.
19436    *
19437    * @private
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`.
19443    */
19444   function arrayAggregator(array, setter, iteratee, accumulator) {
19445     var index = -1,
19446         length = array == null ? 0 : array.length;
19447
19448     while (++index < length) {
19449       var value = array[index];
19450       setter(accumulator, value, iteratee(value), array);
19451     }
19452     return accumulator;
19453   }
19454
19455   /**
19456    * Creates a base function for methods like `_.forIn` and `_.forOwn`.
19457    *
19458    * @private
19459    * @param {boolean} [fromRight] Specify iterating from right to left.
19460    * @returns {Function} Returns the new base function.
19461    */
19462   function createBaseFor(fromRight) {
19463     return function(object, iteratee, keysFunc) {
19464       var index = -1,
19465           iterable = Object(object),
19466           props = keysFunc(object),
19467           length = props.length;
19468
19469       while (length--) {
19470         var key = props[fromRight ? length : ++index];
19471         if (iteratee(iterable[key], key, iterable) === false) {
19472           break;
19473         }
19474       }
19475       return object;
19476     };
19477   }
19478
19479   /**
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`.
19483    *
19484    * @private
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`.
19489    */
19490   var baseFor = createBaseFor();
19491
19492   /**
19493    * The base implementation of `_.forOwn` without support for iteratee shorthands.
19494    *
19495    * @private
19496    * @param {Object} object The object to iterate over.
19497    * @param {Function} iteratee The function invoked per iteration.
19498    * @returns {Object} Returns `object`.
19499    */
19500   function baseForOwn(object, iteratee) {
19501     return object && baseFor(object, iteratee, keys$1);
19502   }
19503
19504   /**
19505    * Creates a `baseEach` or `baseEachRight` function.
19506    *
19507    * @private
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.
19511    */
19512   function createBaseEach(eachFunc, fromRight) {
19513     return function(collection, iteratee) {
19514       if (collection == null) {
19515         return collection;
19516       }
19517       if (!isArrayLike(collection)) {
19518         return eachFunc(collection, iteratee);
19519       }
19520       var length = collection.length,
19521           index = fromRight ? length : -1,
19522           iterable = Object(collection);
19523
19524       while ((fromRight ? index-- : ++index < length)) {
19525         if (iteratee(iterable[index], index, iterable) === false) {
19526           break;
19527         }
19528       }
19529       return collection;
19530     };
19531   }
19532
19533   /**
19534    * The base implementation of `_.forEach` without support for iteratee shorthands.
19535    *
19536    * @private
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`.
19540    */
19541   var baseEach = createBaseEach(baseForOwn);
19542
19543   /**
19544    * Aggregates elements of `collection` on `accumulator` with keys transformed
19545    * by `iteratee` and values set by `setter`.
19546    *
19547    * @private
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`.
19553    */
19554   function baseAggregator(collection, setter, iteratee, accumulator) {
19555     baseEach(collection, function(value, key, collection) {
19556       setter(accumulator, value, iteratee(value), collection);
19557     });
19558     return accumulator;
19559   }
19560
19561   /** Used to stand-in for `undefined` hash values. */
19562   var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
19563
19564   /**
19565    * Adds `value` to the array cache.
19566    *
19567    * @private
19568    * @name add
19569    * @memberOf SetCache
19570    * @alias push
19571    * @param {*} value The value to cache.
19572    * @returns {Object} Returns the cache instance.
19573    */
19574   function setCacheAdd(value) {
19575     this.__data__.set(value, HASH_UNDEFINED$2);
19576     return this;
19577   }
19578
19579   /**
19580    * Checks if `value` is in the array cache.
19581    *
19582    * @private
19583    * @name has
19584    * @memberOf SetCache
19585    * @param {*} value The value to search for.
19586    * @returns {number} Returns `true` if `value` is found, else `false`.
19587    */
19588   function setCacheHas(value) {
19589     return this.__data__.has(value);
19590   }
19591
19592   /**
19593    *
19594    * Creates an array cache object to store unique values.
19595    *
19596    * @private
19597    * @constructor
19598    * @param {Array} [values] The values to cache.
19599    */
19600   function SetCache(values) {
19601     var index = -1,
19602         length = values == null ? 0 : values.length;
19603
19604     this.__data__ = new MapCache;
19605     while (++index < length) {
19606       this.add(values[index]);
19607     }
19608   }
19609
19610   // Add methods to `SetCache`.
19611   SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
19612   SetCache.prototype.has = setCacheHas;
19613
19614   /**
19615    * A specialized version of `_.some` for arrays without support for iteratee
19616    * shorthands.
19617    *
19618    * @private
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,
19622    *  else `false`.
19623    */
19624   function arraySome(array, predicate) {
19625     var index = -1,
19626         length = array == null ? 0 : array.length;
19627
19628     while (++index < length) {
19629       if (predicate(array[index], index, array)) {
19630         return true;
19631       }
19632     }
19633     return false;
19634   }
19635
19636   /**
19637    * Checks if a `cache` value for `key` exists.
19638    *
19639    * @private
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`.
19643    */
19644   function cacheHas(cache, key) {
19645     return cache.has(key);
19646   }
19647
19648   /** Used to compose bitmasks for value comparisons. */
19649   var COMPARE_PARTIAL_FLAG = 1,
19650       COMPARE_UNORDERED_FLAG = 2;
19651
19652   /**
19653    * A specialized version of `baseIsEqualDeep` for arrays with support for
19654    * partial deep comparisons.
19655    *
19656    * @private
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`.
19664    */
19665   function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
19666     var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
19667         arrLength = array.length,
19668         othLength = other.length;
19669
19670     if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
19671       return false;
19672     }
19673     // Assume cyclic values are equal.
19674     var stacked = stack.get(array);
19675     if (stacked && stack.get(other)) {
19676       return stacked == other;
19677     }
19678     var index = -1,
19679         result = true,
19680         seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
19681
19682     stack.set(array, other);
19683     stack.set(other, array);
19684
19685     // Ignore non-index properties.
19686     while (++index < arrLength) {
19687       var arrValue = array[index],
19688           othValue = other[index];
19689
19690       if (customizer) {
19691         var compared = isPartial
19692           ? customizer(othValue, arrValue, index, other, array, stack)
19693           : customizer(arrValue, othValue, index, array, other, stack);
19694       }
19695       if (compared !== undefined) {
19696         if (compared) {
19697           continue;
19698         }
19699         result = false;
19700         break;
19701       }
19702       // Recursively compare arrays (susceptible to call stack limits).
19703       if (seen) {
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);
19708               }
19709             })) {
19710           result = false;
19711           break;
19712         }
19713       } else if (!(
19714             arrValue === othValue ||
19715               equalFunc(arrValue, othValue, bitmask, customizer, stack)
19716           )) {
19717         result = false;
19718         break;
19719       }
19720     }
19721     stack['delete'](array);
19722     stack['delete'](other);
19723     return result;
19724   }
19725
19726   /**
19727    * Converts `map` to its key-value pairs.
19728    *
19729    * @private
19730    * @param {Object} map The map to convert.
19731    * @returns {Array} Returns the key-value pairs.
19732    */
19733   function mapToArray(map) {
19734     var index = -1,
19735         result = Array(map.size);
19736
19737     map.forEach(function(value, key) {
19738       result[++index] = [key, value];
19739     });
19740     return result;
19741   }
19742
19743   /**
19744    * Converts `set` to an array of its values.
19745    *
19746    * @private
19747    * @param {Object} set The set to convert.
19748    * @returns {Array} Returns the values.
19749    */
19750   function setToArray(set) {
19751     var index = -1,
19752         result = Array(set.size);
19753
19754     set.forEach(function(value) {
19755       result[++index] = value;
19756     });
19757     return result;
19758   }
19759
19760   /** Used to compose bitmasks for value comparisons. */
19761   var COMPARE_PARTIAL_FLAG$1 = 1,
19762       COMPARE_UNORDERED_FLAG$1 = 2;
19763
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]';
19774
19775   var arrayBufferTag$3 = '[object ArrayBuffer]',
19776       dataViewTag$4 = '[object DataView]';
19777
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;
19781
19782   /**
19783    * A specialized version of `baseIsEqualDeep` for comparing objects of
19784    * the same `toStringTag`.
19785    *
19786    * **Note:** This function only supports comparing values with tags of
19787    * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
19788    *
19789    * @private
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`.
19798    */
19799   function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
19800     switch (tag) {
19801       case dataViewTag$4:
19802         if ((object.byteLength != other.byteLength) ||
19803             (object.byteOffset != other.byteOffset)) {
19804           return false;
19805         }
19806         object = object.buffer;
19807         other = other.buffer;
19808
19809       case arrayBufferTag$3:
19810         if ((object.byteLength != other.byteLength) ||
19811             !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
19812           return false;
19813         }
19814         return true;
19815
19816       case boolTag$3:
19817       case dateTag$3:
19818       case numberTag$3:
19819         // Coerce booleans to `1` or `0` and dates to milliseconds.
19820         // Invalid dates are coerced to `NaN`.
19821         return eq(+object, +other);
19822
19823       case errorTag$2:
19824         return object.name == other.name && object.message == other.message;
19825
19826       case regexpTag$3:
19827       case stringTag$3:
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 + '');
19832
19833       case mapTag$5:
19834         var convert = mapToArray;
19835
19836       case setTag$5:
19837         var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1;
19838         convert || (convert = setToArray);
19839
19840         if (object.size != other.size && !isPartial) {
19841           return false;
19842         }
19843         // Assume cyclic values are equal.
19844         var stacked = stack.get(object);
19845         if (stacked) {
19846           return stacked == other;
19847         }
19848         bitmask |= COMPARE_UNORDERED_FLAG$1;
19849
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);
19854         return result;
19855
19856       case symbolTag$2:
19857         if (symbolValueOf$1) {
19858           return symbolValueOf$1.call(object) == symbolValueOf$1.call(other);
19859         }
19860     }
19861     return false;
19862   }
19863
19864   /** Used to compose bitmasks for value comparisons. */
19865   var COMPARE_PARTIAL_FLAG$2 = 1;
19866
19867   /** Used for built-in method references. */
19868   var objectProto$d = Object.prototype;
19869
19870   /** Used to check objects for own properties. */
19871   var hasOwnProperty$a = objectProto$d.hasOwnProperty;
19872
19873   /**
19874    * A specialized version of `baseIsEqualDeep` for objects with support for
19875    * partial deep comparisons.
19876    *
19877    * @private
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`.
19885    */
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;
19892
19893     if (objLength != othLength && !isPartial) {
19894       return false;
19895     }
19896     var index = objLength;
19897     while (index--) {
19898       var key = objProps[index];
19899       if (!(isPartial ? key in other : hasOwnProperty$a.call(other, key))) {
19900         return false;
19901       }
19902     }
19903     // Assume cyclic values are equal.
19904     var stacked = stack.get(object);
19905     if (stacked && stack.get(other)) {
19906       return stacked == other;
19907     }
19908     var result = true;
19909     stack.set(object, other);
19910     stack.set(other, object);
19911
19912     var skipCtor = isPartial;
19913     while (++index < objLength) {
19914       key = objProps[index];
19915       var objValue = object[key],
19916           othValue = other[key];
19917
19918       if (customizer) {
19919         var compared = isPartial
19920           ? customizer(othValue, objValue, key, other, object, stack)
19921           : customizer(objValue, othValue, key, object, other, stack);
19922       }
19923       // Recursively compare objects (susceptible to call stack limits).
19924       if (!(compared === undefined
19925             ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
19926             : compared
19927           )) {
19928         result = false;
19929         break;
19930       }
19931       skipCtor || (skipCtor = key == 'constructor');
19932     }
19933     if (result && !skipCtor) {
19934       var objCtor = object.constructor,
19935           othCtor = other.constructor;
19936
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)) {
19942         result = false;
19943       }
19944     }
19945     stack['delete'](object);
19946     stack['delete'](other);
19947     return result;
19948   }
19949
19950   /** Used to compose bitmasks for value comparisons. */
19951   var COMPARE_PARTIAL_FLAG$3 = 1;
19952
19953   /** `Object#toString` result references. */
19954   var argsTag$3 = '[object Arguments]',
19955       arrayTag$2 = '[object Array]',
19956       objectTag$3 = '[object Object]';
19957
19958   /** Used for built-in method references. */
19959   var objectProto$e = Object.prototype;
19960
19961   /** Used to check objects for own properties. */
19962   var hasOwnProperty$b = objectProto$e.hasOwnProperty;
19963
19964   /**
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.
19968    *
19969    * @private
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`.
19977    */
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);
19983
19984     objTag = objTag == argsTag$3 ? objectTag$3 : objTag;
19985     othTag = othTag == argsTag$3 ? objectTag$3 : othTag;
19986
19987     var objIsObj = objTag == objectTag$3,
19988         othIsObj = othTag == objectTag$3,
19989         isSameTag = objTag == othTag;
19990
19991     if (isSameTag && isBuffer(object)) {
19992       if (!isBuffer(other)) {
19993         return false;
19994       }
19995       objIsArr = true;
19996       objIsObj = false;
19997     }
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);
20003     }
20004     if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) {
20005       var objIsWrapped = objIsObj && hasOwnProperty$b.call(object, '__wrapped__'),
20006           othIsWrapped = othIsObj && hasOwnProperty$b.call(other, '__wrapped__');
20007
20008       if (objIsWrapped || othIsWrapped) {
20009         var objUnwrapped = objIsWrapped ? object.value() : object,
20010             othUnwrapped = othIsWrapped ? other.value() : other;
20011
20012         stack || (stack = new Stack);
20013         return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
20014       }
20015     }
20016     if (!isSameTag) {
20017       return false;
20018     }
20019     stack || (stack = new Stack);
20020     return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
20021   }
20022
20023   /**
20024    * The base implementation of `_.isEqual` which supports partial comparisons
20025    * and tracks traversed objects.
20026    *
20027    * @private
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`.
20036    */
20037   function baseIsEqual(value, other, bitmask, customizer, stack) {
20038     if (value === other) {
20039       return true;
20040     }
20041     if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
20042       return value !== value && other !== other;
20043     }
20044     return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
20045   }
20046
20047   /** Used to compose bitmasks for value comparisons. */
20048   var COMPARE_PARTIAL_FLAG$4 = 1,
20049       COMPARE_UNORDERED_FLAG$2 = 2;
20050
20051   /**
20052    * The base implementation of `_.isMatch` without support for iteratee shorthands.
20053    *
20054    * @private
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`.
20060    */
20061   function baseIsMatch(object, source, matchData, customizer) {
20062     var index = matchData.length,
20063         length = index,
20064         noCustomizer = !customizer;
20065
20066     if (object == null) {
20067       return !length;
20068     }
20069     object = Object(object);
20070     while (index--) {
20071       var data = matchData[index];
20072       if ((noCustomizer && data[2])
20073             ? data[1] !== object[data[0]]
20074             : !(data[0] in object)
20075           ) {
20076         return false;
20077       }
20078     }
20079     while (++index < length) {
20080       data = matchData[index];
20081       var key = data[0],
20082           objValue = object[key],
20083           srcValue = data[1];
20084
20085       if (noCustomizer && data[2]) {
20086         if (objValue === undefined && !(key in object)) {
20087           return false;
20088         }
20089       } else {
20090         var stack = new Stack;
20091         if (customizer) {
20092           var result = customizer(objValue, srcValue, key, object, source, stack);
20093         }
20094         if (!(result === undefined
20095               ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack)
20096               : result
20097             )) {
20098           return false;
20099         }
20100       }
20101     }
20102     return true;
20103   }
20104
20105   /**
20106    * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
20107    *
20108    * @private
20109    * @param {*} value The value to check.
20110    * @returns {boolean} Returns `true` if `value` if suitable for strict
20111    *  equality comparisons, else `false`.
20112    */
20113   function isStrictComparable(value) {
20114     return value === value && !isObject(value);
20115   }
20116
20117   /**
20118    * Gets the property names, values, and compare flags of `object`.
20119    *
20120    * @private
20121    * @param {Object} object The object to query.
20122    * @returns {Array} Returns the match data of `object`.
20123    */
20124   function getMatchData(object) {
20125     var result = keys$1(object),
20126         length = result.length;
20127
20128     while (length--) {
20129       var key = result[length],
20130           value = object[key];
20131
20132       result[length] = [key, value, isStrictComparable(value)];
20133     }
20134     return result;
20135   }
20136
20137   /**
20138    * A specialized version of `matchesProperty` for source values suitable
20139    * for strict equality comparisons, i.e. `===`.
20140    *
20141    * @private
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.
20145    */
20146   function matchesStrictComparable(key, srcValue) {
20147     return function(object) {
20148       if (object == null) {
20149         return false;
20150       }
20151       return object[key] === srcValue &&
20152         (srcValue !== undefined || (key in Object(object)));
20153     };
20154   }
20155
20156   /**
20157    * The base implementation of `_.matches` which doesn't clone `source`.
20158    *
20159    * @private
20160    * @param {Object} source The object of property values to match.
20161    * @returns {Function} Returns the new spec function.
20162    */
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]);
20167     }
20168     return function(object) {
20169       return object === source || baseIsMatch(object, source, matchData);
20170     };
20171   }
20172
20173   /** `Object#toString` result references. */
20174   var symbolTag$3 = '[object Symbol]';
20175
20176   /**
20177    * Checks if `value` is classified as a `Symbol` primitive or object.
20178    *
20179    * @static
20180    * @memberOf _
20181    * @since 4.0.0
20182    * @category Lang
20183    * @param {*} value The value to check.
20184    * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
20185    * @example
20186    *
20187    * _.isSymbol(Symbol.iterator);
20188    * // => true
20189    *
20190    * _.isSymbol('abc');
20191    * // => false
20192    */
20193   function isSymbol(value) {
20194     return typeof value == 'symbol' ||
20195       (isObjectLike(value) && baseGetTag(value) == symbolTag$3);
20196   }
20197
20198   /** Used to match property names within property paths. */
20199   var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
20200       reIsPlainProp = /^\w*$/;
20201
20202   /**
20203    * Checks if `value` is a property name and not a property path.
20204    *
20205    * @private
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`.
20209    */
20210   function isKey(value, object) {
20211     if (isArray(value)) {
20212       return false;
20213     }
20214     var type = typeof value;
20215     if (type == 'number' || type == 'symbol' || type == 'boolean' ||
20216         value == null || isSymbol(value)) {
20217       return true;
20218     }
20219     return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
20220       (object != null && value in Object(object));
20221   }
20222
20223   /** Error message constants. */
20224   var FUNC_ERROR_TEXT = 'Expected a function';
20225
20226   /**
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.
20232    *
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`.
20238    *
20239    * @static
20240    * @memberOf _
20241    * @since 0.1.0
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.
20246    * @example
20247    *
20248    * var object = { 'a': 1, 'b': 2 };
20249    * var other = { 'c': 3, 'd': 4 };
20250    *
20251    * var values = _.memoize(_.values);
20252    * values(object);
20253    * // => [1, 2]
20254    *
20255    * values(other);
20256    * // => [3, 4]
20257    *
20258    * object.a = 2;
20259    * values(object);
20260    * // => [1, 2]
20261    *
20262    * // Modify the result cache.
20263    * values.cache.set(object, ['a', 'b']);
20264    * values(object);
20265    * // => ['a', 'b']
20266    *
20267    * // Replace `_.memoize.Cache`.
20268    * _.memoize.Cache = WeakMap;
20269    */
20270   function memoize(func, resolver) {
20271     if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
20272       throw new TypeError(FUNC_ERROR_TEXT);
20273     }
20274     var memoized = function() {
20275       var args = arguments,
20276           key = resolver ? resolver.apply(this, args) : args[0],
20277           cache = memoized.cache;
20278
20279       if (cache.has(key)) {
20280         return cache.get(key);
20281       }
20282       var result = func.apply(this, args);
20283       memoized.cache = cache.set(key, result) || cache;
20284       return result;
20285     };
20286     memoized.cache = new (memoize.Cache || MapCache);
20287     return memoized;
20288   }
20289
20290   // Expose `MapCache`.
20291   memoize.Cache = MapCache;
20292
20293   /** Used as the maximum memoize cache size. */
20294   var MAX_MEMOIZE_SIZE = 500;
20295
20296   /**
20297    * A specialized version of `_.memoize` which clears the memoized function's
20298    * cache when it exceeds `MAX_MEMOIZE_SIZE`.
20299    *
20300    * @private
20301    * @param {Function} func The function to have its output memoized.
20302    * @returns {Function} Returns the new memoized function.
20303    */
20304   function memoizeCapped(func) {
20305     var result = memoize(func, function(key) {
20306       if (cache.size === MAX_MEMOIZE_SIZE) {
20307         cache.clear();
20308       }
20309       return key;
20310     });
20311
20312     var cache = result.cache;
20313     return result;
20314   }
20315
20316   /** Used to match property names within property paths. */
20317   var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
20318
20319   /** Used to match backslashes in property paths. */
20320   var reEscapeChar = /\\(\\)?/g;
20321
20322   /**
20323    * Converts `string` to a property path array.
20324    *
20325    * @private
20326    * @param {string} string The string to convert.
20327    * @returns {Array} Returns the property path array.
20328    */
20329   var stringToPath = memoizeCapped(function(string) {
20330     var result = [];
20331     if (string.charCodeAt(0) === 46 /* . */) {
20332       result.push('');
20333     }
20334     string.replace(rePropName, function(match, number, quote, subString) {
20335       result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
20336     });
20337     return result;
20338   });
20339
20340   /**
20341    * A specialized version of `_.map` for arrays without support for iteratee
20342    * shorthands.
20343    *
20344    * @private
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.
20348    */
20349   function arrayMap(array, iteratee) {
20350     var index = -1,
20351         length = array == null ? 0 : array.length,
20352         result = Array(length);
20353
20354     while (++index < length) {
20355       result[index] = iteratee(array[index], index, array);
20356     }
20357     return result;
20358   }
20359
20360   /** Used as references for various `Number` constants. */
20361   var INFINITY = 1 / 0;
20362
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;
20366
20367   /**
20368    * The base implementation of `_.toString` which doesn't convert nullish
20369    * values to empty strings.
20370    *
20371    * @private
20372    * @param {*} value The value to process.
20373    * @returns {string} Returns the string.
20374    */
20375   function baseToString(value) {
20376     // Exit early for strings to avoid a performance hit in some environments.
20377     if (typeof value == 'string') {
20378       return value;
20379     }
20380     if (isArray(value)) {
20381       // Recursively convert values (susceptible to call stack limits).
20382       return arrayMap(value, baseToString) + '';
20383     }
20384     if (isSymbol(value)) {
20385       return symbolToString ? symbolToString.call(value) : '';
20386     }
20387     var result = (value + '');
20388     return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
20389   }
20390
20391   /**
20392    * Converts `value` to a string. An empty string is returned for `null`
20393    * and `undefined` values. The sign of `-0` is preserved.
20394    *
20395    * @static
20396    * @memberOf _
20397    * @since 4.0.0
20398    * @category Lang
20399    * @param {*} value The value to convert.
20400    * @returns {string} Returns the converted string.
20401    * @example
20402    *
20403    * _.toString(null);
20404    * // => ''
20405    *
20406    * _.toString(-0);
20407    * // => '-0'
20408    *
20409    * _.toString([1, 2, 3]);
20410    * // => '1,2,3'
20411    */
20412   function toString(value) {
20413     return value == null ? '' : baseToString(value);
20414   }
20415
20416   /**
20417    * Casts `value` to a path array if it's not one.
20418    *
20419    * @private
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.
20423    */
20424   function castPath(value, object) {
20425     if (isArray(value)) {
20426       return value;
20427     }
20428     return isKey(value, object) ? [value] : stringToPath(toString(value));
20429   }
20430
20431   /** Used as references for various `Number` constants. */
20432   var INFINITY$1 = 1 / 0;
20433
20434   /**
20435    * Converts `value` to a string key if it's not a string or symbol.
20436    *
20437    * @private
20438    * @param {*} value The value to inspect.
20439    * @returns {string|symbol} Returns the key.
20440    */
20441   function toKey(value) {
20442     if (typeof value == 'string' || isSymbol(value)) {
20443       return value;
20444     }
20445     var result = (value + '');
20446     return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
20447   }
20448
20449   /**
20450    * The base implementation of `_.get` without support for default values.
20451    *
20452    * @private
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.
20456    */
20457   function baseGet(object, path) {
20458     path = castPath(path, object);
20459
20460     var index = 0,
20461         length = path.length;
20462
20463     while (object != null && index < length) {
20464       object = object[toKey(path[index++])];
20465     }
20466     return (index && index == length) ? object : undefined;
20467   }
20468
20469   /**
20470    * Gets the value at `path` of `object`. If the resolved value is
20471    * `undefined`, the `defaultValue` is returned in its place.
20472    *
20473    * @static
20474    * @memberOf _
20475    * @since 3.7.0
20476    * @category Object
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.
20481    * @example
20482    *
20483    * var object = { 'a': [{ 'b': { 'c': 3 } }] };
20484    *
20485    * _.get(object, 'a[0].b.c');
20486    * // => 3
20487    *
20488    * _.get(object, ['a', '0', 'b', 'c']);
20489    * // => 3
20490    *
20491    * _.get(object, 'a.b.c', 'default');
20492    * // => 'default'
20493    */
20494   function get$2(object, path, defaultValue) {
20495     var result = object == null ? undefined : baseGet(object, path);
20496     return result === undefined ? defaultValue : result;
20497   }
20498
20499   /**
20500    * The base implementation of `_.hasIn` without support for deep paths.
20501    *
20502    * @private
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`.
20506    */
20507   function baseHasIn(object, key) {
20508     return object != null && key in Object(object);
20509   }
20510
20511   /**
20512    * Checks if `path` exists on `object`.
20513    *
20514    * @private
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`.
20519    */
20520   function hasPath(object, path, hasFunc) {
20521     path = castPath(path, object);
20522
20523     var index = -1,
20524         length = path.length,
20525         result = false;
20526
20527     while (++index < length) {
20528       var key = toKey(path[index]);
20529       if (!(result = object != null && hasFunc(object, key))) {
20530         break;
20531       }
20532       object = object[key];
20533     }
20534     if (result || ++index != length) {
20535       return result;
20536     }
20537     length = object == null ? 0 : object.length;
20538     return !!length && isLength(length) && isIndex(key, length) &&
20539       (isArray(object) || isArguments(object));
20540   }
20541
20542   /**
20543    * Checks if `path` is a direct or inherited property of `object`.
20544    *
20545    * @static
20546    * @memberOf _
20547    * @since 4.0.0
20548    * @category 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`.
20552    * @example
20553    *
20554    * var object = _.create({ 'a': _.create({ 'b': 2 }) });
20555    *
20556    * _.hasIn(object, 'a');
20557    * // => true
20558    *
20559    * _.hasIn(object, 'a.b');
20560    * // => true
20561    *
20562    * _.hasIn(object, ['a', 'b']);
20563    * // => true
20564    *
20565    * _.hasIn(object, 'b');
20566    * // => false
20567    */
20568   function hasIn(object, path) {
20569     return object != null && hasPath(object, path, baseHasIn);
20570   }
20571
20572   /** Used to compose bitmasks for value comparisons. */
20573   var COMPARE_PARTIAL_FLAG$5 = 1,
20574       COMPARE_UNORDERED_FLAG$3 = 2;
20575
20576   /**
20577    * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
20578    *
20579    * @private
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.
20583    */
20584   function baseMatchesProperty(path, srcValue) {
20585     if (isKey(path) && isStrictComparable(srcValue)) {
20586       return matchesStrictComparable(toKey(path), srcValue);
20587     }
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);
20593     };
20594   }
20595
20596   /**
20597    * This method returns the first argument it receives.
20598    *
20599    * @static
20600    * @since 0.1.0
20601    * @memberOf _
20602    * @category Util
20603    * @param {*} value Any value.
20604    * @returns {*} Returns `value`.
20605    * @example
20606    *
20607    * var object = { 'a': 1 };
20608    *
20609    * console.log(_.identity(object) === object);
20610    * // => true
20611    */
20612   function identity$8(value) {
20613     return value;
20614   }
20615
20616   /**
20617    * The base implementation of `_.property` without support for deep paths.
20618    *
20619    * @private
20620    * @param {string} key The key of the property to get.
20621    * @returns {Function} Returns the new accessor function.
20622    */
20623   function baseProperty(key) {
20624     return function(object) {
20625       return object == null ? undefined : object[key];
20626     };
20627   }
20628
20629   /**
20630    * A specialized version of `baseProperty` which supports deep paths.
20631    *
20632    * @private
20633    * @param {Array|string} path The path of the property to get.
20634    * @returns {Function} Returns the new accessor function.
20635    */
20636   function basePropertyDeep(path) {
20637     return function(object) {
20638       return baseGet(object, path);
20639     };
20640   }
20641
20642   /**
20643    * Creates a function that returns the value at `path` of a given object.
20644    *
20645    * @static
20646    * @memberOf _
20647    * @since 2.4.0
20648    * @category Util
20649    * @param {Array|string} path The path of the property to get.
20650    * @returns {Function} Returns the new accessor function.
20651    * @example
20652    *
20653    * var objects = [
20654    *   { 'a': { 'b': 2 } },
20655    *   { 'a': { 'b': 1 } }
20656    * ];
20657    *
20658    * _.map(objects, _.property('a.b'));
20659    * // => [2, 1]
20660    *
20661    * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
20662    * // => [1, 2]
20663    */
20664   function property(path) {
20665     return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
20666   }
20667
20668   /**
20669    * The base implementation of `_.iteratee`.
20670    *
20671    * @private
20672    * @param {*} [value=_.identity] The value to convert to an iteratee.
20673    * @returns {Function} Returns the iteratee.
20674    */
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') {
20679       return value;
20680     }
20681     if (value == null) {
20682       return identity$8;
20683     }
20684     if (typeof value == 'object') {
20685       return isArray(value)
20686         ? baseMatchesProperty(value[0], value[1])
20687         : baseMatches(value);
20688     }
20689     return property(value);
20690   }
20691
20692   /**
20693    * Creates a function like `_.groupBy`.
20694    *
20695    * @private
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.
20699    */
20700   function createAggregator(setter, initializer) {
20701     return function(collection, iteratee) {
20702       var func = isArray(collection) ? arrayAggregator : baseAggregator,
20703           accumulator = initializer ? initializer() : {};
20704
20705       return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
20706     };
20707   }
20708
20709   /** Used for built-in method references. */
20710   var objectProto$f = Object.prototype;
20711
20712   /** Used to check objects for own properties. */
20713   var hasOwnProperty$c = objectProto$f.hasOwnProperty;
20714
20715   /**
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).
20721    *
20722    * @static
20723    * @memberOf _
20724    * @since 0.1.0
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.
20729    * @example
20730    *
20731    * _.groupBy([6.1, 4.2, 6.3], Math.floor);
20732    * // => { '4': [4.2], '6': [6.1, 6.3] }
20733    *
20734    * // The `_.property` iteratee shorthand.
20735    * _.groupBy(['one', 'two', 'three'], 'length');
20736    * // => { '3': ['one', 'two'], '5': ['three'] }
20737    */
20738   var groupBy = createAggregator(function(result, value, key) {
20739     if (hasOwnProperty$c.call(result, key)) {
20740       result[key].push(value);
20741     } else {
20742       baseAssignValue(result, key, [value]);
20743     }
20744   });
20745
20746   /**
20747    * Gets the last element of `array`.
20748    *
20749    * @static
20750    * @memberOf _
20751    * @since 0.1.0
20752    * @category Array
20753    * @param {Array} array The array to query.
20754    * @returns {*} Returns the last element of `array`.
20755    * @example
20756    *
20757    * _.last([1, 2, 3]);
20758    * // => 3
20759    */
20760   function last(array) {
20761     var length = array == null ? 0 : array.length;
20762     return length ? array[length - 1] : undefined;
20763   }
20764
20765   /**
20766    * The base implementation of `_.slice` without an iteratee call guard.
20767    *
20768    * @private
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`.
20773    */
20774   function baseSlice(array, start, end) {
20775     var index = -1,
20776         length = array.length;
20777
20778     if (start < 0) {
20779       start = -start > length ? 0 : (length + start);
20780     }
20781     end = end > length ? length : end;
20782     if (end < 0) {
20783       end += length;
20784     }
20785     length = start > end ? 0 : ((end - start) >>> 0);
20786     start >>>= 0;
20787
20788     var result = Array(length);
20789     while (++index < length) {
20790       result[index] = array[index + start];
20791     }
20792     return result;
20793   }
20794
20795   /**
20796    * Gets the parent value at `path` of `object`.
20797    *
20798    * @private
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.
20802    */
20803   function parent(object, path) {
20804     return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
20805   }
20806
20807   /**
20808    * The base implementation of `_.unset`.
20809    *
20810    * @private
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`.
20814    */
20815   function baseUnset(object, path) {
20816     path = castPath(path, object);
20817     object = parent(object, path);
20818     return object == null || delete object[toKey(last(path))];
20819   }
20820
20821   /** `Object#toString` result references. */
20822   var objectTag$4 = '[object Object]';
20823
20824   /** Used for built-in method references. */
20825   var funcProto$2 = Function.prototype,
20826       objectProto$g = Object.prototype;
20827
20828   /** Used to resolve the decompiled source of functions. */
20829   var funcToString$2 = funcProto$2.toString;
20830
20831   /** Used to check objects for own properties. */
20832   var hasOwnProperty$d = objectProto$g.hasOwnProperty;
20833
20834   /** Used to infer the `Object` constructor. */
20835   var objectCtorString = funcToString$2.call(Object);
20836
20837   /**
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`.
20840    *
20841    * @static
20842    * @memberOf _
20843    * @since 0.8.0
20844    * @category Lang
20845    * @param {*} value The value to check.
20846    * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
20847    * @example
20848    *
20849    * function Foo() {
20850    *   this.a = 1;
20851    * }
20852    *
20853    * _.isPlainObject(new Foo);
20854    * // => false
20855    *
20856    * _.isPlainObject([1, 2, 3]);
20857    * // => false
20858    *
20859    * _.isPlainObject({ 'x': 0, 'y': 0 });
20860    * // => true
20861    *
20862    * _.isPlainObject(Object.create(null));
20863    * // => true
20864    */
20865   function isPlainObject(value) {
20866     if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
20867       return false;
20868     }
20869     var proto = getPrototype(value);
20870     if (proto === null) {
20871       return true;
20872     }
20873     var Ctor = hasOwnProperty$d.call(proto, 'constructor') && proto.constructor;
20874     return typeof Ctor == 'function' && Ctor instanceof Ctor &&
20875       funcToString$2.call(Ctor) == objectCtorString;
20876   }
20877
20878   /**
20879    * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
20880    * objects.
20881    *
20882    * @private
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`.
20886    */
20887   function customOmitClone(value) {
20888     return isPlainObject(value) ? undefined : value;
20889   }
20890
20891   /** Built-in value references. */
20892   var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
20893
20894   /**
20895    * Checks if `value` is a flattenable `arguments` object or array.
20896    *
20897    * @private
20898    * @param {*} value The value to check.
20899    * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
20900    */
20901   function isFlattenable(value) {
20902     return isArray(value) || isArguments(value) ||
20903       !!(spreadableSymbol && value && value[spreadableSymbol]);
20904   }
20905
20906   /**
20907    * The base implementation of `_.flatten` with support for restricting flattening.
20908    *
20909    * @private
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.
20916    */
20917   function baseFlatten(array, depth, predicate, isStrict, result) {
20918     var index = -1,
20919         length = array.length;
20920
20921     predicate || (predicate = isFlattenable);
20922     result || (result = []);
20923
20924     while (++index < length) {
20925       var value = array[index];
20926       if (depth > 0 && predicate(value)) {
20927         if (depth > 1) {
20928           // Recursively flatten arrays (susceptible to call stack limits).
20929           baseFlatten(value, depth - 1, predicate, isStrict, result);
20930         } else {
20931           arrayPush(result, value);
20932         }
20933       } else if (!isStrict) {
20934         result[result.length] = value;
20935       }
20936     }
20937     return result;
20938   }
20939
20940   /**
20941    * Flattens `array` a single level deep.
20942    *
20943    * @static
20944    * @memberOf _
20945    * @since 0.1.0
20946    * @category Array
20947    * @param {Array} array The array to flatten.
20948    * @returns {Array} Returns the new flattened array.
20949    * @example
20950    *
20951    * _.flatten([1, [2, [3, [4]], 5]]);
20952    * // => [1, 2, [3, [4]], 5]
20953    */
20954   function flatten(array) {
20955     var length = array == null ? 0 : array.length;
20956     return length ? baseFlatten(array, 1) : [];
20957   }
20958
20959   /**
20960    * A faster alternative to `Function#apply`, this function invokes `func`
20961    * with the `this` binding of `thisArg` and the arguments of `args`.
20962    *
20963    * @private
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`.
20968    */
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]);
20975     }
20976     return func.apply(thisArg, args);
20977   }
20978
20979   /* Built-in method references for those with the same name as other `lodash` methods. */
20980   var nativeMax = Math.max;
20981
20982   /**
20983    * A specialized version of `baseRest` which transforms the rest array.
20984    *
20985    * @private
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.
20990    */
20991   function overRest(func, start, transform) {
20992     start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
20993     return function() {
20994       var args = arguments,
20995           index = -1,
20996           length = nativeMax(args.length - start, 0),
20997           array = Array(length);
20998
20999       while (++index < length) {
21000         array[index] = args[start + index];
21001       }
21002       index = -1;
21003       var otherArgs = Array(start + 1);
21004       while (++index < start) {
21005         otherArgs[index] = args[index];
21006       }
21007       otherArgs[start] = transform(array);
21008       return apply(func, this, otherArgs);
21009     };
21010   }
21011
21012   /**
21013    * Creates a function that returns `value`.
21014    *
21015    * @static
21016    * @memberOf _
21017    * @since 2.4.0
21018    * @category Util
21019    * @param {*} value The value to return from the new function.
21020    * @returns {Function} Returns the new constant function.
21021    * @example
21022    *
21023    * var objects = _.times(2, _.constant({ 'a': 1 }));
21024    *
21025    * console.log(objects);
21026    * // => [{ 'a': 1 }, { 'a': 1 }]
21027    *
21028    * console.log(objects[0] === objects[1]);
21029    * // => true
21030    */
21031   function constant$d(value) {
21032     return function() {
21033       return value;
21034     };
21035   }
21036
21037   /**
21038    * The base implementation of `setToString` without support for hot loop shorting.
21039    *
21040    * @private
21041    * @param {Function} func The function to modify.
21042    * @param {Function} string The `toString` result.
21043    * @returns {Function} Returns `func`.
21044    */
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),
21050       'writable': true
21051     });
21052   };
21053
21054   /** Used to detect hot functions by number of calls within a span of milliseconds. */
21055   var HOT_COUNT = 800,
21056       HOT_SPAN = 16;
21057
21058   /* Built-in method references for those with the same name as other `lodash` methods. */
21059   var nativeNow = Date.now;
21060
21061   /**
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`
21064    * milliseconds.
21065    *
21066    * @private
21067    * @param {Function} func The function to restrict.
21068    * @returns {Function} Returns the new shortable function.
21069    */
21070   function shortOut(func) {
21071     var count = 0,
21072         lastCalled = 0;
21073
21074     return function() {
21075       var stamp = nativeNow(),
21076           remaining = HOT_SPAN - (stamp - lastCalled);
21077
21078       lastCalled = stamp;
21079       if (remaining > 0) {
21080         if (++count >= HOT_COUNT) {
21081           return arguments[0];
21082         }
21083       } else {
21084         count = 0;
21085       }
21086       return func.apply(undefined, arguments);
21087     };
21088   }
21089
21090   /**
21091    * Sets the `toString` method of `func` to return `string`.
21092    *
21093    * @private
21094    * @param {Function} func The function to modify.
21095    * @param {Function} string The `toString` result.
21096    * @returns {Function} Returns `func`.
21097    */
21098   var setToString = shortOut(baseSetToString);
21099
21100   /**
21101    * A specialized version of `baseRest` which flattens the rest array.
21102    *
21103    * @private
21104    * @param {Function} func The function to apply a rest parameter to.
21105    * @returns {Function} Returns the new function.
21106    */
21107   function flatRest(func) {
21108     return setToString(overRest(func, undefined, flatten), func + '');
21109   }
21110
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;
21115
21116   /**
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.
21119    *
21120    * **Note:** This method is considerably slower than `_.pick`.
21121    *
21122    * @static
21123    * @since 0.1.0
21124    * @memberOf _
21125    * @category Object
21126    * @param {Object} object The source object.
21127    * @param {...(string|string[])} [paths] The property paths to omit.
21128    * @returns {Object} Returns the new object.
21129    * @example
21130    *
21131    * var object = { 'a': 1, 'b': '2', 'c': 3 };
21132    *
21133    * _.omit(object, ['a', 'c']);
21134    * // => { 'b': '2' }
21135    */
21136   var omit = flatRest(function(object, paths) {
21137     var result = {};
21138     if (object == null) {
21139       return result;
21140     }
21141     var isDeep = false;
21142     paths = arrayMap(paths, function(path) {
21143       path = castPath(path, object);
21144       isDeep || (isDeep = path.length > 1);
21145       return path;
21146     });
21147     copyObject(object, getAllKeysIn(object), result);
21148     if (isDeep) {
21149       result = baseClone(result, CLONE_DEEP_FLAG$1 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$2, customOmitClone);
21150     }
21151     var length = paths.length;
21152     while (length--) {
21153       baseUnset(result, paths[length]);
21154     }
21155     return result;
21156   });
21157
21158   /**
21159    * Creates an array with all falsey values removed. The values `false`, `null`,
21160    * `0`, `""`, `undefined`, and `NaN` are falsey.
21161    *
21162    * @static
21163    * @memberOf _
21164    * @since 0.1.0
21165    * @category Array
21166    * @param {Array} array The array to compact.
21167    * @returns {Array} Returns the new array of filtered values.
21168    * @example
21169    *
21170    * _.compact([0, 1, false, 2, '', 3]);
21171    * // => [1, 2, 3]
21172    */
21173   function compact(array) {
21174     var index = -1,
21175         length = array == null ? 0 : array.length,
21176         resIndex = 0,
21177         result = [];
21178
21179     while (++index < length) {
21180       var value = array[index];
21181       if (value) {
21182         result[resIndex++] = value;
21183       }
21184     }
21185     return result;
21186   }
21187
21188   /**
21189    * The base implementation of `_.rest` which doesn't validate or coerce arguments.
21190    *
21191    * @private
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.
21195    */
21196   function baseRest(func, start) {
21197     return setToString(overRest(func, start, identity$8), func + '');
21198   }
21199
21200   /**
21201    * Checks if the given arguments are from an iteratee call.
21202    *
21203    * @private
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,
21208    *  else `false`.
21209    */
21210   function isIterateeCall(value, index, object) {
21211     if (!isObject(object)) {
21212       return false;
21213     }
21214     var type = typeof index;
21215     if (type == 'number'
21216           ? (isArrayLike(object) && isIndex(index, object.length))
21217           : (type == 'string' && index in object)
21218         ) {
21219       return eq(object[index], value);
21220     }
21221     return false;
21222   }
21223
21224   /**
21225    * Creates a function like `_.assign`.
21226    *
21227    * @private
21228    * @param {Function} assigner The function to assign values.
21229    * @returns {Function} Returns the new assigner function.
21230    */
21231   function createAssigner(assigner) {
21232     return baseRest(function(object, sources) {
21233       var index = -1,
21234           length = sources.length,
21235           customizer = length > 1 ? sources[length - 1] : undefined,
21236           guard = length > 2 ? sources[2] : undefined;
21237
21238       customizer = (assigner.length > 3 && typeof customizer == 'function')
21239         ? (length--, customizer)
21240         : undefined;
21241
21242       if (guard && isIterateeCall(sources[0], sources[1], guard)) {
21243         customizer = length < 3 ? undefined : customizer;
21244         length = 1;
21245       }
21246       object = Object(object);
21247       while (++index < length) {
21248         var source = sources[index];
21249         if (source) {
21250           assigner(object, source, index, customizer);
21251         }
21252       }
21253       return object;
21254     });
21255   }
21256
21257   /**
21258    * This method is like `_.assign` except that it iterates over own and
21259    * inherited source properties.
21260    *
21261    * **Note:** This method mutates `object`.
21262    *
21263    * @static
21264    * @memberOf _
21265    * @since 4.0.0
21266    * @alias extend
21267    * @category Object
21268    * @param {Object} object The destination object.
21269    * @param {...Object} [sources] The source objects.
21270    * @returns {Object} Returns `object`.
21271    * @see _.assign
21272    * @example
21273    *
21274    * function Foo() {
21275    *   this.a = 1;
21276    * }
21277    *
21278    * function Bar() {
21279    *   this.c = 3;
21280    * }
21281    *
21282    * Foo.prototype.b = 2;
21283    * Bar.prototype.d = 4;
21284    *
21285    * _.assignIn({ 'a': 0 }, new Foo, new Bar);
21286    * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
21287    */
21288   var assignIn = createAssigner(function(object, source) {
21289     copyObject(source, keysIn$1(source), object);
21290   });
21291
21292   /**
21293    * The base implementation of `_.filter` without support for iteratee shorthands.
21294    *
21295    * @private
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.
21299    */
21300   function baseFilter(collection, predicate) {
21301     var result = [];
21302     baseEach(collection, function(value, index, collection) {
21303       if (predicate(value, index, collection)) {
21304         result.push(value);
21305       }
21306     });
21307     return result;
21308   }
21309
21310   /**
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).
21314    *
21315    * **Note:** Unlike `_.remove`, this method returns a new array.
21316    *
21317    * @static
21318    * @memberOf _
21319    * @since 0.1.0
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.
21324    * @see _.reject
21325    * @example
21326    *
21327    * var users = [
21328    *   { 'user': 'barney', 'age': 36, 'active': true },
21329    *   { 'user': 'fred',   'age': 40, 'active': false }
21330    * ];
21331    *
21332    * _.filter(users, function(o) { return !o.active; });
21333    * // => objects for ['fred']
21334    *
21335    * // The `_.matches` iteratee shorthand.
21336    * _.filter(users, { 'age': 36, 'active': true });
21337    * // => objects for ['barney']
21338    *
21339    * // The `_.matchesProperty` iteratee shorthand.
21340    * _.filter(users, ['active', false]);
21341    * // => objects for ['fred']
21342    *
21343    * // The `_.property` iteratee shorthand.
21344    * _.filter(users, 'active');
21345    * // => objects for ['barney']
21346    */
21347   function filter(collection, predicate) {
21348     var func = isArray(collection) ? arrayFilter : baseFilter;
21349     return func(collection, baseIteratee(predicate, 3));
21350   }
21351
21352   /**
21353    * Creates a `_.find` or `_.findLast` function.
21354    *
21355    * @private
21356    * @param {Function} findIndexFunc The function to find the collection index.
21357    * @returns {Function} Returns the new find function.
21358    */
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); };
21366       }
21367       var index = findIndexFunc(collection, predicate, fromIndex);
21368       return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
21369     };
21370   }
21371
21372   /**
21373    * The base implementation of `_.findIndex` and `_.findLastIndex` without
21374    * support for iteratee shorthands.
21375    *
21376    * @private
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`.
21382    */
21383   function baseFindIndex(array, predicate, fromIndex, fromRight) {
21384     var length = array.length,
21385         index = fromIndex + (fromRight ? 1 : -1);
21386
21387     while ((fromRight ? index-- : ++index < length)) {
21388       if (predicate(array[index], index, array)) {
21389         return index;
21390       }
21391     }
21392     return -1;
21393   }
21394
21395   /** Used as references for various `Number` constants. */
21396   var NAN = 0 / 0;
21397
21398   /** Used to match leading and trailing whitespace. */
21399   var reTrim = /^\s+|\s+$/g;
21400
21401   /** Used to detect bad signed hexadecimal string values. */
21402   var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
21403
21404   /** Used to detect binary string values. */
21405   var reIsBinary = /^0b[01]+$/i;
21406
21407   /** Used to detect octal string values. */
21408   var reIsOctal = /^0o[0-7]+$/i;
21409
21410   /** Built-in method references without a dependency on `root`. */
21411   var freeParseInt = parseInt;
21412
21413   /**
21414    * Converts `value` to a number.
21415    *
21416    * @static
21417    * @memberOf _
21418    * @since 4.0.0
21419    * @category Lang
21420    * @param {*} value The value to process.
21421    * @returns {number} Returns the number.
21422    * @example
21423    *
21424    * _.toNumber(3.2);
21425    * // => 3.2
21426    *
21427    * _.toNumber(Number.MIN_VALUE);
21428    * // => 5e-324
21429    *
21430    * _.toNumber(Infinity);
21431    * // => Infinity
21432    *
21433    * _.toNumber('3.2');
21434    * // => 3.2
21435    */
21436   function toNumber(value) {
21437     if (typeof value == 'number') {
21438       return value;
21439     }
21440     if (isSymbol(value)) {
21441       return NAN;
21442     }
21443     if (isObject(value)) {
21444       var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
21445       value = isObject(other) ? (other + '') : other;
21446     }
21447     if (typeof value != 'string') {
21448       return value === 0 ? value : +value;
21449     }
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);
21455   }
21456
21457   /** Used as references for various `Number` constants. */
21458   var INFINITY$2 = 1 / 0,
21459       MAX_INTEGER = 1.7976931348623157e+308;
21460
21461   /**
21462    * Converts `value` to a finite number.
21463    *
21464    * @static
21465    * @memberOf _
21466    * @since 4.12.0
21467    * @category Lang
21468    * @param {*} value The value to convert.
21469    * @returns {number} Returns the converted number.
21470    * @example
21471    *
21472    * _.toFinite(3.2);
21473    * // => 3.2
21474    *
21475    * _.toFinite(Number.MIN_VALUE);
21476    * // => 5e-324
21477    *
21478    * _.toFinite(Infinity);
21479    * // => 1.7976931348623157e+308
21480    *
21481    * _.toFinite('3.2');
21482    * // => 3.2
21483    */
21484   function toFinite(value) {
21485     if (!value) {
21486       return value === 0 ? value : 0;
21487     }
21488     value = toNumber(value);
21489     if (value === INFINITY$2 || value === -INFINITY$2) {
21490       var sign = (value < 0 ? -1 : 1);
21491       return sign * MAX_INTEGER;
21492     }
21493     return value === value ? value : 0;
21494   }
21495
21496   /**
21497    * Converts `value` to an integer.
21498    *
21499    * **Note:** This method is loosely based on
21500    * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
21501    *
21502    * @static
21503    * @memberOf _
21504    * @since 4.0.0
21505    * @category Lang
21506    * @param {*} value The value to convert.
21507    * @returns {number} Returns the converted integer.
21508    * @example
21509    *
21510    * _.toInteger(3.2);
21511    * // => 3
21512    *
21513    * _.toInteger(Number.MIN_VALUE);
21514    * // => 0
21515    *
21516    * _.toInteger(Infinity);
21517    * // => 1.7976931348623157e+308
21518    *
21519    * _.toInteger('3.2');
21520    * // => 3
21521    */
21522   function toInteger(value) {
21523     var result = toFinite(value),
21524         remainder = result % 1;
21525
21526     return result === result ? (remainder ? result - remainder : result) : 0;
21527   }
21528
21529   /* Built-in method references for those with the same name as other `lodash` methods. */
21530   var nativeMax$1 = Math.max;
21531
21532   /**
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.
21535    *
21536    * @static
21537    * @memberOf _
21538    * @since 1.1.0
21539    * @category Array
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`.
21544    * @example
21545    *
21546    * var users = [
21547    *   { 'user': 'barney',  'active': false },
21548    *   { 'user': 'fred',    'active': false },
21549    *   { 'user': 'pebbles', 'active': true }
21550    * ];
21551    *
21552    * _.findIndex(users, function(o) { return o.user == 'barney'; });
21553    * // => 0
21554    *
21555    * // The `_.matches` iteratee shorthand.
21556    * _.findIndex(users, { 'user': 'fred', 'active': false });
21557    * // => 1
21558    *
21559    * // The `_.matchesProperty` iteratee shorthand.
21560    * _.findIndex(users, ['active', false]);
21561    * // => 0
21562    *
21563    * // The `_.property` iteratee shorthand.
21564    * _.findIndex(users, 'active');
21565    * // => 2
21566    */
21567   function findIndex(array, predicate, fromIndex) {
21568     var length = array == null ? 0 : array.length;
21569     if (!length) {
21570       return -1;
21571     }
21572     var index = fromIndex == null ? 0 : toInteger(fromIndex);
21573     if (index < 0) {
21574       index = nativeMax$1(length + index, 0);
21575     }
21576     return baseFindIndex(array, baseIteratee(predicate, 3), index);
21577   }
21578
21579   /**
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).
21583    *
21584    * @static
21585    * @memberOf _
21586    * @since 0.1.0
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`.
21592    * @example
21593    *
21594    * var users = [
21595    *   { 'user': 'barney',  'age': 36, 'active': true },
21596    *   { 'user': 'fred',    'age': 40, 'active': false },
21597    *   { 'user': 'pebbles', 'age': 1,  'active': true }
21598    * ];
21599    *
21600    * _.find(users, function(o) { return o.age < 40; });
21601    * // => object for 'barney'
21602    *
21603    * // The `_.matches` iteratee shorthand.
21604    * _.find(users, { 'age': 1, 'active': true });
21605    * // => object for 'pebbles'
21606    *
21607    * // The `_.matchesProperty` iteratee shorthand.
21608    * _.find(users, ['active', false]);
21609    * // => object for 'fred'
21610    *
21611    * // The `_.property` iteratee shorthand.
21612    * _.find(users, 'active');
21613    * // => object for 'barney'
21614    */
21615   var find$1 = createFind(findIndex);
21616
21617   /**
21618    * The base implementation of `_.map` without support for iteratee shorthands.
21619    *
21620    * @private
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.
21624    */
21625   function baseMap(collection, iteratee) {
21626     var index = -1,
21627         result = isArrayLike(collection) ? Array(collection.length) : [];
21628
21629     baseEach(collection, function(value, key, collection) {
21630       result[++index] = iteratee(value, key, collection);
21631     });
21632     return result;
21633   }
21634
21635   /**
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).
21639    *
21640    * Many lodash methods are guarded to work as iteratees for methods like
21641    * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
21642    *
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`
21648    *
21649    * @static
21650    * @memberOf _
21651    * @since 0.1.0
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.
21656    * @example
21657    *
21658    * function square(n) {
21659    *   return n * n;
21660    * }
21661    *
21662    * _.map([4, 8], square);
21663    * // => [16, 64]
21664    *
21665    * _.map({ 'a': 4, 'b': 8 }, square);
21666    * // => [16, 64] (iteration order is not guaranteed)
21667    *
21668    * var users = [
21669    *   { 'user': 'barney' },
21670    *   { 'user': 'fred' }
21671    * ];
21672    *
21673    * // The `_.property` iteratee shorthand.
21674    * _.map(users, 'user');
21675    * // => ['barney', 'fred']
21676    */
21677   function map$3(collection, iteratee) {
21678     var func = isArray(collection) ? arrayMap : baseMap;
21679     return func(collection, baseIteratee(iteratee, 3));
21680   }
21681
21682   /**
21683    * The base implementation of `_.values` and `_.valuesIn` which creates an
21684    * array of `object` property values corresponding to the property names
21685    * of `props`.
21686    *
21687    * @private
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.
21691    */
21692   function baseValues(object, props) {
21693     return arrayMap(props, function(key) {
21694       return object[key];
21695     });
21696   }
21697
21698   /**
21699    * Creates an array of the own enumerable string keyed property values of `object`.
21700    *
21701    * **Note:** Non-object values are coerced to objects.
21702    *
21703    * @static
21704    * @since 0.1.0
21705    * @memberOf _
21706    * @category Object
21707    * @param {Object} object The object to query.
21708    * @returns {Array} Returns the array of property values.
21709    * @example
21710    *
21711    * function Foo() {
21712    *   this.a = 1;
21713    *   this.b = 2;
21714    * }
21715    *
21716    * Foo.prototype.c = 3;
21717    *
21718    * _.values(new Foo);
21719    * // => [1, 2] (iteration order is not guaranteed)
21720    *
21721    * _.values('hi');
21722    * // => ['h', 'i']
21723    */
21724   function values$1(object) {
21725     return object == null ? [] : baseValues(object, keys$1(object));
21726   }
21727
21728   /**
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`.
21731    *
21732    * @private
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.
21736    */
21737   function baseToPairs(object, props) {
21738     return arrayMap(props, function(key) {
21739       return [key, object[key]];
21740     });
21741   }
21742
21743   /**
21744    * Converts `set` to its value-value pairs.
21745    *
21746    * @private
21747    * @param {Object} set The set to convert.
21748    * @returns {Array} Returns the value-value pairs.
21749    */
21750   function setToPairs(set) {
21751     var index = -1,
21752         result = Array(set.size);
21753
21754     set.forEach(function(value) {
21755       result[++index] = [value, value];
21756     });
21757     return result;
21758   }
21759
21760   /** `Object#toString` result references. */
21761   var mapTag$6 = '[object Map]',
21762       setTag$6 = '[object Set]';
21763
21764   /**
21765    * Creates a `_.toPairs` or `_.toPairsIn` function.
21766    *
21767    * @private
21768    * @param {Function} keysFunc The function to get the keys of a given object.
21769    * @returns {Function} Returns the new pairs function.
21770    */
21771   function createToPairs(keysFunc) {
21772     return function(object) {
21773       var tag = getTag$1(object);
21774       if (tag == mapTag$6) {
21775         return mapToArray(object);
21776       }
21777       if (tag == setTag$6) {
21778         return setToPairs(object);
21779       }
21780       return baseToPairs(object, keysFunc(object));
21781     };
21782   }
21783
21784   /**
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.
21788    *
21789    * @static
21790    * @memberOf _
21791    * @since 4.0.0
21792    * @alias entries
21793    * @category Object
21794    * @param {Object} object The object to query.
21795    * @returns {Array} Returns the key-value pairs.
21796    * @example
21797    *
21798    * function Foo() {
21799    *   this.a = 1;
21800    *   this.b = 2;
21801    * }
21802    *
21803    * Foo.prototype.c = 3;
21804    *
21805    * _.toPairs(new Foo);
21806    * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
21807    */
21808   var toPairs = createToPairs(keys$1);
21809
21810   /**
21811    * The base implementation of `_.isNaN` without support for number objects.
21812    *
21813    * @private
21814    * @param {*} value The value to check.
21815    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
21816    */
21817   function baseIsNaN(value) {
21818     return value !== value;
21819   }
21820
21821   /**
21822    * A specialized version of `_.indexOf` which performs strict equality
21823    * comparisons of values, i.e. `===`.
21824    *
21825    * @private
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`.
21830    */
21831   function strictIndexOf(array, value, fromIndex) {
21832     var index = fromIndex - 1,
21833         length = array.length;
21834
21835     while (++index < length) {
21836       if (array[index] === value) {
21837         return index;
21838       }
21839     }
21840     return -1;
21841   }
21842
21843   /**
21844    * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
21845    *
21846    * @private
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`.
21851    */
21852   function baseIndexOf(array, value, fromIndex) {
21853     return value === value
21854       ? strictIndexOf(array, value, fromIndex)
21855       : baseFindIndex(array, baseIsNaN, fromIndex);
21856   }
21857
21858   /**
21859    * A specialized version of `_.includes` for arrays without support for
21860    * specifying an index to search from.
21861    *
21862    * @private
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`.
21866    */
21867   function arrayIncludes(array, value) {
21868     var length = array == null ? 0 : array.length;
21869     return !!length && baseIndexOf(array, value, 0) > -1;
21870   }
21871
21872   /**
21873    * This function is like `arrayIncludes` except that it accepts a comparator.
21874    *
21875    * @private
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`.
21880    */
21881   function arrayIncludesWith(array, value, comparator) {
21882     var index = -1,
21883         length = array == null ? 0 : array.length;
21884
21885     while (++index < length) {
21886       if (comparator(value, array[index])) {
21887         return true;
21888       }
21889     }
21890     return false;
21891   }
21892
21893   /**
21894    * This method returns `undefined`.
21895    *
21896    * @static
21897    * @memberOf _
21898    * @since 2.3.0
21899    * @category Util
21900    * @example
21901    *
21902    * _.times(2, _.noop);
21903    * // => [undefined, undefined]
21904    */
21905   function noop$3() {
21906     // No operation performed.
21907   }
21908
21909   /** Used as references for various `Number` constants. */
21910   var INFINITY$3 = 1 / 0;
21911
21912   /**
21913    * Creates a set object of `values`.
21914    *
21915    * @private
21916    * @param {Array} values The values to add to the set.
21917    * @returns {Object} Returns the new set.
21918    */
21919   var createSet = !(Set$1 && (1 / setToArray(new Set$1([,-0]))[1]) == INFINITY$3) ? noop$3 : function(values) {
21920     return new Set$1(values);
21921   };
21922
21923   /** Used as the size to enable large array optimizations. */
21924   var LARGE_ARRAY_SIZE$1 = 200;
21925
21926   /**
21927    * The base implementation of `_.uniqBy` without support for iteratee shorthands.
21928    *
21929    * @private
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.
21934    */
21935   function baseUniq(array, iteratee, comparator) {
21936     var index = -1,
21937         includes = arrayIncludes,
21938         length = array.length,
21939         isCommon = true,
21940         result = [],
21941         seen = result;
21942
21943     if (comparator) {
21944       isCommon = false;
21945       includes = arrayIncludesWith;
21946     }
21947     else if (length >= LARGE_ARRAY_SIZE$1) {
21948       var set = iteratee ? null : createSet(array);
21949       if (set) {
21950         return setToArray(set);
21951       }
21952       isCommon = false;
21953       includes = cacheHas;
21954       seen = new SetCache;
21955     }
21956     else {
21957       seen = iteratee ? [] : result;
21958     }
21959     outer:
21960     while (++index < length) {
21961       var value = array[index],
21962           computed = iteratee ? iteratee(value) : value;
21963
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) {
21969             continue outer;
21970           }
21971         }
21972         if (iteratee) {
21973           seen.push(computed);
21974         }
21975         result.push(value);
21976       }
21977       else if (!includes(seen, computed, comparator)) {
21978         if (seen !== result) {
21979           seen.push(computed);
21980         }
21981         result.push(value);
21982       }
21983     }
21984     return result;
21985   }
21986
21987   /**
21988    * This method is like `_.isArrayLike` except that it also checks if `value`
21989    * is an object.
21990    *
21991    * @static
21992    * @memberOf _
21993    * @since 4.0.0
21994    * @category Lang
21995    * @param {*} value The value to check.
21996    * @returns {boolean} Returns `true` if `value` is an array-like object,
21997    *  else `false`.
21998    * @example
21999    *
22000    * _.isArrayLikeObject([1, 2, 3]);
22001    * // => true
22002    *
22003    * _.isArrayLikeObject(document.body.children);
22004    * // => true
22005    *
22006    * _.isArrayLikeObject('abc');
22007    * // => false
22008    *
22009    * _.isArrayLikeObject(_.noop);
22010    * // => false
22011    */
22012   function isArrayLikeObject(value) {
22013     return isObjectLike(value) && isArrayLike(value);
22014   }
22015
22016   /**
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.
22020    *
22021    * @static
22022    * @memberOf _
22023    * @since 0.1.0
22024    * @category Array
22025    * @param {...Array} [arrays] The arrays to inspect.
22026    * @returns {Array} Returns the new array of combined values.
22027    * @example
22028    *
22029    * _.union([2], [1, 2]);
22030    * // => [2, 1]
22031    */
22032   var union = baseRest(function(arrays) {
22033     return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
22034   });
22035
22036   /** Used as the size to enable large array optimizations. */
22037   var LARGE_ARRAY_SIZE$2 = 200;
22038
22039   /**
22040    * The base implementation of methods like `_.difference` without support
22041    * for excluding multiple arrays or iteratee shorthands.
22042    *
22043    * @private
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.
22049    */
22050   function baseDifference(array, values, iteratee, comparator) {
22051     var index = -1,
22052         includes = arrayIncludes,
22053         isCommon = true,
22054         length = array.length,
22055         result = [],
22056         valuesLength = values.length;
22057
22058     if (!length) {
22059       return result;
22060     }
22061     if (iteratee) {
22062       values = arrayMap(values, baseUnary(iteratee));
22063     }
22064     if (comparator) {
22065       includes = arrayIncludesWith;
22066       isCommon = false;
22067     }
22068     else if (values.length >= LARGE_ARRAY_SIZE$2) {
22069       includes = cacheHas;
22070       isCommon = false;
22071       values = new SetCache(values);
22072     }
22073     outer:
22074     while (++index < length) {
22075       var value = array[index],
22076           computed = iteratee == null ? value : iteratee(value);
22077
22078       value = (comparator || value !== 0) ? value : 0;
22079       if (isCommon && computed === computed) {
22080         var valuesIndex = valuesLength;
22081         while (valuesIndex--) {
22082           if (values[valuesIndex] === computed) {
22083             continue outer;
22084           }
22085         }
22086         result.push(value);
22087       }
22088       else if (!includes(values, computed, comparator)) {
22089         result.push(value);
22090       }
22091     }
22092     return result;
22093   }
22094
22095   /**
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.
22099    *
22100    * **Note:** Unlike `_.pull`, this method returns a new array.
22101    *
22102    * @static
22103    * @memberOf _
22104    * @since 0.1.0
22105    * @category 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
22110    * @example
22111    *
22112    * _.without([2, 1, 2, 3], 1, 2);
22113    * // => [3]
22114    */
22115   var without = baseRest(function(array, values) {
22116     return isArrayLikeObject(array)
22117       ? baseDifference(array, values)
22118       : [];
22119   });
22120
22121   function osmIsInterestingTag(key) {
22122       return key !== 'attribution' &&
22123           key !== 'created_by' &&
22124           key !== 'source' &&
22125           key !== 'odbl' &&
22126           key.indexOf('tiger:') !== 0;
22127
22128   }
22129
22130
22131   var osmOneWayTags = {
22132       'aerialway': {
22133           'chair_lift': true,
22134           'mixed_lift': true,
22135           't-bar': true,
22136           'j-bar': true,
22137           'platter': true,
22138           'rope_tow': true,
22139           'magic_carpet': true,
22140           'yes': true
22141       },
22142       'highway': {
22143           'motorway': true
22144       },
22145       'junction': {
22146           'circular': true,
22147           'roundabout': true
22148       },
22149       'man_made': {
22150           'piste:halfpipe': true
22151       },
22152       'piste:type': {
22153           'downhill': true,
22154           'sled': true,
22155           'yes': true
22156       },
22157       'waterway': {
22158           'canal': true,
22159           'ditch': true,
22160           'drain': true,
22161           'river': true,
22162           'stream': true
22163       }
22164   };
22165
22166
22167   var osmPavedTags = {
22168       'surface': {
22169           'paved': true,
22170           'asphalt': true,
22171           'concrete': true,
22172           'concrete:lanes': true,
22173           'concrete:plates': true
22174       },
22175       'tracktype': {
22176           'grade1': true
22177       }
22178   };
22179
22180   var wikipedia = [
22181       [
22182           "Abkhazian",
22183           "Аҧсшәа",
22184           "ab"
22185       ],
22186       [
22187           "Achinese",
22188           "Acèh",
22189           "ace"
22190       ],
22191       [
22192           "Adyghe",
22193           "адыгабзэ",
22194           "ady"
22195       ],
22196       [
22197           "Afrikaans",
22198           "Afrikaans",
22199           "af"
22200       ],
22201       [
22202           "Akan",
22203           "Akan",
22204           "ak"
22205       ],
22206       [
22207           "Alemannisch",
22208           "Alemannisch",
22209           "als"
22210       ],
22211       [
22212           "Amharic",
22213           "አማርኛ",
22214           "am"
22215       ],
22216       [
22217           "Aragonese",
22218           "aragonés",
22219           "an"
22220       ],
22221       [
22222           "Old English",
22223           "Ænglisc",
22224           "ang"
22225       ],
22226       [
22227           "Arabic",
22228           "العربية",
22229           "ar"
22230       ],
22231       [
22232           "Aramaic",
22233           "ܐܪܡܝܐ",
22234           "arc"
22235       ],
22236       [
22237           "Egyptian Arabic",
22238           "مصرى",
22239           "arz"
22240       ],
22241       [
22242           "Assamese",
22243           "অসমীয়া",
22244           "as"
22245       ],
22246       [
22247           "Asturian",
22248           "asturianu",
22249           "ast"
22250       ],
22251       [
22252           "Avaric",
22253           "авар",
22254           "av"
22255       ],
22256       [
22257           "Aymara",
22258           "Aymar aru",
22259           "ay"
22260       ],
22261       [
22262           "Azerbaijani",
22263           "azərbaycanca",
22264           "az"
22265       ],
22266       [
22267           "تۆرکجه",
22268           "تۆرکجه",
22269           "azb"
22270       ],
22271       [
22272           "Bashkir",
22273           "башҡортса",
22274           "ba"
22275       ],
22276       [
22277           "Bavarian",
22278           "Boarisch",
22279           "bar"
22280       ],
22281       [
22282           "Samogitian",
22283           "žemaitėška",
22284           "bat-smg"
22285       ],
22286       [
22287           "Bikol Central",
22288           "Bikol Central",
22289           "bcl"
22290       ],
22291       [
22292           "Belarusian",
22293           "беларуская",
22294           "be"
22295       ],
22296       [
22297           "беларуская (тарашкевіца)‎",
22298           "беларуская (тарашкевіца)‎",
22299           "be-x-old"
22300       ],
22301       [
22302           "Bulgarian",
22303           "български",
22304           "bg"
22305       ],
22306       [
22307           "भोजपुरी",
22308           "भोजपुरी",
22309           "bh"
22310       ],
22311       [
22312           "Bislama",
22313           "Bislama",
22314           "bi"
22315       ],
22316       [
22317           "Banjar",
22318           "Bahasa Banjar",
22319           "bjn"
22320       ],
22321       [
22322           "Bambara",
22323           "bamanankan",
22324           "bm"
22325       ],
22326       [
22327           "Bangla",
22328           "বাংলা",
22329           "bn"
22330       ],
22331       [
22332           "Tibetan",
22333           "བོད་ཡིག",
22334           "bo"
22335       ],
22336       [
22337           "Bishnupriya",
22338           "বিষ্ণুপ্রিয়া মণিপুরী",
22339           "bpy"
22340       ],
22341       [
22342           "Breton",
22343           "brezhoneg",
22344           "br"
22345       ],
22346       [
22347           "Bosnian",
22348           "bosanski",
22349           "bs"
22350       ],
22351       [
22352           "Buginese",
22353           "ᨅᨔ ᨕᨘᨁᨗ",
22354           "bug"
22355       ],
22356       [
22357           "буряад",
22358           "буряад",
22359           "bxr"
22360       ],
22361       [
22362           "Catalan",
22363           "català",
22364           "ca"
22365       ],
22366       [
22367           "Chavacano de Zamboanga",
22368           "Chavacano de Zamboanga",
22369           "cbk-zam"
22370       ],
22371       [
22372           "Min Dong Chinese",
22373           "Mìng-dĕ̤ng-ngṳ̄",
22374           "cdo"
22375       ],
22376       [
22377           "Chechen",
22378           "нохчийн",
22379           "ce"
22380       ],
22381       [
22382           "Cebuano",
22383           "Cebuano",
22384           "ceb"
22385       ],
22386       [
22387           "Chamorro",
22388           "Chamoru",
22389           "ch"
22390       ],
22391       [
22392           "Cherokee",
22393           "ᏣᎳᎩ",
22394           "chr"
22395       ],
22396       [
22397           "Cheyenne",
22398           "Tsetsêhestâhese",
22399           "chy"
22400       ],
22401       [
22402           "Central Kurdish",
22403           "کوردیی ناوەندی",
22404           "ckb"
22405       ],
22406       [
22407           "Corsican",
22408           "corsu",
22409           "co"
22410       ],
22411       [
22412           "Cree",
22413           "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
22414           "cr"
22415       ],
22416       [
22417           "Crimean Turkish",
22418           "qırımtatarca",
22419           "crh"
22420       ],
22421       [
22422           "Czech",
22423           "čeština",
22424           "cs"
22425       ],
22426       [
22427           "Kashubian",
22428           "kaszëbsczi",
22429           "csb"
22430       ],
22431       [
22432           "Church Slavic",
22433           "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
22434           "cu"
22435       ],
22436       [
22437           "Chuvash",
22438           "Чӑвашла",
22439           "cv"
22440       ],
22441       [
22442           "Welsh",
22443           "Cymraeg",
22444           "cy"
22445       ],
22446       [
22447           "Danish",
22448           "dansk",
22449           "da"
22450       ],
22451       [
22452           "German",
22453           "Deutsch",
22454           "de"
22455       ],
22456       [
22457           "Zazaki",
22458           "Zazaki",
22459           "diq"
22460       ],
22461       [
22462           "Lower Sorbian",
22463           "dolnoserbski",
22464           "dsb"
22465       ],
22466       [
22467           "Divehi",
22468           "ދިވެހިބަސް",
22469           "dv"
22470       ],
22471       [
22472           "Dzongkha",
22473           "ཇོང་ཁ",
22474           "dz"
22475       ],
22476       [
22477           "Ewe",
22478           "eʋegbe",
22479           "ee"
22480       ],
22481       [
22482           "Greek",
22483           "Ελληνικά",
22484           "el"
22485       ],
22486       [
22487           "Emiliano-Romagnolo",
22488           "emiliàn e rumagnòl",
22489           "eml"
22490       ],
22491       [
22492           "English",
22493           "English",
22494           "en"
22495       ],
22496       [
22497           "Esperanto",
22498           "Esperanto",
22499           "eo"
22500       ],
22501       [
22502           "Spanish",
22503           "español",
22504           "es"
22505       ],
22506       [
22507           "Estonian",
22508           "eesti",
22509           "et"
22510       ],
22511       [
22512           "Basque",
22513           "euskara",
22514           "eu"
22515       ],
22516       [
22517           "Extremaduran",
22518           "estremeñu",
22519           "ext"
22520       ],
22521       [
22522           "Persian",
22523           "فارسی",
22524           "fa"
22525       ],
22526       [
22527           "Fulah",
22528           "Fulfulde",
22529           "ff"
22530       ],
22531       [
22532           "Finnish",
22533           "suomi",
22534           "fi"
22535       ],
22536       [
22537           "Võro",
22538           "Võro",
22539           "fiu-vro"
22540       ],
22541       [
22542           "Fijian",
22543           "Na Vosa Vakaviti",
22544           "fj"
22545       ],
22546       [
22547           "Faroese",
22548           "føroyskt",
22549           "fo"
22550       ],
22551       [
22552           "French",
22553           "français",
22554           "fr"
22555       ],
22556       [
22557           "Arpitan",
22558           "arpetan",
22559           "frp"
22560       ],
22561       [
22562           "Northern Frisian",
22563           "Nordfriisk",
22564           "frr"
22565       ],
22566       [
22567           "Friulian",
22568           "furlan",
22569           "fur"
22570       ],
22571       [
22572           "Western Frisian",
22573           "Frysk",
22574           "fy"
22575       ],
22576       [
22577           "Irish",
22578           "Gaeilge",
22579           "ga"
22580       ],
22581       [
22582           "Gagauz",
22583           "Gagauz",
22584           "gag"
22585       ],
22586       [
22587           "Gan Chinese",
22588           "贛語",
22589           "gan"
22590       ],
22591       [
22592           "Scottish Gaelic",
22593           "Gàidhlig",
22594           "gd"
22595       ],
22596       [
22597           "Galician",
22598           "galego",
22599           "gl"
22600       ],
22601       [
22602           "Gilaki",
22603           "گیلکی",
22604           "glk"
22605       ],
22606       [
22607           "Guarani",
22608           "Avañe'ẽ",
22609           "gn"
22610       ],
22611       [
22612           "Goan Konkani",
22613           "गोंयची कोंकणी / Gõychi Konknni",
22614           "gom"
22615       ],
22616       [
22617           "Gothic",
22618           "𐌲𐌿𐍄𐌹𐍃𐌺",
22619           "got"
22620       ],
22621       [
22622           "Gujarati",
22623           "ગુજરાતી",
22624           "gu"
22625       ],
22626       [
22627           "Manx",
22628           "Gaelg",
22629           "gv"
22630       ],
22631       [
22632           "Hausa",
22633           "Hausa",
22634           "ha"
22635       ],
22636       [
22637           "Hakka Chinese",
22638           "客家語/Hak-kâ-ngî",
22639           "hak"
22640       ],
22641       [
22642           "Hawaiian",
22643           "Hawaiʻi",
22644           "haw"
22645       ],
22646       [
22647           "Hebrew",
22648           "עברית",
22649           "he"
22650       ],
22651       [
22652           "Hindi",
22653           "हिन्दी",
22654           "hi"
22655       ],
22656       [
22657           "Fiji Hindi",
22658           "Fiji Hindi",
22659           "hif"
22660       ],
22661       [
22662           "Croatian",
22663           "hrvatski",
22664           "hr"
22665       ],
22666       [
22667           "Upper Sorbian",
22668           "hornjoserbsce",
22669           "hsb"
22670       ],
22671       [
22672           "Haitian Creole",
22673           "Kreyòl ayisyen",
22674           "ht"
22675       ],
22676       [
22677           "Hungarian",
22678           "magyar",
22679           "hu"
22680       ],
22681       [
22682           "Armenian",
22683           "Հայերեն",
22684           "hy"
22685       ],
22686       [
22687           "Interlingua",
22688           "interlingua",
22689           "ia"
22690       ],
22691       [
22692           "Indonesian",
22693           "Bahasa Indonesia",
22694           "id"
22695       ],
22696       [
22697           "Interlingue",
22698           "Interlingue",
22699           "ie"
22700       ],
22701       [
22702           "Igbo",
22703           "Igbo",
22704           "ig"
22705       ],
22706       [
22707           "Inupiaq",
22708           "Iñupiak",
22709           "ik"
22710       ],
22711       [
22712           "Iloko",
22713           "Ilokano",
22714           "ilo"
22715       ],
22716       [
22717           "Ido",
22718           "Ido",
22719           "io"
22720       ],
22721       [
22722           "Icelandic",
22723           "íslenska",
22724           "is"
22725       ],
22726       [
22727           "Italian",
22728           "italiano",
22729           "it"
22730       ],
22731       [
22732           "Inuktitut",
22733           "ᐃᓄᒃᑎᑐᑦ/inuktitut",
22734           "iu"
22735       ],
22736       [
22737           "Japanese",
22738           "日本語",
22739           "ja"
22740       ],
22741       [
22742           "Jamaican Creole English",
22743           "Patois",
22744           "jam"
22745       ],
22746       [
22747           "Lojban",
22748           "la .lojban.",
22749           "jbo"
22750       ],
22751       [
22752           "Javanese",
22753           "Basa Jawa",
22754           "jv"
22755       ],
22756       [
22757           "Georgian",
22758           "ქართული",
22759           "ka"
22760       ],
22761       [
22762           "Kara-Kalpak",
22763           "Qaraqalpaqsha",
22764           "kaa"
22765       ],
22766       [
22767           "Kabyle",
22768           "Taqbaylit",
22769           "kab"
22770       ],
22771       [
22772           "Kabardian",
22773           "Адыгэбзэ",
22774           "kbd"
22775       ],
22776       [
22777           "Kongo",
22778           "Kongo",
22779           "kg"
22780       ],
22781       [
22782           "Kikuyu",
22783           "Gĩkũyũ",
22784           "ki"
22785       ],
22786       [
22787           "Kazakh",
22788           "қазақша",
22789           "kk"
22790       ],
22791       [
22792           "Kalaallisut",
22793           "kalaallisut",
22794           "kl"
22795       ],
22796       [
22797           "Khmer",
22798           "ភាសាខ្មែរ",
22799           "km"
22800       ],
22801       [
22802           "Kannada",
22803           "ಕನ್ನಡ",
22804           "kn"
22805       ],
22806       [
22807           "Korean",
22808           "한국어",
22809           "ko"
22810       ],
22811       [
22812           "Komi-Permyak",
22813           "Перем Коми",
22814           "koi"
22815       ],
22816       [
22817           "Karachay-Balkar",
22818           "къарачай-малкъар",
22819           "krc"
22820       ],
22821       [
22822           "Kashmiri",
22823           "कॉशुर / کٲشُر",
22824           "ks"
22825       ],
22826       [
22827           "Colognian",
22828           "Ripoarisch",
22829           "ksh"
22830       ],
22831       [
22832           "Kurdish",
22833           "Kurdî",
22834           "ku"
22835       ],
22836       [
22837           "Komi",
22838           "коми",
22839           "kv"
22840       ],
22841       [
22842           "Cornish",
22843           "kernowek",
22844           "kw"
22845       ],
22846       [
22847           "Kyrgyz",
22848           "Кыргызча",
22849           "ky"
22850       ],
22851       [
22852           "Latin",
22853           "Latina",
22854           "la"
22855       ],
22856       [
22857           "Ladino",
22858           "Ladino",
22859           "lad"
22860       ],
22861       [
22862           "Luxembourgish",
22863           "Lëtzebuergesch",
22864           "lb"
22865       ],
22866       [
22867           "лакку",
22868           "лакку",
22869           "lbe"
22870       ],
22871       [
22872           "Lezghian",
22873           "лезги",
22874           "lez"
22875       ],
22876       [
22877           "Ganda",
22878           "Luganda",
22879           "lg"
22880       ],
22881       [
22882           "Limburgish",
22883           "Limburgs",
22884           "li"
22885       ],
22886       [
22887           "Ligurian",
22888           "Ligure",
22889           "lij"
22890       ],
22891       [
22892           "Lombard",
22893           "lumbaart",
22894           "lmo"
22895       ],
22896       [
22897           "Lingala",
22898           "lingála",
22899           "ln"
22900       ],
22901       [
22902           "Lao",
22903           "ລາວ",
22904           "lo"
22905       ],
22906       [
22907           "Northern Luri",
22908           "لۊری شومالی",
22909           "lrc"
22910       ],
22911       [
22912           "Lithuanian",
22913           "lietuvių",
22914           "lt"
22915       ],
22916       [
22917           "Latgalian",
22918           "latgaļu",
22919           "ltg"
22920       ],
22921       [
22922           "Latvian",
22923           "latviešu",
22924           "lv"
22925       ],
22926       [
22927           "Maithili",
22928           "मैथिली",
22929           "mai"
22930       ],
22931       [
22932           "Basa Banyumasan",
22933           "Basa Banyumasan",
22934           "map-bms"
22935       ],
22936       [
22937           "Moksha",
22938           "мокшень",
22939           "mdf"
22940       ],
22941       [
22942           "Malagasy",
22943           "Malagasy",
22944           "mg"
22945       ],
22946       [
22947           "Eastern Mari",
22948           "олык марий",
22949           "mhr"
22950       ],
22951       [
22952           "Maori",
22953           "Māori",
22954           "mi"
22955       ],
22956       [
22957           "Minangkabau",
22958           "Baso Minangkabau",
22959           "min"
22960       ],
22961       [
22962           "Macedonian",
22963           "македонски",
22964           "mk"
22965       ],
22966       [
22967           "Malayalam",
22968           "മലയാളം",
22969           "ml"
22970       ],
22971       [
22972           "Mongolian",
22973           "монгол",
22974           "mn"
22975       ],
22976       [
22977           "Marathi",
22978           "मराठी",
22979           "mr"
22980       ],
22981       [
22982           "Western Mari",
22983           "кырык мары",
22984           "mrj"
22985       ],
22986       [
22987           "Malay",
22988           "Bahasa Melayu",
22989           "ms"
22990       ],
22991       [
22992           "Maltese",
22993           "Malti",
22994           "mt"
22995       ],
22996       [
22997           "Mirandese",
22998           "Mirandés",
22999           "mwl"
23000       ],
23001       [
23002           "Burmese",
23003           "မြန်မာဘာသာ",
23004           "my"
23005       ],
23006       [
23007           "Erzya",
23008           "эрзянь",
23009           "myv"
23010       ],
23011       [
23012           "Mazanderani",
23013           "مازِرونی",
23014           "mzn"
23015       ],
23016       [
23017           "Nauru",
23018           "Dorerin Naoero",
23019           "na"
23020       ],
23021       [
23022           "Nāhuatl",
23023           "Nāhuatl",
23024           "nah"
23025       ],
23026       [
23027           "Neapolitan",
23028           "Napulitano",
23029           "nap"
23030       ],
23031       [
23032           "Low German",
23033           "Plattdüütsch",
23034           "nds"
23035       ],
23036       [
23037           "Low Saxon",
23038           "Nedersaksies",
23039           "nds-nl"
23040       ],
23041       [
23042           "Nepali",
23043           "नेपाली",
23044           "ne"
23045       ],
23046       [
23047           "Newari",
23048           "नेपाल भाषा",
23049           "new"
23050       ],
23051       [
23052           "Dutch",
23053           "Nederlands",
23054           "nl"
23055       ],
23056       [
23057           "Norwegian Nynorsk",
23058           "norsk nynorsk",
23059           "nn"
23060       ],
23061       [
23062           "Norwegian",
23063           "norsk bokmål",
23064           "no"
23065       ],
23066       [
23067           "Novial",
23068           "Novial",
23069           "nov"
23070       ],
23071       [
23072           "Nouormand",
23073           "Nouormand",
23074           "nrm"
23075       ],
23076       [
23077           "Northern Sotho",
23078           "Sesotho sa Leboa",
23079           "nso"
23080       ],
23081       [
23082           "Navajo",
23083           "Diné bizaad",
23084           "nv"
23085       ],
23086       [
23087           "Nyanja",
23088           "Chi-Chewa",
23089           "ny"
23090       ],
23091       [
23092           "Occitan",
23093           "occitan",
23094           "oc"
23095       ],
23096       [
23097           "Livvi-Karelian",
23098           "Livvinkarjala",
23099           "olo"
23100       ],
23101       [
23102           "Oromo",
23103           "Oromoo",
23104           "om"
23105       ],
23106       [
23107           "Odia",
23108           "ଓଡ଼ିଆ",
23109           "or"
23110       ],
23111       [
23112           "Ossetic",
23113           "Ирон",
23114           "os"
23115       ],
23116       [
23117           "Punjabi",
23118           "ਪੰਜਾਬੀ",
23119           "pa"
23120       ],
23121       [
23122           "Pangasinan",
23123           "Pangasinan",
23124           "pag"
23125       ],
23126       [
23127           "Pampanga",
23128           "Kapampangan",
23129           "pam"
23130       ],
23131       [
23132           "Papiamento",
23133           "Papiamentu",
23134           "pap"
23135       ],
23136       [
23137           "Picard",
23138           "Picard",
23139           "pcd"
23140       ],
23141       [
23142           "Pennsylvania German",
23143           "Deitsch",
23144           "pdc"
23145       ],
23146       [
23147           "Palatine German",
23148           "Pälzisch",
23149           "pfl"
23150       ],
23151       [
23152           "Pali",
23153           "पालि",
23154           "pi"
23155       ],
23156       [
23157           "Norfuk / Pitkern",
23158           "Norfuk / Pitkern",
23159           "pih"
23160       ],
23161       [
23162           "Polish",
23163           "polski",
23164           "pl"
23165       ],
23166       [
23167           "Piedmontese",
23168           "Piemontèis",
23169           "pms"
23170       ],
23171       [
23172           "Western Punjabi",
23173           "پنجابی",
23174           "pnb"
23175       ],
23176       [
23177           "Pontic",
23178           "Ποντιακά",
23179           "pnt"
23180       ],
23181       [
23182           "Pashto",
23183           "پښتو",
23184           "ps"
23185       ],
23186       [
23187           "Portuguese",
23188           "português",
23189           "pt"
23190       ],
23191       [
23192           "Quechua",
23193           "Runa Simi",
23194           "qu"
23195       ],
23196       [
23197           "Romansh",
23198           "rumantsch",
23199           "rm"
23200       ],
23201       [
23202           "Romani",
23203           "Romani",
23204           "rmy"
23205       ],
23206       [
23207           "Rundi",
23208           "Kirundi",
23209           "rn"
23210       ],
23211       [
23212           "Romanian",
23213           "română",
23214           "ro"
23215       ],
23216       [
23217           "Aromanian",
23218           "armãneashti",
23219           "roa-rup"
23220       ],
23221       [
23222           "tarandíne",
23223           "tarandíne",
23224           "roa-tara"
23225       ],
23226       [
23227           "Russian",
23228           "русский",
23229           "ru"
23230       ],
23231       [
23232           "Rusyn",
23233           "русиньскый",
23234           "rue"
23235       ],
23236       [
23237           "Kinyarwanda",
23238           "Kinyarwanda",
23239           "rw"
23240       ],
23241       [
23242           "Sanskrit",
23243           "संस्कृतम्",
23244           "sa"
23245       ],
23246       [
23247           "Sakha",
23248           "саха тыла",
23249           "sah"
23250       ],
23251       [
23252           "Sardinian",
23253           "sardu",
23254           "sc"
23255       ],
23256       [
23257           "Sicilian",
23258           "sicilianu",
23259           "scn"
23260       ],
23261       [
23262           "Scots",
23263           "Scots",
23264           "sco"
23265       ],
23266       [
23267           "Sindhi",
23268           "سنڌي",
23269           "sd"
23270       ],
23271       [
23272           "Northern Sami",
23273           "sámegiella",
23274           "se"
23275       ],
23276       [
23277           "Sango",
23278           "Sängö",
23279           "sg"
23280       ],
23281       [
23282           "Serbo-Croatian",
23283           "srpskohrvatski / српскохрватски",
23284           "sh"
23285       ],
23286       [
23287           "Sinhala",
23288           "සිංහල",
23289           "si"
23290       ],
23291       [
23292           "Simple English",
23293           "Simple English",
23294           "simple"
23295       ],
23296       [
23297           "Slovak",
23298           "slovenčina",
23299           "sk"
23300       ],
23301       [
23302           "Slovenian",
23303           "slovenščina",
23304           "sl"
23305       ],
23306       [
23307           "Samoan",
23308           "Gagana Samoa",
23309           "sm"
23310       ],
23311       [
23312           "Shona",
23313           "chiShona",
23314           "sn"
23315       ],
23316       [
23317           "Somali",
23318           "Soomaaliga",
23319           "so"
23320       ],
23321       [
23322           "Albanian",
23323           "shqip",
23324           "sq"
23325       ],
23326       [
23327           "Serbian",
23328           "српски / srpski",
23329           "sr"
23330       ],
23331       [
23332           "Sranan Tongo",
23333           "Sranantongo",
23334           "srn"
23335       ],
23336       [
23337           "Swati",
23338           "SiSwati",
23339           "ss"
23340       ],
23341       [
23342           "Southern Sotho",
23343           "Sesotho",
23344           "st"
23345       ],
23346       [
23347           "Saterland Frisian",
23348           "Seeltersk",
23349           "stq"
23350       ],
23351       [
23352           "Sundanese",
23353           "Basa Sunda",
23354           "su"
23355       ],
23356       [
23357           "Swedish",
23358           "svenska",
23359           "sv"
23360       ],
23361       [
23362           "Swahili",
23363           "Kiswahili",
23364           "sw"
23365       ],
23366       [
23367           "Silesian",
23368           "ślůnski",
23369           "szl"
23370       ],
23371       [
23372           "Tamil",
23373           "தமிழ்",
23374           "ta"
23375       ],
23376       [
23377           "Tulu",
23378           "ತುಳು",
23379           "tcy"
23380       ],
23381       [
23382           "Telugu",
23383           "తెలుగు",
23384           "te"
23385       ],
23386       [
23387           "Tetum",
23388           "tetun",
23389           "tet"
23390       ],
23391       [
23392           "Tajik",
23393           "тоҷикӣ",
23394           "tg"
23395       ],
23396       [
23397           "Thai",
23398           "ไทย",
23399           "th"
23400       ],
23401       [
23402           "Tigrinya",
23403           "ትግርኛ",
23404           "ti"
23405       ],
23406       [
23407           "Turkmen",
23408           "Türkmençe",
23409           "tk"
23410       ],
23411       [
23412           "Tagalog",
23413           "Tagalog",
23414           "tl"
23415       ],
23416       [
23417           "Tswana",
23418           "Setswana",
23419           "tn"
23420       ],
23421       [
23422           "Tongan",
23423           "lea faka-Tonga",
23424           "to"
23425       ],
23426       [
23427           "Tok Pisin",
23428           "Tok Pisin",
23429           "tpi"
23430       ],
23431       [
23432           "Turkish",
23433           "Türkçe",
23434           "tr"
23435       ],
23436       [
23437           "Tsonga",
23438           "Xitsonga",
23439           "ts"
23440       ],
23441       [
23442           "Tatar",
23443           "татарча/tatarça",
23444           "tt"
23445       ],
23446       [
23447           "Tumbuka",
23448           "chiTumbuka",
23449           "tum"
23450       ],
23451       [
23452           "Twi",
23453           "Twi",
23454           "tw"
23455       ],
23456       [
23457           "Tahitian",
23458           "reo tahiti",
23459           "ty"
23460       ],
23461       [
23462           "Tuvinian",
23463           "тыва дыл",
23464           "tyv"
23465       ],
23466       [
23467           "Udmurt",
23468           "удмурт",
23469           "udm"
23470       ],
23471       [
23472           "Uyghur",
23473           "ئۇيغۇرچە / Uyghurche",
23474           "ug"
23475       ],
23476       [
23477           "Ukrainian",
23478           "українська",
23479           "uk"
23480       ],
23481       [
23482           "Urdu",
23483           "اردو",
23484           "ur"
23485       ],
23486       [
23487           "Uzbek",
23488           "oʻzbekcha/ўзбекча",
23489           "uz"
23490       ],
23491       [
23492           "Venda",
23493           "Tshivenda",
23494           "ve"
23495       ],
23496       [
23497           "Venetian",
23498           "vèneto",
23499           "vec"
23500       ],
23501       [
23502           "Veps",
23503           "vepsän kel’",
23504           "vep"
23505       ],
23506       [
23507           "Vietnamese",
23508           "Tiếng Việt",
23509           "vi"
23510       ],
23511       [
23512           "West Flemish",
23513           "West-Vlams",
23514           "vls"
23515       ],
23516       [
23517           "Volapük",
23518           "Volapük",
23519           "vo"
23520       ],
23521       [
23522           "Walloon",
23523           "walon",
23524           "wa"
23525       ],
23526       [
23527           "Waray",
23528           "Winaray",
23529           "war"
23530       ],
23531       [
23532           "Wolof",
23533           "Wolof",
23534           "wo"
23535       ],
23536       [
23537           "Wu Chinese",
23538           "吴语",
23539           "wuu"
23540       ],
23541       [
23542           "Kalmyk",
23543           "хальмг",
23544           "xal"
23545       ],
23546       [
23547           "Xhosa",
23548           "isiXhosa",
23549           "xh"
23550       ],
23551       [
23552           "Mingrelian",
23553           "მარგალური",
23554           "xmf"
23555       ],
23556       [
23557           "Yiddish",
23558           "ייִדיש",
23559           "yi"
23560       ],
23561       [
23562           "Yoruba",
23563           "Yorùbá",
23564           "yo"
23565       ],
23566       [
23567           "Zhuang",
23568           "Vahcuengh",
23569           "za"
23570       ],
23571       [
23572           "Zeelandic",
23573           "Zeêuws",
23574           "zea"
23575       ],
23576       [
23577           "Chinese",
23578           "中文",
23579           "zh"
23580       ],
23581       [
23582           "Classical Chinese",
23583           "文言",
23584           "zh-classical"
23585       ],
23586       [
23587           "Chinese (Min Nan)",
23588           "Bân-lâm-gú",
23589           "zh-min-nan"
23590       ],
23591       [
23592           "Cantonese",
23593           "粵語",
23594           "zh-yue"
23595       ],
23596       [
23597           "Zulu",
23598           "isiZulu",
23599           "zu"
23600       ]
23601   ];
23602
23603   var wikipedia$1 = /*#__PURE__*/Object.freeze({
23604     default: wikipedia
23605   });
23606
23607   var require$$6 = ( wikipedia$1 && wikipedia ) || wikipedia$1;
23608
23609   var wikipedia$2 = require$$6;
23610
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 = {
23617   amenity: amenity,
23618   leisure: leisure,
23619   man_made: man_made,
23620   shop: shop,
23621   tourism: tourism
23622   };
23623
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"]]}];
23625
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"}}];
23627
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};
23629
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}};
23631
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"};
23633
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"}]}]}];
23635
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 = {
23639   type: type$2,
23640   features: features
23641   };
23642
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 = {
23646   type: type$3,
23647   features: features$1
23648   };
23649
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"}}}}};
23651
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]]]}}};
23653
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/"}]}};
23655
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;'>&larr;</span> <span style='color: #96f;'>&darr;</span> <span style='color: #6e0;'>&uarr;</span> <span style='color: #f63;'>&rarr;</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"}];
23657
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}};
23659
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"]};
23661
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"]}};
23663
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"}}}};
23665
23666   var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
23667
23668   function createCommonjsModule(fn, module) {
23669         return module = { exports: {} }, fn(module, module.exports), module.exports;
23670   }
23671
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);
23678   }
23679
23680   function quickselectStep(arr, k, left, right, compare) {
23681
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);
23692           }
23693
23694           var t = arr[k];
23695           var i = left;
23696           var j = right;
23697
23698           swap(arr, left, k);
23699           if (compare(arr[right], t) > 0) swap(arr, left, right);
23700
23701           while (i < j) {
23702               swap(arr, i, j);
23703               i++;
23704               j--;
23705               while (compare(arr[i], t) < 0) i++;
23706               while (compare(arr[j], t) > 0) j--;
23707           }
23708
23709           if (compare(arr[left], t) === 0) swap(arr, left, j);
23710           else {
23711               j++;
23712               swap(arr, j, right);
23713           }
23714
23715           if (j <= k) left = j + 1;
23716           if (k <= j) right = j - 1;
23717       }
23718   }
23719
23720   function swap(arr, i, j) {
23721       var tmp = arr[i];
23722       arr[i] = arr[j];
23723       arr[j] = tmp;
23724   }
23725
23726   function defaultCompare(a, b) {
23727       return a < b ? -1 : a > b ? 1 : 0;
23728   }
23729
23730   return quickselect;
23731
23732   })));
23733   });
23734
23735   var rbush_1 = rbush;
23736   var default_1 = rbush;
23737
23738
23739
23740   function rbush(maxEntries, format) {
23741       if (!(this instanceof rbush)) return new rbush(maxEntries, format);
23742
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));
23746
23747       if (format) {
23748           this._initFormat(format);
23749       }
23750
23751       this.clear();
23752   }
23753
23754   rbush.prototype = {
23755
23756       all: function () {
23757           return this._all(this.data, []);
23758       },
23759
23760       search: function (bbox) {
23761
23762           var node = this.data,
23763               result = [],
23764               toBBox = this.toBBox;
23765
23766           if (!intersects$1(bbox, node)) return result;
23767
23768           var nodesToSearch = [],
23769               i, len, child, childBBox;
23770
23771           while (node) {
23772               for (i = 0, len = node.children.length; i < len; i++) {
23773
23774                   child = node.children[i];
23775                   childBBox = node.leaf ? toBBox(child) : child;
23776
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);
23781                   }
23782               }
23783               node = nodesToSearch.pop();
23784           }
23785
23786           return result;
23787       },
23788
23789       collides: function (bbox) {
23790
23791           var node = this.data,
23792               toBBox = this.toBBox;
23793
23794           if (!intersects$1(bbox, node)) return false;
23795
23796           var nodesToSearch = [],
23797               i, len, child, childBBox;
23798
23799           while (node) {
23800               for (i = 0, len = node.children.length; i < len; i++) {
23801
23802                   child = node.children[i];
23803                   childBBox = node.leaf ? toBBox(child) : child;
23804
23805                   if (intersects$1(bbox, childBBox)) {
23806                       if (node.leaf || contains$2(bbox, childBBox)) return true;
23807                       nodesToSearch.push(child);
23808                   }
23809               }
23810               node = nodesToSearch.pop();
23811           }
23812
23813           return false;
23814       },
23815
23816       load: function (data) {
23817           if (!(data && data.length)) return this;
23818
23819           if (data.length < this._minEntries) {
23820               for (var i = 0, len = data.length; i < len; i++) {
23821                   this.insert(data[i]);
23822               }
23823               return this;
23824           }
23825
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);
23828
23829           if (!this.data.children.length) {
23830               // save as is if tree is empty
23831               this.data = node;
23832
23833           } else if (this.data.height === node.height) {
23834               // split root if trees have the same height
23835               this._splitRoot(this.data, node);
23836
23837           } else {
23838               if (this.data.height < node.height) {
23839                   // swap trees if inserted one is bigger
23840                   var tmpNode = this.data;
23841                   this.data = node;
23842                   node = tmpNode;
23843               }
23844
23845               // insert the small tree into the large tree at appropriate level
23846               this._insert(node, this.data.height - node.height - 1, true);
23847           }
23848
23849           return this;
23850       },
23851
23852       insert: function (item) {
23853           if (item) this._insert(item, this.data.height - 1);
23854           return this;
23855       },
23856
23857       clear: function () {
23858           this.data = createNode([]);
23859           return this;
23860       },
23861
23862       remove: function (item, equalsFn) {
23863           if (!item) return this;
23864
23865           var node = this.data,
23866               bbox = this.toBBox(item),
23867               path = [],
23868               indexes = [],
23869               i, parent, index, goingUp;
23870
23871           // depth-first iterative tree traversal
23872           while (node || path.length) {
23873
23874               if (!node) { // go up
23875                   node = path.pop();
23876                   parent = path[path.length - 1];
23877                   i = indexes.pop();
23878                   goingUp = true;
23879               }
23880
23881               if (node.leaf) { // check current node
23882                   index = findItem(item, node.children, equalsFn);
23883
23884                   if (index !== -1) {
23885                       // item found, remove the item and condense tree upwards
23886                       node.children.splice(index, 1);
23887                       path.push(node);
23888                       this._condense(path);
23889                       return this;
23890                   }
23891               }
23892
23893               if (!goingUp && !node.leaf && contains$2(node, bbox)) { // go down
23894                   path.push(node);
23895                   indexes.push(i);
23896                   i = 0;
23897                   parent = node;
23898                   node = node.children[0];
23899
23900               } else if (parent) { // go right
23901                   i++;
23902                   node = parent.children[i];
23903                   goingUp = false;
23904
23905               } else node = null; // nothing found
23906           }
23907
23908           return this;
23909       },
23910
23911       toBBox: function (item) { return item; },
23912
23913       compareMinX: compareNodeMinX,
23914       compareMinY: compareNodeMinY,
23915
23916       toJSON: function () { return this.data; },
23917
23918       fromJSON: function (data) {
23919           this.data = data;
23920           return this;
23921       },
23922
23923       _all: function (node, result) {
23924           var nodesToSearch = [];
23925           while (node) {
23926               if (node.leaf) result.push.apply(result, node.children);
23927               else nodesToSearch.push.apply(nodesToSearch, node.children);
23928
23929               node = nodesToSearch.pop();
23930           }
23931           return result;
23932       },
23933
23934       _build: function (items, left, right, height) {
23935
23936           var N = right - left + 1,
23937               M = this._maxEntries,
23938               node;
23939
23940           if (N <= M) {
23941               // reached leaf level; return leaf
23942               node = createNode(items.slice(left, right + 1));
23943               calcBBox(node, this.toBBox);
23944               return node;
23945           }
23946
23947           if (!height) {
23948               // target height of the bulk-loaded tree
23949               height = Math.ceil(Math.log(N) / Math.log(M));
23950
23951               // target number of root entries to maximize storage utilization
23952               M = Math.ceil(N / Math.pow(M, height - 1));
23953           }
23954
23955           node = createNode([]);
23956           node.leaf = false;
23957           node.height = height;
23958
23959           // split the items into M mostly square tiles
23960
23961           var N2 = Math.ceil(N / M),
23962               N1 = N2 * Math.ceil(Math.sqrt(M)),
23963               i, j, right2, right3;
23964
23965           multiSelect(items, left, right, N1, this.compareMinX);
23966
23967           for (i = left; i <= right; i += N1) {
23968
23969               right2 = Math.min(i + N1 - 1, right);
23970
23971               multiSelect(items, i, right2, N2, this.compareMinY);
23972
23973               for (j = i; j <= right2; j += N2) {
23974
23975                   right3 = Math.min(j + N2 - 1, right2);
23976
23977                   // pack each entry recursively
23978                   node.children.push(this._build(items, j, right3, height - 1));
23979               }
23980           }
23981
23982           calcBBox(node, this.toBBox);
23983
23984           return node;
23985       },
23986
23987       _chooseSubtree: function (bbox, node, level, path) {
23988
23989           var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
23990
23991           while (true) {
23992               path.push(node);
23993
23994               if (node.leaf || path.length - 1 === level) break;
23995
23996               minArea = minEnlargement = Infinity;
23997
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;
24002
24003                   // choose entry with the least area enlargement
24004                   if (enlargement < minEnlargement) {
24005                       minEnlargement = enlargement;
24006                       minArea = area < minArea ? area : minArea;
24007                       targetNode = child;
24008
24009                   } else if (enlargement === minEnlargement) {
24010                       // otherwise choose one with the smallest area
24011                       if (area < minArea) {
24012                           minArea = area;
24013                           targetNode = child;
24014                       }
24015                   }
24016               }
24017
24018               node = targetNode || node.children[0];
24019           }
24020
24021           return node;
24022       },
24023
24024       _insert: function (item, level, isNode) {
24025
24026           var toBBox = this.toBBox,
24027               bbox = isNode ? item : toBBox(item),
24028               insertPath = [];
24029
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);
24032
24033           // put the item into the node
24034           node.children.push(item);
24035           extend$1(node, bbox);
24036
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);
24041                   level--;
24042               } else break;
24043           }
24044
24045           // adjust bboxes along the insertion path
24046           this._adjustParentBBoxes(bbox, insertPath, level);
24047       },
24048
24049       // split overflowed node into two
24050       _split: function (insertPath, level) {
24051
24052           var node = insertPath[level],
24053               M = node.children.length,
24054               m = this._minEntries;
24055
24056           this._chooseSplitAxis(node, m, M);
24057
24058           var splitIndex = this._chooseSplitIndex(node, m, M);
24059
24060           var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
24061           newNode.height = node.height;
24062           newNode.leaf = node.leaf;
24063
24064           calcBBox(node, this.toBBox);
24065           calcBBox(newNode, this.toBBox);
24066
24067           if (level) insertPath[level - 1].children.push(newNode);
24068           else this._splitRoot(node, newNode);
24069       },
24070
24071       _splitRoot: function (node, newNode) {
24072           // split root node
24073           this.data = createNode([node, newNode]);
24074           this.data.height = node.height + 1;
24075           this.data.leaf = false;
24076           calcBBox(this.data, this.toBBox);
24077       },
24078
24079       _chooseSplitIndex: function (node, m, M) {
24080
24081           var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
24082
24083           minOverlap = minArea = Infinity;
24084
24085           for (i = m; i <= M - m; i++) {
24086               bbox1 = distBBox(node, 0, i, this.toBBox);
24087               bbox2 = distBBox(node, i, M, this.toBBox);
24088
24089               overlap = intersectionArea(bbox1, bbox2);
24090               area = bboxArea(bbox1) + bboxArea(bbox2);
24091
24092               // choose distribution with minimum overlap
24093               if (overlap < minOverlap) {
24094                   minOverlap = overlap;
24095                   index = i;
24096
24097                   minArea = area < minArea ? area : minArea;
24098
24099               } else if (overlap === minOverlap) {
24100                   // otherwise choose distribution with minimum area
24101                   if (area < minArea) {
24102                       minArea = area;
24103                       index = i;
24104                   }
24105               }
24106           }
24107
24108           return index;
24109       },
24110
24111       // sorts node children by the best axis for split
24112       _chooseSplitAxis: function (node, m, M) {
24113
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);
24118
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);
24122       },
24123
24124       // total margin of all possible split distributions where each node is at least m full
24125       _allDistMargin: function (node, m, M, compare) {
24126
24127           node.children.sort(compare);
24128
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),
24133               i, child;
24134
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);
24139           }
24140
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);
24145           }
24146
24147           return margin;
24148       },
24149
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);
24154           }
24155       },
24156
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) {
24161                   if (i > 0) {
24162                       siblings = path[i - 1].children;
24163                       siblings.splice(siblings.indexOf(path[i]), 1);
24164
24165                   } else this.clear();
24166
24167               } else calcBBox(path[i], this.toBBox);
24168           }
24169       },
24170
24171       _initFormat: function (format) {
24172           // data format (minX, minY, maxX, maxY accessors)
24173
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
24177
24178           var compareArr = ['return a', ' - b', ';'];
24179
24180           this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
24181           this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
24182
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] + '};');
24188       }
24189   };
24190
24191   function findItem(item, items, equalsFn) {
24192       if (!equalsFn) return items.indexOf(item);
24193
24194       for (var i = 0; i < items.length; i++) {
24195           if (equalsFn(item, items[i])) return i;
24196       }
24197       return -1;
24198   }
24199
24200   // calculate node's bbox from bboxes of its children
24201   function calcBBox(node, toBBox) {
24202       distBBox(node, 0, node.children.length, toBBox, node);
24203   }
24204
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;
24212
24213       for (var i = k, child; i < p; i++) {
24214           child = node.children[i];
24215           extend$1(destNode, node.leaf ? toBBox(child) : child);
24216       }
24217
24218       return destNode;
24219   }
24220
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);
24226       return a;
24227   }
24228
24229   function compareNodeMinX(a, b) { return a.minX - b.minX; }
24230   function compareNodeMinY(a, b) { return a.minY - b.minY; }
24231
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); }
24234
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));
24238   }
24239
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);
24245
24246       return Math.max(0, maxX - minX) *
24247              Math.max(0, maxY - minY);
24248   }
24249
24250   function contains$2(a, b) {
24251       return a.minX <= b.minX &&
24252              a.minY <= b.minY &&
24253              b.maxX <= a.maxX &&
24254              b.maxY <= a.maxY;
24255   }
24256
24257   function intersects$1(a, b) {
24258       return b.minX <= a.maxX &&
24259              b.minY <= a.maxY &&
24260              b.maxX >= a.minX &&
24261              b.maxY >= a.minY;
24262   }
24263
24264   function createNode(children) {
24265       return {
24266           children: children,
24267           height: 1,
24268           leaf: true,
24269           minX: Infinity,
24270           minY: Infinity,
24271           maxX: -Infinity,
24272           maxY: -Infinity
24273       };
24274   }
24275
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
24278
24279   function multiSelect(arr, left, right, n, compare) {
24280       var stack = [left, right],
24281           mid;
24282
24283       while (stack.length) {
24284           right = stack.pop();
24285           left = stack.pop();
24286
24287           if (right - left <= n) continue;
24288
24289           mid = left + Math.ceil((right - left) / n / 2) * n;
24290           quickselect(arr, mid, left, right, compare);
24291
24292           stack.push(left, mid, mid, right);
24293       }
24294   }
24295   rbush_1.default = default_1;
24296
24297   var lineclip_1 = lineclip;
24298
24299   lineclip.polyline = lineclip;
24300   lineclip.polygon = polygonclip;
24301
24302
24303   // Cohen-Sutherland line clippign algorithm, adapted to efficiently
24304   // handle polylines rather than just segments
24305
24306   function lineclip(points, bbox, result) {
24307
24308       var len = points.length,
24309           codeA = bitCode(points[0], bbox),
24310           part = [],
24311           i, a, b, codeB, lastCode;
24312
24313       if (!result) result = [];
24314
24315       for (i = 1; i < len; i++) {
24316           a = points[i - 1];
24317           b = points[i];
24318           codeB = lastCode = bitCode(b, bbox);
24319
24320           while (true) {
24321
24322               if (!(codeA | codeB)) { // accept
24323                   part.push(a);
24324
24325                   if (codeB !== lastCode) { // segment went outside
24326                       part.push(b);
24327
24328                       if (i < len - 1) { // start a new line
24329                           result.push(part);
24330                           part = [];
24331                       }
24332                   } else if (i === len - 1) {
24333                       part.push(b);
24334                   }
24335                   break;
24336
24337               } else if (codeA & codeB) { // trivial reject
24338                   break;
24339
24340               } else if (codeA) { // a outside, intersect with clip edge
24341                   a = intersect$1(a, b, codeA, bbox);
24342                   codeA = bitCode(a, bbox);
24343
24344               } else { // b outside
24345                   b = intersect$1(a, b, codeB, bbox);
24346                   codeB = bitCode(b, bbox);
24347               }
24348           }
24349
24350           codeA = lastCode;
24351       }
24352
24353       if (part.length) result.push(part);
24354
24355       return result;
24356   }
24357
24358   // Sutherland-Hodgeman polygon clipping algorithm
24359
24360   function polygonclip(points, bbox) {
24361
24362       var result, edge, prev, prevInside, i, p, inside;
24363
24364       // clip against each side of the clip rectangle
24365       for (edge = 1; edge <= 8; edge *= 2) {
24366           result = [];
24367           prev = points[points.length - 1];
24368           prevInside = !(bitCode(prev, bbox) & edge);
24369
24370           for (i = 0; i < points.length; i++) {
24371               p = points[i];
24372               inside = !(bitCode(p, bbox) & edge);
24373
24374               // if segment goes through the clip window, add an intersection
24375               if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
24376
24377               if (inside) result.push(p); // add a point if it's inside
24378
24379               prev = p;
24380               prevInside = inside;
24381           }
24382
24383           points = result;
24384
24385           if (!points.length) break;
24386       }
24387
24388       return result;
24389   }
24390
24391   // intersect a segment against one of the 4 lines that make up the bbox
24392
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
24398              null;
24399   }
24400
24401   // bit code reflects the point position relative to the bbox:
24402
24403   //         left  mid  right
24404   //    top  1001  1000  1010
24405   //    mid  0001  0000  0010
24406   // bottom  0101  0100  0110
24407
24408   function bitCode(p, bbox) {
24409       var code = 0;
24410
24411       if (p[0] < bbox[0]) code |= 1; // left
24412       else if (p[0] > bbox[2]) code |= 2; // right
24413
24414       if (p[1] < bbox[1]) code |= 4; // bottom
24415       else if (p[1] > bbox[3]) code |= 8; // top
24416
24417       return code;
24418   }
24419
24420   var whichPolygon_1 = whichPolygon;
24421
24422   function whichPolygon(data) {
24423       var bboxes = [];
24424       for (var i = 0; i < data.features.length; i++) {
24425           var feature = data.features[i];
24426           var coords = feature.geometry.coordinates;
24427
24428           if (feature.geometry.type === 'Polygon') {
24429               bboxes.push(treeItem(coords, feature.properties));
24430
24431           } else if (feature.geometry.type === 'MultiPolygon') {
24432               for (var j = 0; j < coords.length; j++) {
24433                   bboxes.push(treeItem(coords[j], feature.properties));
24434               }
24435           }
24436       }
24437
24438       var tree = rbush_1().load(bboxes);
24439
24440       function query(p, multi) {
24441           var output = [],
24442               result = tree.search({
24443                   minX: p[0],
24444                   minY: p[1],
24445                   maxX: p[0],
24446                   maxY: p[1]
24447               });
24448           for (var i = 0; i < result.length; i++) {
24449               if (insidePolygon(result[i].coords, p)) {
24450                   if (multi)
24451                       output.push(result[i].props);
24452                   else
24453                       return result[i].props;
24454               }
24455           }
24456           return multi && output.length ? output : null;
24457       }
24458
24459       query.tree = tree;
24460       query.bbox = function queryBBox(bbox) {
24461           var output = [];
24462           var result = tree.search({
24463               minX: bbox[0],
24464               minY: bbox[1],
24465               maxX: bbox[2],
24466               maxY: bbox[3]
24467           });
24468           for (var i = 0; i < result.length; i++) {
24469               if (polygonIntersectsBBox(result[i].coords, bbox)) {
24470                   output.push(result[i].props);
24471               }
24472           }
24473           return output;
24474       };
24475
24476       return query;
24477   }
24478
24479   function polygonIntersectsBBox(polygon, bbox) {
24480       var bboxCenter = [
24481           (bbox[0] + bbox[2]) / 2,
24482           (bbox[1] + bbox[3]) / 2
24483       ];
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;
24487       }
24488       return false;
24489   }
24490
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;
24498           }
24499       }
24500       return inside;
24501   }
24502
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]);
24505   }
24506
24507   function treeItem(coords, props) {
24508       var item = {
24509           minX: Infinity,
24510           minY: Infinity,
24511           maxX: -Infinity,
24512           maxY: -Infinity,
24513           coords: coords,
24514           props: props
24515       };
24516
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]);
24523       }
24524       return item;
24525   }
24526
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 = {
24532           id: feature.id,
24533           area: d3_geoArea(feature)   // also precompute areas
24534       };
24535
24536       return feature;
24537   });
24538
24539   var data = {
24540       community: {
24541           features: features$2,
24542           resources: resources,
24543           query: whichPolygon_1({
24544               type: 'FeatureCollection',
24545               features: features$4
24546           })
24547       },
24548       imagery: dataImagery,
24549       presets: {
24550           presets: presets,
24551           defaults: defaults,
24552           categories: categories,
24553           fields: fields
24554       }
24555   };
24556
24557   function osmEntity$$1(attrs) {
24558       // For prototypal inheritance.
24559       if (this instanceof osmEntity$$1) return;
24560
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);
24566       }
24567
24568       // Initialize a generic Entity (used only in tests).
24569       return (new osmEntity$$1()).initialize(arguments);
24570   }
24571
24572
24573   osmEntity$$1.id = function(type) {
24574       return osmEntity$$1.id.fromOSM(type, osmEntity$$1.id.next[type]--);
24575   };
24576
24577
24578   osmEntity$$1.id.next = {
24579       changeset: -1, node: -1, way: -1, relation: -1
24580   };
24581
24582
24583   osmEntity$$1.id.fromOSM = function(type, id) {
24584       return type[0] + id;
24585   };
24586
24587
24588   osmEntity$$1.id.toOSM = function(id) {
24589       return id.slice(1);
24590   };
24591
24592
24593   osmEntity$$1.id.type = function(id) {
24594       return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
24595   };
24596
24597
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);
24601   };
24602
24603
24604   osmEntity$$1.prototype = {
24605
24606       tags: {},
24607
24608
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) {
24615                           delete this[prop];
24616                       } else {
24617                           this[prop] = source[prop];
24618                       }
24619                   }
24620               }
24621           }
24622
24623           if (!this.id && this.type) {
24624               this.id = osmEntity$$1.id(this.type);
24625           }
24626           if (!this.hasOwnProperty('visible')) {
24627               this.visible = true;
24628           }
24629
24630           return this;
24631       },
24632
24633
24634       copy: function(resolver, copies) {
24635           if (copies[this.id])
24636               return copies[this.id];
24637
24638           var copy = osmEntity$$1(this, {id: undefined, user: undefined, version: undefined});
24639           copies[this.id] = copy;
24640
24641           return copy;
24642       },
24643
24644
24645       osmId: function() {
24646           return osmEntity$$1.id.toOSM(this.id);
24647       },
24648
24649
24650       isNew: function() {
24651           return this.osmId() < 0;
24652       },
24653
24654
24655       update: function(attrs) {
24656           return osmEntity$$1(this, attrs, {v: 1 + (this.v || 0)});
24657       },
24658
24659
24660       mergeTags: function(tags) {
24661           var merged = clone(this.tags), changed = false;
24662           for (var k in tags) {
24663               var t1 = merged[k],
24664                   t2 = tags[k];
24665               if (!t1) {
24666                   changed = true;
24667                   merged[k] = t2;
24668               } else if (t1 !== t2) {
24669                   changed = true;
24670                   merged[k] = union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
24671               }
24672           }
24673           return changed ? this.update({tags: merged}) : this;
24674       },
24675
24676
24677       intersects: function(extent, resolver) {
24678           return this.extent(resolver).intersects(extent);
24679       },
24680
24681
24682       isUsed: function(resolver) {
24683           return without(Object.keys(this.tags), 'area').length > 0 ||
24684               resolver.parentRelations(this).length > 0;
24685       },
24686
24687
24688       hasInterestingTags: function() {
24689           return keys$1(this.tags).some(osmIsInterestingTag);
24690       },
24691
24692
24693       isHighwayIntersection: function() {
24694           return false;
24695       },
24696
24697       isDegenerate: function() {
24698           return true;
24699       },
24700
24701       deprecatedTags: function() {
24702           var tags = toPairs(this.tags);
24703           var deprecated = {};
24704
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];
24711                   }
24712               });
24713           });
24714
24715           return deprecated;
24716       }
24717   };
24718
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) {
24723           return min;
24724       } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
24725           this[0] = min[0];
24726           this[1] = min[1];
24727       } else {
24728           this[0] = min        || [ Infinity,  Infinity];
24729           this[1] = max || min || [-Infinity, -Infinity];
24730       }
24731   }
24732
24733   // $FlowFixMe
24734   geoExtent$$1.prototype = new Array(2);
24735
24736   assignIn(geoExtent$$1.prototype, {
24737
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];
24743       },
24744
24745
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])]
24751           );
24752       },
24753
24754
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]);
24760       },
24761
24762
24763       area: function() {
24764           return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
24765       },
24766
24767
24768       center: function() {
24769           return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
24770       },
24771
24772
24773       rectangle: function() {
24774           return [this[0][0], this[0][1], this[1][0], this[1][1]];
24775       },
24776
24777
24778       bbox: function() {
24779           return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
24780       },
24781
24782
24783       polygon: function() {
24784           return [
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]]
24790           ];
24791       },
24792
24793
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];
24800       },
24801
24802
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];
24809       },
24810
24811
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])]
24817           );
24818       },
24819
24820
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();
24825
24826           if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
24827               return 0;
24828           } else {
24829               return a1 / a2;
24830           }
24831       },
24832
24833
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]
24840           );
24841       },
24842
24843
24844       toParam: function() {
24845           return this.rectangle().join(',');
24846       }
24847
24848   });
24849
24850   // constants
24851   var TAU = 2 * Math.PI;
24852   var EQUATORIAL_RADIUS = 6356752.314245179;
24853   var POLAR_RADIUS = 6378137.0;
24854
24855
24856   function geoLatToMeters(dLat) {
24857       return dLat * (TAU * POLAR_RADIUS / 360);
24858   }
24859
24860
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)));
24864   }
24865
24866
24867   function geoMetersToLat(m) {
24868       return m / (TAU * POLAR_RADIUS / 360);
24869   }
24870
24871
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)));
24875   }
24876
24877
24878   function geoMetersToOffset(meters, tileSize) {
24879       tileSize = tileSize || 256;
24880       return [
24881           meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
24882           -meters[1] * tileSize / (TAU * POLAR_RADIUS)
24883       ];
24884   }
24885
24886
24887   function geoOffsetToMeters(offset, tileSize) {
24888       tileSize = tileSize || 256;
24889       return [
24890           offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
24891           -offset[1] * TAU * POLAR_RADIUS / tileSize
24892       ];
24893   }
24894
24895
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));
24901   }
24902
24903
24904   // scale to zoom
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;
24909   }
24910
24911
24912   // zoom to scale
24913   function geoZoomToScale(z, tileSize) {
24914       tileSize = tileSize || 256;
24915       return tileSize * Math.pow(2, z) / TAU;
24916   }
24917
24918   /**
24919    * A specialized version of `_.every` for arrays without support for
24920    * iteratee shorthands.
24921    *
24922    * @private
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,
24926    *  else `false`.
24927    */
24928   function arrayEvery(array, predicate) {
24929     var index = -1,
24930         length = array == null ? 0 : array.length;
24931
24932     while (++index < length) {
24933       if (!predicate(array[index], index, array)) {
24934         return false;
24935       }
24936     }
24937     return true;
24938   }
24939
24940   /**
24941    * The base implementation of `_.every` without support for iteratee shorthands.
24942    *
24943    * @private
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,
24947    *  else `false`
24948    */
24949   function baseEvery(collection, predicate) {
24950     var result = true;
24951     baseEach(collection, function(value, index, collection) {
24952       result = !!predicate(value, index, collection);
24953       return result;
24954     });
24955     return result;
24956   }
24957
24958   /**
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).
24962    *
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.
24967    *
24968    * @static
24969    * @memberOf _
24970    * @since 0.1.0
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,
24976    *  else `false`.
24977    * @example
24978    *
24979    * _.every([true, 1, null, 'yes'], Boolean);
24980    * // => false
24981    *
24982    * var users = [
24983    *   { 'user': 'barney', 'age': 36, 'active': false },
24984    *   { 'user': 'fred',   'age': 40, 'active': false }
24985    * ];
24986    *
24987    * // The `_.matches` iteratee shorthand.
24988    * _.every(users, { 'user': 'barney', 'active': false });
24989    * // => false
24990    *
24991    * // The `_.matchesProperty` iteratee shorthand.
24992    * _.every(users, ['active', false]);
24993    * // => true
24994    *
24995    * // The `_.property` iteratee shorthand.
24996    * _.every(users, 'active');
24997    * // => false
24998    */
24999   function every(collection, predicate, guard) {
25000     var func = isArray(collection) ? arrayEvery : baseEvery;
25001     if (guard && isIterateeCall(collection, predicate, guard)) {
25002       predicate = undefined;
25003     }
25004     return func(collection, baseIteratee(predicate, 3));
25005   }
25006
25007   /**
25008    * The base implementation of `_.some` without support for iteratee shorthands.
25009    *
25010    * @private
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,
25014    *  else `false`.
25015    */
25016   function baseSome(collection, predicate) {
25017     var result;
25018
25019     baseEach(collection, function(value, index, collection) {
25020       result = predicate(value, index, collection);
25021       return !result;
25022     });
25023     return !!result;
25024   }
25025
25026   /**
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).
25030    *
25031    * @static
25032    * @memberOf _
25033    * @since 0.1.0
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,
25039    *  else `false`.
25040    * @example
25041    *
25042    * _.some([null, 0, 'yes', false], Boolean);
25043    * // => true
25044    *
25045    * var users = [
25046    *   { 'user': 'barney', 'active': true },
25047    *   { 'user': 'fred',   'active': false }
25048    * ];
25049    *
25050    * // The `_.matches` iteratee shorthand.
25051    * _.some(users, { 'user': 'barney', 'active': false });
25052    * // => false
25053    *
25054    * // The `_.matchesProperty` iteratee shorthand.
25055    * _.some(users, ['active', false]);
25056    * // => true
25057    *
25058    * // The `_.property` iteratee shorthand.
25059    * _.some(users, 'active');
25060    * // => true
25061    */
25062   function some(collection, predicate, guard) {
25063     var func = isArray(collection) ? arraySome : baseSome;
25064     if (guard && isIterateeCall(collection, predicate, guard)) {
25065       predicate = undefined;
25066     }
25067     return func(collection, baseIteratee(predicate, 3));
25068   }
25069
25070   // vector equals
25071   function geoVecEqual(a, b, epsilon) {
25072       if (epsilon) {
25073           return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
25074       } else {
25075           return (a[0] === b[0]) && (a[1] === b[1]);
25076       }
25077   }
25078
25079   // vector addition
25080   function geoVecAdd(a, b) {
25081       return [ a[0] + b[0], a[1] + b[1] ];
25082   }
25083
25084   // vector subtraction
25085   function geoVecSubtract(a, b) {
25086       return [ a[0] - b[0], a[1] - b[1] ];
25087   }
25088
25089   // vector scaling
25090   function geoVecScale(a, mag) {
25091       return [ a[0] * mag, a[1] * mag ];
25092   }
25093
25094   // vector rounding (was: geoRoundCoordinates)
25095   function geoVecFloor(a) {
25096       return [ Math.floor(a[0]), Math.floor(a[1]) ];
25097   }
25098
25099   // linear interpolation
25100   function geoVecInterp(a, b, t) {
25101       return [
25102           a[0] + (b[0] - a[0]) * t,
25103           a[1] + (b[1] - a[1]) * t
25104       ];
25105   }
25106
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));
25112   }
25113
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]);
25118   }
25119
25120   // dot product
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]);
25125   }
25126
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]);
25134   }
25135
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));
25140   }
25141
25142   function geoEdgeEqual(a, b) {
25143       return (a[0] === b[0] && a[1] === b[1]) ||
25144           (a[0] === b[1] && a[1] === b[0]);
25145   }
25146
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);
25151           return [
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]
25154           ];
25155       });
25156   }
25157
25158
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;
25168       var idx;
25169       var loc;
25170
25171       for (var i = 0; i < points.length - 1; i++) {
25172           if (ids[i] === activeID || ids[i + 1] === activeID) continue;
25173
25174           var o = points[i];
25175           var s = geoVecSubtract(points[i + 1], o);
25176           var v = geoVecSubtract(point, o);
25177           var proj = geoVecDot(v, s) / geoVecDot(s, s);
25178           var p;
25179
25180           if (proj < 0) {
25181               p = o;
25182           } else if (proj > 1) {
25183               p = points[i + 1];
25184           } else {
25185               p = [o[0] + proj * s[0], o[1] + proj * s[1]];
25186           }
25187
25188           var d = dist(p, point);
25189           if (d < min) {
25190               min = d;
25191               idx = i + 1;
25192               loc = projection.invert(p);
25193           }
25194       }
25195
25196       if (idx !== undefined) {
25197           return { index: idx, distance: min, loc: loc };
25198       } else {
25199           return null;
25200       }
25201   }
25202
25203
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) {
25209       var actives = [];
25210       var inactives = [];
25211       var j, k, n1, n2, segment;
25212
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);
25220           }
25221       }
25222
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);
25229       }
25230
25231       // test
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);
25237               if (hit) {
25238                   return true;
25239               }
25240           }
25241       }
25242
25243       return false;
25244   }
25245
25246
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) {
25250       var actives = [];
25251       var inactives = [];
25252       var j, k;
25253
25254       // group active and passive segments along the nodes
25255       for (j = 0; j < nodes.length - 1; j++) {
25256           var n1 = nodes[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);
25261           } else {
25262               inactives.push(segment);
25263           }
25264       }
25265
25266       // test
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]) ) {
25274                   continue;
25275               }
25276
25277               var hit = geoLineIntersection(p, q);
25278               if (hit) {
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) ) {
25283                       continue;
25284                   } else {
25285                       return true;
25286                   }
25287               }
25288           }
25289       }
25290
25291       return false;
25292   }
25293
25294
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);
25308
25309       if (uNumerator && denominator) {
25310           var u = uNumerator / denominator;
25311           var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
25312
25313           if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
25314               return geoVecInterp(p, p2, t);
25315           }
25316       }
25317
25318       return null;
25319   }
25320
25321
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);
25329               if (hit) {
25330                   intersections.push(hit);
25331               }
25332           }
25333       }
25334       return intersections;
25335   }
25336
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);
25343               if (hit) {
25344                   return true;
25345               }
25346           }
25347       }
25348       return false;
25349   }
25350
25351
25352   // Return whether point is contained in polygon.
25353   //
25354   // `point` should be a 2-item array of coordinates.
25355   // `polygon` should be an array of 2-item arrays of coordinates.
25356   //
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
25360   //
25361   function geoPointInPolygon(point, polygon) {
25362       var x = point[0];
25363       var y = point[1];
25364       var inside = false;
25365
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];
25371
25372           var intersect = ((yi > y) !== (yj > y)) &&
25373               (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
25374           if (intersect) inside = !inside;
25375       }
25376
25377       return inside;
25378   }
25379
25380
25381   function geoPolygonContainsPolygon(outer, inner) {
25382       return every(inner, function(point) {
25383           return geoPointInPolygon(point, outer);
25384       });
25385   }
25386
25387
25388   function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
25389       function testPoints(outer, inner) {
25390           return some(inner, function(point) {
25391               return geoPointInPolygon(point, outer);
25392           });
25393       }
25394
25395      return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
25396   }
25397
25398
25399   function geoPathLength(path) {
25400       var length = 0;
25401       for (var i = 0; i < path.length - 1; i++) {
25402           length += geoVecLength(path[i], path[i + 1]);
25403       }
25404       return length;
25405   }
25406
25407
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
25412       var x = 0;
25413       var y = 0;
25414
25415       if (point[0] > dimensions[0] - pad[1])
25416           x = -10;
25417       if (point[0] < pad[3])
25418           x = 10;
25419       if (point[1] > dimensions[1] - pad[2])
25420           y = -10;
25421       if (point[1] < pad[0])
25422           y = 10;
25423
25424       if (x || y) {
25425           return [x, y];
25426       } else {
25427           return null;
25428       }
25429   }
25430
25431   /*
25432       Bypasses features of D3's default projection stream pipeline that are unnecessary:
25433       * Antimeridian clipping
25434       * Spherical rotation
25435       * Resampling
25436   */
25437   function geoRawMercator() {
25438       var project = mercatorRaw;
25439       var k = 512 / Math.PI; // scale
25440       var x = 0;
25441       var y = 0; // translate
25442       var clipExtent = [[0, 0], [0, 0]];
25443
25444
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];
25448       }
25449
25450
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];
25454       };
25455
25456
25457       projection$$1.scale = function(_) {
25458           if (!arguments.length) return k;
25459           k = +_;
25460           return projection$$1;
25461       };
25462
25463
25464       projection$$1.translate = function(_) {
25465           if (!arguments.length) return [x, y];
25466           x = +_[0];
25467           y = +_[1];
25468           return projection$$1;
25469       };
25470
25471
25472       projection$$1.clipExtent = function(_) {
25473           if (!arguments.length) return clipExtent;
25474           clipExtent = _;
25475           return projection$$1;
25476       };
25477
25478
25479       projection$$1.transform = function(obj) {
25480           if (!arguments.length) return identity$7.translate(x, y).scale(k);
25481           x = +obj.x;
25482           y = +obj.y;
25483           k = +obj.k;
25484           return projection$$1;
25485       };
25486
25487
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]);
25492           }
25493       }).stream;
25494
25495
25496       return projection$$1;
25497   }
25498
25499   function osmChangeset() {
25500       if (!(this instanceof osmChangeset)) {
25501           return (new osmChangeset()).initialize(arguments);
25502       } else if (arguments.length) {
25503           this.initialize(arguments);
25504       }
25505   }
25506
25507
25508   osmEntity$$1.changeset = osmChangeset;
25509
25510   osmChangeset.prototype = Object.create(osmEntity$$1.prototype);
25511
25512   assignIn(osmChangeset.prototype, {
25513
25514       type: 'changeset',
25515
25516
25517       extent: function() {
25518           return new geoExtent$$1();
25519       },
25520
25521
25522       geometry: function() {
25523           return 'changeset';
25524       },
25525
25526
25527       asJXON: function() {
25528           return {
25529               osm: {
25530                   changeset: {
25531                       tag: map$3(this.tags, function(value, key) {
25532                           return { '@k': key, '@v': value };
25533                       }),
25534                       '@version': 0.6,
25535                       '@generator': 'iD'
25536                   }
25537               }
25538           };
25539       },
25540
25541
25542       // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
25543       // XML. Returns a string.
25544       osmChangeJXON: function(changes) {
25545           var changeset_id = this.id;
25546
25547           function nest(x, order) {
25548               var groups = {};
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]);
25553               }
25554               var ordered = {};
25555               order.forEach(function(o) {
25556                   if (groups[o]) ordered[o] = groups[o];
25557               });
25558               return ordered;
25559           }
25560
25561
25562           // sort relations in a changeset by dependencies
25563           function sort(changes) {
25564
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'];
25570                   });
25571               }
25572
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'];
25577                   });
25578               }
25579
25580               var processing = [],
25581                   sorted = {},
25582                   relations = changes.relation;
25583
25584               if (!relations) return changes;
25585
25586               for (var i = 0; i < relations.length; i++) {
25587                   var relation = relations[i];
25588
25589                   // skip relation if already sorted
25590                   if (!sorted[relation['@id']]) {
25591                       processing.push(relation);
25592                   }
25593
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();
25600                       } else {
25601                           processing = deps.concat(processing);
25602                       }
25603                   }
25604               }
25605
25606               changes.relation = values$1(sorted);
25607               return changes;
25608           }
25609
25610           function rep(entity) {
25611               return entity.asJXON(changeset_id);
25612           }
25613
25614           return {
25615               osmChange: {
25616                   '@version': 0.6,
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 })
25621               }
25622           };
25623       },
25624
25625
25626       asGeoJSON: function() {
25627           return {};
25628       }
25629
25630   });
25631
25632   /**
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
25637    * in the array.
25638    *
25639    * @static
25640    * @memberOf _
25641    * @since 0.1.0
25642    * @category Array
25643    * @param {Array} array The array to inspect.
25644    * @returns {Array} Returns the new duplicate free array.
25645    * @example
25646    *
25647    * _.uniq([2, 1, 2]);
25648    * // => [2, 1]
25649    */
25650   function uniq(array) {
25651     return (array && array.length) ? baseUniq(array) : [];
25652   }
25653
25654   function osmNode() {
25655       if (!(this instanceof osmNode)) {
25656           return (new osmNode()).initialize(arguments);
25657       } else if (arguments.length) {
25658           this.initialize(arguments);
25659       }
25660   }
25661
25662   osmEntity$$1.node = osmNode;
25663
25664   osmNode.prototype = Object.create(osmEntity$$1.prototype);
25665
25666   assignIn(osmNode.prototype, {
25667
25668       type: 'node',
25669
25670
25671       extent: function() {
25672           return new geoExtent$$1(this.loc);
25673       },
25674
25675
25676       geometry: function(graph) {
25677           return graph.transient(this, 'geometry', function() {
25678               return graph.isPoi(this) ? 'point' : 'vertex';
25679           });
25680       },
25681
25682
25683       move: function(loc) {
25684           return this.update({loc: loc});
25685       },
25686
25687
25688       isDegenerate: function() {
25689           return !(
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
25693           );
25694       },
25695
25696
25697       // Inspect tags and geometry to determine which direction(s) this node/vertex points
25698       directions: function(resolver, projection) {
25699           var val;
25700           var i;
25701
25702           // which tag to use?
25703           if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
25704               // all-way stop tag on a highway intersection
25705               val = 'all';
25706           } else {
25707               // generic direction tag
25708               val = (this.tags.direction || '').toLowerCase();
25709
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();
25716                       break;
25717                   }
25718               }
25719           }
25720
25721           if (val === '') return [];
25722
25723           var cardinal = {
25724               north: 0,               n: 0,
25725               northnortheast: 22,     nne: 22,
25726               northeast: 45,          ne: 45,
25727               eastnortheast: 67,      ene: 67,
25728               east: 90,               e: 90,
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,
25736               west: 270,              w: 270,
25737               westnorthwest: 292,     wnw: 292,
25738               northwest: 315,         nw: 315,
25739               northnorthwest: 337,    nnw: 337
25740           };
25741
25742
25743           var values = val.split(';');
25744           var results = [];
25745
25746           values.forEach(function(v) {
25747               // swap cardinal for numeric directions
25748               if (cardinal[v] !== undefined) {
25749                   v = cardinal[v];
25750               }
25751
25752               // numeric direction - just add to results
25753               if (v !== '' && !isNaN(+v)) {
25754                   results.push(+v);
25755                   return;
25756               }
25757
25758               // string direction - inspect parent ways
25759               var lookBackward =
25760                   (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
25761               var lookForward =
25762                   (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
25763
25764               if (!lookForward && !lookBackward) return;
25765
25766               var nodeIds = {};
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
25773                           }
25774                           if (lookBackward && i < nodes.length - 1) {
25775                               nodeIds[nodes[i + 1]] = true;  // look ahead to next node
25776                           }
25777                       }
25778                   }
25779               }, this);
25780
25781               Object.keys(nodeIds).forEach(function(nodeId) {
25782                   // +90 because geoAngle returns angle from X axis, not Y (north)
25783                   results.push(
25784                       (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
25785                   );
25786               }, this);
25787
25788           }, this);
25789
25790           return uniq(results);
25791       },
25792
25793
25794       isEndpoint: function(resolver) {
25795           return resolver.transient(this, 'isEndpoint', function() {
25796               var id = this.id;
25797               return resolver.parentWays(this).filter(function(parent) {
25798                   return !parent.isClosed() && !!parent.affix(id);
25799               }).length > 0;
25800           });
25801       },
25802
25803
25804       isConnected: function(resolver) {
25805           return resolver.transient(this, 'isConnected', function() {
25806               var parents = resolver.parentWays(this);
25807
25808               function isLine(entity) {
25809                   return entity.geometry(resolver) === 'line' &&
25810                       entity.hasInterestingTags();
25811               }
25812
25813               // vertex is connected to multiple parent lines
25814               if (parents.length > 1 && some(parents, isLine)) {
25815                   return true;
25816
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
25821
25822                   // return true if vertex appears multiple times (way is self intersecting)
25823                   return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
25824               }
25825
25826               return false;
25827           });
25828       },
25829
25830
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';
25839               }).length > 1;
25840           });
25841       },
25842
25843
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';
25848               }).length > 1;
25849           });
25850       },
25851
25852
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';
25858               }).length > 0;
25859           });
25860       },
25861
25862
25863       asJXON: function(changeset_id) {
25864           var r = {
25865               node: {
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 } };
25872                   })
25873               }
25874           };
25875           if (changeset_id) r.node['@changeset'] = changeset_id;
25876           return r;
25877       },
25878
25879
25880       asGeoJSON: function() {
25881           return {
25882               type: 'Point',
25883               coordinates: this.loc
25884           };
25885       }
25886   });
25887
25888   /** Error message constants. */
25889   var FUNC_ERROR_TEXT$1 = 'Expected a function';
25890
25891   /**
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.
25895    *
25896    * @static
25897    * @memberOf _
25898    * @since 3.0.0
25899    * @category Function
25900    * @param {Function} predicate The predicate to negate.
25901    * @returns {Function} Returns the new negated function.
25902    * @example
25903    *
25904    * function isEven(n) {
25905    *   return n % 2 == 0;
25906    * }
25907    *
25908    * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
25909    * // => [1, 3, 5]
25910    */
25911   function negate(predicate) {
25912     if (typeof predicate != 'function') {
25913       throw new TypeError(FUNC_ERROR_TEXT$1);
25914     }
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]);
25922       }
25923       return !predicate.apply(this, args);
25924     };
25925   }
25926
25927   /**
25928    * The opposite of `_.filter`; this method returns the elements of `collection`
25929    * that `predicate` does **not** return truthy for.
25930    *
25931    * @static
25932    * @memberOf _
25933    * @since 0.1.0
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.
25938    * @see _.filter
25939    * @example
25940    *
25941    * var users = [
25942    *   { 'user': 'barney', 'age': 36, 'active': false },
25943    *   { 'user': 'fred',   'age': 40, 'active': true }
25944    * ];
25945    *
25946    * _.reject(users, function(o) { return !o.active; });
25947    * // => objects for ['fred']
25948    *
25949    * // The `_.matches` iteratee shorthand.
25950    * _.reject(users, { 'age': 40, 'active': true });
25951    * // => objects for ['barney']
25952    *
25953    * // The `_.matchesProperty` iteratee shorthand.
25954    * _.reject(users, ['active', false]);
25955    * // => objects for ['fred']
25956    *
25957    * // The `_.property` iteratee shorthand.
25958    * _.reject(users, 'active');
25959    * // => objects for ['barney']
25960    */
25961   function reject(collection, predicate) {
25962     var func = isArray(collection) ? arrayFilter : baseFilter;
25963     return func(collection, negate(baseIteratee(predicate, 3)));
25964   }
25965
25966   /**
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`.
25974    *
25975    * @static
25976    * @memberOf _
25977    * @since 1.3.0
25978    * @category Object
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.
25983    * @example
25984    *
25985    * _.transform([2, 3, 4], function(result, n) {
25986    *   result.push(n *= n);
25987    *   return n % 2 == 0;
25988    * }, []);
25989    * // => [4, 9]
25990    *
25991    * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
25992    *   (result[value] || (result[value] = [])).push(key);
25993    * }, {});
25994    * // => { '1': ['a', 'c'], '2': ['b'] }
25995    */
25996   function transform$1(object, iteratee, accumulator) {
25997     var isArr = isArray(object),
25998         isArrLike = isArr || isBuffer(object) || isTypedArray(object);
25999
26000     iteratee = baseIteratee(iteratee, 4);
26001     if (accumulator == null) {
26002       var Ctor = object && object.constructor;
26003       if (isArrLike) {
26004         accumulator = isArr ? new Ctor : [];
26005       }
26006       else if (isObject(object)) {
26007         accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
26008       }
26009       else {
26010         accumulator = {};
26011       }
26012     }
26013     (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
26014       return iteratee(accumulator, value, index, object);
26015     });
26016     return accumulator;
26017   }
26018
26019   /*
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.)
26023
26024     The following transforms are performed:
26025
26026       Keys:
26027             *:right=* ⟺ *:left=*
26028           *:forward=* ⟺ *:backward=*
26029          direction=up ⟺ direction=down
26030            incline=up ⟺ incline=down
26031               *=right ⟺ *=left
26032
26033       Relation members:
26034          role=forward ⟺ role=backward
26035            role=north ⟺ role=south
26036             role=east ⟺ role=west
26037
26038      In addition, numeric-valued `incline` tags are negated.
26039
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.
26042
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
26045
26046       Node Keys:
26047           *direction=forward ⟺ *direction=backward
26048           *direction=left ⟺ *direction=right
26049           *:forward=* ⟺ *:backward=*
26050           *:left=* ⟺ *:right=*
26051
26052      References:
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
26060    */
26061   function actionReverse(wayId, options) {
26062       var replacements = [
26063               [/:right$/, ':left'], [/:left$/, ':right'],
26064               [/:forward$/, ':backward'], [/:backward$/, ':forward']
26065           ],
26066           numeric = /^([+\-]?)(?=[\d.])/,
26067           roleReversals = {
26068               forward: 'backward',
26069               backward: 'forward',
26070               north: 'south',
26071               south: 'north',
26072               east: 'west',
26073               west: 'east'
26074           };
26075
26076
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]);
26082               }
26083           }
26084           return key;
26085       }
26086
26087
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;
26095           } else {
26096               return {left: 'right', right: 'left'}[value] || value;
26097           }
26098       }
26099
26100
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;
26108               } else {
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;
26112               }
26113               return acc;
26114           }, {})});
26115       }
26116
26117
26118       function reverseTagsOnNodes(graph, nodeIds) {
26119           // Reverse the direction of appropriate tags attached to the nodes (#3076)
26120           return nodeIds
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);
26129       }
26130
26131
26132       return function(graph) {
26133           var way = graph.entity(wayId),
26134               nodes = way.nodes.slice().reverse(),
26135               tags = {}, key, role;
26136
26137           for (key in way.tags) {
26138               tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
26139           }
26140
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);
26146                   }
26147               });
26148           });
26149
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}));
26153       };
26154   }
26155
26156   /** `Object#toString` result references. */
26157   var numberTag$4 = '[object Number]';
26158
26159   /**
26160    * Checks if `value` is classified as a `Number` primitive or object.
26161    *
26162    * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
26163    * classified as numbers, use the `_.isFinite` method.
26164    *
26165    * @static
26166    * @memberOf _
26167    * @since 0.1.0
26168    * @category Lang
26169    * @param {*} value The value to check.
26170    * @returns {boolean} Returns `true` if `value` is a number, else `false`.
26171    * @example
26172    *
26173    * _.isNumber(3);
26174    * // => true
26175    *
26176    * _.isNumber(Number.MIN_VALUE);
26177    * // => true
26178    *
26179    * _.isNumber(Infinity);
26180    * // => true
26181    *
26182    * _.isNumber('3');
26183    * // => false
26184    */
26185   function isNumber(value) {
26186     return typeof value == 'number' ||
26187       (isObjectLike(value) && baseGetTag(value) == numberTag$4);
26188   }
26189
26190   /** `Object#toString` result references. */
26191   var stringTag$4 = '[object String]';
26192
26193   /**
26194    * Checks if `value` is classified as a `String` primitive or object.
26195    *
26196    * @static
26197    * @since 0.1.0
26198    * @memberOf _
26199    * @category Lang
26200    * @param {*} value The value to check.
26201    * @returns {boolean} Returns `true` if `value` is a string, else `false`.
26202    * @example
26203    *
26204    * _.isString('abc');
26205    * // => true
26206    *
26207    * _.isString(1);
26208    * // => false
26209    */
26210   function isString(value) {
26211     return typeof value == 'string' ||
26212       (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag$4);
26213   }
26214
26215   /**
26216    * Checks if `value` is `NaN`.
26217    *
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.
26222    *
26223    * @static
26224    * @memberOf _
26225    * @since 0.1.0
26226    * @category Lang
26227    * @param {*} value The value to check.
26228    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
26229    * @example
26230    *
26231    * _.isNaN(NaN);
26232    * // => true
26233    *
26234    * _.isNaN(new Number(NaN));
26235    * // => true
26236    *
26237    * isNaN(undefined);
26238    * // => true
26239    *
26240    * _.isNaN(undefined);
26241    * // => false
26242    */
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;
26248   }
26249
26250   function osmLanes(entity) {
26251       if (entity.type !== 'way') return null;
26252       if (!entity.tags.highway) return null;
26253
26254       var tags = entity.tags;
26255       var isOneWay = entity.isOneWay();
26256       var laneCount = getLaneCount(tags, isOneWay);
26257       var maxspeed = parseMaxspeed(tags);
26258
26259       var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
26260       var forward = laneDirections.forward;
26261       var backward = laneDirections.backward;
26262       var bothways = laneDirections.bothways;
26263
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']);
26269
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);
26274
26275       var psvLanes = {};
26276       psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
26277       psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
26278       psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
26279
26280       var busLanes = {};
26281       busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
26282       busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
26283       busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
26284
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']);
26289
26290       var hovLanes = {};
26291       hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
26292       hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
26293       hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
26294
26295       var hgvLanes = {};
26296       hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
26297       hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
26298       hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
26299
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']);
26304
26305       var lanesObj = {
26306           forward: [],
26307           backward: [],
26308           unspecified: []
26309       };
26310
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');
26320
26321       return {
26322           metadata: {
26323               count: laneCount,
26324               oneway: isOneWay,
26325               forward: forward,
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
26337           },
26338           lanes: lanesObj
26339       };
26340   }
26341
26342
26343   function getLaneCount(tags, isOneWay) {
26344       var count;
26345       if (tags.lanes) {
26346           count = parseInt(tags.lanes, 10);
26347           if (count > 0) {
26348               return count;
26349           }
26350       }
26351
26352
26353       switch (tags.highway) {
26354           case 'trunk':
26355           case 'motorway':
26356               count = isOneWay ? 2 : 4;
26357               break;
26358           default:
26359               count = isOneWay ? 1 : 2;
26360               break;
26361       }
26362
26363       return count;
26364   }
26365
26366
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);
26374       }
26375   }
26376
26377
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;
26382
26383       if (parseInt(tags.oneway, 10) === -1) {
26384           forward = 0;
26385           bothways = 0;
26386           backward = laneCount;
26387       }
26388       else if (isOneWay) {
26389           forward = laneCount;
26390           bothways = 0;
26391           backward = 0;
26392       }
26393       else if (isNaN$1(forward) && isNaN$1(backward)) {
26394           backward = Math.floor((laneCount - bothways) / 2);
26395           forward = laneCount - bothways - backward;
26396       }
26397       else if (isNaN$1(forward)) {
26398           if (backward > laneCount - bothways) {
26399               backward = laneCount - bothways;
26400           }
26401           forward = laneCount - bothways - backward;
26402       }
26403       else if (isNaN$1(backward)) {
26404           if (forward > laneCount - bothways) {
26405               forward = laneCount - bothways;
26406           }
26407           backward = laneCount - bothways - forward;
26408       }
26409       return {
26410           forward: forward,
26411           backward: backward,
26412           bothways: bothways
26413       };
26414   }
26415
26416
26417   function parseTurnLanes(tag){
26418       if (!tag) return;
26419
26420       var validValues = [
26421           'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
26422           'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
26423       ];
26424
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;
26431                   });
26432           });
26433   }
26434
26435
26436   function parseMaxspeedLanes(tag, maxspeed) {
26437       if (!tag) return;
26438
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;
26445           });
26446   }
26447
26448
26449   function parseMiscLanes(tag) {
26450       if (!tag) return;
26451
26452       var validValues = [
26453           'yes', 'no', 'designated'
26454       ];
26455
26456       return tag.split('|')
26457           .map(function (s) {
26458               if (s === '') s = 'no';
26459               return validValues.indexOf(s) === -1 ? 'unknown': s;
26460           });
26461   }
26462
26463
26464   function parseBicycleWay(tag) {
26465       if (!tag) return;
26466
26467       var validValues = [
26468           'yes', 'no', 'designated', 'lane'
26469       ];
26470
26471       return tag.split('|')
26472           .map(function (s) {
26473               if (s === '') s = 'no';
26474               return validValues.indexOf(s) === -1 ? 'unknown': s;
26475           });
26476   }
26477
26478
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;
26483       });
26484       if (data.backward) data.backward.forEach(function(l, i) {
26485           if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
26486           lanesObj.backward[i][key] = l;
26487       });
26488       if (data.unspecified) data.unspecified.forEach(function(l, i) {
26489           if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
26490           lanesObj.unspecified[i][key] = l;
26491       });
26492   }
26493
26494   /** Used to compose bitmasks for cloning. */
26495   var CLONE_DEEP_FLAG$2 = 1,
26496       CLONE_SYMBOLS_FLAG$3 = 4;
26497
26498   /**
26499    * This method is like `_.clone` except that it recursively clones `value`.
26500    *
26501    * @static
26502    * @memberOf _
26503    * @since 1.0.0
26504    * @category Lang
26505    * @param {*} value The value to recursively clone.
26506    * @returns {*} Returns the deep cloned value.
26507    * @see _.clone
26508    * @example
26509    *
26510    * var objects = [{ 'a': 1 }, { 'b': 2 }];
26511    *
26512    * var deep = _.cloneDeep(objects);
26513    * console.log(deep[0] === objects[0]);
26514    * // => false
26515    */
26516   function cloneDeep(value) {
26517     return baseClone(value, CLONE_DEEP_FLAG$2 | CLONE_SYMBOLS_FLAG$3);
26518   }
26519
26520   /**
26521    * Gets the timestamp of the number of milliseconds that have elapsed since
26522    * the Unix epoch (1 January 1970 00:00:00 UTC).
26523    *
26524    * @static
26525    * @memberOf _
26526    * @since 2.4.0
26527    * @category Date
26528    * @returns {number} Returns the timestamp.
26529    * @example
26530    *
26531    * _.defer(function(stamp) {
26532    *   console.log(_.now() - stamp);
26533    * }, _.now());
26534    * // => Logs the number of milliseconds it took for the deferred invocation.
26535    */
26536   var now$1 = function() {
26537     return root$2.Date.now();
26538   };
26539
26540   /** Error message constants. */
26541   var FUNC_ERROR_TEXT$2 = 'Expected a function';
26542
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;
26546
26547   /**
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`
26556    * invocation.
26557    *
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.
26561    *
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`.
26564    *
26565    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
26566    * for details over the differences between `_.debounce` and `_.throttle`.
26567    *
26568    * @static
26569    * @memberOf _
26570    * @since 0.1.0
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.
26582    * @example
26583    *
26584    * // Avoid costly calculations while the window size is in flux.
26585    * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
26586    *
26587    * // Invoke `sendMail` when clicked, debouncing subsequent calls.
26588    * jQuery(element).on('click', _.debounce(sendMail, 300, {
26589    *   'leading': true,
26590    *   'trailing': false
26591    * }));
26592    *
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);
26597    *
26598    * // Cancel the trailing debounced invocation.
26599    * jQuery(window).on('popstate', debounced.cancel);
26600    */
26601   function debounce(func, wait, options) {
26602     var lastArgs,
26603         lastThis,
26604         maxWait,
26605         result,
26606         timerId,
26607         lastCallTime,
26608         lastInvokeTime = 0,
26609         leading = false,
26610         maxing = false,
26611         trailing = true;
26612
26613     if (typeof func != 'function') {
26614       throw new TypeError(FUNC_ERROR_TEXT$2);
26615     }
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;
26622     }
26623
26624     function invokeFunc(time) {
26625       var args = lastArgs,
26626           thisArg = lastThis;
26627
26628       lastArgs = lastThis = undefined;
26629       lastInvokeTime = time;
26630       result = func.apply(thisArg, args);
26631       return result;
26632     }
26633
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;
26641     }
26642
26643     function remainingWait(time) {
26644       var timeSinceLastCall = time - lastCallTime,
26645           timeSinceLastInvoke = time - lastInvokeTime,
26646           timeWaiting = wait - timeSinceLastCall;
26647
26648       return maxing
26649         ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
26650         : timeWaiting;
26651     }
26652
26653     function shouldInvoke(time) {
26654       var timeSinceLastCall = time - lastCallTime,
26655           timeSinceLastInvoke = time - lastInvokeTime;
26656
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));
26662     }
26663
26664     function timerExpired() {
26665       var time = now$1();
26666       if (shouldInvoke(time)) {
26667         return trailingEdge(time);
26668       }
26669       // Restart the timer.
26670       timerId = setTimeout(timerExpired, remainingWait(time));
26671     }
26672
26673     function trailingEdge(time) {
26674       timerId = undefined;
26675
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);
26680       }
26681       lastArgs = lastThis = undefined;
26682       return result;
26683     }
26684
26685     function cancel() {
26686       if (timerId !== undefined) {
26687         clearTimeout(timerId);
26688       }
26689       lastInvokeTime = 0;
26690       lastArgs = lastCallTime = lastThis = timerId = undefined;
26691     }
26692
26693     function flush() {
26694       return timerId === undefined ? result : trailingEdge(now$1());
26695     }
26696
26697     function debounced() {
26698       var time = now$1(),
26699           isInvoking = shouldInvoke(time);
26700
26701       lastArgs = arguments;
26702       lastThis = this;
26703       lastCallTime = time;
26704
26705       if (isInvoking) {
26706         if (timerId === undefined) {
26707           return leadingEdge(lastCallTime);
26708         }
26709         if (maxing) {
26710           // Handle invocations in a tight loop.
26711           timerId = setTimeout(timerExpired, wait);
26712           return invokeFunc(lastCallTime);
26713         }
26714       }
26715       if (timerId === undefined) {
26716         timerId = setTimeout(timerExpired, wait);
26717       }
26718       return result;
26719     }
26720     debounced.cancel = cancel;
26721     debounced.flush = flush;
26722     return debounced;
26723   }
26724
26725   /**
26726    * Casts `value` to `identity` if it's not a function.
26727    *
26728    * @private
26729    * @param {*} value The value to inspect.
26730    * @returns {Function} Returns cast function.
26731    */
26732   function castFunction(value) {
26733     return typeof value == 'function' ? value : identity$8;
26734   }
26735
26736   /**
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`.
26740    *
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.
26744    *
26745    * @static
26746    * @memberOf _
26747    * @since 0.1.0
26748    * @alias each
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
26754    * @example
26755    *
26756    * _.forEach([1, 2], function(value) {
26757    *   console.log(value);
26758    * });
26759    * // => Logs `1` then `2`.
26760    *
26761    * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
26762    *   console.log(key);
26763    * });
26764    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
26765    */
26766   function forEach(collection, iteratee) {
26767     var func = isArray(collection) ? arrayEach : baseEach;
26768     return func(collection, castFunction(iteratee));
26769   }
26770
26771   /**
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`.
26776    *
26777    * @static
26778    * @memberOf _
26779    * @since 0.3.0
26780    * @category Object
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
26785    * @example
26786    *
26787    * function Foo() {
26788    *   this.a = 1;
26789    *   this.b = 2;
26790    * }
26791    *
26792    * Foo.prototype.c = 3;
26793    *
26794    * _.forOwn(new Foo, function(value, key) {
26795    *   console.log(key);
26796    * });
26797    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
26798    */
26799   function forOwn(object, iteratee) {
26800     return object && baseForOwn(object, castFunction(iteratee));
26801   }
26802
26803   var translations = Object.create(null);
26804
26805   var currentLocale = 'en';
26806   var textDirection = 'ltr';
26807
26808   function setLocale(_) {
26809       if (translations[_] !== undefined) {
26810           currentLocale = _;
26811       } else if (translations[_.split('-')[0]]) {
26812           currentLocale = _.split('-')[0];
26813       }
26814   }
26815
26816   function addTranslation(id, value) {
26817       translations[id] = value;
26818   }
26819
26820   /**
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.
26824    *
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
26829    */
26830   function t(s, o, loc) {
26831       loc = loc || currentLocale;
26832
26833       var path = s
26834           .split('.')
26835           .map(function (s) { return s.replace('<TX_DOT>', '.'); })
26836           .reverse();
26837
26838       var rep = translations[loc];
26839
26840       while (rep !== undefined && path.length) {
26841           rep = rep[path.pop()];
26842       }
26843
26844       if (rep !== undefined) {
26845           if (o) {
26846               for (var k in o) {
26847                   rep = rep.replace('{' + k + '}', o[k]);
26848               }
26849           }
26850           return rep;
26851       }
26852
26853       if (loc !== 'en') {
26854           return t(s, o, 'en');
26855       }
26856
26857       if (o && 'default' in o) {
26858           return o.default;
26859       }
26860
26861       var missing = 'Missing ' + loc + ' translation: ' + s;
26862       if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
26863
26864       return missing;
26865   }
26866
26867   /**
26868    * Given string 'ltr' or 'rtl', save that setting
26869    *
26870    * @param {string} dir ltr or rtl
26871    */
26872
26873   function setTextDirection(dir) {
26874       textDirection = dir;
26875   }
26876
26877   /** Used to compose bitmasks for cloning. */
26878   var CLONE_DEEP_FLAG$3 = 1,
26879       CLONE_SYMBOLS_FLAG$4 = 4;
26880
26881   /**
26882    * This method is like `_.cloneWith` except that it recursively clones `value`.
26883    *
26884    * @static
26885    * @memberOf _
26886    * @since 4.0.0
26887    * @category Lang
26888    * @param {*} value The value to recursively clone.
26889    * @param {Function} [customizer] The function to customize cloning.
26890    * @returns {*} Returns the deep cloned value.
26891    * @see _.cloneWith
26892    * @example
26893    *
26894    * function customizer(value) {
26895    *   if (_.isElement(value)) {
26896    *     return value.cloneNode(true);
26897    *   }
26898    * }
26899    *
26900    * var el = _.cloneDeepWith(document.body, customizer);
26901    *
26902    * console.log(el === document.body);
26903    * // => false
26904    * console.log(el.nodeName);
26905    * // => 'BODY'
26906    * console.log(el.childNodes.length);
26907    * // => 20
26908    */
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);
26912   }
26913
26914   /**
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.
26919    *
26920    * **Note:** Unlike `_.pullAll`, this method returns a new array.
26921    *
26922    * @static
26923    * @memberOf _
26924    * @since 0.1.0
26925    * @category 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
26930    * @example
26931    *
26932    * _.difference([2, 1], [2, 3]);
26933    * // => [1]
26934    */
26935   var difference = baseRest(function(array, values) {
26936     return isArrayLikeObject(array)
26937       ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
26938       : [];
26939   });
26940
26941   /** `Object#toString` result references. */
26942   var mapTag$7 = '[object Map]',
26943       setTag$7 = '[object Set]';
26944
26945   /** Used for built-in method references. */
26946   var objectProto$h = Object.prototype;
26947
26948   /** Used to check objects for own properties. */
26949   var hasOwnProperty$e = objectProto$h.hasOwnProperty;
26950
26951   /**
26952    * Checks if `value` is an empty object, collection, map, or set.
26953    *
26954    * Objects are considered empty if they have no own enumerable string keyed
26955    * properties.
26956    *
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`.
26960    *
26961    * @static
26962    * @memberOf _
26963    * @since 0.1.0
26964    * @category Lang
26965    * @param {*} value The value to check.
26966    * @returns {boolean} Returns `true` if `value` is empty, else `false`.
26967    * @example
26968    *
26969    * _.isEmpty(null);
26970    * // => true
26971    *
26972    * _.isEmpty(true);
26973    * // => true
26974    *
26975    * _.isEmpty(1);
26976    * // => true
26977    *
26978    * _.isEmpty([1, 2, 3]);
26979    * // => false
26980    *
26981    * _.isEmpty({ 'a': 1 });
26982    * // => false
26983    */
26984   function isEmpty(value) {
26985     if (value == null) {
26986       return true;
26987     }
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;
26992     }
26993     var tag = getTag$1(value);
26994     if (tag == mapTag$7 || tag == setTag$7) {
26995       return !value.size;
26996     }
26997     if (isPrototype(value)) {
26998       return !baseKeys(value).length;
26999     }
27000     for (var key in value) {
27001       if (hasOwnProperty$e.call(value, key)) {
27002         return false;
27003       }
27004     }
27005     return true;
27006   }
27007
27008   var detected;
27009
27010   function utilDetect(force) {
27011       if (detected && !force) return detected;
27012       detected = {};
27013
27014       var ua = navigator.userAgent,
27015           m = null;
27016
27017       m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
27018       if (m !== null) {
27019           detected.browser = m[1];
27020           detected.version = m[2];
27021       }
27022       if (!detected.browser) {
27023           m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
27024           if (m !== null) {
27025               detected.browser = 'msie';
27026               detected.version = m[1];
27027           }
27028       }
27029       if (!detected.browser) {
27030           m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
27031           if (m !== null) {
27032               detected.browser = 'Opera';
27033               detected.version = m[2];
27034           }
27035       }
27036       if (!detected.browser) {
27037           m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
27038           if (m !== null) {
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];
27043           }
27044       }
27045       if (!detected.browser) {
27046           detected.browser = navigator.appName;
27047           detected.version = navigator.appVersion;
27048       }
27049
27050       // keep major.minor version only..
27051       detected.version = detected.version.split(/\W/).slice(0,2).join('.');
27052
27053       if (detected.browser.toLowerCase() === 'msie') {
27054           detected.ie = true;
27055           detected.browser = 'Internet Explorer';
27056           detected.support = parseFloat(detected.version) >= 11;
27057       } else {
27058           detected.ie = false;
27059           detected.support = true;
27060       }
27061
27062       // Added due to incomplete svg style support. See #715
27063       detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
27064
27065       detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
27066       detected.language = detected.locale.split('-')[0];
27067
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('-');
27073
27074           detected.locale = code0;
27075           detected.language = parts0[0];
27076
27077           if (navigator.languages.length > 1 && parts0.length === 1) {
27078               var code1 = navigator.languages[1],
27079                   parts1 = code1.split('-');
27080
27081               if (parts1[0] === parts0[0]) {
27082                   detected.locale = code1;
27083               }
27084           }
27085       }
27086
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];
27093       }
27094
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';
27100       } else {
27101           detected.textDirection = 'ltr';
27102       }
27103       setTextDirection(detected.textDirection);
27104
27105       // detect host
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: '');
27110       }
27111
27112       detected.host = origin + loc.pathname;
27113
27114       detected.filedrop = (window.FileReader && 'ondrop' in window);
27115
27116       detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
27117
27118       detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
27119
27120       function nav(x) {
27121           return navigator.userAgent.indexOf(x) !== -1;
27122       }
27123
27124       if (nav('Win')) {
27125           detected.os = 'win';
27126           detected.platform = 'Windows';
27127       }
27128       else if (nav('Mac')) {
27129           detected.os = 'mac';
27130           detected.platform = 'Macintosh';
27131       }
27132       else if (nav('X11') || nav('Linux')) {
27133           detected.os = 'linux';
27134           detected.platform = 'Linux';
27135       }
27136       else {
27137           detected.os = 'win';
27138           detected.platform = 'Unknown';
27139       }
27140
27141       return detected;
27142   }
27143
27144   var remove$1 = removeDiacritics;
27145
27146   var replacementList = [
27147     {
27148       base: ' ',
27149       chars: "\u00A0",
27150     }, {
27151       base: '0',
27152       chars: "\u07C0",
27153     }, {
27154       base: 'A',
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",
27156     }, {
27157       base: 'AA',
27158       chars: "\uA732",
27159     }, {
27160       base: 'AE',
27161       chars: "\u00C6\u01FC\u01E2",
27162     }, {
27163       base: 'AO',
27164       chars: "\uA734",
27165     }, {
27166       base: 'AU',
27167       chars: "\uA736",
27168     }, {
27169       base: 'AV',
27170       chars: "\uA738\uA73A",
27171     }, {
27172       base: 'AY',
27173       chars: "\uA73C",
27174     }, {
27175       base: 'B',
27176       chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
27177     }, {
27178       base: 'C',
27179       chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
27180     }, {
27181       base: 'D',
27182       chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
27183     }, {
27184       base: 'Dh',
27185       chars: "\u00D0",
27186     }, {
27187       base: 'DZ',
27188       chars: "\u01F1\u01C4",
27189     }, {
27190       base: 'Dz',
27191       chars: "\u01F2\u01C5",
27192     }, {
27193       base: 'E',
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",
27195     }, {
27196       base: 'F',
27197       chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
27198     }, {
27199       base: 'G',
27200       chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
27201     }, {
27202       base: 'H',
27203       chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
27204     }, {
27205       base: 'I',
27206       chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
27207     }, {
27208       base: 'J',
27209       chars: "\u24BF\uFF2A\u0134\u0248\u0237",
27210     }, {
27211       base: 'K',
27212       chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
27213     }, {
27214       base: 'L',
27215       chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
27216     }, {
27217       base: 'LJ',
27218       chars: "\u01C7",
27219     }, {
27220       base: 'Lj',
27221       chars: "\u01C8",
27222     }, {
27223       base: 'M',
27224       chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
27225     }, {
27226       base: 'N',
27227       chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
27228     }, {
27229       base: 'NJ',
27230       chars: "\u01CA",
27231     }, {
27232       base: 'Nj',
27233       chars: "\u01CB",
27234     }, {
27235       base: 'O',
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",
27237     }, {
27238       base: 'OE',
27239       chars: "\u0152",
27240     }, {
27241       base: 'OI',
27242       chars: "\u01A2",
27243     }, {
27244       base: 'OO',
27245       chars: "\uA74E",
27246     }, {
27247       base: 'OU',
27248       chars: "\u0222",
27249     }, {
27250       base: 'P',
27251       chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
27252     }, {
27253       base: 'Q',
27254       chars: "\u24C6\uFF31\uA756\uA758\u024A",
27255     }, {
27256       base: 'R',
27257       chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
27258     }, {
27259       base: 'S',
27260       chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
27261     }, {
27262       base: 'T',
27263       chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
27264     }, {
27265       base: 'Th',
27266       chars: "\u00DE",
27267     }, {
27268       base: 'TZ',
27269       chars: "\uA728",
27270     }, {
27271       base: 'U',
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",
27273     }, {
27274       base: 'V',
27275       chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
27276     }, {
27277       base: 'VY',
27278       chars: "\uA760",
27279     }, {
27280       base: 'W',
27281       chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
27282     }, {
27283       base: 'X',
27284       chars: "\u24CD\uFF38\u1E8A\u1E8C",
27285     }, {
27286       base: 'Y',
27287       chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
27288     }, {
27289       base: 'Z',
27290       chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
27291     }, {
27292       base: 'a',
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",
27294     }, {
27295       base: 'aa',
27296       chars: "\uA733",
27297     }, {
27298       base: 'ae',
27299       chars: "\u00E6\u01FD\u01E3",
27300     }, {
27301       base: 'ao',
27302       chars: "\uA735",
27303     }, {
27304       base: 'au',
27305       chars: "\uA737",
27306     }, {
27307       base: 'av',
27308       chars: "\uA739\uA73B",
27309     }, {
27310       base: 'ay',
27311       chars: "\uA73D",
27312     }, {
27313       base: 'b',
27314       chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
27315     }, {
27316       base: 'c',
27317       chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
27318     }, {
27319       base: 'd',
27320       chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
27321     }, {
27322       base: 'dh',
27323       chars: "\u00F0",
27324     }, {
27325       base: 'dz',
27326       chars: "\u01F3\u01C6",
27327     }, {
27328       base: 'e',
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",
27330     }, {
27331       base: 'f',
27332       chars: "\u24D5\uFF46\u1E1F\u0192",
27333     }, {
27334       base: 'ff',
27335       chars: "\uFB00",
27336     }, {
27337       base: 'fi',
27338       chars: "\uFB01",
27339     }, {
27340       base: 'fl',
27341       chars: "\uFB02",
27342     }, {
27343       base: 'ffi',
27344       chars: "\uFB03",
27345     }, {
27346       base: 'ffl',
27347       chars: "\uFB04",
27348     }, {
27349       base: 'g',
27350       chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
27351     }, {
27352       base: 'h',
27353       chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
27354     }, {
27355       base: 'hv',
27356       chars: "\u0195",
27357     }, {
27358       base: 'i',
27359       chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
27360     }, {
27361       base: 'j',
27362       chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
27363     }, {
27364       base: 'k',
27365       chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
27366     }, {
27367       base: 'l',
27368       chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
27369     }, {
27370       base: 'lj',
27371       chars: "\u01C9",
27372     }, {
27373       base: 'm',
27374       chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
27375     }, {
27376       base: 'n',
27377       chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
27378     }, {
27379       base: 'nj',
27380       chars: "\u01CC",
27381     }, {
27382       base: 'o',
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",
27384     }, {
27385       base: 'oe',
27386       chars: "\u0153",
27387     }, {
27388       base: 'oi',
27389       chars: "\u01A3",
27390     }, {
27391       base: 'oo',
27392       chars: "\uA74F",
27393     }, {
27394       base: 'ou',
27395       chars: "\u0223",
27396     }, {
27397       base: 'p',
27398       chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
27399     }, {
27400       base: 'q',
27401       chars: "\u24E0\uFF51\u024B\uA757\uA759",
27402     }, {
27403       base: 'r',
27404       chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
27405     }, {
27406       base: 's',
27407       chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
27408     }, {
27409       base: 'ss',
27410       chars: "\xDF",
27411     }, {
27412       base: 't',
27413       chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
27414     }, {
27415       base: 'th',
27416       chars: "\u00FE",
27417     }, {
27418       base: 'tz',
27419       chars: "\uA729",
27420     }, {
27421       base: 'u',
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",
27423     }, {
27424       base: 'v',
27425       chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
27426     }, {
27427       base: 'vy',
27428       chars: "\uA761",
27429     }, {
27430       base: 'w',
27431       chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
27432     }, {
27433       base: 'x',
27434       chars: "\u24E7\uFF58\u1E8B\u1E8D",
27435     }, {
27436       base: 'y',
27437       chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
27438     }, {
27439       base: 'z',
27440       chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
27441     }
27442   ];
27443
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;
27449     }
27450   }
27451
27452   function removeDiacritics(str) {
27453     return str.replace(/[^\u0000-\u007e]/g, function(c) {
27454       return diacriticsMap[c] || c;
27455     });
27456   }
27457
27458   // see https://github.com/openstreetmap/iD/pull/3707
27459   // https://gist.github.com/mapmeld/556b09ddec07a2044c76e1ef45f01c60
27460
27461   var chars$1 = {
27462       // madda above alef
27463       1570: { initial: 'آ‎', isolated: 'ﺁ', medial: 'ﺁ', final: 'ﺂ' },
27464
27465       // hamza above and below alef
27466       1571: { initial: 'أ', isolated: 'ﺃ', medial: '', final: 'ﺄ' },
27467       // 1572 is ؤ
27468       1573: { initial: 'إ', isolated: 'ﺇ', medial: '', final: 'ﺈ' },
27469       // 1574 is ئ
27470       1575: { initial: 'ا', isolated: 'ا', medial: '', final: 'ﺎ' },
27471       1576: { initial: 'ﺑ', isolated: 'ﺏ', medial: 'ﺒ', final: 'ﺐ' },
27472
27473       // 1577 ة
27474       1577: { initial: '', isolated: 'ة', medial: '', final: 'ﺔ' },
27475
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: 'ﻎ' },
27494
27495       // 1595 ػ - may be very rare
27496
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: 'ﻮ' },
27504
27505       // 1609 ى
27506       1609: { initial: 'ﯨ', isolated: 'ﻯ', medial: 'ﯩ', final: 'ﻰ' },
27507       // 1610 ي
27508       1610: { initial: 'ﻳ', isolated: 'ﻱ', medial: 'ﻴ', final: 'ﻲ' },
27509
27510       // short vowel sounds / tashkil markings
27511
27512       1662: { initial: 'ﭘ', isolated: 'ﭖ', medial: 'ﭙ', final: 'ﭗ' },
27513
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: 'ﻼ' }
27520   };
27521
27522   var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
27523
27524   function fixRTLTextForSvg(inputText) {
27525       var context = true;
27526       var ret = '';
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]/;
27532
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)) {
27540                   rtlBuffer.push(c);
27541               } else if (c === ' ' && rtlBuffer.length) {
27542                   // whitespace within RTL text
27543                   rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
27544               } else {
27545                   // non-RTL character
27546                   ret += rtlBuffer.reverse().join('') + c;
27547                   rtlBuffer = [];
27548               }
27549           }
27550       } else {
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;
27554
27555               if (!chars$1[code]) {
27556                   if (code === 32 && rtlBuffer.length) {
27557                       // whitespace
27558                       rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
27559                   } else if (arabicTashkil.test(inputText[i]) && rtlBuffer.length) {
27560                       // tashkil mark
27561                       rtlBuffer[rtlBuffer.length - 1] += inputText[i];
27562                   } else {
27563                       // non-RTL character
27564                       ret += rtlBuffer.reverse().join('') + inputText[i];
27565                       rtlBuffer = [];
27566                   }
27567                   continue;
27568               }
27569               if (context) {
27570                   if (i === l - 1 || nextCode === 32) {
27571                       rtlBuffer.push(chars$1[code].isolated);
27572                   } else {
27573                       // special case for لا
27574                       if (code === 1604 && nextCode === 1575) {
27575                           rtlBuffer.push(chars$1[5000].initial);
27576                           i++;
27577                           context = true;
27578                           continue;
27579                       }
27580                       rtlBuffer.push(chars$1[code].initial);
27581                   }
27582               } else {
27583                   if (i === l - 1 || nextCode === 32){
27584                       rtlBuffer.push(chars$1[code].final);
27585                   } else {
27586                       // special case for ﻼ
27587                       if (code === 1604 && nextCode === 1575){
27588                           rtlBuffer.push(chars$1[5000].final);
27589                           i++;
27590                           context = true;
27591                           continue;
27592                       }
27593                       if (chars$1[code].medial === ''){
27594                           rtlBuffer.push(chars$1[code].final);
27595                       } else {
27596                           rtlBuffer.push(chars$1[code].medial);
27597                       }
27598                   }
27599               }
27600               context = (chars$1[code].medial === '') || nextCode === 32;
27601           }
27602       }
27603       ret += rtlBuffer.reverse().join('');
27604       return ret;
27605   }
27606
27607   function utilTagText(entity) {
27608       return map$3(entity.tags, function(v, k) {
27609           return k + '=' + v;
27610       }).join(', ');
27611   }
27612
27613
27614   function utilEntitySelector(ids) {
27615       return ids.length ? '.' + ids.join(',.') : 'nothing';
27616   }
27617
27618
27619   function utilEntityOrMemberSelector(ids, graph) {
27620       var s = utilEntitySelector(ids);
27621
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;
27627               });
27628           }
27629       });
27630
27631       return s;
27632   }
27633
27634
27635   function utilGetAllNodes(ids, graph) {
27636       var seen = {};
27637       var nodes = [];
27638       ids.forEach(getNodes);
27639       return nodes;
27640
27641       function getNodes(id) {
27642           if (seen[id]) return;
27643           seen[id] = true;
27644
27645           var entity = graph.hasEntity(id);
27646           if (!entity) return;
27647
27648           if (entity.type === 'node') {
27649               nodes.push(entity);
27650           } else if (entity.type === 'way') {
27651               entity.nodes.forEach(getNodes);
27652           } else {
27653               entity.members.map(function(member) { return member.id; }).forEach(getNodes);
27654           }
27655       }
27656   }
27657
27658
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;
27663
27664       if (!name && entity.tags.ref) {
27665           name = entity.tags.ref;
27666           if (network) {
27667               name = network + ' ' + name;
27668           }
27669       }
27670
27671       return name;
27672   }
27673
27674
27675   function utilDisplayNameForPath(entity) {
27676       var name = utilDisplayName(entity);
27677       var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
27678
27679       if (!isFirefox && name && rtlRegex.test(name)) {
27680           name = fixRTLTextForSvg(name);
27681       }
27682
27683       return name;
27684   }
27685
27686
27687   function utilDisplayType(id) {
27688       return {
27689           n: t('inspector.node'),
27690           w: t('inspector.way'),
27691           r: t('inspector.relation')
27692       }[id.charAt(0)];
27693   }
27694
27695
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]);
27701           }
27702           return obj;
27703       }, {});
27704   }
27705
27706
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);
27712       }
27713       return Object.keys(obj).sort().map(function(key) {
27714           return encodeURIComponent(key) + '=' + (
27715               noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
27716       }).join('&');
27717   }
27718
27719
27720   function utilPrefixDOMProperty(property) {
27721       var prefixes = ['webkit', 'ms', 'moz', 'o'],
27722           i = -1,
27723           n = prefixes.length,
27724           s = document.body;
27725
27726       if (property in s)
27727           return property;
27728
27729       property = property.substr(0, 1).toUpperCase() + property.substr(1);
27730
27731       while (++i < n)
27732           if (prefixes[i] + property in s)
27733               return prefixes[i] + property;
27734
27735       return false;
27736   }
27737
27738
27739   function utilPrefixCSSProperty(property) {
27740       var prefixes = ['webkit', 'ms', 'Moz', 'O'],
27741           i = -1,
27742           n = prefixes.length,
27743           s = document.body.style;
27744
27745       if (property.toLowerCase() in s)
27746           return property.toLowerCase();
27747
27748       while (++i < n)
27749           if (prefixes[i] + property in s)
27750               return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
27751
27752       return false;
27753   }
27754
27755
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 + ')' : ''));
27763   }
27764
27765
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;
27774       var matrix = [];
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];
27781               } else {
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
27785               }
27786           }
27787       }
27788       return matrix[b.length][a.length];
27789   }
27790
27791
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') {
27802           rectLeft = 0;
27803       }
27804       return function(e) {
27805           return [
27806               e.clientX - rectLeft - clientLeft,
27807               e.clientY - rectTop - clientTop];
27808       };
27809   }
27810
27811
27812   /* eslint-disable no-proto */
27813   var utilGetPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
27814   /* eslint-enable no-proto */
27815
27816
27817   function utilAsyncMap(inputs, func, callback) {
27818       var remaining = inputs.length,
27819           results = [],
27820           errors = [];
27821
27822       inputs.forEach(function(d, i) {
27823           func(d, function done(err, data) {
27824               errors[i] = err;
27825               results[i] = data;
27826               remaining--;
27827               if (!remaining) callback(errors, results);
27828           });
27829       });
27830   }
27831
27832
27833   // wraps an index to an interval [0..length-1]
27834   function utilWrap(index, length) {
27835       if (index < 0)
27836           index += Math.ceil(-index/length)*length;
27837       return index % length;
27838   }
27839
27840
27841   /**
27842    * a replacement for functor
27843    *
27844    * @param {*} value any value
27845    * @returns {Function} a function that returns that value or the value if it's a function
27846    */
27847   function utilFunctor(value) {
27848       if (typeof value === 'function') return value;
27849       return function() {
27850           return value;
27851       };
27852   }
27853
27854
27855   function utilNoAuto(selection) {
27856       var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
27857
27858       return selection
27859           .attr('autocomplete', 'off')
27860           .attr('autocorrect', 'off')
27861           .attr('autocapitalize', 'off')
27862           .attr('spellcheck', isText ? 'true' : 'false');
27863   }
27864
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;
27870           var that = this;
27871           window.requestIdleCallback(function() {
27872               func.apply(that, args);
27873           }, {timeout: timeout});
27874       };
27875   }
27876
27877   function utilCleanTags(tags) {
27878       var out = {};
27879       for (var k in tags) {
27880           if (!k) continue;
27881           var v = tags[k];
27882           if (v !== undefined) {
27883               out[k] = cleanValue(k, v);
27884           }
27885       }
27886
27887       return out;
27888
27889
27890       function cleanValue(k, v) {
27891           function keepSpaces(k) {
27892               return /_hours|_times|:conditional$/.test(k);
27893           }
27894
27895           function skip(k) {
27896               return /^(description|note|fixme)$/.test(k);
27897           }
27898
27899           if (skip(k)) return v;
27900
27901           var cleaned = v
27902               .split(';')
27903               .map(function(s) { return s.trim(); })
27904               .join(keepSpaces(k) ? '; ' : ';');
27905
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) {
27912               cleaned = cleaned
27913                   .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
27914
27915           }
27916
27917           return cleaned;
27918       }
27919   }
27920
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() {
27926               delete this.value;
27927           }
27928
27929           function valueConstant() {
27930               if (this.value !== value) {
27931                   this.value = value;
27932               }
27933           }
27934
27935           function valueFunction() {
27936               var x = value.apply(this, arguments);
27937               if (x == null) {
27938                   delete this.value;
27939               } else if (this.value !== x) {
27940                   this.value = x;
27941               }
27942           }
27943
27944           return value == null
27945               ? valueNull : (typeof value === 'function'
27946               ? valueFunction : valueConstant);
27947       }
27948
27949       if (arguments.length === 1) {
27950           return selection.property('value');
27951       }
27952
27953       return selection.each(d3_selection_value(value));
27954   }
27955
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);
27961       }
27962       callback(results);
27963
27964       // var processed = [];
27965       // var currentPos = 0;
27966       // var totalTasks = tasks.length;
27967
27968       // function worker(deadline) {
27969       //     while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
27970       //         var result = processor(tasks[currentPos]);
27971
27972       //         // if falsy dont add to the processed list
27973       //         if (result) processed.push(result);
27974       //         currentPos++;
27975       //     }
27976
27977       //     // more tasks are left, we might need more idleCallbacks
27978       //     if (currentPos < totalTasks) {
27979       //         return window.requestIdleCallback(function(deadline) {worker(deadline);});
27980       //     }
27981
27982       //     // tasks are completed
27983       //     return callback(processed);
27984       // }
27985
27986       // window.requestIdleCallback(function(deadline) {worker(deadline);});
27987   }
27988
27989   // shim
27990   window.requestIdleCallback =
27991       window.requestIdleCallback ||
27992       function(cb) {
27993           var start = Date.now();
27994           return setTimeout(function() {
27995               cb({
27996                   didTimeout: false,
27997                   timeRemaining: function() {
27998                       return Math.max(0, 50 - (Date.now() - start));
27999                   }
28000               });
28001           }, 1);
28002       };
28003
28004   window.cancelIdleCallback =
28005       window.cancelIdleCallback ||
28006       function(id) {
28007           clearTimeout(id);
28008       };
28009
28010   // Copies a variable number of methods from source to target.
28011   function utilRebind(target, source) {
28012       var i = 1, n = arguments.length, method;
28013       while (++i < n) {
28014           target[method = arguments[i]] = d3_rebind(target, source, source[method]);
28015       }
28016       return target;
28017   }
28018
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;
28026       };
28027   }
28028
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.
28032
28033   // This accepts a string and returns an object that complies with utilSessionMutexType
28034   function utilSessionMutex(name) {
28035       var mutex = {};
28036       var intervalID;
28037
28038       function renew() {
28039           var expires = new Date();
28040           expires.setSeconds(expires.getSeconds() + 5);
28041           document.cookie = name + '=1; expires=' + expires.toUTCString();
28042       }
28043
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;
28048           renew();
28049           intervalID = window.setInterval(renew, 4000);
28050           return true;
28051       };
28052
28053       mutex.unlock = function () {
28054           if (!intervalID) return;
28055           document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
28056           clearInterval(intervalID);
28057           intervalID = null;
28058       };
28059
28060       mutex.locked = function () {
28061           return !!intervalID;
28062       };
28063
28064       return mutex;
28065   }
28066
28067   function utilSuggestNames(preset, suggestions) {
28068       preset = preset.id.split('/', 2);
28069       var k = preset[0],
28070           v = preset[1];
28071
28072       return function(value, callback) {
28073           var result = [];
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));
28078                       if (dist < 3) {
28079                           result.push({
28080                               title: sugg,
28081                               value: sugg,
28082                               dist: dist
28083                           });
28084                       }
28085                   }
28086               }
28087               result.sort(function(a, b) {
28088                   return a.dist - b.dist;
28089               });
28090           }
28091           result = result.slice(0,3);
28092           callback(result);
28093       };
28094   }
28095
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);
28101       });
28102   }
28103
28104   function validationDeprecatedTag() {
28105
28106       var validation = function(changes) {
28107           var warnings = [];
28108           for (var i = 0; i < changes.created.length; i++) {
28109               var change = changes.created[i],
28110                   deprecatedTags = change.deprecatedTags();
28111
28112               if (!isEmpty(deprecatedTags)) {
28113                   var tags = utilTagText({ tags: deprecatedTags });
28114                   warnings.push({
28115                       id: 'deprecated_tags',
28116                       message: t('validations.deprecated_tags', { tags: tags }),
28117                       entity: change
28118                   });
28119               }
28120           }
28121
28122           return warnings;
28123       };
28124
28125
28126       return validation;
28127   }
28128
28129   function validationDisconnectedHighway() {
28130
28131       function isDisconnectedHighway(entity, graph) {
28132           if (!entity.tags.highway) return false;
28133           if (entity.geometry(graph) !== 'line') return false;
28134
28135           return graph.childNodes(entity)
28136               .every(function(vertex) {
28137                   var parents = graph.parentWays(vertex);
28138                   if (parents.length === 1) {  // standalone vertex
28139                       return true;
28140                   } else {                     // shared vertex
28141                       return !vertex.tags.entrance &&
28142                           parents.filter(function(parent) {
28143                               return parent.tags.highway && parent !== entity;
28144                           }).length === 0;
28145                   }
28146               });
28147       }
28148
28149
28150       var validation = function(changes, graph) {
28151           var warnings = [];
28152           for (var i = 0; i < changes.created.length; i++) {
28153               var entity = changes.created[i];
28154
28155               if (isDisconnectedHighway(entity, graph)) {
28156                   warnings.push({
28157                       id: 'disconnected_highway',
28158                       message: t('validations.disconnected_highway'),
28159                       tooltip: t('validations.disconnected_highway_tooltip'),
28160                       entity: entity
28161                   });
28162               }
28163           }
28164
28165           return warnings;
28166       };
28167
28168
28169       return validation;
28170   }
28171
28172   function validationManyDeletions() {
28173       var threshold = 100;
28174
28175       var validation = function(changes, graph) {
28176           var warnings = [];
28177           var nodes=0, ways=0, areas=0, relations=0;
28178
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++;}
28184           });
28185           if (changes.deleted.length > threshold) {
28186               warnings.push({
28187                   id: 'many_deletions',
28188                   message: t('validations.many_deletions',
28189                       { n: changes.deleted.length, p: nodes, l: ways, a:areas, r: relations })
28190               });
28191           }
28192
28193           return warnings;
28194       };
28195
28196
28197       return validation;
28198   }
28199
28200   function validationMissingTag() {
28201
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;
28206       }
28207
28208       var validation = function(changes, graph) {
28209           var types = ['point', 'line', 'area', 'relation'],
28210               warnings = [];
28211
28212           for (var i = 0; i < changes.created.length; i++) {
28213               var change = changes.created[i],
28214                   geometry = change.geometry(graph);
28215
28216               if (types.indexOf(geometry) !== -1 && !hasTags(change, graph)) {
28217                   warnings.push({
28218                       id: 'missing_tag',
28219                       message: t('validations.untagged_' + geometry),
28220                       tooltip: t('validations.untagged_' + geometry + '_tooltip'),
28221                       entity: change
28222                   });
28223               }
28224           }
28225
28226           return warnings;
28227       };
28228
28229
28230       return validation;
28231   }
28232
28233   function validationOldMultipolygon() {
28234
28235       return function validation(changes, graph) {
28236           var warnings = [];
28237           for (var i = 0; i < changes.created.length; i++) {
28238               var entity = changes.created[i];
28239               var parent = osmIsSimpleMultipolygonOuterMember(entity, graph);
28240               if (parent) {
28241                   warnings.push({
28242                       id: 'old_multipolygon',
28243                       message: t('validations.old_multipolygon'),
28244                       tooltip: t('validations.old_multipolygon_tooltip'),
28245                       entity: parent
28246                   });
28247               }
28248           }
28249           return warnings;
28250       };
28251   }
28252
28253   // https://github.com/openstreetmap/josm/blob/mirror/src/org/
28254   // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
28255   function validationTagSuggestsArea() {
28256
28257       function tagSuggestsArea(tags) {
28258           if (isEmpty(tags)) return false;
28259
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]];
28264               }
28265           }
28266
28267           if (tags.building && tags.building === 'yes') return 'building=yes';
28268       }
28269
28270
28271       var validation = function(changes, graph) {
28272           var warnings = [];
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);
28277
28278               if (suggestion) {
28279                   warnings.push({
28280                       id: 'tag_suggests_area',
28281                       message: t('validations.tag_suggests_area', { tag: suggestion }),
28282                       entity: change
28283                   });
28284               }
28285           }
28286
28287           return warnings;
28288       };
28289
28290
28291       return validation;
28292   }
28293
28294
28295
28296   var Validations = /*#__PURE__*/Object.freeze({
28297     validationDeprecatedTag: validationDeprecatedTag,
28298     validationDisconnectedHighway: validationDisconnectedHighway,
28299     validationManyDeletions: validationManyDeletions,
28300     validationMissingTag: validationMissingTag,
28301     validationOldMultipolygon: validationOldMultipolygon,
28302     validationTagSuggestsArea: validationTagSuggestsArea
28303   });
28304
28305   /**
28306    * Performs a deep comparison between two values to determine if they are
28307    * equivalent.
28308    *
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. `===`.
28314    *
28315    * @static
28316    * @memberOf _
28317    * @since 0.1.0
28318    * @category Lang
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`.
28322    * @example
28323    *
28324    * var object = { 'a': 1 };
28325    * var other = { 'a': 1 };
28326    *
28327    * _.isEqual(object, other);
28328    * // => true
28329    *
28330    * object === other;
28331    * // => false
28332    */
28333   function isEqual(value, other) {
28334     return baseIsEqual(value, other);
28335   }
28336
28337   /*
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.
28344    */
28345   function coreDifference(base, head) {
28346       var _changes = {};
28347       var _diff = {};
28348       var _length = 0;
28349       var i, k, h, b, keys;
28350
28351       function changed(h, b) {
28352           if (h === b) return false;
28353           if (!h || !b) return true;
28354
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;
28358           }
28359           if (h.nodes || b.nodes) {
28360               if (!isEqual(h.nodes, b.nodes)) return true;
28361           }
28362           if (h.members || b.members) {
28363               if (!isEqual(h.members, b.members)) return true;
28364           }
28365           return !isEqual(h.tags, b.tags);
28366       }
28367
28368
28369       keys = Object.keys(head.entities);
28370       for (i = 0; i < keys.length; i++) {
28371           k = keys[i];
28372           h = head.entities[k];
28373           b = base.entities[k];
28374           if (changed(h, b)) {
28375               _changes[k] = {base: b, head: h};
28376               _length++;
28377           }
28378       }
28379
28380       keys = Object.keys(base.entities);
28381       for (i = 0; i < keys.length; i++) {
28382           k = keys[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};
28387               _length++;
28388           }
28389       }
28390
28391
28392       function addParents(parents, result) {
28393           for (var i = 0; i < parents.length; i++) {
28394               var parent = parents[i];
28395
28396               if (parent.id in result)
28397                   continue;
28398
28399               result[parent.id] = parent;
28400               addParents(head.parentRelations(parent), result);
28401           }
28402       }
28403
28404
28405       _diff.length = function length() {
28406           return _length;
28407       };
28408
28409
28410       _diff.changes = function changes() {
28411           return _changes;
28412       };
28413
28414
28415       _diff.extantIDs = function extantIDs() {
28416           var result = [];
28417           forEach(_changes, function(change, id) {
28418               if (change.head) result.push(id);
28419           });
28420           return result;
28421       };
28422
28423
28424       _diff.modified = function modified() {
28425           var result = [];
28426           forEach(_changes, function(change) {
28427               if (change.base && change.head) result.push(change.head);
28428           });
28429           return result;
28430       };
28431
28432
28433       _diff.created = function created() {
28434           var result = [];
28435           forEach(_changes, function(change) {
28436               if (!change.base && change.head) result.push(change.head);
28437           });
28438           return result;
28439       };
28440
28441
28442       _diff.deleted = function deleted() {
28443           var result = [];
28444           forEach(_changes, function(change) {
28445               if (change.base && !change.head) result.push(change.base);
28446           });
28447           return result;
28448       };
28449
28450
28451       _diff.summary = function summary() {
28452           var relevant = {};
28453
28454           function addEntity(entity, graph, changeType) {
28455               relevant[entity.id] = {
28456                   entity: entity,
28457                   graph: graph,
28458                   changeType: changeType
28459               };
28460           }
28461
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');
28467               }
28468           }
28469
28470           var keys = Object.keys(_changes);
28471           for (var i = 0; i < keys.length; i++) {
28472               var change = _changes[keys[i]];
28473
28474               if (change.head && change.head.geometry(head) !== 'vertex') {
28475                   addEntity(change.head, head, change.base ? 'modified' : 'created');
28476
28477               } else if (change.base && change.base.geometry(base) !== 'vertex') {
28478                   addEntity(change.base, base, 'deleted');
28479
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);
28483
28484                   if (moved) {
28485                       addParents(change.head);
28486                   }
28487
28488                   if (retagged || (moved && change.head.hasInterestingTags())) {
28489                       addEntity(change.head, head, 'modified');
28490                   }
28491
28492               } else if (change.head && change.head.hasInterestingTags()) { // created vertex
28493                   addEntity(change.head, head, 'created');
28494
28495               } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
28496                   addEntity(change.base, base, 'deleted');
28497               }
28498           }
28499
28500           return values$1(relevant);
28501       };
28502
28503
28504       _diff.complete = function complete(extent) {
28505           var result = {};
28506           var id, change;
28507
28508           for (id in _changes) {
28509               change = _changes[id];
28510
28511               var h = change.head;
28512               var b = change.base;
28513               var entity = h || b;
28514
28515               if (extent &&
28516                   (!h || !h.intersects(extent, head)) &&
28517                   (!b || !b.intersects(extent, base)))
28518                   continue;
28519
28520               result[id] = h;
28521
28522               if (entity.type === 'way') {
28523                   var nh = h ? h.nodes : [];
28524                   var nb = b ? b.nodes : [];
28525                   var diff, i;
28526
28527                   diff = difference(nh, nb);
28528                   for (i = 0; i < diff.length; i++) {
28529                       result[diff[i]] = head.hasEntity(diff[i]);
28530                   }
28531
28532                   diff = difference(nb, nh);
28533                   for (i = 0; i < diff.length; i++) {
28534                       result[diff[i]] = head.hasEntity(diff[i]);
28535                   }
28536               }
28537
28538               addParents(head.parentWays(entity), result);
28539               addParents(head.parentRelations(entity), result);
28540           }
28541
28542           return result;
28543       };
28544
28545
28546       return _diff;
28547   }
28548
28549   /** Used for built-in method references. */
28550   var objectProto$i = Object.prototype;
28551
28552   /** Used to check objects for own properties. */
28553   var hasOwnProperty$f = objectProto$i.hasOwnProperty;
28554
28555   /**
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.
28559    *
28560    * **Note:** This method mutates `object` and is loosely based on
28561    * [`Object.assign`](https://mdn.io/Object/assign).
28562    *
28563    * @static
28564    * @memberOf _
28565    * @since 0.10.0
28566    * @category Object
28567    * @param {Object} object The destination object.
28568    * @param {...Object} [sources] The source objects.
28569    * @returns {Object} Returns `object`.
28570    * @see _.assignIn
28571    * @example
28572    *
28573    * function Foo() {
28574    *   this.a = 1;
28575    * }
28576    *
28577    * function Bar() {
28578    *   this.c = 3;
28579    * }
28580    *
28581    * Foo.prototype.b = 2;
28582    * Bar.prototype.d = 4;
28583    *
28584    * _.assign({ 'a': 0 }, new Foo, new Bar);
28585    * // => { 'a': 1, 'c': 3 }
28586    */
28587   var assign = createAssigner(function(object, source) {
28588     if (isPrototype(source) || isArrayLike(source)) {
28589       copyObject(source, keys$1(source), object);
28590       return;
28591     }
28592     for (var key in source) {
28593       if (hasOwnProperty$f.call(source, key)) {
28594         assignValue(object, key, source[key]);
28595       }
28596     }
28597   });
28598
28599   /* Built-in method references for those with the same name as other `lodash` methods. */
28600   var nativeMax$3 = Math.max;
28601
28602   /**
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`.
28608    *
28609    * @static
28610    * @memberOf _
28611    * @since 0.1.0
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`.
28618    * @example
28619    *
28620    * _.includes([1, 2, 3], 1);
28621    * // => true
28622    *
28623    * _.includes([1, 2, 3], 1, 2);
28624    * // => false
28625    *
28626    * _.includes({ 'a': 1, 'b': 2 }, 1);
28627    * // => true
28628    *
28629    * _.includes('abcd', 'bc');
28630    * // => true
28631    */
28632   function includes(collection, value, fromIndex, guard) {
28633     collection = isArrayLike(collection) ? collection : values$1(collection);
28634     fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
28635
28636     var length = collection.length;
28637     if (fromIndex < 0) {
28638       fromIndex = nativeMax$3(length + fromIndex, 0);
28639     }
28640     return isString(collection)
28641       ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
28642       : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
28643   }
28644
28645   function coreGraph$$1(other, mutable) {
28646       if (!(this instanceof coreGraph$$1)) return new coreGraph$$1(other, mutable);
28647
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);
28653
28654       } else {
28655           this.entities = Object.create({});
28656           this._parentWays = Object.create({});
28657           this._parentRels = Object.create({});
28658           this.rebase(other || [], [this]);
28659       }
28660
28661       this.transients = {};
28662       this._childNodes = {};
28663       this.frozen = !mutable;
28664   }
28665
28666
28667   coreGraph$$1.prototype = {
28668
28669       hasEntity: function(id) {
28670           return this.entities[id];
28671       },
28672
28673
28674       entity: function(id) {
28675           var entity = this.entities[id];
28676
28677           //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
28678           if (!entity) {
28679               entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
28680           }
28681
28682           if (!entity) {
28683               throw new Error('entity ' + id + ' not found');
28684           }
28685           return entity;
28686       },
28687
28688
28689       transient: function(entity, key, fn) {
28690           var id = entity.id,
28691               transients = this.transients[id] ||
28692               (this.transients[id] = {});
28693
28694           if (transients[key] !== undefined) {
28695               return transients[key];
28696           }
28697
28698           transients[key] = fn.call(entity);
28699
28700           return transients[key];
28701       },
28702
28703
28704       parentWays: function(entity) {
28705           var parents = this._parentWays[entity.id],
28706               result = [];
28707
28708           if (parents) {
28709               for (var i = 0; i < parents.length; i++) {
28710                   result.push(this.entity(parents[i]));
28711               }
28712           }
28713           return result;
28714       },
28715
28716
28717       isPoi: function(entity) {
28718           var parentWays = this._parentWays[entity.id];
28719           return !parentWays || parentWays.length === 0;
28720       },
28721
28722
28723       isShared: function(entity) {
28724           var parentWays = this._parentWays[entity.id];
28725           return parentWays && parentWays.length > 1;
28726       },
28727
28728
28729       parentRelations: function(entity) {
28730           var parents = this._parentRels[entity.id],
28731               result = [];
28732
28733           if (parents) {
28734               for (var i = 0; i < parents.length; i++) {
28735                   result.push(this.entity(parents[i]));
28736               }
28737           }
28738           return result;
28739       },
28740
28741
28742       childNodes: function(entity) {
28743           if (this._childNodes[entity.id]) return this._childNodes[entity.id];
28744           if (!entity.nodes) return [];
28745
28746           var nodes = [];
28747           for (var i = 0; i < entity.nodes.length; i++) {
28748               nodes[i] = this.entity(entity.nodes[i]);
28749           }
28750
28751           this._childNodes[entity.id] = nodes;
28752           return this._childNodes[entity.id];
28753       },
28754
28755
28756       base: function() {
28757           return {
28758               'entities': utilGetPrototypeOf(this.entities),
28759               'parentWays': utilGetPrototypeOf(this._parentWays),
28760               'parentRels': utilGetPrototypeOf(this._parentRels)
28761           };
28762       },
28763
28764
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(),
28771               i, j, k, id;
28772
28773           for (i = 0; i < entities.length; i++) {
28774               var entity = entities[i];
28775
28776               if (!entity.visible || (!force && base.entities[entity.id]))
28777                   continue;
28778
28779               // Merging data into the base graph
28780               base.entities[entity.id] = entity;
28781               this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
28782
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) {
28790                               delete ents[id];
28791                           }
28792                       }
28793                   }
28794               }
28795           }
28796
28797           for (i = 0; i < stack.length; i++) {
28798               stack[i]._updateRebased();
28799           }
28800       },
28801
28802
28803       _updateRebased: function() {
28804           var base = this.base(),
28805               i, k, child, id, keys;
28806
28807           keys = Object.keys(this._parentWays);
28808           for (i = 0; i < keys.length; i++) {
28809               child = keys[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);
28815                       }
28816                   }
28817               }
28818           }
28819
28820           keys = Object.keys(this._parentRels);
28821           for (i = 0; i < keys.length; i++) {
28822               child = keys[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);
28828                       }
28829                   }
28830               }
28831           }
28832
28833           this.transients = {};
28834
28835           // this._childNodes is not updated, under the assumption that
28836           // ways are always downloaded with their child nodes.
28837       },
28838
28839
28840       // Updates calculated properties (parentWays, parentRels) for the specified change
28841       _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
28842
28843           parentWays = parentWays || this._parentWays;
28844           parentRels = parentRels || this._parentRels;
28845
28846           var type = entity && entity.type || oldentity && oldentity.type,
28847               removed, added, ways, rels, i;
28848
28849
28850           if (type === 'way') {
28851
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;
28858                   added = [];
28859               } else if (entity) {
28860                   removed = [];
28861                   added = entity.nodes;
28862               }
28863               for (i = 0; i < removed.length; i++) {
28864                   parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
28865               }
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;
28870               }
28871
28872           } else if (type === 'relation') {
28873
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;
28880                   added = [];
28881               } else if (entity) {
28882                   removed = [];
28883                   added = entity.members;
28884               }
28885               for (i = 0; i < removed.length; i++) {
28886                   parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
28887               }
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;
28892               }
28893           }
28894       },
28895
28896
28897       replace: function(entity) {
28898           if (this.entities[entity.id] === entity)
28899               return this;
28900
28901           return this.update(function() {
28902               this._updateCalculated(this.entities[entity.id], entity);
28903               this.entities[entity.id] = entity;
28904           });
28905       },
28906
28907
28908       remove: function(entity) {
28909           return this.update(function() {
28910               this._updateCalculated(entity, undefined);
28911               this.entities[entity.id] = undefined;
28912           });
28913       },
28914
28915
28916       revert: function(id) {
28917           var baseEntity = this.base().entities[id],
28918               headEntity = this.entities[id];
28919
28920           if (headEntity === baseEntity)
28921               return this;
28922
28923           return this.update(function() {
28924               this._updateCalculated(headEntity, baseEntity);
28925               delete this.entities[id];
28926           });
28927       },
28928
28929
28930       update: function() {
28931           var graph = this.frozen ? coreGraph$$1(this, true) : this;
28932
28933           for (var i = 0; i < arguments.length; i++) {
28934               arguments[i].call(graph, graph);
28935           }
28936
28937           if (this.frozen) graph.frozen = true;
28938
28939           return graph;
28940       },
28941
28942
28943       // Obliterates any existing entities
28944       load: function(entities) {
28945           var base = this.base();
28946           this.entities = Object.create(base.entities);
28947
28948           for (var i in entities) {
28949               this.entities[i] = entities[i];
28950               this._updateCalculated(base.entities[i], this.entities[i]);
28951           }
28952
28953           return this;
28954       }
28955   };
28956
28957   function coreTree(head) {
28958       var rtree = rbush_1(),
28959           bboxes = {},
28960           tree = {};
28961
28962
28963       function entityBBox(entity) {
28964           var bbox = entity.extent(head).bbox();
28965           bbox.id = entity.id;
28966           bboxes[entity.id] = bbox;
28967           return bbox;
28968       }
28969
28970
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;
28976               }
28977               updateParents(way, insertions, memo);
28978           });
28979
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;
28986               }
28987               updateParents(relation, insertions, memo);
28988           });
28989       }
28990
28991
28992       tree.rebase = function(entities, force) {
28993           var insertions = {};
28994
28995           for (var i = 0; i < entities.length; i++) {
28996               var entity = entities[i];
28997
28998               if (!entity.visible)
28999                   continue;
29000
29001               if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
29002                   if (!force) {
29003                       continue;
29004                   } else if (bboxes[entity.id]) {
29005                       rtree.remove(bboxes[entity.id]);
29006                   }
29007               }
29008
29009               insertions[entity.id] = entity;
29010               updateParents(entity, insertions, {});
29011           }
29012
29013           rtree.load(map$3(insertions, entityBBox));
29014
29015           return tree;
29016       };
29017
29018
29019       tree.intersects = function(extent, graph) {
29020           if (graph !== head) {
29021               var diff = coreDifference(head, graph),
29022                   insertions = {};
29023
29024               head = graph;
29025
29026               diff.deleted().forEach(function(entity) {
29027                   rtree.remove(bboxes[entity.id]);
29028                   delete bboxes[entity.id];
29029               });
29030
29031               diff.modified().forEach(function(entity) {
29032                   rtree.remove(bboxes[entity.id]);
29033                   insertions[entity.id] = entity;
29034                   updateParents(entity, insertions, {});
29035               });
29036
29037               diff.created().forEach(function(entity) {
29038                   insertions[entity.id] = entity;
29039               });
29040
29041               rtree.load(map$3(insertions, entityBBox));
29042           }
29043
29044           return rtree.search(extent.bbox()).map(function(bbox) {
29045               return head.entity(bbox.id);
29046           });
29047       };
29048
29049
29050       return tree;
29051   }
29052
29053   /*
29054    * This code is licensed under the MIT license.
29055    *
29056    * Copyright © 2013, iD authors.
29057    *
29058    * Portions copyright © 2011, Keith Cirkel
29059    * See https://github.com/keithamus/jwerty
29060    *
29061    */
29062   function d3keybinding(namespace$$1) {
29063       var bindings = [];
29064
29065
29066       function testBindings(isCapturing) {
29067           var didMatch = false,
29068               i, binding;
29069
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')
29074
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();
29082                   didMatch = true;
29083               }
29084           }
29085
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();
29094               }
29095           }
29096
29097
29098           function matches(binding, testShift) {
29099               var event$$1 = event;
29100               var isMatch = false;
29101               var tryKeyCode = true;
29102
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
29106                   isMatch = true;
29107
29108                   if (binding.event.key === undefined) {
29109                       isMatch = false;
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)
29112                           isMatch = false;
29113                   } else {
29114                       if (event$$1.key.toLowerCase() !== binding.event.key.toLowerCase())
29115                           isMatch = false;
29116                   }
29117               }
29118
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);
29124               }
29125
29126               if (!isMatch) return false;
29127
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;
29132               }
29133               if (event$$1.metaKey !== binding.event.modifiers.metaKey) return false;
29134               if (testShift && event$$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
29135
29136               return true;
29137           }
29138       }
29139
29140
29141       function capture() {
29142           testBindings(true);
29143       }
29144
29145
29146       function bubble() {
29147           var tagName = select(event.target).node().tagName;
29148           if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
29149               return;
29150           }
29151           testBindings(false);
29152       }
29153
29154
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);
29159           return keybinding;
29160       }
29161
29162
29163       keybinding.off = function(selection$$1) {
29164           bindings = [];
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);
29168           return keybinding;
29169       };
29170
29171
29172       keybinding.on = function(codes, callback, capture) {
29173           var arr = [].concat(codes);
29174           for (var i = 0; i < arr.length; i++) {
29175               var code = arr[i];
29176               var binding = {
29177                   event: {
29178                       key: undefined,  // preferred
29179                       keyCode: 0,      // fallback
29180                       modifiers: {
29181                           shiftKey: false,
29182                           ctrlKey: false,
29183                           altKey: false,
29184                           metaKey: false
29185                       }
29186                   },
29187                   capture: capture,
29188                   callback: callback
29189               };
29190
29191               code = code.toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
29192
29193               for (var j = 0; j < code.length; j++) {
29194                   // Normalise matching errors
29195                   if (code[j] === '++') code[j] = '+';
29196
29197                   if (code[j] in d3keybinding.modifierCodes) {
29198                       binding.event.modifiers[d3keybinding.modifierProperties[d3keybinding.modifierCodes[code[j]]]] = true;
29199                   } else {
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]];
29203                       }
29204                   }
29205               }
29206
29207               bindings.push(binding);
29208           }
29209
29210           return keybinding;
29211       };
29212
29213       return keybinding;
29214   }
29215
29216
29217   d3keybinding.modifierCodes = {
29218       // Shift key, ⇧
29219       '⇧': 16, shift: 16,
29220       // CTRL key, on Mac: ⌃
29221       '⌃': 17, ctrl: 17,
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
29226   };
29227
29228   d3keybinding.modifierProperties = {
29229       16: 'shiftKey',
29230       17: 'ctrlKey',
29231       18: 'altKey',
29232       91: 'metaKey'
29233   };
29234
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',
29240       // Return key, ↩
29241       '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
29242       // Pause/Break key
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'],
29248       // Space key
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'],
29273       // Num-Plus or +
29274       '+': ['+', 'Add'], 'plus': ['+', 'Add'],
29275       // Num-Subtract, or -
29276       '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
29277       // Semicolon
29278       semicolon: ';',
29279       // = or equals
29280       equals: '=',
29281       // Comma, or ,
29282       comma: ',',
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: '\'',
29297       // NUMPAD 0-9
29298       'num-0': '0',
29299       'num-1': '1',
29300       'num-2': '2',
29301       'num-3': '3',
29302       'num-4': '4',
29303       'num-5': '5',
29304       'num-6': '6',
29305       'num-7': '7',
29306       'num-8': '8',
29307       'num-9': '9',
29308       // F1-F25
29309       f1: 'F1',
29310       f2: 'F2',
29311       f3: 'F3',
29312       f4: 'F4',
29313       f5: 'F5',
29314       f6: 'F6',
29315       f7: 'F7',
29316       f8: 'F8',
29317       f9: 'F9',
29318       f10: 'F10',
29319       f11: 'F11',
29320       f12: 'F12',
29321       f13: 'F13',
29322       f14: 'F14',
29323       f15: 'F15',
29324       f16: 'F16',
29325       f17: 'F17',
29326       f18: 'F18',
29327       f19: 'F19',
29328       f20: 'F20',
29329       f21: 'F21',
29330       f22: 'F22',
29331       f23: 'F23',
29332       f24: 'F24',
29333       f25: 'F25'
29334   };
29335
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,
29341       // Return key, ↩
29342       '↩': 13, 'return': 13, enter: 13, '⌅': 13,
29343       // Pause/Break key
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,
29349       // Space key
29350       space: 32,
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: ⇟
29356       '⇟': 35, end: 35,
29357       // HOME key, on Mac: ⇞
29358       '⇞': 36, home: 36,
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:
29372       // Firefox Equals
29373       'ffequals': 61,
29374       // Num-Multiply, or *
29375       '*': 106, star: 106, asterisk: 106, multiply: 106,
29376       // Num-Plus or +
29377       '+': 107, 'plus': 107,
29378       // Num-Subtract, or -
29379       '-': 109, subtract: 109,
29380       // Firefox Plus
29381       'ffplus': 171,
29382       // Firefox Minus
29383       'ffminus': 173,
29384       // Semicolon
29385       ';': 186, semicolon: 186,
29386       // = or equals
29387       '=': 187, 'equals': 187,
29388       // Comma, or ,
29389       ',': 188, comma: 188,
29390       // Dash / Underscore key
29391       'dash': 189,
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
29406   };
29407
29408   // NUMPAD 0-9
29409   var i$1 = 95, n = 0;
29410   while (++i$1 < 106) {
29411       d3keybinding.keyCodes['num-' + n] = i$1;
29412       ++n;
29413   }
29414
29415   // 0-9
29416   i$1 = 47; n = 0;
29417   while (++i$1 < 58) {
29418       d3keybinding.keyCodes[n] = i$1;
29419       ++n;
29420   }
29421
29422   // F1-F25
29423   i$1 = 111; n = 1;
29424   while (++i$1 < 136) {
29425       d3keybinding.keyCodes['f' + n] = i$1;
29426       ++n;
29427   }
29428
29429   // a-z
29430   i$1 = 64;
29431   while (++i$1 < 91) {
29432       d3keybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
29433   }
29434
29435   function tooltip() {
29436     var tooltip = function(selection$$1) {
29437         selection$$1.each(setup);
29438       },
29439       animation = utilFunctor(false),
29440       html = utilFunctor(false),
29441       title = function() {
29442         var title = this.getAttribute('data-original-title');
29443         if (title) {
29444           return title;
29445         } else {
29446           title = this.getAttribute('title');
29447           this.removeAttribute('title');
29448           this.setAttribute('data-original-title', title);
29449         }
29450         return title;
29451       },
29452       over = 'mouseenter.tooltip',
29453       out = 'mouseleave.tooltip',
29454       placement = utilFunctor('top');
29455
29456
29457     tooltip.title = function(_) {
29458       if (arguments.length) {
29459         title = utilFunctor(_);
29460         return tooltip;
29461       } else {
29462         return title;
29463       }
29464     };
29465
29466
29467     tooltip.html = function(_) {
29468       if (arguments.length) {
29469         html = utilFunctor(_);
29470         return tooltip;
29471       } else {
29472         return html;
29473       }
29474     };
29475
29476
29477     tooltip.placement = function(_) {
29478       if (arguments.length) {
29479         placement = utilFunctor(_);
29480         return tooltip;
29481       } else {
29482         return placement;
29483       }
29484     };
29485
29486
29487     tooltip.show = function(selection$$1) {
29488       selection$$1.each(show);
29489     };
29490
29491
29492     tooltip.hide = function(selection$$1) {
29493       selection$$1.each(hide);
29494     };
29495
29496
29497     tooltip.toggle = function(selection$$1) {
29498       selection$$1.each(toggle);
29499     };
29500
29501
29502     tooltip.destroy = function(selection$$1) {
29503       selection$$1
29504         .on(over, null)
29505         .on(out, null)
29506         .attr('title', function() {
29507           return this.getAttribute('data-original-title') || this.getAttribute('title');
29508         })
29509         .attr('data-original-title', null)
29510         .selectAll('.tooltip')
29511         .remove();
29512     };
29513
29514
29515     function setup() {
29516       var root = select(this),
29517           animate = animation.apply(this, arguments),
29518           tip = root.selectAll('.tooltip').data([0]);
29519
29520       var enter = tip.enter()
29521         .append('div')
29522         .attr('class', 'tooltip');
29523
29524       enter
29525         .append('div')
29526         .attr('class', 'tooltip-arrow');
29527
29528       enter
29529         .append('div')
29530         .attr('class', 'tooltip-inner');
29531
29532       tip = enter
29533         .merge(tip);
29534
29535       if (animate) {
29536         tip.classed('fade', true);
29537       }
29538
29539       var place = placement.apply(this, arguments);
29540       tip.classed(place, true);
29541
29542       root.on(over, show);
29543       root.on(out, hide);
29544     }
29545
29546
29547     function show() {
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);
29553
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()),
29558         pos;
29559
29560       switch (place) {
29561         case 'top':
29562           pos = {x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h};
29563           break;
29564         case 'right':
29565           pos = {x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2};
29566           break;
29567         case 'left':
29568           pos = {x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2};
29569           break;
29570         case 'bottom':
29571           pos = {x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h};
29572           break;
29573       }
29574
29575       if (pos) {
29576         tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
29577       } else {
29578         tip.style('left', null).style('top', null);
29579       }
29580
29581       this.tooltipVisible = true;
29582     }
29583
29584
29585     function hide() {
29586       select(this).selectAll('.tooltip')
29587         .classed('in', false);
29588
29589       this.tooltipVisible = false;
29590     }
29591
29592
29593     function toggle() {
29594       if (this.tooltipVisible) {
29595         hide.apply(this, arguments);
29596       } else {
29597         show.apply(this, arguments);
29598       }
29599     }
29600
29601     return tooltip;
29602   }
29603
29604
29605   function getPosition(node) {
29606     var mode = select(node).style('position');
29607     if (mode === 'absolute' || mode === 'static') {
29608       return {
29609         x: node.offsetLeft,
29610         y: node.offsetTop,
29611         w: node.offsetWidth,
29612         h: node.offsetHeight
29613       };
29614     } else {
29615       return {
29616         x: 0,
29617         y: 0,
29618         w: node.offsetWidth,
29619         h: node.offsetHeight
29620       };
29621     }
29622   }
29623
29624   function behaviorEdit(context) {
29625
29626       function edit() {
29627           context.map()
29628               .minzoom(context.minEditableZoom());
29629       }
29630
29631
29632       edit.off = function() {
29633           context.map()
29634               .minzoom(0);
29635       };
29636
29637
29638       return edit;
29639   }
29640
29641   /*
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.
29644
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.
29649    */
29650   function behaviorHover(context) {
29651       var dispatch$$1 = dispatch('hover');
29652       var _selection = select(null);
29653       var _newId = null;
29654       var _buttonDown;
29655       var _altDisables;
29656       var _target;
29657
29658
29659       function keydown() {
29660           if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29661               _selection.selectAll('.hover')
29662                   .classed('hover-suppressed', true)
29663                   .classed('hover', false);
29664
29665               _selection
29666                   .classed('hover-disabled', true);
29667
29668               dispatch$$1.call('hover', this, null);
29669           }
29670       }
29671
29672
29673       function keyup() {
29674           if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29675               _selection.selectAll('.hover-suppressed')
29676                   .classed('hover-suppressed', false)
29677                   .classed('hover', true);
29678
29679               _selection
29680                   .classed('hover-disabled', false);
29681
29682               dispatch$$1.call('hover', this, _target ? _target.id : null);
29683           }
29684       }
29685
29686
29687       var hover = function(selection$$1) {
29688           _selection = selection$$1;
29689           _newId = null;
29690
29691           _selection
29692               .on('mouseover.hover', mouseover)
29693               .on('mouseout.hover', mouseout)
29694               .on('mousedown.hover', mousedown);
29695
29696           select(window)
29697               .on('keydown.hover', keydown)
29698               .on('keyup.hover', keyup);
29699
29700
29701           function mouseover() {
29702               if (_buttonDown) return;
29703               var target = event.target;
29704               enter(target ? target.__data__ : null);
29705           }
29706
29707
29708           function mouseout() {
29709               if (_buttonDown) return;
29710               var target = event.relatedTarget;
29711               enter(target ? target.__data__ : null);
29712           }
29713
29714
29715           function mousedown() {
29716               _buttonDown = true;
29717               select(window)
29718                   .on('mouseup.hover', mouseup, true);
29719           }
29720
29721
29722           function mouseup() {
29723               _buttonDown = false;
29724               select(window)
29725                   .on('mouseup.hover', null, true);
29726           }
29727
29728
29729           function enter(datum) {
29730               if (datum === _target) return;
29731               _target = datum;
29732
29733               _selection.selectAll('.hover')
29734                   .classed('hover', false);
29735               _selection.selectAll('.hover-suppressed')
29736                   .classed('hover-suppressed', false);
29737
29738               var entity;
29739               if (datum instanceof osmEntity$$1) {
29740                   entity = datum;
29741               } else {
29742                   entity = datum && datum.properties && datum.properties.entity;
29743               }
29744
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;
29750                       return;
29751                   }
29752
29753                   var selector$$1 = '.' + entity.id;
29754
29755                   if (entity.type === 'relation') {
29756                       entity.members.forEach(function(member) {
29757                           selector$$1 += ', .' + member.id;
29758                       });
29759                   }
29760
29761                   var suppressed = _altDisables && event && event.altKey;
29762
29763                   _selection.selectAll(selector$$1)
29764                       .classed(suppressed ? 'hover-suppressed' : 'hover', true);
29765
29766                   dispatch$$1.call('hover', this, !suppressed && entity.id);
29767
29768               } else {
29769                   dispatch$$1.call('hover', this, null);
29770               }
29771           }
29772
29773       };
29774
29775
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);
29781           selection$$1
29782               .classed('hover-disabled', false);
29783
29784           selection$$1
29785               .on('mouseover.hover', null)
29786               .on('mouseout.hover', null)
29787               .on('mousedown.hover', null);
29788
29789           select(window)
29790               .on('keydown.hover', null)
29791               .on('keyup.hover', null);
29792       };
29793
29794
29795       hover.altDisables = function(_) {
29796           if (!arguments.length) return _altDisables;
29797           _altDisables = _;
29798           return hover;
29799       };
29800
29801
29802       return utilRebind(hover, dispatch$$1, 'on');
29803   }
29804
29805   function refresh(selection, node) {
29806       var cr = node.getBoundingClientRect();
29807       var prop = [cr.width, cr.height];
29808       selection.property('__dimensions__', prop);
29809       return prop;
29810   }
29811
29812   function utilGetDimensions(selection, force) {
29813       if (!selection || selection.empty()) {
29814           return [0, 0];
29815       }
29816       var node = selection.node(),
29817           cached = selection.property('__dimensions__');
29818       return (!cached || force) ? refresh(selection, node) : cached;
29819   }
29820
29821
29822   function utilSetDimensions(selection, dimensions) {
29823       if (!selection || selection.empty()) {
29824           return selection;
29825       }
29826       var node = selection.node();
29827       if (dimensions === null) {
29828           refresh(selection, node);
29829           return selection;
29830       }
29831       return selection
29832           .property('__dimensions__', [dimensions[0], dimensions[1]])
29833           .attr('width', dimensions[0])
29834           .attr('height', dimensions[1]);
29835   }
29836
29837   function behaviorTail() {
29838       var text,
29839           container,
29840           xmargin = 25,
29841           tooltipSize = [0, 0],
29842           selectionSize = [0, 0];
29843
29844
29845       function tail(selection$$1) {
29846           if (!text) return;
29847
29848           select(window)
29849               .on('resize.tail', function() { selectionSize = utilGetDimensions(selection$$1); });
29850
29851           container = select(document.body)
29852               .append('div')
29853               .style('display', 'none')
29854               .attr('class', 'tail tooltip-inner');
29855
29856           container.append('div')
29857               .text(text);
29858
29859           selection$$1
29860               .on('mousemove.tail', mousemove)
29861               .on('mouseenter.tail', mouseenter)
29862               .on('mouseleave.tail', mouseleave);
29863
29864           container
29865               .on('mousemove.tail', mousemove);
29866
29867           tooltipSize = utilGetDimensions(container);
29868           selectionSize = utilGetDimensions(selection$$1);
29869
29870
29871           function show() {
29872               container.style('display', 'block');
29873               tooltipSize = utilGetDimensions(container);
29874           }
29875
29876
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);
29883           }
29884
29885
29886           function mouseleave() {
29887               if (event.relatedTarget !== container.node()) {
29888                   container.style('display', 'none');
29889               }
29890           }
29891
29892
29893           function mouseenter() {
29894               if (event.relatedTarget !== container.node()) {
29895                   show();
29896               }
29897           }
29898       }
29899
29900
29901       tail.off = function(selection$$1) {
29902           if (!text) return;
29903
29904           container
29905               .on('mousemove.tail', null)
29906               .remove();
29907
29908           selection$$1
29909               .on('mousemove.tail', null)
29910               .on('mouseenter.tail', null)
29911               .on('mouseleave.tail', null);
29912
29913           select(window)
29914               .on('resize.tail', null);
29915       };
29916
29917
29918       tail.text = function(_) {
29919           if (!arguments.length) return text;
29920           text = _;
29921           return tail;
29922       };
29923
29924
29925       return tail;
29926   }
29927
29928   var _usedTails = {};
29929   var _disableSpace = false;
29930   var _lastSpace = null;
29931
29932
29933   function behaviorDraw(context) {
29934       var dispatch$$1 = dispatch(
29935           'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
29936       );
29937
29938       var keybinding = d3keybinding('draw');
29939
29940       var hover = behaviorHover(context).altDisables(true)
29941           .on('hover', context.ui().sidebar.hover);
29942       var tail = behaviorTail();
29943       var edit = behaviorEdit(context);
29944
29945       var closeTolerance = 4;
29946       var tolerance = 12;
29947       var _mouseLeave = false;
29948       var _lastMouse = null;
29949
29950
29951       // related code
29952       // - `mode/drag_node.js` `datum()`
29953       function datum() {
29954           if (event.altKey) return {};
29955
29956           var element;
29957           if (event.type === 'keydown') {
29958               element = _lastMouse && _lastMouse.target;
29959           } else {
29960               element = event.target;
29961           }
29962
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 : {};
29967       }
29968
29969
29970       function mousedown() {
29971
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;
29976               })[0] : mouse(p);
29977           }
29978
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();
29983
29984           element.on('mousemove.draw', null);
29985
29986           select(window).on('mouseup.draw', function() {
29987               var t2 = +new Date();
29988               var p2 = point$$1();
29989               var dist = geoVecLength(p1, p2);
29990
29991               element.on('mousemove.draw', mousemove);
29992               select(window).on('mouseup.draw', null);
29993
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();
29998                   }, true);
29999
30000                   context.map().dblclickEnable(false);
30001
30002                   window.setTimeout(function() {
30003                       context.map().dblclickEnable(true);
30004                       select(window).on('click.draw-block', null);
30005                   }, 500);
30006
30007                   click();
30008               }
30009           }, true);
30010       }
30011
30012
30013       function mousemove() {
30014           _lastMouse = event;
30015           dispatch$$1.call('move', this, datum());
30016       }
30017
30018
30019       function mouseenter() {
30020           _mouseLeave = false;
30021       }
30022
30023
30024       function mouseleave() {
30025           _mouseLeave = true;
30026       }
30027
30028
30029       // related code
30030       // - `mode/drag_node.js`     `doMode()`
30031       // - `behavior/draw.js`      `click()`
30032       // - `behavior/draw_way.js`  `move()`
30033       function click() {
30034           var d = datum();
30035           var target = d && d.properties && d.properties.entity;
30036
30037           if (target && target.type === 'node') {   // Snap to a node
30038               dispatch$$1.call('clickNode', this, target, d);
30039               return;
30040
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()
30044               );
30045               if (choice) {
30046                   var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
30047                   dispatch$$1.call('clickWay', this, choice.loc, edge, d);
30048                   return;
30049               }
30050           }
30051
30052           dispatch$$1.call('click', this, context.map().mouseCoordinates(), d);
30053       }
30054
30055
30056       function space() {
30057           event.preventDefault();
30058           event.stopPropagation();
30059
30060           var currSpace = context.mouse();
30061           if (_disableSpace && _lastSpace) {
30062               var dist = geoVecLength(_lastSpace, currSpace);
30063               if (dist > tolerance) {
30064                   _disableSpace = false;
30065               }
30066           }
30067
30068           if (_disableSpace || _mouseLeave || !_lastMouse) return;
30069
30070           // user must move mouse or release space bar to allow another click
30071           _lastSpace = currSpace;
30072           _disableSpace = true;
30073
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);
30079           });
30080
30081           click();
30082       }
30083
30084
30085       function backspace() {
30086           event.preventDefault();
30087           dispatch$$1.call('undo');
30088       }
30089
30090
30091       function del() {
30092           event.preventDefault();
30093           dispatch$$1.call('cancel');
30094       }
30095
30096
30097       function ret() {
30098           event.preventDefault();
30099           dispatch$$1.call('finish');
30100       }
30101
30102
30103       function draw(selection$$1) {
30104           context.install(hover);
30105           context.install(edit);
30106
30107           if (!context.inIntro() && !_usedTails[tail.text()]) {
30108               context.install(tail);
30109           }
30110
30111           keybinding
30112               .on('⌫', backspace)
30113               .on('⌦', del)
30114               .on('⎋', ret)
30115               .on('↩', ret)
30116               .on('space', space)
30117               .on('⌥space', space);
30118
30119           selection$$1
30120               .on('mouseenter.draw', mouseenter)
30121               .on('mouseleave.draw', mouseleave)
30122               .on('mousedown.draw', mousedown)
30123               .on('mousemove.draw', mousemove);
30124
30125           select(document)
30126               .call(keybinding);
30127
30128           return draw;
30129       }
30130
30131
30132       draw.off = function(selection$$1) {
30133           context.ui().sidebar.hover.cancel();
30134           context.uninstall(hover);
30135           context.uninstall(edit);
30136
30137           if (!context.inIntro() && !_usedTails[tail.text()]) {
30138               context.uninstall(tail);
30139               _usedTails[tail.text()] = true;
30140           }
30141
30142           selection$$1
30143               .on('mouseenter.draw', null)
30144               .on('mouseleave.draw', null)
30145               .on('mousedown.draw', null)
30146               .on('mousemove.draw', null);
30147
30148           select(window)
30149               .on('mouseup.draw', null);
30150               // note: keyup.space-block, click.draw-block should remain
30151
30152           select(document)
30153               .call(keybinding.off);
30154       };
30155
30156
30157       draw.tail = function(_) {
30158           tail.text(_);
30159           return draw;
30160       };
30161
30162
30163       return utilRebind(draw, dispatch$$1, 'on');
30164   }
30165
30166   function modeAddArea$$1(context) {
30167       var mode = {
30168           id: 'add-area',
30169           button: 'area',
30170           title: t('modes.add_area.title'),
30171           description: t('modes.add_area.description'),
30172           key: '3'
30173       };
30174
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' };
30181
30182
30183       function actionClose(wayId) {
30184           return function (graph) {
30185               return graph.replace(graph.entity(wayId).close());
30186           };
30187       }
30188
30189
30190       function start(loc) {
30191           var startGraph = context.graph(),
30192               node = osmNode({ loc: loc }),
30193               way = osmWay({ tags: defaultTags });
30194
30195           context.perform(
30196               actionAddEntity(node),
30197               actionAddEntity(way),
30198               actionAddVertex(way.id, node.id),
30199               actionClose(way.id)
30200           );
30201
30202           context.enter(modeDrawArea(context, way.id, startGraph));
30203       }
30204
30205
30206       function startFromWay(loc, edge) {
30207           var startGraph = context.graph(),
30208               node = osmNode({ loc: loc }),
30209               way = osmWay({ tags: defaultTags });
30210
30211           context.perform(
30212               actionAddEntity(node),
30213               actionAddEntity(way),
30214               actionAddVertex(way.id, node.id),
30215               actionClose(way.id),
30216               actionAddMidpoint({ loc: loc, edge: edge }, node)
30217           );
30218
30219           context.enter(modeDrawArea(context, way.id, startGraph));
30220       }
30221
30222
30223       function startFromNode(node) {
30224           var startGraph = context.graph(),
30225               way = osmWay({ tags: defaultTags });
30226
30227           context.perform(
30228               actionAddEntity(way),
30229               actionAddVertex(way.id, node.id),
30230               actionClose(way.id)
30231           );
30232
30233           context.enter(modeDrawArea(context, way.id, startGraph));
30234       }
30235
30236
30237       mode.enter = function() {
30238           context.install(behavior);
30239       };
30240
30241
30242       mode.exit = function() {
30243           context.uninstall(behavior);
30244       };
30245
30246
30247       return mode;
30248   }
30249
30250   function modeAddLine$$1(context) {
30251       var mode = {
30252           id: 'add-line',
30253           button: 'line',
30254           title: t('modes.add_line.title'),
30255           description: t('modes.add_line.description'),
30256           key: '2'
30257       };
30258
30259       var behavior = behaviorAddWay(context)
30260           .tail(t('modes.add_line.tail'))
30261           .on('start', start)
30262           .on('startFromWay', startFromWay)
30263           .on('startFromNode', startFromNode);
30264
30265
30266       function start(loc) {
30267           var startGraph = context.graph(),
30268               node = osmNode({ loc: loc }),
30269               way = osmWay();
30270
30271           context.perform(
30272               actionAddEntity(node),
30273               actionAddEntity(way),
30274               actionAddVertex(way.id, node.id)
30275           );
30276
30277           context.enter(modeDrawLine(context, way.id, startGraph));
30278       }
30279
30280
30281       function startFromWay(loc, edge) {
30282           var startGraph = context.graph(),
30283               node = osmNode({ loc: loc }),
30284               way = osmWay();
30285
30286           context.perform(
30287               actionAddEntity(node),
30288               actionAddEntity(way),
30289               actionAddVertex(way.id, node.id),
30290               actionAddMidpoint({ loc: loc, edge: edge }, node)
30291           );
30292
30293           context.enter(modeDrawLine(context, way.id, startGraph));
30294       }
30295
30296
30297       function startFromNode(node) {
30298           var startGraph = context.graph(),
30299               way = osmWay();
30300
30301           context.perform(
30302               actionAddEntity(way),
30303               actionAddVertex(way.id, node.id)
30304           );
30305
30306           context.enter(modeDrawLine(context, way.id, startGraph));
30307       }
30308
30309
30310       mode.enter = function() {
30311           context.install(behavior);
30312       };
30313
30314
30315       mode.exit = function() {
30316           context.uninstall(behavior);
30317       };
30318
30319       return mode;
30320   }
30321
30322   function modeAddPoint$$1(context) {
30323       var mode = {
30324           id: 'add-point',
30325           button: 'point',
30326           title: t('modes.add_point.title'),
30327           description: t('modes.add_point.description'),
30328           key: '1'
30329       };
30330
30331       var behavior = behaviorDraw(context)
30332           .tail(t('modes.add_point.tail'))
30333           .on('click', add)
30334           .on('clickWay', addWay)
30335           .on('clickNode', addNode)
30336           .on('cancel', cancel)
30337           .on('finish', cancel);
30338
30339
30340       function add(loc) {
30341           var node = osmNode({ loc: loc });
30342
30343           context.perform(
30344               actionAddEntity(node),
30345               t('operations.add.annotation.point')
30346           );
30347
30348           context.enter(
30349               modeSelect(context, [node.id]).newFeature(true)
30350           );
30351       }
30352
30353
30354       function addWay(loc) {
30355           add(loc);
30356       }
30357
30358
30359       function addNode(node) {
30360           add(node.loc);
30361       }
30362
30363
30364       function cancel() {
30365           context.enter(modeBrowse(context));
30366       }
30367
30368
30369       mode.enter = function() {
30370           context.install(behavior);
30371       };
30372
30373
30374       mode.exit = function() {
30375           context.uninstall(behavior);
30376       };
30377
30378
30379       return mode;
30380   }
30381
30382   function modeDragNode$$1(context) {
30383       var mode = {
30384           id: 'drag-node',
30385           button: 'browse'
30386       };
30387       var hover = behaviorHover(context).altDisables(true)
30388           .on('hover', context.ui().sidebar.hover);
30389       var edit = behaviorEdit(context);
30390
30391       var _nudgeInterval;
30392       var _restoreSelectedIDs = [];
30393       var _wasMidpoint = false;
30394       var _isCancelled = false;
30395       var _activeEntity;
30396       var _startLoc;
30397       var _lastLoc;
30398
30399
30400       function startNudge(entity, nudge) {
30401           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
30402           _nudgeInterval = window.setInterval(function() {
30403               context.pan(nudge);
30404               doMove(entity, nudge);
30405           }, 50);
30406       }
30407
30408
30409       function stopNudge() {
30410           if (_nudgeInterval) {
30411               window.clearInterval(_nudgeInterval);
30412               _nudgeInterval = null;
30413           }
30414       }
30415
30416
30417       function moveAnnotation(entity) {
30418           return t('operations.move.annotation.' + entity.geometry(context.graph()));
30419       }
30420
30421
30422       function connectAnnotation(entity) {
30423           return t('operations.connect.annotation.' + entity.geometry(context.graph()));
30424       }
30425
30426
30427       function origin(entity) {
30428           return context.projection(entity.loc);
30429       }
30430
30431
30432       function keydown() {
30433           if (event.keyCode === d3keybinding.modifierCodes.alt) {
30434               if (context.surface().classed('nope')) {
30435                   context.surface()
30436                       .classed('nope-suppressed', true);
30437               }
30438               context.surface()
30439                   .classed('nope', false)
30440                   .classed('nope-disabled', true);
30441           }
30442       }
30443
30444
30445       function keyup() {
30446           if (event.keyCode === d3keybinding.modifierCodes.alt) {
30447               if (context.surface().classed('nope-suppressed')) {
30448                   context.surface()
30449                       .classed('nope', true);
30450               }
30451               context.surface()
30452                   .classed('nope-suppressed', false)
30453                   .classed('nope-disabled', false);
30454           }
30455       }
30456
30457
30458       function start(entity) {
30459           _wasMidpoint = entity.type === 'midpoint';
30460           var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
30461           _isCancelled = event.sourceEvent.shiftKey || hasHidden;
30462
30463
30464           if (_isCancelled) {
30465               if (hasHidden) {
30466                   uiFlash()
30467                       .duration(4000)
30468                       .text(t('modes.drag_node.connected_to_hidden'))();
30469               }
30470               return drag.cancel();
30471           }
30472
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
30478
30479               var vertex = context.surface().selectAll('.' + entity.id);
30480               drag.target(vertex.node(), entity);
30481
30482           } else {
30483               context.perform(actionNoop());
30484           }
30485
30486           _activeEntity = entity;
30487           _startLoc = entity.loc;
30488
30489           context.surface().selectAll('.' + _activeEntity.id)
30490               .classed('active', true);
30491
30492           context.enter(mode);
30493       }
30494
30495
30496       // related code
30497       // - `behavior/draw.js` `datum()`
30498       function datum() {
30499           var event$$1 = event && event.sourceEvent;
30500           if (!event$$1 || event$$1.altKey) {
30501               return {};
30502           } else {
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 : {};
30507           }
30508       }
30509
30510
30511       function doMove(entity, nudge) {
30512           nudge = nudge || [0, 0];
30513
30514           var currPoint = (event && event.point) || context.projection(_lastLoc);
30515           var currMouse = geoVecSubtract(currPoint, nudge);
30516           var loc = context.projection.invert(currMouse);
30517
30518           if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
30519               // related code
30520               // - `mode/drag_node.js`     `doMode()`
30521               // - `behavior/draw.js`      `click()`
30522               // - `behavior/draw_way.js`  `move()`
30523               var d = datum();
30524               var target = d && d.properties && d.properties.entity;
30525               var targetLoc = target && target.loc;
30526               var targetNodes = d && d.properties && d.properties.nodes;
30527               var edge;
30528
30529               if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
30530                   loc = targetLoc;
30531
30532               } else if (targetNodes) {   // snap to way - a line target with `.nodes`
30533                   edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
30534                   if (edge) {
30535                       loc = edge.loc;
30536                   }
30537               }
30538           }
30539
30540           context.replace(
30541               actionMoveNode(entity.id, loc),
30542               moveAnnotation(entity)
30543           );
30544
30545           // Below here: validations
30546           var isInvalid = false;
30547
30548           // Check if this connection to `target` could cause relations to break..
30549           if (target) {
30550               isInvalid = hasRelationConflict(entity, target, edge, context.graph());
30551           }
30552
30553           // Check if this drag causes the geometry to break..
30554           if (!isInvalid) {
30555               isInvalid = hasInvalidGeometry(entity, context.graph());
30556           }
30557
30558
30559           var nope = context.surface().classed('nope');
30560           if (isInvalid === 'relation' || isInvalid === 'restriction') {
30561               if (!nope) {   // about to nope - show hint
30562                   uiFlash()
30563                       .duration(4000)
30564                       .text(t('operations.connect.' + isInvalid,
30565                           { relation: context.presets().item('type/restriction').name() }
30566                       ))();
30567               }
30568           } else {
30569               if (nope) {   // about to un-nope, remove hint
30570                   uiFlash()
30571                       .duration(1)
30572                       .text('')();
30573               }
30574           }
30575
30576
30577           var nopeDisabled = context.surface().classed('nope-disabled');
30578           if (nopeDisabled) {
30579               context.surface()
30580                   .classed('nope', false)
30581                   .classed('nope-suppressed', isInvalid);
30582           } else {
30583               context.surface()
30584                   .classed('nope', isInvalid)
30585                   .classed('nope-suppressed', false);
30586           }
30587
30588           _lastLoc = loc;
30589       }
30590
30591
30592       // Uses `actionConnect.disabled()` to know whether this connection is ok..
30593       function hasRelationConflict(entity, target, edge, graph) {
30594           var testGraph = graph.update();  // copy
30595
30596           // if snapping to way - add midpoint there and consider that the target..
30597           if (edge) {
30598               var midpoint = osmNode();
30599               var action = actionAddMidpoint({
30600                   loc: edge.loc,
30601                   edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
30602               }, midpoint);
30603
30604               testGraph = action(testGraph);
30605               target = midpoint;
30606           }
30607
30608           // can we connect to it?
30609           var ids = [entity.id, target.id];
30610           return actionConnect(ids).disabled(testGraph);
30611       }
30612
30613
30614       function hasInvalidGeometry(entity, graph) {
30615           var parents = graph.parentWays(entity);
30616           var i, j, k;
30617
30618           for (i = 0; i < parents.length; i++) {
30619               var parent = parents[i];
30620               var nodes = [];
30621               var activeIndex = null;    // which multipolygon ring contains node being dragged
30622
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;
30627
30628                   var rings = osmJoinWays(relations[j].members, graph);
30629
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; })) {
30634                           activeIndex = k;
30635                           if (geoHasSelfIntersections(nodes, entity.id)) {
30636                               return true;
30637                           }
30638                       }
30639                       rings[k].coords = nodes.map(function(n) { return n.loc; });
30640                   }
30641
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;
30645
30646                       // make sure active ring doesnt cross passive rings
30647                       if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
30648                           return true;
30649                       }
30650                   }
30651               }
30652
30653
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)) {
30659                       return true;
30660                   }
30661               }
30662
30663           }
30664
30665           return false;
30666       }
30667
30668
30669       function move(entity) {
30670           if (_isCancelled) return;
30671           event.sourceEvent.stopPropagation();
30672
30673           context.surface().classed('nope-disabled', event.sourceEvent.altKey);
30674
30675           _lastLoc = context.projection.invert(event.point);
30676
30677           doMove(entity);
30678           var nudge = geoViewportEdge(event.point, context.map().dimensions());
30679           if (nudge) {
30680               startNudge(entity, nudge);
30681           } else {
30682               stopNudge();
30683           }
30684       }
30685
30686
30687       function end(entity) {
30688           if (_isCancelled) return;
30689
30690           var d = datum();
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
30693
30694           if (nope) {   // bounce back
30695               context.perform(
30696                   _actionBounceBack(entity.id, _startLoc)
30697               );
30698
30699           } else if (target && target.type === 'way') {
30700               var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
30701               context.replace(
30702                   actionAddMidpoint({
30703                       loc: choice.loc,
30704                       edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
30705                   }, entity),
30706                   connectAnnotation(target)
30707               );
30708
30709           } else if (target && target.type === 'node') {
30710               context.replace(
30711                   actionConnect([target.id, entity.id]),
30712                   connectAnnotation(target)
30713               );
30714
30715           } else if (_wasMidpoint) {
30716               context.replace(
30717                   actionNoop(),
30718                   t('operations.add.annotation.vertex')
30719               );
30720
30721           } else {
30722               context.replace(
30723                   actionNoop(),
30724                   moveAnnotation(entity)
30725               );
30726           }
30727
30728           var reselection = _restoreSelectedIDs.filter(function(id) {
30729               return context.graph().hasEntity(id);
30730           });
30731
30732           if (reselection.length) {
30733               context.enter(modeSelect(context, reselection));
30734           } else {
30735               context.enter(modeBrowse(context));
30736           }
30737       }
30738
30739
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);
30747           };
30748           action.transitionable = true;
30749           return action;
30750       }
30751
30752
30753       function cancel() {
30754           drag.cancel();
30755           context.enter(modeBrowse(context));
30756       }
30757
30758
30759       var drag = behaviorDrag()
30760           .selector('.layer-points-targets .target')
30761           .surface(select('#map').node())
30762           .origin(origin)
30763           .on('start', start)
30764           .on('move', move)
30765           .on('end', end);
30766
30767
30768       mode.enter = function() {
30769           context.install(hover);
30770           context.install(edit);
30771
30772           select(window)
30773               .on('keydown.drawWay', keydown)
30774               .on('keyup.drawWay', keyup);
30775
30776           context.history()
30777               .on('undone.drag-node', cancel);
30778       };
30779
30780
30781       mode.exit = function() {
30782           context.ui().sidebar.hover.cancel();
30783           context.uninstall(hover);
30784           context.uninstall(edit);
30785
30786           select(window)
30787               .on('keydown.hover', null)
30788               .on('keyup.hover', null);
30789
30790           context.history()
30791               .on('undone.drag-node', null);
30792
30793           context.map()
30794               .on('drawn.drag-node', null);
30795
30796           _activeEntity = null;
30797
30798           context.surface()
30799               .classed('nope', false)
30800               .classed('nope-suppressed', false)
30801               .classed('nope-disabled', false)
30802               .selectAll('.active')
30803               .classed('active', false);
30804
30805           stopNudge();
30806       };
30807
30808
30809       mode.selectedIDs = function() {
30810           if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
30811           // no assign
30812           return mode;
30813       };
30814
30815
30816       mode.activeID = function() {
30817           if (!arguments.length) return _activeEntity && _activeEntity.id;
30818           // no assign
30819           return mode;
30820       };
30821
30822
30823       mode.restoreSelectedIDs = function(_) {
30824           if (!arguments.length) return _restoreSelectedIDs;
30825           _restoreSelectedIDs = _;
30826           return mode;
30827       };
30828
30829
30830       mode.behavior = drag;
30831
30832
30833       return mode;
30834   }
30835
30836   function modeBrowse(context) {
30837       var mode = {
30838           button: 'browse',
30839           id: 'browse',
30840           title: t('modes.browse.title'),
30841           description: t('modes.browse.description')
30842       }, sidebar;
30843
30844       var behaviors = [
30845           behaviorPaste(context),
30846           behaviorHover(context).on('hover', context.ui().sidebar.hover),
30847           behaviorSelect(context),
30848           behaviorLasso(context),
30849           modeDragNode$$1(context).behavior
30850       ];
30851
30852
30853       mode.enter = function() {
30854           behaviors.forEach(function(behavior) {
30855               context.install(behavior);
30856           });
30857
30858           // Get focus on the body.
30859           if (document.activeElement && document.activeElement.blur) {
30860               document.activeElement.blur();
30861           }
30862
30863           if (sidebar) {
30864               context.ui().sidebar.show(sidebar);
30865           } else {
30866               context.ui().sidebar.select(null);
30867           }
30868       };
30869
30870
30871       mode.exit = function() {
30872           context.ui().sidebar.hover.cancel();
30873           behaviors.forEach(function(behavior) {
30874               context.uninstall(behavior);
30875           });
30876
30877           if (sidebar) {
30878               context.ui().sidebar.hide();
30879           }
30880       };
30881
30882
30883       mode.sidebar = function(_) {
30884           if (!arguments.length) return sidebar;
30885           sidebar = _;
30886           return mode;
30887       };
30888
30889
30890       return mode;
30891   }
30892
30893   function modeDrawArea(context, wayId, startGraph) {
30894       var mode = {
30895           button: 'area',
30896           id: 'draw-area'
30897       };
30898
30899       var behavior;
30900
30901
30902       mode.enter = function() {
30903           var way = context.entity(wayId);
30904
30905           behavior = behaviorDrawWay(context, wayId, undefined, mode, startGraph)
30906               .tail(t('modes.draw_area.tail'));
30907
30908           var addNode = behavior.addNode;
30909
30910           behavior.addNode = function(node, d) {
30911               var length = way.nodes.length;
30912               var penultimate = length > 2 ? way.nodes[length - 2] : null;
30913
30914               if (node.id === way.first() || node.id === penultimate) {
30915                   behavior.finish();
30916               } else {
30917                   addNode(node, d);
30918               }
30919           };
30920
30921           context.install(behavior);
30922       };
30923
30924
30925       mode.exit = function() {
30926           context.uninstall(behavior);
30927       };
30928
30929
30930       mode.selectedIDs = function() {
30931           return [wayId];
30932       };
30933
30934
30935       mode.activeID = function() {
30936           return (behavior && behavior.activeID()) || [];
30937       };
30938
30939
30940       return mode;
30941   }
30942
30943   function modeDrawLine(context, wayId, startGraph, affix) {
30944       var mode = {
30945           button: 'line',
30946           id: 'draw-line'
30947       };
30948
30949       var behavior;
30950
30951
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();
30956
30957           behavior = behaviorDrawWay(context, wayId, index, mode, startGraph)
30958               .tail(t('modes.draw_line.tail'));
30959
30960           var addNode = behavior.addNode;
30961           behavior.addNode = function(node, d) {
30962               if (node.id === headId) {
30963                   behavior.finish();
30964               } else {
30965                   addNode(node, d);
30966               }
30967           };
30968
30969           context.install(behavior);
30970       };
30971
30972
30973       mode.exit = function() {
30974           context.uninstall(behavior);
30975       };
30976
30977
30978       mode.selectedIDs = function() {
30979           return [wayId];
30980       };
30981
30982
30983       mode.activeID = function() {
30984           return (behavior && behavior.activeID()) || [];
30985       };
30986
30987       return mode;
30988   }
30989
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);
30996
30997
30998       var operation = function() {
30999           context.perform(action, operation.annotation());
31000       };
31001
31002
31003       operation.available = function() {
31004           return selectedIDs.length === 1 &&
31005               entity.type === 'way' &&
31006               uniq(entity.nodes).length > 1;
31007       };
31008
31009
31010       operation.disabled = function() {
31011           var reason;
31012           if (extent.percentContainedIn(context.extent()) < 0.8) {
31013               reason = 'too_large';
31014           } else if (context.hasHiddenConnections(entityId)) {
31015               reason = 'connected_to_hidden';
31016           }
31017           return action.disabled(context.graph()) || reason;
31018       };
31019
31020
31021       operation.tooltip = function() {
31022           var disable = operation.disabled();
31023           return disable ?
31024               t('operations.circularize.' + disable) :
31025               t('operations.circularize.description.' + geometry);
31026       };
31027
31028
31029       operation.annotation = function() {
31030           return t('operations.circularize.annotation.' + geometry);
31031       };
31032
31033
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);
31038
31039       return operation;
31040   }
31041
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];
31048
31049
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);
31056           });
31057       }
31058
31059
31060       var operation = function() {
31061           var candidate = candidateWays()[0];
31062           context.enter(
31063               modeDrawLine(context, candidate.id, context.graph(), candidate.affix(vertex.id))
31064           );
31065       };
31066
31067
31068       operation.available = function() {
31069           return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
31070               !context.features().hasHiddenConnections(vertex, context.graph());
31071       };
31072
31073
31074       operation.disabled = function() {
31075           var candidates = candidateWays();
31076           if (candidates.length === 0)
31077               return 'not_eligible';
31078           if (candidates.length > 1)
31079               return 'multiple';
31080       };
31081
31082
31083       operation.tooltip = function() {
31084           var disable = operation.disabled();
31085           return disable ?
31086               t('operations.continue.' + disable) :
31087               t('operations.continue.description');
31088       };
31089
31090
31091       operation.annotation = function() {
31092           return t('operations.continue.annotation.line');
31093       };
31094
31095
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);
31100
31101       return operation;
31102   }
31103
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());
31110
31111
31112       var operation = function() {
31113           var nextSelectedID;
31114           var nextSelectedLoc;
31115
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];
31122
31123               // Select the next closest node in the way.
31124               if (geometry === 'vertex') {
31125                   var nodes = parent.nodes,
31126                       i = nodes.indexOf(id);
31127
31128                   if (i === 0) {
31129                       i++;
31130                   } else if (i === nodes.length - 1) {
31131                       i--;
31132                   } else {
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;
31136                   }
31137
31138                   nextSelectedID = nodes[i];
31139                   nextSelectedLoc = context.entity(nextSelectedID).loc;
31140               }
31141           }
31142
31143           context.perform(action, operation.annotation());
31144
31145           if (nextSelectedID && nextSelectedLoc) {
31146               if (context.hasEntity(nextSelectedID)) {
31147                   context.enter(modeSelect(context, [nextSelectedID]).follow(true));
31148               } else {
31149                   context.map().centerEase(nextSelectedLoc);
31150                   context.enter(modeBrowse(context));
31151               }
31152           } else {
31153               context.enter(modeBrowse(context));
31154           }
31155
31156       };
31157
31158
31159       operation.available = function() {
31160           return true;
31161       };
31162
31163
31164       operation.disabled = function() {
31165           var reason;
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';
31174           }
31175           return reason;
31176
31177           function incompleteRelation(id) {
31178               var entity = context.entity(id);
31179               return entity.type === 'relation' && !entity.isComplete(context.graph());
31180           }
31181
31182           function protectedMember(id) {
31183               var entity = context.entity(id);
31184               if (entity.type !== 'way') return false;
31185
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')) {
31192                       return true;
31193                   }
31194               }
31195               return false;
31196           }
31197
31198       };
31199
31200
31201       operation.tooltip = function() {
31202           var disable = operation.disabled();
31203           return disable ?
31204               t('operations.delete.' + disable + '.' + multi) :
31205               t('operations.delete.description' + '.' + multi);
31206       };
31207
31208
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 });
31213       };
31214
31215
31216       operation.id = 'delete';
31217       operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
31218       operation.title = t('operations.delete.title');
31219       operation.behavior = behaviorOperation(context).which(operation);
31220
31221       return operation;
31222   }
31223
31224   function operationDisconnect(selectedIDs, context) {
31225       var vertices = filter(selectedIDs, function(entityId) {
31226           return context.geometry(entityId) === 'vertex';
31227       });
31228
31229       var entityId = vertices[0],
31230           action = actionDisconnect(entityId);
31231
31232       if (selectedIDs.length > 1) {
31233           action.limitWays(without(selectedIDs, entityId));
31234       }
31235
31236
31237       var operation = function() {
31238           context.perform(action, operation.annotation());
31239       };
31240
31241
31242       operation.available = function() {
31243           return vertices.length === 1;
31244       };
31245
31246
31247       operation.disabled = function() {
31248           var reason;
31249           if (some(selectedIDs, context.hasHiddenConnections)) {
31250               reason = 'connected_to_hidden';
31251           }
31252           return action.disabled(context.graph()) || reason;
31253       };
31254
31255
31256       operation.tooltip = function() {
31257           var disable = operation.disabled();
31258           return disable ?
31259               t('operations.disconnect.' + disable) :
31260               t('operations.disconnect.description');
31261       };
31262
31263
31264       operation.annotation = function() {
31265           return t('operations.disconnect.annotation');
31266       };
31267
31268
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);
31273
31274       return operation;
31275   }
31276
31277   function operationMerge(selectedIDs, context) {
31278
31279       function updatePresetTags(newGraph, ids) {
31280           var id = ids[0];
31281           var newEntity = newGraph.hasEntity(id);
31282
31283           if (!newEntity) return;
31284           var newPreset = context.presets().match(newEntity, newGraph);
31285           context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
31286       }
31287
31288
31289       var join = actionJoin(selectedIDs);
31290       var merge = actionMerge(selectedIDs);
31291       var mergePolygon = actionMergePolygon(selectedIDs);
31292       var mergeNodes = actionMergeNodes(selectedIDs);
31293
31294
31295       var operation = function() {
31296           var doUpdateTags;
31297           var action;
31298
31299           if (!join.disabled(context.graph())) {
31300               doUpdateTags = false;
31301               action = join;
31302           } else if (!merge.disabled(context.graph())) {
31303               doUpdateTags = true;
31304               action = merge;
31305           } else if (!mergePolygon.disabled(context.graph())) {
31306               doUpdateTags = false;
31307               action = mergePolygon;
31308           } else {
31309               doUpdateTags = true;
31310               action = mergeNodes;
31311           }
31312
31313           context.perform(action, operation.annotation());
31314
31315           var ids = selectedIDs.filter(function(id) {
31316               var entity = context.hasEntity(id);
31317               return entity && entity.type !== 'node';
31318           });
31319
31320           // if we merged tags, rematch preset to update tags if necessary (#3851)
31321           if (doUpdateTags) {
31322               updatePresetTags(context.graph(), ids);
31323           }
31324
31325           context.enter(modeSelect(context, ids));
31326       };
31327
31328
31329       operation.available = function() {
31330           return selectedIDs.length >= 2;
31331       };
31332
31333
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());
31339       };
31340
31341
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'
31347
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() });
31353
31354               } else if (p === 'incomplete_relation') {
31355                   return t('operations.merge.incomplete_relation');
31356
31357               } else if (n === 'relation') {
31358                   return t('operations.merge.relation');
31359
31360               } else {
31361                   return t('operations.merge.' + j);
31362               }
31363
31364           } else {
31365               return t('operations.merge.description');
31366           }
31367       };
31368
31369
31370       operation.annotation = function() {
31371           return t('operations.merge.annotation', { n: selectedIDs.length });
31372       };
31373
31374
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);
31379
31380       return operation;
31381   }
31382
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());
31388
31389
31390       var operation = function() {
31391           context.enter(modeMove$$1(context, selectedIDs));
31392       };
31393
31394
31395       operation.available = function() {
31396           return selectedIDs.length > 1 ||
31397               context.entity(selectedIDs[0]).type !== 'node';
31398       };
31399
31400
31401       operation.disabled = function() {
31402           var reason;
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';
31409           }
31410           return reason;
31411
31412           function incompleteRelation(id) {
31413               var entity = context.entity(id);
31414               return entity.type === 'relation' && !entity.isComplete(context.graph());
31415           }
31416       };
31417
31418
31419       operation.tooltip = function() {
31420           var disable = operation.disabled();
31421           return disable ?
31422               t('operations.move.' + disable + '.' + multi) :
31423               t('operations.move.description.' + multi);
31424       };
31425
31426
31427       operation.annotation = function() {
31428           return selectedIDs.length === 1 ?
31429               t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
31430               t('operations.move.annotation.multiple');
31431       };
31432
31433
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);
31438
31439       return operation;
31440   }
31441
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);
31448
31449
31450       var operation = function() {
31451           context.perform(action, operation.annotation());
31452       };
31453
31454
31455       operation.available = function() {
31456           return selectedIDs.length === 1 &&
31457               entity.type === 'way' &&
31458               entity.isClosed() &&
31459               uniq(entity.nodes).length > 2;
31460       };
31461
31462
31463       operation.disabled = function() {
31464           var reason;
31465           if (extent.percentContainedIn(context.extent()) < 0.8) {
31466               reason = 'too_large';
31467           } else if (context.hasHiddenConnections(entityId)) {
31468               reason = 'connected_to_hidden';
31469           }
31470           return action.disabled(context.graph()) || reason;
31471       };
31472
31473
31474       operation.tooltip = function() {
31475           var disable = operation.disabled();
31476           return disable ?
31477               t('operations.orthogonalize.' + disable) :
31478               t('operations.orthogonalize.description.' + geometry);
31479       };
31480
31481
31482       operation.annotation = function() {
31483           return t('operations.orthogonalize.annotation.' + geometry);
31484       };
31485
31486
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);
31491
31492       return operation;
31493   }
31494
31495   /**
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:
31500    * (value).
31501    *
31502    * @static
31503    * @memberOf _
31504    * @since 4.0.0
31505    * @category Array
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.
31509    * @example
31510    *
31511    * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
31512    * // => [2.1, 1.2]
31513    *
31514    * // The `_.property` iteratee shorthand.
31515    * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
31516    * // => [{ 'x': 1 }, { 'x': 2 }]
31517    */
31518   function uniqBy(array, iteratee) {
31519     return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
31520   }
31521
31522   function operationReflectShort(selectedIDs, context) {
31523       return operationReflect(selectedIDs, context, 'short');
31524   }
31525
31526
31527   function operationReflectLong(selectedIDs, context) {
31528       return operationReflect(selectedIDs, context, 'long');
31529   }
31530
31531
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());
31538
31539
31540       var operation = function() {
31541           var action = actionReflect(selectedIDs, context.projection)
31542               .useLongAxis(Boolean(axis === 'long'));
31543           context.perform(action, operation.annotation());
31544       };
31545
31546
31547       operation.available = function() {
31548           var nodes = utilGetAllNodes(selectedIDs, context.graph());
31549           return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
31550       };
31551
31552
31553       operation.disabled = function() {
31554           var reason;
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';
31561           }
31562           return reason;
31563
31564           function incompleteRelation(id) {
31565               var entity = context.entity(id);
31566               return entity.type === 'relation' && !entity.isComplete(context.graph());
31567           }
31568       };
31569
31570
31571       operation.tooltip = function() {
31572           var disable = operation.disabled();
31573           return disable ?
31574               t('operations.reflect.' + disable + '.' + multi) :
31575               t('operations.reflect.description.' + axis + '.' + multi);
31576       };
31577
31578
31579       operation.annotation = function() {
31580           return t('operations.reflect.annotation.' + axis + '.' + multi);
31581       };
31582
31583
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);
31588
31589       return operation;
31590   }
31591
31592   function operationReverse(selectedIDs, context) {
31593       var entityId = selectedIDs[0];
31594
31595       var operation = function() {
31596           context.perform(actionReverse(entityId), operation.annotation());
31597       };
31598
31599
31600       operation.available = function() {
31601           return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
31602       };
31603
31604
31605       operation.disabled = function() {
31606           return false;
31607       };
31608
31609
31610       operation.tooltip = function() {
31611           return t('operations.reverse.description');
31612       };
31613
31614
31615       operation.annotation = function() {
31616           return t('operations.reverse.annotation');
31617       };
31618
31619
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);
31624
31625       return operation;
31626   }
31627
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());
31633
31634
31635       var operation = function() {
31636           context.enter(modeRotate$$1(context, selectedIDs));
31637       };
31638
31639
31640       operation.available = function() {
31641           var nodes = utilGetAllNodes(selectedIDs, context.graph());
31642           return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
31643       };
31644
31645
31646       operation.disabled = function() {
31647           var reason;
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';
31654           }
31655           return reason;
31656
31657           function incompleteRelation(id) {
31658               var entity = context.entity(id);
31659               return entity.type === 'relation' && !entity.isComplete(context.graph());
31660           }
31661       };
31662
31663
31664       operation.tooltip = function() {
31665           var disable = operation.disabled();
31666           return disable ?
31667               t('operations.rotate.' + disable + '.' + multi) :
31668               t('operations.rotate.description.' + multi);
31669       };
31670
31671
31672       operation.annotation = function() {
31673           return selectedIDs.length === 1 ?
31674               t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
31675               t('operations.rotate.annotation.multiple');
31676       };
31677
31678
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);
31683
31684       return operation;
31685   }
31686
31687   function operationSplit(selectedIDs, context) {
31688       var vertices = filter(selectedIDs, function(entityId) {
31689           return context.geometry(entityId) === 'vertex';
31690       });
31691
31692       var entityId = vertices[0],
31693           action = actionSplit(entityId),
31694           ways = [];
31695
31696       if (vertices.length === 1) {
31697           if (selectedIDs.length > 1) {
31698               action.limitWays(without(selectedIDs, entityId));
31699           }
31700           ways = action.ways(context.graph());
31701       }
31702
31703
31704       var operation = function() {
31705           var difference = context.perform(action, operation.annotation());
31706           context.enter(modeSelect(context, difference.extantIDs()));
31707       };
31708
31709
31710       operation.available = function() {
31711           return vertices.length === 1;
31712       };
31713
31714
31715       operation.disabled = function() {
31716           var reason;
31717           if (some(selectedIDs, context.hasHiddenConnections)) {
31718               reason = 'connected_to_hidden';
31719           }
31720           return action.disabled(context.graph()) || reason;
31721       };
31722
31723
31724       operation.tooltip = function() {
31725           var disable = operation.disabled();
31726           if (disable) {
31727               return t('operations.split.' + disable);
31728           }
31729           if (ways.length === 1) {
31730               return t('operations.split.description.' + context.geometry(ways[0].id));
31731           } else {
31732               return t('operations.split.description.multiple');
31733           }
31734       };
31735
31736
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 });
31741       };
31742
31743
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);
31748
31749       return operation;
31750   }
31751
31752   function operationStraighten(selectedIDs, context) {
31753       var entityId = selectedIDs[0],
31754           action = actionStraighten(entityId, context.projection);
31755
31756
31757       function operation() {
31758           context.perform(action, operation.annotation());
31759       }
31760
31761
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;
31768       };
31769
31770
31771       operation.disabled = function() {
31772           var reason;
31773           if (context.hasHiddenConnections(entityId)) {
31774               reason = 'connected_to_hidden';
31775           }
31776           return action.disabled(context.graph()) || reason;
31777       };
31778
31779
31780       operation.tooltip = function() {
31781           var disable = operation.disabled();
31782           return disable ?
31783               t('operations.straighten.' + disable) :
31784               t('operations.straighten.description');
31785       };
31786
31787
31788       operation.annotation = function() {
31789           return t('operations.straighten.annotation');
31790       };
31791
31792
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);
31797
31798       return operation;
31799   }
31800
31801
31802
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
31817   });
31818
31819   function modeMove$$1(context, entityIDs, baseGraph) {
31820       var mode = {
31821           id: 'move',
31822           button: 'browse'
31823       };
31824
31825       var keybinding = d3keybinding('move');
31826       var behaviors = [
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
31834       ];
31835       var annotation = entityIDs.length === 1 ?
31836           t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
31837           t('operations.move.annotation.multiple');
31838
31839       var _prevGraph;
31840       var _cache;
31841       var _origin;
31842       var _nudgeInterval;
31843
31844
31845       function doMove(nudge) {
31846           nudge = nudge || [0, 0];
31847
31848           var fn;
31849           if (_prevGraph !== context.graph()) {
31850               _cache = {};
31851               _origin = context.map().mouseCoordinates();
31852               fn = context.perform;
31853           } else {
31854               fn = context.overwrite;
31855           }
31856
31857           var currMouse = context.mouse();
31858           var origMouse = context.projection(_origin);
31859           var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
31860
31861           fn(actionMove(entityIDs, delta, context.projection, _cache), annotation);
31862           _prevGraph = context.graph();
31863       }
31864
31865
31866       function startNudge(nudge) {
31867           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
31868           _nudgeInterval = window.setInterval(function() {
31869               context.pan(nudge);
31870               doMove(nudge);
31871           }, 50);
31872       }
31873
31874
31875       function stopNudge() {
31876           if (_nudgeInterval) {
31877               window.clearInterval(_nudgeInterval);
31878               _nudgeInterval = null;
31879           }
31880       }
31881
31882
31883       function move() {
31884           doMove();
31885           var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
31886           if (nudge) {
31887               startNudge(nudge);
31888           } else {
31889               stopNudge();
31890           }
31891       }
31892
31893
31894       function finish() {
31895           event.stopPropagation();
31896           context.enter(modeSelect(context, entityIDs));
31897           stopNudge();
31898       }
31899
31900
31901       function cancel() {
31902           if (baseGraph) {
31903               while (context.graph() !== baseGraph) context.pop();
31904               context.enter(modeBrowse(context));
31905           } else {
31906               context.pop();
31907               context.enter(modeSelect(context, entityIDs));
31908           }
31909           stopNudge();
31910       }
31911
31912
31913       function undone() {
31914           context.enter(modeBrowse(context));
31915       }
31916
31917
31918       mode.enter = function() {
31919           _origin = context.map().mouseCoordinates();
31920           _prevGraph = null;
31921           _cache = {};
31922
31923           behaviors.forEach(function(behavior) {
31924               context.install(behavior);
31925           });
31926
31927           context.surface()
31928               .on('mousemove.move', move)
31929               .on('click.move', finish);
31930
31931           context.history()
31932               .on('undone.move', undone);
31933
31934           keybinding
31935               .on('⎋', cancel)
31936               .on('↩', finish);
31937
31938           select(document)
31939               .call(keybinding);
31940       };
31941
31942
31943       mode.exit = function() {
31944           stopNudge();
31945
31946           behaviors.forEach(function(behavior) {
31947               context.uninstall(behavior);
31948           });
31949
31950           context.surface()
31951               .on('mousemove.move', null)
31952               .on('click.move', null);
31953
31954           context.history()
31955               .on('undone.move', null);
31956
31957           keybinding.off();
31958       };
31959
31960
31961       mode.selectedIDs = function() {
31962           if (!arguments.length) return entityIDs;
31963           // no assign
31964           return mode;
31965       };
31966
31967
31968       return mode;
31969   }
31970
31971   function modeRotate$$1(context, entityIDs) {
31972       var mode = {
31973           id: 'rotate',
31974           button: 'browse'
31975       };
31976
31977       var keybinding = d3keybinding('rotate');
31978       var behaviors = [
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
31986       ];
31987       var annotation = entityIDs.length === 1 ?
31988           t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
31989           t('operations.rotate.annotation.multiple');
31990
31991       var _prevGraph;
31992       var _prevAngle;
31993       var _prevTransform;
31994       var _pivot;
31995
31996
31997       function doRotate() {
31998           var fn;
31999           if (context.graph() !== _prevGraph) {
32000               fn = context.perform;
32001           } else {
32002               fn = context.replace;
32003           }
32004
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) {
32012
32013               var nodes = utilGetAllNodes(entityIDs, context.graph());
32014               var points = nodes.map(function(n) { return projection(n.loc); });
32015
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);
32020               } else {
32021                   _pivot = d3_polygonCentroid(d3_polygonHull(points));
32022               }
32023               _prevAngle = undefined;
32024           }
32025
32026
32027           var currMouse = context.mouse();
32028           var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
32029
32030           if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
32031           var delta = currAngle - _prevAngle;
32032
32033           fn(actionRotate(entityIDs, _pivot, delta, projection), annotation);
32034
32035           _prevTransform = currTransform;
32036           _prevAngle = currAngle;
32037           _prevGraph = context.graph();
32038       }
32039
32040
32041       function finish() {
32042           event.stopPropagation();
32043           context.enter(modeSelect(context, entityIDs));
32044       }
32045
32046
32047       function cancel() {
32048           context.pop();
32049           context.enter(modeSelect(context, entityIDs));
32050       }
32051
32052
32053       function undone() {
32054           context.enter(modeBrowse(context));
32055       }
32056
32057
32058       mode.enter = function() {
32059           behaviors.forEach(function(behavior) {
32060               context.install(behavior);
32061           });
32062
32063           context.surface()
32064               .on('mousemove.rotate', doRotate)
32065               .on('click.rotate', finish);
32066
32067           context.history()
32068               .on('undone.rotate', undone);
32069
32070           keybinding
32071               .on('⎋', cancel)
32072               .on('↩', finish);
32073
32074           select(document)
32075               .call(keybinding);
32076       };
32077
32078
32079       mode.exit = function() {
32080           behaviors.forEach(function(behavior) {
32081               context.uninstall(behavior);
32082           });
32083
32084           context.surface()
32085               .on('mousemove.rotate', null)
32086               .on('click.rotate', null);
32087
32088           context.history()
32089               .on('undone.rotate', null);
32090
32091           keybinding.off();
32092       };
32093
32094
32095       mode.selectedIDs = function() {
32096           if (!arguments.length) return entityIDs;
32097           // no assign
32098           return mode;
32099       };
32100
32101
32102       return mode;
32103   }
32104
32105   /**
32106    * A specialized version of `_.reduce` for arrays without support for
32107    * iteratee shorthands.
32108    *
32109    * @private
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.
32116    */
32117   function arrayReduce(array, iteratee, accumulator, initAccum) {
32118     var index = -1,
32119         length = array == null ? 0 : array.length;
32120
32121     if (initAccum && length) {
32122       accumulator = array[++index];
32123     }
32124     while (++index < length) {
32125       accumulator = iteratee(accumulator, array[index], index, array);
32126     }
32127     return accumulator;
32128   }
32129
32130   /**
32131    * The base implementation of `_.reduce` and `_.reduceRight`, without support
32132    * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
32133    *
32134    * @private
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.
32142    */
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);
32148     });
32149     return accumulator;
32150   }
32151
32152   /**
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).
32159    *
32160    * Many lodash methods are guarded to work as iteratees for methods like
32161    * `_.reduce`, `_.reduceRight`, and `_.transform`.
32162    *
32163    * The guarded methods are:
32164    * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
32165    * and `sortBy`
32166    *
32167    * @static
32168    * @memberOf _
32169    * @since 0.1.0
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
32176    * @example
32177    *
32178    * _.reduce([1, 2], function(sum, n) {
32179    *   return sum + n;
32180    * }, 0);
32181    * // => 3
32182    *
32183    * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
32184    *   (result[value] || (result[value] = [])).push(key);
32185    *   return result;
32186    * }, {});
32187    * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
32188    */
32189   function reduce(collection, iteratee, accumulator) {
32190     var func = isArray(collection) ? arrayReduce : baseReduce,
32191         initAccum = arguments.length < 3;
32192
32193     return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
32194   }
32195
32196   function d3geoTile() {
32197       var _size = [960, 500];
32198       var _scale = 256;
32199       var _scaleExtent = [0, 20];
32200       var _translate = [_size[0] / 2, _size[1] / 2];
32201       var _zoomDelta = 0;
32202       var _margin = 0;
32203
32204       function bound(val) {
32205           return Math.min(_scaleExtent[1], Math.max(_scaleExtent[0], val));
32206       }
32207
32208       function tile() {
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);
32212           var origin = [
32213               (_translate[0] - _scale / 2) / k,
32214               (_translate[1] - _scale / 2) / k
32215           ];
32216
32217           var cols = range(
32218               Math.max(0, Math.floor(-origin[0]) - _margin),
32219               Math.max(0, Math.ceil(_size[0] / k - origin[0]) + _margin)
32220           );
32221           var rows = range(
32222               Math.max(0, Math.floor(-origin[1]) - _margin),
32223               Math.max(0, Math.ceil(_size[1] / k - origin[1]) + _margin)
32224           );
32225
32226           var tiles = [];
32227           for (var i = 0; i < rows.length; i++) {
32228               var y = rows[i];
32229               for (var j = 0; j < cols.length; j++) {
32230                   var x = cols[j];
32231
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
32235                   } else {
32236                       tiles.push([x, y, z0]);     // tiles in margin at the end
32237                   }
32238               }
32239           }
32240
32241           tiles.translate = origin;
32242           tiles.scale = k;
32243
32244           return tiles;
32245       }
32246
32247       tile.scaleExtent = function(val) {
32248           if (!arguments.length) return _scaleExtent;
32249           _scaleExtent = val;
32250           return tile;
32251       };
32252
32253       tile.size = function(val) {
32254           if (!arguments.length) return _size;
32255           _size = val;
32256           return tile;
32257       };
32258
32259       tile.scale = function(val) {
32260           if (!arguments.length) return _scale;
32261           _scale = val;
32262           return tile;
32263       };
32264
32265       tile.translate = function(val) {
32266           if (!arguments.length) return _translate;
32267           _translate = val;
32268           return tile;
32269       };
32270
32271       tile.zoomDelta = function(val) {
32272           if (!arguments.length) return _zoomDelta;
32273           _zoomDelta = +val;
32274           return tile;
32275       };
32276
32277       // number to extend the rows/columns beyond those covering the viewport
32278       tile.margin = function(val) {
32279           if (!arguments.length) return _margin;
32280           _margin = +val;
32281           return tile;
32282       };
32283
32284       return tile;
32285   }
32286
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)
32290       var patterns = {
32291           beach: 'beach',
32292           cemetery: 'cemetery',
32293           construction: 'construction',
32294           farm: 'farmland',
32295           farmland: 'farmland',
32296           grave_yard: 'cemetery',
32297           meadow: 'meadow',
32298           military: 'construction',
32299           orchard: 'orchard',
32300           sand: 'beach',
32301           scrub: 'scrub',
32302           wetland: 'wetland',
32303       };
32304
32305       var patternKeys = ['landuse', 'natural', 'amenity'];
32306
32307
32308       function setPattern(d) {
32309           for (var i = 0; i < patternKeys.length; i++) {
32310               if (d.tags.building && d.tags.building !== 'no') continue;
32311
32312               if (patterns.hasOwnProperty(d.tags[patternKeys[i]])) {
32313                   this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[d.tags[patternKeys[i]]] + '")';
32314                   return;
32315               }
32316           }
32317           this.style.fill = this.style.stroke = '';
32318       }
32319
32320
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();
32326
32327           // The targets and nopes will be MultiLineString sub-segments of the ways
32328           var data = { targets: [], nopes: [] };
32329
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);
32334           });
32335
32336
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; });
32342
32343           // exit
32344           targets.exit()
32345               .remove();
32346
32347           // enter/update
32348           targets.enter()
32349               .append('path')
32350               .merge(targets)
32351               .attr('d', getPath)
32352               .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
32353
32354
32355           // NOPE
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; });
32360
32361           // exit
32362           nopes.exit()
32363               .remove();
32364
32365           // enter/update
32366           nopes.enter()
32367               .append('path')
32368               .merge(nopes)
32369               .attr('d', getPath)
32370               .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
32371       }
32372
32373
32374       function drawAreas(selection, graph, entities, filter) {
32375           var path = svgPath(projection, graph, true),
32376               areas = {},
32377               multipolygon;
32378
32379           for (var i = 0; i < entities.length; i++) {
32380               var entity = entities[i];
32381               if (entity.geometry(graph) !== 'area') continue;
32382
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))
32388                   };
32389               } else if (!areas[entity.id]) {
32390                   areas[entity.id] = {
32391                       entity: entity,
32392                       area: Math.abs(entity.area(graph))
32393                   };
32394               }
32395           }
32396
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');
32400
32401           var strokes = areas.filter(function(area) {
32402               return area.type === 'way';
32403           });
32404
32405           var data = {
32406               clip: areas,
32407               shadow: strokes,
32408               stroke: strokes,
32409               fill: areas
32410           };
32411
32412           var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath')
32413              .filter(filter)
32414              .data(data.clip, osmEntity$$1.key);
32415
32416           clipPaths.exit()
32417              .remove();
32418
32419           var clipPathsEnter = clipPaths.enter()
32420              .append('clipPath')
32421              .attr('class', 'clipPath')
32422              .attr('id', function(entity) { return entity.id + '-clippath'; });
32423
32424           clipPathsEnter
32425              .append('path');
32426
32427           clipPaths.merge(clipPathsEnter)
32428              .selectAll('path')
32429              .attr('d', path);
32430
32431
32432           var layer = selection.selectAll('.layer-areas .layer-areas-areas');
32433
32434           var areagroup = layer
32435               .selectAll('g.areagroup')
32436               .data(['fill', 'shadow', 'stroke']);
32437
32438           areagroup = areagroup.enter()
32439               .append('g')
32440               .attr('class', function(d) { return 'areagroup area-' + d; })
32441               .merge(areagroup);
32442
32443           var paths = areagroup
32444               .selectAll('path')
32445               .filter(filter)
32446               .data(function(layer) { return data[layer]; }, osmEntity$$1.key);
32447
32448           paths.exit()
32449               .remove();
32450
32451           var fills = selection.selectAll('.area-fill path.area').nodes();
32452
32453           var bisect = bisector(function(node) {
32454               return -node.__data__.area(graph);
32455           }).left;
32456
32457           function sortedByArea(entity) {
32458               if (this._parent.__data__ === 'fill') {
32459                   return fills[bisect(fills, -entity.area(graph))];
32460               }
32461           }
32462
32463           paths = paths.enter()
32464               .insert('path', sortedByArea)
32465               .merge(paths)
32466               .each(function(entity) {
32467                   var layer = this.parentNode.__data__;
32468
32469                   this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
32470
32471                   if (layer === 'fill') {
32472                       this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
32473                       setPattern.apply(this, arguments);
32474                   }
32475               })
32476               .call(svgTagClasses())
32477               .attr('d', path);
32478
32479
32480           // touch targets
32481           selection.selectAll('.layer-areas .layer-areas-targets')
32482               .call(drawTargets, graph, data.stroke, filter);
32483       }
32484
32485       return drawAreas;
32486   }
32487
32488   function svgDebug$$1(projection, context) {
32489
32490       function multipolygons(imagery) {
32491           return imagery.map(function(data$$1) {
32492               return {
32493                   type: 'MultiPolygon',
32494                   coordinates: [ data$$1.polygon ]
32495               };
32496           });
32497       }
32498
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');
32507
32508           var debugData = [];
32509           if (showsTile) {
32510               debugData.push({ class: 'red', label: 'tile' });
32511           }
32512           if (showsCollision) {
32513               debugData.push({ class: 'yellow', label: 'collision' });
32514           }
32515           if (showsImagery) {
32516               debugData.push({ class: 'orange', label: 'imagery' });
32517           }
32518           if (showsCommunity) {
32519               debugData.push({ class: 'blue', label: 'community' });
32520           }
32521           if (showsImperial) {
32522               debugData.push({ class: 'cyan', label: 'imperial' });
32523           }
32524           if (showsDriveLeft) {
32525               debugData.push({ class: 'green', label: 'driveLeft' });
32526           }
32527           if (showsTouchTargets) {
32528               debugData.push({ class: 'pink', label: 'touchTargets' });
32529           }
32530
32531
32532           var legend = select('#content')
32533               .selectAll('.debug-legend')
32534               .data(debugData.length ? [0] : []);
32535
32536           legend.exit()
32537               .remove();
32538
32539           legend = legend.enter()
32540               .append('div')
32541               .attr('class', 'fillD debug-legend')
32542               .merge(legend);
32543
32544
32545           var legendItems = legend.selectAll('.debug-legend-item')
32546               .data(debugData, function(d) { return d.label; });
32547
32548           legendItems.exit()
32549               .remove();
32550
32551           legendItems.enter()
32552               .append('span')
32553               .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
32554               .text(function(d) { return d.label; });
32555
32556
32557           var layer = selection$$1.selectAll('.layer-debug')
32558               .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft ? [0] : []);
32559
32560           layer.exit()
32561               .remove();
32562
32563           layer = layer.enter()
32564               .append('g')
32565               .attr('class', 'layer-debug')
32566               .merge(layer);
32567
32568
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);
32575               });
32576           }));
32577
32578           var imagery = layer.selectAll('path.debug-imagery')
32579               .data(showsImagery ? availableImagery : []);
32580
32581           imagery.exit()
32582               .remove();
32583
32584           imagery.enter()
32585               .append('path')
32586               .attr('class', 'debug-imagery debug orange');
32587
32588
32589           var community = layer.selectAll('path.debug-community')
32590               .data(showsCommunity ? values$1(data.community.features) : []);
32591
32592           community.exit()
32593               .remove();
32594
32595           community.enter()
32596               .append('path')
32597               .attr('class', 'debug-community debug blue');
32598
32599
32600           var imperial = layer
32601               .selectAll('path.debug-imperial')
32602               .data(showsImperial ? [dataImperial] : []);
32603
32604           imperial.exit()
32605               .remove();
32606
32607           imperial.enter()
32608               .append('path')
32609               .attr('class', 'debug-imperial debug cyan');
32610
32611
32612           var driveLeft = layer
32613               .selectAll('path.debug-drive-left')
32614               .data(showsDriveLeft ? [dataDriveLeft] : []);
32615
32616           driveLeft.exit()
32617               .remove();
32618
32619           driveLeft.enter()
32620               .append('path')
32621               .attr('class', 'debug-drive-left debug green');
32622
32623
32624           // update
32625           layer.selectAll('path')
32626               .attr('d', svgPath(projection).geojson);
32627       }
32628
32629
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');
32640           } else {
32641               return this;
32642           }
32643       };
32644
32645
32646       return drawDebug;
32647   }
32648
32649   /*
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.
32652   */
32653   function svgDefs(context) {
32654
32655       function drawDefs(selection$$1) {
32656           var defs = selection$$1.append('defs');
32657
32658           // add markers
32659           defs
32660               .append('marker')
32661               .attr('id', 'oneway-marker')
32662               .attr('viewBox', '0 0 10 5')
32663               .attr('refX', 2.5)
32664               .attr('refY', 2.5)
32665               .attr('markerWidth', 2)
32666               .attr('markerHeight', 2)
32667               .attr('markerUnits', 'strokeWidth')
32668               .attr('orient', 'auto')
32669               .append('path')
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');
32675
32676           defs
32677               .append('marker')
32678               .attr('id', 'viewfield-marker')
32679               .attr('viewBox', '0 0 16 16')
32680               .attr('refX', 8)
32681               .attr('refY', 16)
32682               .attr('markerWidth', 4)
32683               .attr('markerHeight', 4)
32684               .attr('markerUnits', 'strokeWidth')
32685               .attr('orient', 'auto')
32686               .append('path')
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');
32694
32695           defs
32696               .append('marker')
32697               .attr('id', 'viewfield-marker-wireframe')
32698               .attr('viewBox', '0 0 16 16')
32699               .attr('refX', 8)
32700               .attr('refY', 16)
32701               .attr('markerWidth', 4)
32702               .attr('markerHeight', 4)
32703               .attr('markerUnits', 'strokeWidth')
32704               .attr('orient', 'auto')
32705               .append('path')
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');
32712
32713           // add patterns
32714           var patterns = defs.selectAll('pattern')
32715               .data([
32716                   // pattern name, pattern image name
32717                   ['wetland', 'wetland'],
32718                   ['construction', 'construction'],
32719                   ['cemetery', 'cemetery'],
32720                   ['orchard', 'orchard'],
32721                   ['farmland', 'farmland'],
32722                   ['beach', 'dots'],
32723                   ['scrub', 'dots'],
32724                   ['meadow', 'dots']
32725               ])
32726               .enter()
32727               .append('pattern')
32728               .attr('id', function (d) { return 'pattern-' + d[0]; })
32729               .attr('width', 32)
32730               .attr('height', 32)
32731               .attr('patternUnits', 'userSpaceOnUse');
32732
32733           patterns
32734               .append('rect')
32735               .attr('x', 0)
32736               .attr('y', 0)
32737               .attr('width', 32)
32738               .attr('height', 32)
32739               .attr('class', function (d) { return 'pattern-color-' + d[0]; });
32740
32741           patterns
32742               .append('image')
32743               .attr('x', 0)
32744               .attr('y', 0)
32745               .attr('width', 32)
32746               .attr('height', 32)
32747               .attr('xlink:href', function (d) {
32748                   return context.imagePath('pattern/' + d[1] + '.png');
32749               });
32750
32751           // add clip paths
32752           defs.selectAll('clipPath')
32753               .data([12, 18, 20, 32, 45])
32754               .enter()
32755               .append('clipPath')
32756               .attr('id', function (d) { return 'clip-square-' + d; })
32757               .append('rect')
32758               .attr('x', 0)
32759               .attr('y', 0)
32760               .attr('width', function (d) { return d; })
32761               .attr('height', function (d) { return d; });
32762
32763           // add symbol spritesheets
32764           defs
32765               .call(drawDefs.addSprites, [
32766                   'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'community-sprite'
32767               ]);
32768       }
32769
32770
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));
32775
32776           spritesheets
32777               .data(data)
32778               .enter()
32779               .append('g')
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();
32784                   request(url)
32785                       .mimeType('image/svg+xml')
32786                       .response(function(xhr) { return xhr.responseXML; })
32787                       .get(function(err, svg) {
32788                           if (err) return;
32789                           node.appendChild(
32790                               select(svg.documentElement).attr('id', d).node()
32791                           );
32792                       });
32793               });
32794       };
32795
32796
32797       return drawDefs;
32798   }
32799
32800   /**
32801    * Checks if `value` is `undefined`.
32802    *
32803    * @static
32804    * @since 0.1.0
32805    * @memberOf _
32806    * @category Lang
32807    * @param {*} value The value to check.
32808    * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
32809    * @example
32810    *
32811    * _.isUndefined(void 0);
32812    * // => true
32813    *
32814    * _.isUndefined(null);
32815    * // => false
32816    */
32817   function isUndefined(value) {
32818     return value === undefined;
32819   }
32820
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(',')
32829
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 />
32840
32841   function XMLReader(){
32842         
32843   }
32844
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();
32853         }
32854   };
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) {
32860                         code -= 0x10000;
32861                         var surrogate1 = 0xd800 + (code >> 10)
32862                                 , surrogate2 = 0xdc00 + (code & 0x3ff);
32863
32864                         return String.fromCharCode(surrogate1, surrogate2);
32865                 } else {
32866                         return String.fromCharCode(code);
32867                 }
32868         }
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')))
32875                 }else{
32876                         errorHandler.error('entity not found:'+a);
32877                         return a;
32878                 }
32879         }
32880         function appendText(end){//has some bugs
32881                 if(end>start){
32882                         var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
32883                         locator&&position(start);
32884                         domBuilder.characters(xt,0,end-start);
32885                         start = end;
32886                 }
32887         }
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)
32894                 }
32895                 locator.columnNumber = p-lineStart+1;
32896         }
32897         var lineStart = 0;
32898         var lineEnd = 0;
32899         var linePattern = /.*(?:\r\n?|\n)|.*$/g;
32900         var locator = domBuilder.locator;
32901         
32902         var parseStack = [{currentNSMap:defaultNSMapCopy}];
32903         var closeMap = {};
32904         var start = 0;
32905         while(true){
32906                 try{
32907                         var tagStart = source.indexOf('<',start);
32908                         if(tagStart<0){
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;
32914                                 }
32915                                 return;
32916                         }
32917                         if(tagStart>start){
32918                                 appendText(tagStart);
32919                         }
32920                         switch(source.charAt(tagStart+1)){
32921                         case '/':
32922                                 var end = source.indexOf('>',tagStart+3);
32923                                 var tagName = source.substring(tagStart+2,end);
32924                                 var config = parseStack.pop();
32925                                 if(end<0){
32926                                         
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;
32935                                 }
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);
32943                                         if(localNSMap){
32944                                                 for(var prefix in localNSMap){
32945                                                         domBuilder.endPrefixMapping(prefix) ;
32946                                                 }
32947                                         }
32948                                         if(!endMatch){
32949                                 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
32950                                         }
32951                         }else{
32952                                 parseStack.push(config);
32953                         }
32954                                 
32955                                 end++;
32956                                 break;
32957                                 // end elment
32958                         case '?':// <?...?>
32959                                 locator&&position(tagStart);
32960                                 end = parseInstruction(source,tagStart,domBuilder);
32961                                 break;
32962                         case '!':// <!doctype,<![CDATA,<!--
32963                                 locator&&position(tagStart);
32964                                 end = parseDCC(source,tagStart,domBuilder,errorHandler);
32965                                 break;
32966                         default:
32967                                 locator&&position(tagStart);
32968                                 var el = new ElementAttributes();
32969                                 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
32970                                 //elStartEnd
32971                                 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
32972                                 var len = el.length;
32973                                 
32974                                 
32975                                 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
32976                                         el.closed = true;
32977                                         if(!entityMap.nbsp){
32978                                                 errorHandler.warning('unclosed xml attribute');
32979                                         }
32980                                 }
32981                                 if(locator && len){
32982                                         var locator2 = copyLocator(locator,{});
32983                                         //try{//attribute position fixed
32984                                         for(var i = 0;i<len;i++){
32985                                                 var a = el[i];
32986                                                 position(a.offset);
32987                                                 a.locator = copyLocator(locator,{});
32988                                         }
32989                                         //}catch(e){console.error('@@@@@'+e)}
32990                                         domBuilder.locator = locator2;
32991                                         if(appendElement(el,domBuilder,currentNSMap)){
32992                                                 parseStack.push(el);
32993                                         }
32994                                         domBuilder.locator = locator;
32995                                 }else{
32996                                         if(appendElement(el,domBuilder,currentNSMap)){
32997                                                 parseStack.push(el);
32998                                         }
32999                                 }
33000                                 
33001                                 
33002                                 
33003                                 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
33004                                         end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
33005                                 }else{
33006                                         end++;
33007                                 }
33008                         }
33009                 }catch(e){
33010                         errorHandler.error('element parse error: '+e);
33011                         //errorHandler.error('element parse error: '+e);
33012                         end = -1;
33013                         //throw e;
33014                 }
33015                 if(end>start){
33016                         start = end;
33017                 }else{
33018                         //TODO: 这里有可能sax回退,有位置错误风险
33019                         appendText(Math.max(tagStart,start)+1);
33020                 }
33021         }
33022   }
33023   function copyLocator(f,t){
33024         t.lineNumber = f.lineNumber;
33025         t.columnNumber = f.columnNumber;
33026         return t;
33027   }
33028
33029   /**
33030    * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
33031    * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
33032    */
33033   function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
33034         var attrName;
33035         var value;
33036         var p = ++start;
33037         var s = S_TAG;//status
33038         while(true){
33039                 var c = source.charAt(p);
33040                 switch(c){
33041                 case '=':
33042                         if(s === S_ATTR){//attrName
33043                                 attrName = source.slice(start,p);
33044                                 s = S_EQ;
33045                         }else if(s === S_ATTR_SPACE){
33046                                 s = S_EQ;
33047                         }else{
33048                                 //fatalError: equal must after attrName or space after attrName
33049                                 throw new Error('attribute equal must after attrName');
33050                         }
33051                         break;
33052                 case '\'':
33053                 case '"':
33054                         if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
33055                                 ){//equal
33056                                 if(s === S_ATTR){
33057                                         errorHandler.warning('attribute value must after "="');
33058                                         attrName = source.slice(start,p);
33059                                 }
33060                                 start = p+1;
33061                                 p = source.indexOf(c,start);
33062                                 if(p>0){
33063                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
33064                                         el.add(attrName,value,start-1);
33065                                         s = S_ATTR_END;
33066                                 }else{
33067                                         //fatalError: no end quot match
33068                                         throw new Error('attribute value no end \''+c+'\' match');
33069                                 }
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);
33074                                 //console.dir(el)
33075                                 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
33076                                 start = p+1;
33077                                 s = S_ATTR_END;
33078                         }else{
33079                                 //fatalError: no equal before
33080                                 throw new Error('attribute value must after "="');
33081                         }
33082                         break;
33083                 case '/':
33084                         switch(s){
33085                         case S_TAG:
33086                                 el.setTagName(source.slice(start,p));
33087                         case S_ATTR_END:
33088                         case S_TAG_SPACE:
33089                         case S_TAG_CLOSE:
33090                                 s =S_TAG_CLOSE;
33091                                 el.closed = true;
33092                         case S_ATTR_NOQUOT_VALUE:
33093                         case S_ATTR:
33094                         case S_ATTR_SPACE:
33095                                 break;
33096                         //case S_EQ:
33097                         default:
33098                                 throw new Error("attribute invalid close char('/')")
33099                         }
33100                         break;
33101                 case ''://end document
33102                         //throw new Error('unexpected end of input')
33103                         errorHandler.error('unexpected end of input');
33104                         if(s == S_TAG){
33105                                 el.setTagName(source.slice(start,p));
33106                         }
33107                         return p;
33108                 case '>':
33109                         switch(s){
33110                         case S_TAG:
33111                                 el.setTagName(source.slice(start,p));
33112                         case S_ATTR_END:
33113                         case S_TAG_SPACE:
33114                         case S_TAG_CLOSE:
33115                                 break;//normal
33116                         case S_ATTR_NOQUOT_VALUE://Compatible state
33117                         case S_ATTR:
33118                                 value = source.slice(start,p);
33119                                 if(value.slice(-1) === '/'){
33120                                         el.closed  = true;
33121                                         value = value.slice(0,-1);
33122                                 }
33123                         case S_ATTR_SPACE:
33124                                 if(s === S_ATTR_SPACE){
33125                                         value = attrName;
33126                                 }
33127                                 if(s == S_ATTR_NOQUOT_VALUE){
33128                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
33129                                         el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
33130                                 }else{
33131                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
33132                                                 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
33133                                         }
33134                                         el.add(value,value,start);
33135                                 }
33136                                 break;
33137                         case S_EQ:
33138                                 throw new Error('attribute value missed!!');
33139                         }
33140   //                    console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
33141                         return p;
33142                 /*xml space '\x20' | #x9 | #xD | #xA; */
33143                 case '\u0080':
33144                         c = ' ';
33145                 default:
33146                         if(c<= ' '){//space
33147                                 switch(s){
33148                                 case S_TAG:
33149                                         el.setTagName(source.slice(start,p));//tagName
33150                                         s = S_TAG_SPACE;
33151                                         break;
33152                                 case S_ATTR:
33153                                         attrName = source.slice(start,p);
33154                                         s = S_ATTR_SPACE;
33155                                         break;
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);
33160                                 case S_ATTR_END:
33161                                         s = S_TAG_SPACE;
33162                                         break;
33163                                 //case S_TAG_SPACE:
33164                                 //case S_EQ:
33165                                 //case S_ATTR_SPACE:
33166                                 //      void();break;
33167                                 //case S_TAG_CLOSE:
33168                                         //ignore warning
33169                                 }
33170                         }else{//not space
33171   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
33172   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
33173                                 switch(s){
33174                                 //case S_TAG:void();break;
33175                                 //case S_ATTR:void();break;
33176                                 //case S_ATTR_NOQUOT_VALUE:void();break;
33177                                 case S_ATTR_SPACE:
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!!');
33181                                         }
33182                                         el.add(attrName,attrName,start);
33183                                         start = p;
33184                                         s = S_ATTR;
33185                                         break;
33186                                 case S_ATTR_END:
33187                                         errorHandler.warning('attribute space is required"'+attrName+'"!!');
33188                                 case S_TAG_SPACE:
33189                                         s = S_ATTR;
33190                                         start = p;
33191                                         break;
33192                                 case S_EQ:
33193                                         s = S_ATTR_NOQUOT_VALUE;
33194                                         start = p;
33195                                         break;
33196                                 case S_TAG_CLOSE:
33197                                         throw new Error("elements closed character '/' and '>' must be connected to");
33198                                 }
33199                         }
33200                 }//end outer switch
33201                 //console.log('p++',p)
33202                 p++;
33203         }
33204   }
33205   /**
33206    * @return true if has new namespace define
33207    */
33208   function appendElement(el,domBuilder,currentNSMap){
33209         var tagName = el.tagName;
33210         var localNSMap = null;
33211         //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
33212         var i = el.length;
33213         while(i--){
33214                 var a = el[i];
33215                 var qName = a.qName;
33216                 var value = a.value;
33217                 var nsp = qName.indexOf(':');
33218                 if(nsp>0){
33219                         var prefix = a.prefix = qName.slice(0,nsp);
33220                         var localName = qName.slice(nsp+1);
33221                         var nsPrefix = prefix === 'xmlns' && localName;
33222                 }else{
33223                         localName = qName;
33224                         prefix = null;
33225                         nsPrefix = qName === 'xmlns' && '';
33226                 }
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){
33232                                 localNSMap = {};
33233                                 //console.log(currentNSMap,0)
33234                                 _copy(currentNSMap,currentNSMap={});
33235                                 //console.log(currentNSMap,1)
33236                         }
33237                         currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
33238                         a.uri = 'http://www.w3.org/2000/xmlns/';
33239                         domBuilder.startPrefixMapping(nsPrefix, value); 
33240                 }
33241         }
33242         var i = el.length;
33243         while(i--){
33244                 a = el[i];
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 || ''];
33251                                 
33252                                 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
33253                         }
33254                 }
33255         }
33256         var nsp = tagName.indexOf(':');
33257         if(nsp>0){
33258                 prefix = el.prefix = tagName.slice(0,nsp);
33259                 localName = el.localName = tagName.slice(nsp+1);
33260         }else{
33261                 prefix = null;//important!!
33262                 localName = el.localName = tagName;
33263         }
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
33269         if(el.closed){
33270                 domBuilder.endElement(ns,localName,tagName);
33271                 if(localNSMap){
33272                         for(prefix in localNSMap){
33273                                 domBuilder.endPrefixMapping(prefix); 
33274                         }
33275                 }
33276         }else{
33277                 el.currentNSMap = currentNSMap;
33278                 el.localNSMap = localNSMap;
33279                 //parseStack.push(el);
33280                 return true;
33281         }
33282   }
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();
33293                                         return elEndStart;
33294                                 //}
33295                         }//}else{//text area
33296                                 text = text.replace(/&#?\w+;/g,entityReplacer);
33297                                 domBuilder.characters(text,0,text.length);
33298                                 return elEndStart;
33299                         //}
33300                         
33301                 }
33302         }
33303         return elStartEnd+1;
33304   }
33305   function fixSelfClosed(source,elStartEnd,tagName,closeMap){
33306         //if(tagName in closeMap){
33307         var pos = closeMap[tagName];
33308         if(pos == null){
33309                 //console.log(tagName)
33310                 pos =  source.lastIndexOf('</'+tagName+'>');
33311                 if(pos<elStartEnd){//忘记闭合
33312                         pos = source.lastIndexOf('</'+tagName);
33313                 }
33314                 closeMap[tagName] =pos;
33315         }
33316         return pos<elStartEnd;
33317         //} 
33318   }
33319   function _copy(source,target){
33320         for(var n in source){target[n] = source[n];}
33321   }
33322   function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
33323         var next= source.charAt(start+2);
33324         switch(next){
33325         case '-':
33326                 if(source.charAt(start + 3) === '-'){
33327                         var end = source.indexOf('-->',start+4);
33328                         //append comment source.substring(4,end)//<!--
33329                         if(end>start){
33330                                 domBuilder.comment(source,start+4,end-start-4);
33331                                 return end+3;
33332                         }else{
33333                                 errorHandler.error("Unclosed comment");
33334                                 return -1;
33335                         }
33336                 }else{
33337                         //error
33338                         return -1;
33339                 }
33340         default:
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(); 
33346                         return end+3;
33347                 }
33348                 //<!DOCTYPE
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();
33360                         
33361                         return lastMatch.index+lastMatch[0].length
33362                 }
33363         }
33364         return -1;
33365   }
33366
33367
33368
33369   function parseInstruction(source,start,domBuilder){
33370         var end = source.indexOf('?>',start);
33371         if(end){
33372                 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
33373                 if(match){
33374                         var len = match[0].length;
33375                         domBuilder.processingInstruction(match[1], match[2]) ;
33376                         return end+2;
33377                 }else{//error
33378                         return -1;
33379                 }
33380         }
33381         return -1;
33382   }
33383
33384   /**
33385    * @param source
33386    */
33387   function ElementAttributes(source){
33388         
33389   }
33390   ElementAttributes.prototype = {
33391         setTagName:function(tagName){
33392                 if(!tagNamePattern.test(tagName)){
33393                         throw new Error('invalid tagName:'+tagName)
33394                 }
33395                 this.tagName = tagName;
33396         },
33397         add:function(qName,value,offset){
33398                 if(!tagNamePattern.test(qName)){
33399                         throw new Error('invalid attribute:'+qName)
33400                 }
33401                 this[this.length++] = {qName:qName,value:value,offset:offset};
33402         },
33403         length:0,
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)){
33410   //            if(localName){
33411   //                    
33412   //            }else{
33413   //                    var qName = uri
33414   //            }
33415   //    },
33416   //    getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
33417   //    getType:function(uri,localName){}
33418   //    getType:function(i){},
33419   };
33420
33421
33422
33423
33424   function _set_proto_(thiz,parent){
33425         thiz.__proto__ = parent;
33426         return thiz;
33427   }
33428   if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
33429         _set_proto_ = function(thiz,parent){
33430                 function p(){}          p.prototype = parent;
33431                 p = new p();
33432                 for(parent in thiz){
33433                         p[parent] = thiz[parent];
33434                 }
33435                 return p;
33436         };
33437   }
33438
33439   function split(source,start){
33440         var match;
33441         var buf = [];
33442         var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
33443         reg.lastIndex = start;
33444         reg.exec(source);//skip <
33445         while(match = reg.exec(source)){
33446                 buf.push(match);
33447                 if(match[1])return buf;
33448         }
33449   }
33450
33451   var XMLReader_1 = XMLReader;
33452
33453   var sax = {
33454         XMLReader: XMLReader_1
33455   };
33456
33457   /*
33458    * DOM Level 2
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
33462    */
33463
33464   function copy$1(src,dest){
33465         for(var p in src){
33466                 dest[p] = src[p];
33467         }
33468   }
33469   /**
33470   ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
33471   ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
33472    */
33473   function _extends(Class,Super){
33474         var pt = Class.prototype;
33475         if(Object.create){
33476                 var ppt = Object.create(Super.prototype);
33477                 pt.__proto__ = ppt;
33478         }
33479         if(!(pt instanceof Super)){
33480                 function t(){}          t.prototype = Super.prototype;
33481                 t = new t();
33482                 copy$1(pt,t);
33483                 Class.prototype = pt = t;
33484         }
33485         if(pt.constructor != Class){
33486                 if(typeof Class != 'function'){
33487                         console.error("unknow Class:"+Class);
33488                 }
33489                 pt.constructor = Class;
33490         }
33491   }
33492   var htmlns = 'http://www.w3.org/1999/xhtml' ;
33493   // Node Types
33494   var NodeType = {};
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;
33507
33508   // ExceptionCode
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);
33521   //level2
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);
33527
33528
33529   function DOMException(code, message) {
33530         if(message instanceof Error){
33531                 var error = message;
33532         }else{
33533                 error = this;
33534                 Error.call(this, ExceptionMessage[code]);
33535                 this.message = ExceptionMessage[code];
33536                 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
33537         }
33538         error.code = code;
33539         if(message) this.message = this.message + ": " + message;
33540         return error;
33541   }DOMException.prototype = Error.prototype;
33542   copy$1(ExceptionCode,DOMException);
33543   /**
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.
33547    */
33548   function NodeList() {
33549   }NodeList.prototype = {
33550         /**
33551          * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
33552          * @standard level1
33553          */
33554         length:0, 
33555         /**
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.
33557          * @standard level1
33558          * @param index  unsigned long 
33559          *   Index into the collection.
33560          * @return Node
33561          *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
33562          */
33563         item: function(index) {
33564                 return this[index] || null;
33565         },
33566         toString:function(isHTML,nodeFilter){
33567                 for(var buf = [], i = 0;i<this.length;i++){
33568                         serializeToString(this[i],buf,isHTML,nodeFilter);
33569                 }
33570                 return buf.join('');
33571         }
33572   };
33573   function LiveNodeList(node,refresh){
33574         this._node = node;
33575         this._refresh = refresh;
33576         _updateLiveList(this);
33577   }
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);
33584                 copy$1(ls,list);
33585                 list._inc = inc;
33586         }
33587   }
33588   LiveNodeList.prototype.item = function(i){
33589         _updateLiveList(this);
33590         return this[i];
33591   };
33592
33593   _extends(LiveNodeList,NodeList);
33594   /**
33595    * 
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 
33599    */
33600   function NamedNodeMap() {
33601   }
33602   function _findNodeIndex(list,node){
33603         var i = list.length;
33604         while(i--){
33605                 if(list[i] === node){return i}
33606         }
33607   }
33608
33609   function _addNamedNode(el,list,newAttr,oldAttr){
33610         if(oldAttr){
33611                 list[_findNodeIndex(list,oldAttr)] = newAttr;
33612         }else{
33613                 list[list.length++] = newAttr;
33614         }
33615         if(el){
33616                 newAttr.ownerElement = el;
33617                 var doc = el.ownerDocument;
33618                 if(doc){
33619                         oldAttr && _onRemoveAttribute(doc,el,oldAttr);
33620                         _onAddAttribute(doc,el,newAttr);
33621                 }
33622         }
33623   }
33624   function _removeNamedNode(el,list,attr){
33625         //console.log('remove attr:'+attr)
33626         var i = _findNodeIndex(list,attr);
33627         if(i>=0){
33628                 var lastIndex = list.length-1;
33629                 while(i<lastIndex){
33630                         list[i] = list[++i];
33631                 }
33632                 list.length = lastIndex;
33633                 if(el){
33634                         var doc = el.ownerDocument;
33635                         if(doc){
33636                                 _onRemoveAttribute(doc,el,attr);
33637                                 attr.ownerElement = null;
33638                         }
33639                 }
33640         }else{
33641                 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
33642         }
33643   }
33644   NamedNodeMap.prototype = {
33645         length:0,
33646         item:NodeList.prototype.item,
33647         getNamedItem: function(key) {
33648   //            if(key.indexOf(':')>0 || key == 'xmlns'){
33649   //                    return null;
33650   //            }
33651                 //console.log()
33652                 var i = this.length;
33653                 while(i--){
33654                         var attr = this[i];
33655                         //console.log(attr.nodeName,key)
33656                         if(attr.nodeName == key){
33657                                 return attr;
33658                         }
33659                 }
33660         },
33661         setNamedItem: function(attr) {
33662                 var el = attr.ownerElement;
33663                 if(el && el!=this._ownerElement){
33664                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
33665                 }
33666                 var oldAttr = this.getNamedItem(attr.nodeName);
33667                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
33668                 return oldAttr;
33669         },
33670         /* returns Node */
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);
33675                 }
33676                 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
33677                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
33678                 return oldAttr;
33679         },
33680
33681         /* returns Node */
33682         removeNamedItem: function(key) {
33683                 var attr = this.getNamedItem(key);
33684                 _removeNamedNode(this._ownerElement,this,attr);
33685                 return attr;
33686                 
33687                 
33688         },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
33689         
33690         //for level2
33691         removeNamedItemNS:function(namespaceURI,localName){
33692                 var attr = this.getNamedItemNS(namespaceURI,localName);
33693                 _removeNamedNode(this._ownerElement,this,attr);
33694                 return attr;
33695         },
33696         getNamedItemNS: function(namespaceURI, localName) {
33697                 var i = this.length;
33698                 while(i--){
33699                         var node = this[i];
33700                         if(node.localName == localName && node.namespaceURI == namespaceURI){
33701                                 return node;
33702                         }
33703                 }
33704                 return null;
33705         }
33706   };
33707   /**
33708    * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
33709    */
33710   function DOMImplementation(/* Object */ features) {
33711         this._features = {};
33712         if (features) {
33713                 for (var feature in features) {
33714                          this._features = features[feature];
33715                 }
33716         }
33717   }
33718   DOMImplementation.prototype = {
33719         hasFeature: function(/* string */ feature, /* string */ version) {
33720                 var versions = this._features[feature.toLowerCase()];
33721                 if (versions && (!version || version in versions)) {
33722                         return true;
33723                 } else {
33724                         return false;
33725                 }
33726         },
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;
33733                 if(doctype){
33734                         doc.appendChild(doctype);
33735                 }
33736                 if(qualifiedName){
33737                         var root = doc.createElementNS(namespaceURI,qualifiedName);
33738                         doc.appendChild(root);
33739                 }
33740                 return doc;
33741         },
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;
33751                 
33752                 //TODO:..
33753                 //  readonly attribute NamedNodeMap     entities;
33754                 //  readonly attribute NamedNodeMap     notations;
33755                 return node;
33756         }
33757   };
33758
33759
33760   /**
33761    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
33762    */
33763
33764   function Node$2() {
33765   }
33766   Node$2.prototype = {
33767         firstChild : null,
33768         lastChild : null,
33769         previousSibling : null,
33770         nextSibling : null,
33771         attributes : null,
33772         parentNode : null,
33773         childNodes : null,
33774         ownerDocument : null,
33775         nodeValue : null,
33776         namespaceURI : null,
33777         prefix : null,
33778         localName : null,
33779         // Modified in DOM Level 2:
33780         insertBefore:function(newChild, refChild){//raises 
33781                 return _insertBefore(this,newChild,refChild);
33782         },
33783         replaceChild:function(newChild, oldChild){//raises 
33784                 this.insertBefore(newChild,oldChild);
33785                 if(oldChild){
33786                         this.removeChild(oldChild);
33787                 }
33788         },
33789         removeChild:function(oldChild){
33790                 return _removeChild(this,oldChild);
33791         },
33792         appendChild:function(newChild){
33793                 return this.insertBefore(newChild,null);
33794         },
33795         hasChildNodes:function(){
33796                 return this.firstChild != null;
33797         },
33798         cloneNode:function(deep){
33799                 return cloneNode(this.ownerDocument||this,this,deep);
33800         },
33801         // Modified in DOM Level 2:
33802         normalize:function(){
33803                 var child = this.firstChild;
33804                 while(child){
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);
33809                         }else{
33810                                 child.normalize();
33811                                 child = next;
33812                         }
33813                 }
33814         },
33815         // Introduced in DOM Level 2:
33816         isSupported:function(feature, version){
33817                 return this.ownerDocument.implementation.hasFeature(feature,version);
33818         },
33819       // Introduced in DOM Level 2:
33820       hasAttributes:function(){
33821         return this.attributes.length>0;
33822       },
33823       lookupPrefix:function(namespaceURI){
33824         var el = this;
33825         while(el){
33826                 var map = el._nsMap;
33827                 //console.dir(map)
33828                 if(map){
33829                         for(var n in map){
33830                                 if(map[n] == namespaceURI){
33831                                         return n;
33832                                 }
33833                         }
33834                 }
33835                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
33836         }
33837         return null;
33838       },
33839       // Introduced in DOM Level 3:
33840       lookupNamespaceURI:function(prefix){
33841         var el = this;
33842         while(el){
33843                 var map = el._nsMap;
33844                 //console.dir(map)
33845                 if(map){
33846                         if(prefix in map){
33847                                 return map[prefix] ;
33848                         }
33849                 }
33850                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
33851         }
33852         return null;
33853       },
33854       // Introduced in DOM Level 3:
33855       isDefaultNamespace:function(namespaceURI){
33856         var prefix = this.lookupPrefix(namespaceURI);
33857         return prefix == null;
33858       }
33859   };
33860
33861
33862   function _xmlEncoder(c){
33863         return c == '<' && '&lt;' ||
33864            c == '>' && '&gt;' ||
33865            c == '&' && '&amp;' ||
33866            c == '"' && '&quot;' ||
33867            '&#'+c.charCodeAt()+';'
33868   }
33869
33870
33871   copy$1(NodeType,Node$2);
33872   copy$1(NodeType,Node$2.prototype);
33873
33874   /**
33875    * @param callback return true for continue,false for break
33876    * @return boolean true: break visit;
33877    */
33878   function _visitNode(node,callback){
33879         if(callback(node)){
33880                 return true;
33881         }
33882         if(node = node.firstChild){
33883                 do{
33884                         if(_visitNode(node,callback)){return true}
33885           }while(node=node.nextSibling)
33886       }
33887   }
33888
33889
33890
33891   function Document(){
33892   }
33893   function _onAddAttribute(doc,el,newAttr){
33894         doc && doc._inc++;
33895         var ns = newAttr.namespaceURI ;
33896         if(ns == 'http://www.w3.org/2000/xmlns/'){
33897                 //update namespace
33898                 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
33899         }
33900   }
33901   function _onRemoveAttribute(doc,el,newAttr,remove){
33902         doc && doc._inc++;
33903         var ns = newAttr.namespaceURI ;
33904         if(ns == 'http://www.w3.org/2000/xmlns/'){
33905                 //update namespace
33906                 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
33907         }
33908   }
33909   function _onUpdateChild(doc,el,newChild){
33910         if(doc && doc._inc){
33911                 doc._inc++;
33912                 //update childNodes
33913                 var cs = el.childNodes;
33914                 if(newChild){
33915                         cs[cs.length++] = newChild;
33916                 }else{
33917                         //console.log(1)
33918                         var child = el.firstChild;
33919                         var i = 0;
33920                         while(child){
33921                                 cs[i++] = child;
33922                                 child =child.nextSibling;
33923                         }
33924                         cs.length = i;
33925                 }
33926         }
33927   }
33928
33929   /**
33930    * attributes;
33931    * children;
33932    * 
33933    * writeable properties:
33934    * nodeValue,Attr:value,CharacterData:data
33935    * prefix
33936    */
33937   function _removeChild(parentNode,child){
33938         var previous = child.previousSibling;
33939         var next = child.nextSibling;
33940         if(previous){
33941                 previous.nextSibling = next;
33942         }else{
33943                 parentNode.firstChild = next;
33944         }
33945         if(next){
33946                 next.previousSibling = previous;
33947         }else{
33948                 parentNode.lastChild = previous;
33949         }
33950         _onUpdateChild(parentNode.ownerDocument,parentNode);
33951         return child;
33952   }
33953   /**
33954    * preformance key(refChild == null)
33955    */
33956   function _insertBefore(parentNode,newChild,nextChild){
33957         var cp = newChild.parentNode;
33958         if(cp){
33959                 cp.removeChild(newChild);//remove and update
33960         }
33961         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
33962                 var newFirst = newChild.firstChild;
33963                 if (newFirst == null) {
33964                         return newChild;
33965                 }
33966                 var newLast = newChild.lastChild;
33967         }else{
33968                 newFirst = newLast = newChild;
33969         }
33970         var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
33971
33972         newFirst.previousSibling = pre;
33973         newLast.nextSibling = nextChild;
33974         
33975         
33976         if(pre){
33977                 pre.nextSibling = newFirst;
33978         }else{
33979                 parentNode.firstChild = newFirst;
33980         }
33981         if(nextChild == null){
33982                 parentNode.lastChild = newLast;
33983         }else{
33984                 nextChild.previousSibling = newLast;
33985         }
33986         do{
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;
33993         }
33994         return newChild;
33995   }
33996   function _appendSingleChild(parentNode,newChild){
33997         var cp = newChild.parentNode;
33998         if(cp){
33999                 var pre = parentNode.lastChild;
34000                 cp.removeChild(newChild);//remove and update
34001                 var pre = parentNode.lastChild;
34002         }
34003         var pre = parentNode.lastChild;
34004         newChild.parentNode = parentNode;
34005         newChild.previousSibling = pre;
34006         newChild.nextSibling = null;
34007         if(pre){
34008                 pre.nextSibling = newChild;
34009         }else{
34010                 parentNode.firstChild = newChild;
34011         }
34012         parentNode.lastChild = newChild;
34013         _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
34014         return newChild;
34015         //console.log("__aa",parentNode.lastChild.nextSibling == null)
34016   }
34017   Document.prototype = {
34018         //implementation : null,
34019         nodeName :  '#document',
34020         nodeType :  DOCUMENT_NODE,
34021         doctype :  null,
34022         documentElement :  null,
34023         _inc : 1,
34024         
34025         insertBefore :  function(newChild, refChild){//raises 
34026                 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
34027                         var child = newChild.firstChild;
34028                         while(child){
34029                                 var next = child.nextSibling;
34030                                 this.insertBefore(child,refChild);
34031                                 child = next;
34032                         }
34033                         return newChild;
34034                 }
34035                 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
34036                         this.documentElement = newChild;
34037                 }
34038                 
34039                 return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
34040         },
34041         removeChild :  function(oldChild){
34042                 if(this.documentElement == oldChild){
34043                         this.documentElement = null;
34044                 }
34045                 return _removeChild(this,oldChild);
34046         },
34047         // Introduced in DOM Level 2:
34048         importNode : function(importedNode,deep){
34049                 return importNode(this,importedNode,deep);
34050         },
34051         // Introduced in DOM Level 2:
34052         getElementById :        function(id){
34053                 var rtv = null;
34054                 _visitNode(this.documentElement,function(node){
34055                         if(node.nodeType == ELEMENT_NODE){
34056                                 if(node.getAttribute('id') == id){
34057                                         rtv = node;
34058                                         return true;
34059                                 }
34060                         }
34061                 });
34062                 return rtv;
34063         },
34064         
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;
34074                 return node;
34075         },
34076         createDocumentFragment :        function(){
34077                 var node = new DocumentFragment();
34078                 node.ownerDocument = this;
34079                 node.childNodes = new NodeList();
34080                 return node;
34081         },
34082         createTextNode :        function(data){
34083                 var node = new Text();
34084                 node.ownerDocument = this;
34085                 node.appendData(data);
34086                 return node;
34087         },
34088         createComment : function(data){
34089                 var node = new Comment();
34090                 node.ownerDocument = this;
34091                 node.appendData(data);
34092                 return node;
34093         },
34094         createCDATASection :    function(data){
34095                 var node = new CDATASection();
34096                 node.ownerDocument = this;
34097                 node.appendData(data);
34098                 return node;
34099         },
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;
34105                 return node;
34106         },
34107         createAttribute :       function(name){
34108                 var node = new Attr();
34109                 node.ownerDocument      = this;
34110                 node.name = name;
34111                 node.nodeName   = name;
34112                 node.localName = name;
34113                 node.specified = true;
34114                 return node;
34115         },
34116         createEntityReference : function(name){
34117                 var node = new EntityReference();
34118                 node.ownerDocument      = this;
34119                 node.nodeName   = name;
34120                 return node;
34121         },
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];
34135                 }else{
34136                         //el.prefix = null;
34137                         node.localName = qualifiedName;
34138                 }
34139                 attrs._ownerElement = node;
34140                 return node;
34141         },
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];
34154                 }else{
34155                         //el.prefix = null;
34156                         node.localName = qualifiedName;
34157                 }
34158                 return node;
34159         }
34160   };
34161   _extends(Document,Node$2);
34162
34163
34164   function Element() {
34165         this._nsMap = {};
34166   }Element.prototype = {
34167         nodeType : ELEMENT_NODE,
34168         hasAttribute : function(name){
34169                 return this.getAttributeNode(name)!=null;
34170         },
34171         getAttribute : function(name){
34172                 var attr = this.getAttributeNode(name);
34173                 return attr && attr.value || '';
34174         },
34175         getAttributeNode : function(name){
34176                 return this.attributes.getNamedItem(name);
34177         },
34178         setAttribute : function(name, value){
34179                 var attr = this.ownerDocument.createAttribute(name);
34180                 attr.value = attr.nodeValue = "" + value;
34181                 this.setAttributeNode(attr);
34182         },
34183         removeAttribute : function(name){
34184                 var attr = this.getAttributeNode(name);
34185                 attr && this.removeAttributeNode(attr);
34186         },
34187         
34188         //four real opeartion method
34189         appendChild:function(newChild){
34190                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
34191                         return this.insertBefore(newChild,null);
34192                 }else{
34193                         return _appendSingleChild(this,newChild);
34194                 }
34195         },
34196         setAttributeNode : function(newAttr){
34197                 return this.attributes.setNamedItem(newAttr);
34198         },
34199         setAttributeNodeNS : function(newAttr){
34200                 return this.attributes.setNamedItemNS(newAttr);
34201         },
34202         removeAttributeNode : function(oldAttr){
34203                 //console.log(this == oldAttr.ownerElement)
34204                 return this.attributes.removeNamedItem(oldAttr.nodeName);
34205         },
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);
34210         },
34211         
34212         hasAttributeNS : function(namespaceURI, localName){
34213                 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
34214         },
34215         getAttributeNS : function(namespaceURI, localName){
34216                 var attr = this.getAttributeNodeNS(namespaceURI, localName);
34217                 return attr && attr.value || '';
34218         },
34219         setAttributeNS : function(namespaceURI, qualifiedName, value){
34220                 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
34221                 attr.value = attr.nodeValue = "" + value;
34222                 this.setAttributeNode(attr);
34223         },
34224         getAttributeNodeNS : function(namespaceURI, localName){
34225                 return this.attributes.getNamedItemNS(namespaceURI, localName);
34226         },
34227         
34228         getElementsByTagName : function(tagName){
34229                 return new LiveNodeList(this,function(base){
34230                         var ls = [];
34231                         _visitNode(base,function(node){
34232                                 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
34233                                         ls.push(node);
34234                                 }
34235                         });
34236                         return ls;
34237                 });
34238         },
34239         getElementsByTagNameNS : function(namespaceURI, localName){
34240                 return new LiveNodeList(this,function(base){
34241                         var ls = [];
34242                         _visitNode(base,function(node){
34243                                 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
34244                                         ls.push(node);
34245                                 }
34246                         });
34247                         return ls;
34248                         
34249                 });
34250         }
34251   };
34252   Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
34253   Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
34254
34255
34256   _extends(Element,Node$2);
34257   function Attr() {
34258   }Attr.prototype.nodeType = ATTRIBUTE_NODE;
34259   _extends(Attr,Node$2);
34260
34261
34262   function CharacterData() {
34263   }CharacterData.prototype = {
34264         data : '',
34265         substringData : function(offset, count) {
34266                 return this.data.substring(offset, offset+count);
34267         },
34268         appendData: function(text) {
34269                 text = this.data+text;
34270                 this.nodeValue = this.data = text;
34271                 this.length = text.length;
34272         },
34273         insertData: function(offset,text) {
34274                 this.replaceData(offset,0,text);
34275         
34276         },
34277         appendChild:function(newChild){
34278                 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
34279         },
34280         deleteData: function(offset, count) {
34281                 this.replaceData(offset,count,"");
34282         },
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;
34289         }
34290   };
34291   _extends(CharacterData,Node$2);
34292   function Text() {
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);
34305                 }
34306                 return newNode;
34307         }
34308   };
34309   _extends(Text,CharacterData);
34310   function Comment() {
34311   }Comment.prototype = {
34312         nodeName : "#comment",
34313         nodeType : COMMENT_NODE
34314   };
34315   _extends(Comment,CharacterData);
34316
34317   function CDATASection() {
34318   }CDATASection.prototype = {
34319         nodeName : "#cdata-section",
34320         nodeType : CDATA_SECTION_NODE
34321   };
34322   _extends(CDATASection,CharacterData);
34323
34324
34325   function DocumentType() {
34326   }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
34327   _extends(DocumentType,Node$2);
34328
34329   function Notation() {
34330   }Notation.prototype.nodeType = NOTATION_NODE;
34331   _extends(Notation,Node$2);
34332
34333   function Entity() {
34334   }Entity.prototype.nodeType = ENTITY_NODE;
34335   _extends(Entity,Node$2);
34336
34337   function EntityReference() {
34338   }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
34339   _extends(EntityReference,Node$2);
34340
34341   function DocumentFragment() {
34342   }DocumentFragment.prototype.nodeName =        "#document-fragment";
34343   DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
34344   _extends(DocumentFragment,Node$2);
34345
34346
34347   function ProcessingInstruction() {
34348   }
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);
34354   };
34355   Node$2.prototype.toString = nodeSerializeToString;
34356   function nodeSerializeToString(isHtml,nodeFilter){
34357         var buf = [];
34358         var refNode = this.nodeType == 9?this.documentElement:this;
34359         var prefix = refNode.prefix;
34360         var uri = refNode.namespaceURI;
34361         
34362         if(uri && prefix == null){
34363                 //console.log(prefix)
34364                 var prefix = refNode.lookupPrefix(uri);
34365                 if(prefix == null){
34366                         //isHTML = true;
34367                         var visibleNamespaces=[
34368                         {namespace:uri,prefix:null}
34369                         //{namespace:uri,prefix:''}
34370                         ];
34371                 }
34372         }
34373         serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
34374         //console.log('###',this.nodeType,uri,prefix,buf.join(''))
34375         return buf.join('');
34376   }
34377   function needNamespaceDefine(node,isHTML, visibleNamespaces) {
34378         var prefix = node.prefix||'';
34379         var uri = node.namespaceURI;
34380         if (!prefix && !uri){
34381                 return false;
34382         }
34383         if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
34384                 || uri == 'http://www.w3.org/2000/xmlns/'){
34385                 return false;
34386         }
34387         
34388         var i = visibleNamespaces.length; 
34389         //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
34390         while (i--) {
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;
34396                 }
34397         }
34398         //console.log(isHTML,uri,prefix=='')
34399         //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
34400         //      return false;
34401         //}
34402         //node.flag = '11111'
34403         //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
34404         return true;
34405   }
34406   function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
34407         if(nodeFilter){
34408                 node = nodeFilter(node);
34409                 if(node){
34410                         if(typeof node == 'string'){
34411                                 buf.push(node);
34412                                 return;
34413                         }
34414                 }else{
34415                         return;
34416                 }
34417                 //buf.sort.apply(attrs, attributeSorter);
34418         }
34419         switch(node.nodeType){
34420         case ELEMENT_NODE:
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;
34427                 
34428                 isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
34429                 buf.push('<',nodeName);
34430                 
34431                 
34432                 
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 });
34440                         }
34441                 }
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 });
34450                         }
34451                         serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
34452                 }
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 });
34460                 }
34461                 
34462                 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
34463                         buf.push('>');
34464                         //if is cdata child node
34465                         if(isHTML && /^script$/i.test(nodeName)){
34466                                 while(child){
34467                                         if(child.data){
34468                                                 buf.push(child.data);
34469                                         }else{
34470                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
34471                                         }
34472                                         child = child.nextSibling;
34473                                 }
34474                         }else
34475                         {
34476                                 while(child){
34477                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
34478                                         child = child.nextSibling;
34479                                 }
34480                         }
34481                         buf.push('</',nodeName,'>');
34482                 }else{
34483                         buf.push('/>');
34484                 }
34485                 // remove added visible namespaces
34486                 //visibleNamespaces.length = startVisibleNamespaces;
34487                 return;
34488         case DOCUMENT_NODE:
34489         case DOCUMENT_FRAGMENT_NODE:
34490                 var child = node.firstChild;
34491                 while(child){
34492                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
34493                         child = child.nextSibling;
34494                 }
34495                 return;
34496         case ATTRIBUTE_NODE:
34497                 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
34498         case TEXT_NODE:
34499                 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
34500         case CDATA_SECTION_NODE:
34501                 return buf.push( '<![CDATA[',node.data,']]>');
34502         case COMMENT_NODE:
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);
34508                 if(pubid){
34509                         buf.push(' PUBLIC "',pubid);
34510                         if (sysid && sysid!='.') {
34511                                 buf.push( '" "',sysid);
34512                         }
34513                         buf.push('">');
34514                 }else if(sysid && sysid!='.'){
34515                         buf.push(' SYSTEM "',sysid,'">');
34516                 }else{
34517                         var sub = node.internalSubset;
34518                         if(sub){
34519                                 buf.push(" [",sub,"]");
34520                         }
34521                         buf.push(">");
34522                 }
34523                 return;
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:
34530         default:
34531                 buf.push('??',node.nodeName);
34532         }
34533   }
34534   function importNode(doc,node,deep){
34535         var node2;
34536         switch (node.nodeType) {
34537         case ELEMENT_NODE:
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));
34544                 //}
34545         case DOCUMENT_FRAGMENT_NODE:
34546                 break;
34547         case ATTRIBUTE_NODE:
34548                 deep = true;
34549                 break;
34550         //case ENTITY_REFERENCE_NODE:
34551         //case PROCESSING_INSTRUCTION_NODE:
34552         ////case TEXT_NODE:
34553         //case CDATA_SECTION_NODE:
34554         //case COMMENT_NODE:
34555         //      deep = false;
34556         //      break;
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
34563         //default:throw e;
34564         }
34565         if(!node2){
34566                 node2 = node.cloneNode(false);//false
34567         }
34568         node2.ownerDocument = doc;
34569         node2.parentNode = null;
34570         if(deep){
34571                 var child = node.firstChild;
34572                 while(child){
34573                         node2.appendChild(importNode(doc,child,deep));
34574                         child = child.nextSibling;
34575                 }
34576         }
34577         return node2;
34578   }
34579   //
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){
34585                 var v = node[n];
34586                 if(typeof v != 'object' ){
34587                         if(v != node2[n]){
34588                                 node2[n] = v;
34589                         }
34590                 }
34591         }
34592         if(node.childNodes){
34593                 node2.childNodes = new NodeList();
34594         }
34595         node2.ownerDocument = doc;
34596         switch (node2.nodeType) {
34597         case ELEMENT_NODE:
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));
34604                 }
34605                 break;
34606         case ATTRIBUTE_NODE:
34607                 deep = true;
34608         }
34609         if(deep){
34610                 var child = node.firstChild;
34611                 while(child){
34612                         node2.appendChild(cloneNode(doc,child,deep));
34613                         child = child.nextSibling;
34614                 }
34615         }
34616         return node2;
34617   }
34618
34619   function __set__(object,key,value){
34620         object[key] = value;
34621   }
34622   //do dynamic
34623   try{
34624         if(Object.defineProperty){
34625                 Object.defineProperty(LiveNodeList.prototype,'length',{
34626                         get:function(){
34627                                 _updateLiveList(this);
34628                                 return this.$$length;
34629                         }
34630                 });
34631                 Object.defineProperty(Node$2.prototype,'textContent',{
34632                         get:function(){
34633                                 return getTextContent(this);
34634                         },
34635                         set:function(data){
34636                                 switch(this.nodeType){
34637                                 case ELEMENT_NODE:
34638                                 case DOCUMENT_FRAGMENT_NODE:
34639                                         while(this.firstChild){
34640                                                 this.removeChild(this.firstChild);
34641                                         }
34642                                         if(data || String(data)){
34643                                                 this.appendChild(this.ownerDocument.createTextNode(data));
34644                                         }
34645                                         break;
34646                                 default:
34647                                         //TODO:
34648                                         this.data = data;
34649                                         this.value = data;
34650                                         this.nodeValue = data;
34651                                 }
34652                         }
34653                 });
34654                 
34655                 function getTextContent(node){
34656                         switch(node.nodeType){
34657                         case ELEMENT_NODE:
34658                         case DOCUMENT_FRAGMENT_NODE:
34659                                 var buf = [];
34660                                 node = node.firstChild;
34661                                 while(node){
34662                                         if(node.nodeType!==7 && node.nodeType !==8){
34663                                                 buf.push(getTextContent(node));
34664                                         }
34665                                         node = node.nextSibling;
34666                                 }
34667                                 return buf.join('');
34668                         default:
34669                                 return node.nodeValue;
34670                         }
34671                 }
34672                 __set__ = function(object,key,value){
34673                         //console.log(value)
34674                         object['$$'+key] = value;
34675                 };
34676         }
34677   }catch(e){//ie8
34678   }
34679
34680   //if(typeof require == 'function'){
34681         var DOMImplementation_1 = DOMImplementation;
34682         var XMLSerializer_1 = XMLSerializer$1;
34683   //}
34684
34685   var dom = {
34686         DOMImplementation: DOMImplementation_1,
34687         XMLSerializer: XMLSerializer_1
34688   };
34689
34690   var domParser = createCommonjsModule(function (module, exports) {
34691   function DOMParser(options){
34692         this.options = options ||{locator:{}};
34693         
34694   }
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':"'"};
34703         if(locator){
34704                 domBuilder.setDocumentLocator(locator);
34705         }
34706         
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';
34713         }
34714         defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
34715         if(source){
34716                 sax$$1.parse(source,defaultNSMap,entityMap);
34717         }else{
34718                 sax$$1.errorHandler.error("invalid doc source");
34719         }
34720         return domBuilder.doc;
34721   };
34722   function buildErrorHandler(errorImpl,domBuilder,locator){
34723         if(!errorImpl){
34724                 if(domBuilder instanceof DOMHandler){
34725                         return domBuilder;
34726                 }
34727                 errorImpl = domBuilder ;
34728         }
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;
34736                 }
34737                 errorHandler[key] = fn && function(msg){
34738                         fn('[xmldom '+key+']\t'+msg+_locator(locator));
34739                 }||function(){};
34740         }
34741         build('warning');
34742         build('error');
34743         build('fatalError');
34744         return errorHandler;
34745   }
34746
34747   //console.log('#\n\n\n\n\n\n\n####')
34748   /**
34749    * +ContentHandler+ErrorHandler
34750    * +LexicalHandler+EntityResolver2
34751    * -DeclHandler-DTDHandler 
34752    * 
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
34756    */
34757   function DOMHandler() {
34758       this.cdata = false;
34759   }
34760   function position(locator,node){
34761         node.lineNumber = locator.lineNumber;
34762         node.columnNumber = locator.columnNumber;
34763   }
34764   /**
34765    * @see org.xml.sax.ContentHandler#startDocument
34766    * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
34767    */ 
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;
34773         }
34774         },
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;
34781             
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);
34791             }
34792         },
34793         endElement:function(namespaceURI, localName, qName) {
34794                 var current = this.currentElement;
34795                 var tagName = current.tagName;
34796                 this.currentElement = current.parentNode;
34797         },
34798         startPrefixMapping:function(prefix, uri) {
34799         },
34800         endPrefixMapping:function(prefix) {
34801         },
34802         processingInstruction:function(target, data) {
34803             var ins = this.doc.createProcessingInstruction(target, data);
34804             this.locator && position(this.locator,ins);
34805             appendElement(this, ins);
34806         },
34807         ignorableWhitespace:function(ch, start, length) {
34808         },
34809         characters:function(chars, start, length) {
34810                 chars = _toString.apply(this,arguments);
34811                 //console.log(chars)
34812                 if(chars){
34813                         if (this.cdata) {
34814                                 var charNode = this.doc.createCDATASection(chars);
34815                         } else {
34816                                 var charNode = this.doc.createTextNode(chars);
34817                         }
34818                         if(this.currentElement){
34819                                 this.currentElement.appendChild(charNode);
34820                         }else if(/^\s*$/.test(chars)){
34821                                 this.doc.appendChild(charNode);
34822                                 //process xml
34823                         }
34824                         this.locator && position(this.locator,charNode);
34825                 }
34826         },
34827         skippedEntity:function(name) {
34828         },
34829         endDocument:function() {
34830                 this.doc.normalize();
34831         },
34832         setDocumentLocator:function (locator) {
34833             if(this.locator = locator){// && !('lineNumber' in locator)){
34834                 locator.lineNumber = 0;
34835             }
34836         },
34837         //LexicalHandler
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);
34843         },
34844         
34845         startCDATA:function() {
34846             //used in characters() methods
34847             this.cdata = true;
34848         },
34849         endCDATA:function() {
34850             this.cdata = false;
34851         },
34852         
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);
34859             }
34860         },
34861         /**
34862          * @see org.xml.sax.ErrorHandler
34863          * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
34864          */
34865         warning:function(error) {
34866                 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
34867         },
34868         error:function(error) {
34869                 console.error('[xmldom error]\t'+error,_locator(this.locator));
34870         },
34871         fatalError:function(error) {
34872                 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
34873             throw error;
34874         }
34875   };
34876   function _locator(l){
34877         if(l){
34878                 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
34879         }
34880   }
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)+'';
34887                 }
34888                 return chars;
34889         }
34890   }
34891
34892   /*
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)
34896    *  #startCDATA()
34897    *  #endCDATA()
34898    *  #startDTD(name, publicId, systemId)
34899    *
34900    *
34901    * IGNORED method of org.xml.sax.ext.LexicalHandler:
34902    *  #endDTD()
34903    *  #startEntity(name)
34904    *  #endEntity(name)
34905    *
34906    *
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) {};
34922    */
34923   "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
34924         DOMHandler.prototype[key] = function(){return null};
34925   });
34926
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);
34931       } else {
34932           hander.currentElement.appendChild(node);
34933       }
34934   }//appendChild and setAttributeNS are preformance key
34935
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;
34941   //}
34942   });
34943   var domParser_1 = domParser.DOMImplementation;
34944   var domParser_2 = domParser.XMLSerializer;
34945   var domParser_3 = domParser.DOMParser;
34946
34947   var togeojson = createCommonjsModule(function (module, exports) {
34948   var toGeoJSON = (function() {
34949
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;
34958           } return h;
34959       }
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]); }
34971           return o;
34972       }
34973       // get the content of a text node, if any
34974       function nodeVal(x) {
34975           if (x) { norm(x); }
34976           return (x && x.textContent) || '';
34977       }
34978       // get the contents of multiple text nodes, if present
34979       function getMulti(x, ys) {
34980           var o = {}, n, k;
34981           for (k = 0; k < ys.length; k++) {
34982               n = get1(x, ys[k]);
34983               if (n) o[ys[k]] = nodeVal(n);
34984           }
34985           return o;
34986       }
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),
34994               o = [];
34995           for (var i = 0; i < coords.length; i++) {
34996               o.push(coord1(coords[i]));
34997           }
34998           return o;
34999       }
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'),
35006               e;
35007           if (ele) {
35008               e = parseFloat(nodeVal(ele));
35009               if (!isNaN(e)) {
35010                   ll.push(e);
35011               }
35012           }
35013           return {
35014               coordinates: ll,
35015               time: time ? nodeVal(time) : null,
35016               heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
35017           };
35018       }
35019
35020       // create a new feature collection parent object
35021       function fc() {
35022           return {
35023               type: 'FeatureCollection',
35024               features: []
35025           };
35026       }
35027
35028       var serializer;
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)();
35035       }
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);
35042       }
35043
35044       var t = {
35045           kml: function(doc) {
35046
35047               var gj = fc(),
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');
35059
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];
35064               }
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');
35068                   var pairsMap = {};
35069                   for (var m = 0; m < pairs.length; m++) {
35070                       pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
35071                   }
35072                   styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
35073
35074               }
35075               for (var j = 0; j < placemarks.length; j++) {
35076                   gj.features = gj.features.concat(getPlacemark(placemarks[j]));
35077               }
35078               function kmlColor(v) {
35079                   var color, opacity;
35080                   v = v || '';
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) +
35086                           v.substr(4, 2) +
35087                           v.substr(2, 2);
35088                   }
35089                   return [color, isNaN(opacity) ? undefined : opacity];
35090               }
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]));
35098                   return {
35099                       coords: coords,
35100                       times: times
35101                   };
35102               }
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]);
35110                       if (geomNodes) {
35111                           for (j = 0; j < geomNodes.length; j++) {
35112                               geomNode = geomNodes[j];
35113                               if (geotypes[i] === 'Point') {
35114                                   geoms.push({
35115                                       type: 'Point',
35116                                       coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
35117                                   });
35118                               } else if (geotypes[i] === 'LineString') {
35119                                   geoms.push({
35120                                       type: 'LineString',
35121                                       coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
35122                                   });
35123                               } else if (geotypes[i] === 'Polygon') {
35124                                   var rings = get(geomNode, 'LinearRing'),
35125                                       coords = [];
35126                                   for (k = 0; k < rings.length; k++) {
35127                                       coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
35128                                   }
35129                                   geoms.push({
35130                                       type: 'Polygon',
35131                                       coordinates: coords
35132                                   });
35133                               } else if (geotypes[i] === 'Track' ||
35134                                   geotypes[i] === 'gx:Track') {
35135                                   var track = gxCoords(geomNode);
35136                                   geoms.push({
35137                                       type: 'LineString',
35138                                       coordinates: track.coords
35139                                   });
35140                                   if (track.times.length) coordTimes.push(track.times);
35141                               }
35142                           }
35143                       }
35144                   }
35145                   return {
35146                       geoms: geoms,
35147                       coordTimes: coordTimes
35148                   };
35149               }
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');
35162
35163                   if (!geomsAndTimes.geoms.length) return [];
35164                   if (name) properties.name = name;
35165                   if (address) properties.address = address;
35166                   if (styleUrl) {
35167                       if (styleUrl[0] !== '#') {
35168                           styleUrl = '#' + styleUrl;
35169                       }
35170
35171                       properties.styleUrl = styleUrl;
35172                       if (styleIndex[styleUrl]) {
35173                           properties.styleHash = styleIndex[styleUrl];
35174                       }
35175                       if (styleMapIndex[styleUrl]) {
35176                           properties.styleMapHash = styleMapIndex[styleUrl];
35177                           properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
35178                       }
35179                       // Try to populate the lineStyle or polyStyle since we got the style hash
35180                       var style = styleByHash[properties.styleHash];
35181                       if (style) {
35182                           if (!lineStyle) lineStyle = get1(style, 'LineStyle');
35183                           if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
35184                       }
35185                   }
35186                   if (description) properties.description = description;
35187                   if (timeSpan) {
35188                       var begin = nodeVal(get1(timeSpan, 'begin'));
35189                       var end = nodeVal(get1(timeSpan, 'end'));
35190                       properties.timespan = { begin: begin, end: end };
35191                   }
35192                   if (timeStamp) {
35193                       properties.timestamp = nodeVal(get1(timeStamp, 'when'));
35194                   }
35195                   if (lineStyle) {
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;
35203                   }
35204                   if (polyStyle) {
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;
35214                   }
35215                   if (extendedData) {
35216                       var datas = get(extendedData, 'Data'),
35217                           simpleDatas = get(extendedData, 'SimpleData');
35218
35219                       for (i = 0; i < datas.length; i++) {
35220                           properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
35221                       }
35222                       for (i = 0; i < simpleDatas.length; i++) {
35223                           properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
35224                       }
35225                   }
35226                   if (visibility) {
35227                       properties.visibility = nodeVal(visibility);
35228                   }
35229                   if (geomsAndTimes.coordTimes.length) {
35230                       properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
35231                           geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
35232                   }
35233                   var feature = {
35234                       type: 'Feature',
35235                       geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
35236                           type: 'GeometryCollection',
35237                           geometries: geomsAndTimes.geoms
35238                       },
35239                       properties: properties
35240                   };
35241                   if (attr(root, 'id')) feature.id = attr(root, 'id');
35242                   return [feature];
35243               }
35244               return gj;
35245           },
35246           gpx: function(doc) {
35247               var i,
35248                   tracks = get(doc, 'trk'),
35249                   routes = get(doc, 'rte'),
35250                   waypoints = get(doc, 'wpt'),
35251                   // a feature collection
35252                   gj = fc(),
35253                   feature;
35254               for (i = 0; i < tracks.length; i++) {
35255                   feature = getTrack(tracks[i]);
35256                   if (feature) gj.features.push(feature);
35257               }
35258               for (i = 0; i < routes.length; i++) {
35259                   feature = getRoute(routes[i]);
35260                   if (feature) gj.features.push(feature);
35261               }
35262               for (i = 0; i < waypoints.length; i++) {
35263                   gj.features.push(getPoint(waypoints[i]));
35264               }
35265               function getPoints(node, pointname) {
35266                   var pts = get(node, pointname),
35267                       line = [],
35268                       times = [],
35269                       heartRates = [],
35270                       l = pts.length;
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);
35277                   }
35278                   return {
35279                       line: line,
35280                       times: times,
35281                       heartRates: heartRates
35282                   };
35283               }
35284               function getTrack(node) {
35285                   var segments = get(node, 'trkseg'),
35286                       track = [],
35287                       times = [],
35288                       heartRates = [],
35289                       line;
35290                   for (var i = 0; i < segments.length; i++) {
35291                       line = getPoints(segments[i], 'trkpt');
35292                       if (line) {
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);
35296                       }
35297                   }
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;
35303                   return {
35304                       type: 'Feature',
35305                       properties: properties,
35306                       geometry: {
35307                           type: track.length === 1 ? 'LineString' : 'MultiLineString',
35308                           coordinates: track.length === 1 ? track[0] : track
35309                       }
35310                   };
35311               }
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')));
35317                   var routeObj = {
35318                       type: 'Feature',
35319                       properties: prop,
35320                       geometry: {
35321                           type: 'LineString',
35322                           coordinates: line.line
35323                       }
35324                   };
35325                   return routeObj;
35326               }
35327               function getPoint(node) {
35328                   var prop = getProperties(node);
35329                   extend(prop, getMulti(node, ['sym']));
35330                   return {
35331                       type: 'Feature',
35332                       properties: prop,
35333                       geometry: {
35334                           type: 'Point',
35335                           coordinates: coordPair(node).coordinates
35336                       }
35337                   };
35338               }
35339               function getLineStyle(extensions) {
35340                   var style = {};
35341                   if (extensions) {
35342                       var lineStyle = get1(extensions, 'line');
35343                       if (lineStyle) {
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;
35351                       }
35352                   }
35353                   return style;
35354               }
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);
35363                   }
35364                   return prop;
35365               }
35366               return gj;
35367           }
35368       };
35369       return t;
35370   })();
35371
35372   module.exports = toGeoJSON;
35373   });
35374
35375   var _initialized = false;
35376   var _enabled = false;
35377   var _geojson;
35378
35379
35380   function svgGpx$$1(projection$$1, context, dispatch) {
35381       var _showLabels = true;
35382       var detected = utilDetect();
35383       var layer;
35384       var _src;
35385
35386
35387       function init() {
35388           if (_initialized) return;  // run once
35389
35390           _geojson = {};
35391           _enabled = true;
35392
35393           function over() {
35394               event.stopPropagation();
35395               event.preventDefault();
35396               event.dataTransfer.dropEffect = 'copy';
35397           }
35398
35399           select('body')
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);
35406               })
35407               .on('dragenter.localgpx', over)
35408               .on('dragexit.localgpx', over)
35409               .on('dragover.localgpx', over);
35410
35411           _initialized = true;
35412       }
35413
35414
35415       function drawGpx(selection$$1) {
35416           var getPath = svgPath(projection$$1).geojson;
35417
35418           layer = selection$$1.selectAll('.layer-gpx')
35419               .data(_enabled ? [0] : []);
35420
35421           layer.exit()
35422               .remove();
35423
35424           layer = layer.enter()
35425               .append('g')
35426               .attr('class', 'layer-gpx')
35427               .merge(layer);
35428
35429
35430           var paths = layer
35431               .selectAll('path')
35432               .data([_geojson]);
35433
35434           paths.exit()
35435               .remove();
35436
35437           paths = paths.enter()
35438               .append('path')
35439               .attr('class', 'gpx')
35440               .merge(paths);
35441
35442           paths
35443               .attr('d', getPath);
35444
35445
35446           var labelData = _showLabels && _geojson.features ? _geojson.features : [];
35447           labelData = labelData.filter(getPath);
35448
35449           layer
35450               .call(drawLabels, 'gpxlabel-halo', labelData)
35451               .call(drawLabels, 'gpxlabel', labelData);
35452
35453
35454           function drawLabels(selection$$1, textClass, data) {
35455               var labels = selection$$1.selectAll('text.' + textClass)
35456                   .data(data);
35457
35458               // exit
35459               labels.exit()
35460                   .remove();
35461
35462               // enter/update
35463               labels = labels.enter()
35464                   .append('text')
35465                   .attr('class', textClass)
35466                   .merge(labels)
35467                   .text(function(d) {
35468                       if (d.properties) {
35469                           return d.properties.desc || d.properties.name;
35470                       }
35471                       return null;
35472                   })
35473                   .attr('x', function(d) {
35474                       var centroid = getPath.centroid(d);
35475                       return centroid[0] + 11;
35476                   })
35477                   .attr('y', function(d) {
35478                       var centroid = getPath.centroid(d);
35479                       return centroid[1];
35480                   });
35481           }
35482       }
35483
35484
35485       function toDom(x) {
35486           return (new DOMParser()).parseFromString(x, 'text/xml');
35487       }
35488
35489
35490       function getExtension(fileName) {
35491           if (isUndefined(fileName)) {
35492               return '';
35493           }
35494
35495           var lastDotIndex = fileName.lastIndexOf('.');
35496           if (lastDotIndex < 0) {
35497               return '';
35498           }
35499
35500           return fileName.substr(lastDotIndex);
35501       }
35502
35503
35504       function parseSaveAndZoom(extension, data) {
35505           switch (extension) {
35506               default:
35507                   drawGpx.geojson(togeojson.gpx(toDom(data))).fitZoom();
35508                   break;
35509               case '.kml':
35510                   drawGpx.geojson(togeojson.kml(toDom(data))).fitZoom();
35511                   break;
35512               case '.geojson':
35513               case '.json':
35514                   drawGpx.geojson(JSON.parse(data)).fitZoom();
35515                   break;
35516           }
35517       }
35518
35519
35520       drawGpx.showLabels = function(_) {
35521           if (!arguments.length) return _showLabels;
35522           _showLabels = _;
35523           return this;
35524       };
35525
35526
35527       drawGpx.enabled = function(_) {
35528           if (!arguments.length) return _enabled;
35529           _enabled = _;
35530           dispatch.call('change');
35531           return this;
35532       };
35533
35534
35535       drawGpx.hasGpx = function() {
35536           return (!(isEmpty(_geojson) || isEmpty(_geojson.features)));
35537       };
35538
35539
35540       drawGpx.geojson = function(gj) {
35541           if (!arguments.length) return _geojson;
35542           if (isEmpty(gj) || isEmpty(gj.features)) return this;
35543           _geojson = gj;
35544           dispatch.call('change');
35545           return this;
35546       };
35547
35548
35549       drawGpx.url = function(url) {
35550           d3_text(url, function(err, data) {
35551               if (!err) {
35552                   _src = url;
35553                   var extension = getExtension(url);
35554                   parseSaveAndZoom(extension, data);
35555               }
35556           });
35557           return this;
35558       };
35559
35560
35561       drawGpx.files = function(fileList) {
35562           if (!fileList.length) return this;
35563           var f = fileList[0],
35564               reader = new FileReader();
35565
35566           reader.onload = (function(file) {
35567               _src = file.name;
35568               var extension = getExtension(file.name);
35569               return function (e) {
35570                   parseSaveAndZoom(extension, e.target.result);
35571               };
35572           })(f);
35573
35574           reader.readAsText(f);
35575           return this;
35576       };
35577
35578
35579       drawGpx.getSrc = function () {
35580           return _src;
35581       };
35582
35583
35584       drawGpx.fitZoom = function() {
35585           if (!this.hasGpx()) return this;
35586
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;
35591
35592               /* eslint-disable no-fallthrough */
35593               switch (feature.geometry.type) {
35594                   case 'Point':
35595                       c = [c];
35596                   case 'MultiPoint':
35597                   case 'LineString':
35598                       break;
35599
35600                   case 'MultiPolygon':
35601                       c = flatten(c);
35602                   case 'Polygon':
35603                   case 'MultiLineString':
35604                       c = flatten(c);
35605                       break;
35606               }
35607               /* eslint-enable no-fallthrough */
35608
35609               return union(coords, c);
35610           }, []);
35611
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));
35615           }
35616
35617           return this;
35618       };
35619
35620
35621       init();
35622       return drawGpx;
35623   }
35624
35625   function svgIcon(name, svgklass, useklass) {
35626       return function drawIcon(selection) {
35627           selection.selectAll('svg')
35628               .data([0])
35629               .enter()
35630               .append('svg')
35631               .attr('class', 'icon ' + (svgklass || ''))
35632               .append('use')
35633               .attr('xlink:href', name)
35634               .attr('class', useklass);
35635       };
35636   }
35637
35638   /** Error message constants. */
35639   var FUNC_ERROR_TEXT$3 = 'Expected a function';
35640
35641   /**
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.
35650    *
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.
35654    *
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`.
35657    *
35658    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
35659    * for details over the differences between `_.throttle` and `_.debounce`.
35660    *
35661    * @static
35662    * @memberOf _
35663    * @since 0.1.0
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.
35673    * @example
35674    *
35675    * // Avoid excessively updating the position while scrolling.
35676    * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
35677    *
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);
35681    *
35682    * // Cancel the trailing throttled invocation.
35683    * jQuery(window).on('popstate', throttled.cancel);
35684    */
35685   function throttle(func, wait, options) {
35686     var leading = true,
35687         trailing = true;
35688
35689     if (typeof func != 'function') {
35690       throw new TypeError(FUNC_ERROR_TEXT$3);
35691     }
35692     if (isObject(options)) {
35693       leading = 'leading' in options ? !!options.leading : leading;
35694       trailing = 'trailing' in options ? !!options.trailing : trailing;
35695     }
35696     return debounce(func, wait, {
35697       'leading': leading,
35698       'maxWait': wait,
35699       'trailing': trailing
35700     });
35701   }
35702
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 = {};
35711
35712       // Listed from highest to lowest priority
35713       var labelStack = [
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]
35746       ];
35747
35748
35749       function blacklisted(preset) {
35750           var noIcons = ['building', 'landuse', 'natural'];
35751           return some(noIcons, function(s) {
35752               return preset.id.indexOf(s) >= 0;
35753           });
35754       }
35755
35756
35757       function get(array, prop) {
35758           return function(d, i) { return array[i][prop]; };
35759       }
35760
35761
35762       function textWidth(text, size, elem) {
35763           var c = _textWidthCache[size];
35764           if (!c) c = _textWidthCache[size] = {};
35765
35766           if (c[text]) {
35767               return c[text];
35768
35769           } else if (elem) {
35770               c[text] = elem.getComputedTextLength();
35771               return c[text];
35772
35773           } else {
35774               var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
35775               if (str === null) {
35776                   return size / 3 * 2 * text.length;
35777               } else {
35778                   return size / 3 * (2 * text.length + str.length);
35779               }
35780           }
35781       }
35782
35783
35784       function drawLinePaths(selection, entities, filter, classes, labels) {
35785           var paths = selection.selectAll('path')
35786               .filter(filter)
35787               .data(entities, osmEntity$$1.key);
35788
35789           // exit
35790           paths.exit()
35791               .remove();
35792
35793           // enter/update
35794           paths.enter()
35795               .append('path')
35796               .style('stroke-width', get(labels, 'font-size'))
35797               .attr('id', function(d) { return 'labelpath-' + d.id; })
35798               .attr('class', classes)
35799               .merge(paths)
35800               .attr('d', get(labels, 'lineString'));
35801       }
35802
35803
35804       function drawLineLabels(selection, entities, filter, classes, labels) {
35805           var texts = selection.selectAll('text.' + classes)
35806               .filter(filter)
35807               .data(entities, osmEntity$$1.key);
35808
35809           // exit
35810           texts.exit()
35811               .remove();
35812
35813           // enter
35814           texts.enter()
35815               .append('text')
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');
35820
35821           // update
35822           selection.selectAll('text.' + classes).selectAll('.textpath')
35823               .filter(filter)
35824               .data(entities, osmEntity$$1.key)
35825               .attr('startOffset', '50%')
35826               .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
35827               .text(utilDisplayNameForPath);
35828       }
35829
35830
35831       function drawPointLabels(selection, entities, filter, classes, labels) {
35832           var texts = selection.selectAll('text.' + classes)
35833               .filter(filter)
35834               .data(entities, osmEntity$$1.key);
35835
35836           // exit
35837           texts.exit()
35838               .remove();
35839
35840           // enter/update
35841           texts.enter()
35842               .append('text')
35843               .attr('class', function(d, i) {
35844                   return classes + ' ' + labels[i].classes + ' ' + d.id;
35845               })
35846               .merge(texts)
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);
35853               });
35854       }
35855
35856
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);
35861
35862           function hasText(d, i) {
35863               return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
35864           }
35865       }
35866
35867
35868       function drawAreaIcons(selection, entities, filter, classes, labels) {
35869           var icons = selection.selectAll('use.' + classes)
35870               .filter(filter)
35871               .data(entities, osmEntity$$1.key);
35872
35873           // exit
35874           icons.exit()
35875               .remove();
35876
35877           // enter/update
35878           icons.enter()
35879               .append('use')
35880               .attr('class', 'icon ' + classes)
35881               .attr('width', '17px')
35882               .attr('height', '17px')
35883               .merge(icons)
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;
35888
35889                   if (!picon) {
35890                       return '';
35891                   } else {
35892                       var isMaki = /^maki-/.test(picon);
35893                       return '#' + picon + (isMaki ? '-15' : '');
35894                   }
35895               });
35896       }
35897
35898
35899       function drawCollisionBoxes(selection, rtree, which) {
35900           var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
35901
35902           var gj = [];
35903           if (context.getDebug('collision')) {
35904               gj = rtree.all().map(function(d) {
35905                   return { type: 'Polygon', coordinates: [[
35906                       [d.minX, d.minY],
35907                       [d.maxX, d.minY],
35908                       [d.maxX, d.maxY],
35909                       [d.minX, d.maxY],
35910                       [d.minX, d.minY]
35911                   ]]};
35912               });
35913           }
35914
35915           var boxes = selection.selectAll('.' + which)
35916               .data(gj);
35917
35918           // exit
35919           boxes.exit()
35920               .remove();
35921
35922           // enter/update
35923           boxes.enter()
35924               .append('path')
35925               .attr('class', classes)
35926               .merge(boxes)
35927               .attr('d', d3_geoPath());
35928       }
35929
35930
35931       function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
35932           var wireframe = context.surface().classed('fill-wireframe');
35933           var zoom = geoScaleToZoom(projection$$1.scale());
35934
35935           var labelable = [];
35936           var renderNodeAs = {};
35937           var i, j, k, entity, geometry;
35938
35939           for (i = 0; i < labelStack.length; i++) {
35940               labelable.push([]);
35941           }
35942
35943           if (fullRedraw) {
35944               _rdrawn.clear();
35945               _rskipped.clear();
35946               _entitybboxes = {};
35947
35948           } else {
35949               for (i = 0; i < entities.length; i++) {
35950                   entity = entities[i];
35951                   var toRemove = []
35952                       .concat(_entitybboxes[entity.id] || [])
35953                       .concat(_entitybboxes[entity.id + 'I'] || []);
35954
35955                   for (j = 0; j < toRemove.length; j++) {
35956                       _rdrawn.remove(toRemove[j]);
35957                       _rskipped.remove(toRemove[j]);
35958                   }
35959               }
35960           }
35961
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);
35966
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;
35970                   var markerPadding;
35971
35972                   if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
35973                       renderNodeAs[entity.id] = 'point';
35974                       markerPadding = 20;   // extra y for marker height
35975                   } else {
35976                       renderNodeAs[entity.id] = 'vertex';
35977                       markerPadding = 0;
35978                   }
35979
35980                   var coord = projection$$1(entity.loc);
35981                   var nodePadding = 10;
35982                   var bbox = {
35983                       minX: coord[0] - nodePadding,
35984                       minY: coord[1] - nodePadding - markerPadding,
35985                       maxX: coord[0] + nodePadding,
35986                       maxY: coord[1] + nodePadding
35987                   };
35988
35989                   doInsert(bbox, entity.id + 'P');
35990               }
35991
35992               // From here on, treat vertices like points
35993               if (geometry === 'vertex') {
35994                   geometry = 'point';
35995               }
35996
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;
36000
36001               if (!icon && !utilDisplayName(entity))
36002                   continue;
36003
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];
36009
36010                   if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
36011                       labelable[k].push(entity);
36012                       break;
36013                   }
36014               }
36015           }
36016
36017           var positions = {
36018               point: [],
36019               line: [],
36020               area: []
36021           };
36022
36023           var labelled = {
36024               point: [],
36025               line: [],
36026               area: []
36027           };
36028
36029           // Try and find a valid label for labellable entities
36030           for (k = 0; k < labelable.length; k++) {
36031               var fontSize = labelStack[k][3];
36032
36033               for (i = 0; i < labelable[k].length; i++) {
36034                   entity = labelable[k][i];
36035                   geometry = entity.geometry(graph);
36036
36037                   var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
36038                   var name = getName(entity);
36039                   var width = name && textWidth(name, fontSize);
36040                   var p = null;
36041
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;
36048
36049                       p = getPointLabel(entity, width, fontSize, renderAs);
36050
36051                   } else if (geometry === 'line') {
36052                       p = getLineLabel(entity, width, fontSize);
36053
36054                   } else if (geometry === 'area') {
36055                       p = getAreaLabel(entity, width, fontSize);
36056                   }
36057
36058                   if (p) {
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);
36063                   }
36064               }
36065           }
36066
36067
36068           function isInterestingVertex(entity) {
36069               var selectedIDs = context.selectedIDs();
36070
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;
36077                   });
36078           }
36079
36080
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']
36086               };
36087
36088               var coord = projection$$1(entity.loc);
36089               var textPadding = 2;
36090               var offset = pointOffsets[textDirection];
36091               var p = {
36092                   height: height,
36093                   width: width,
36094                   x: coord[0] + offset[0],
36095                   y: coord[1] + offset[1],
36096                   textAnchor: offset[2]
36097               };
36098
36099               // insert a collision box for the text label..
36100               var bbox;
36101               if (textDirection === 'rtl') {
36102                   bbox = {
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
36107                   };
36108               } else {
36109                   bbox = {
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
36114                   };
36115               }
36116
36117               if (tryInsert([bbox], entity.id, true)) {
36118                   return p;
36119               }
36120           }
36121
36122
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);
36127
36128               if (length < width + 20) return;
36129
36130               // todo: properly clip points to viewport
36131
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];
36135               var padding = 3;
36136
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;
36141
36142                   if (start < 0 || start + width > length) continue;
36143
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)) {
36147                       continue;
36148                   }
36149
36150                   var isReverse = reverse(sub);
36151                   if (isReverse) {
36152                       sub = sub.reverse();
36153                   }
36154
36155                   var bboxes = [];
36156                   var boxsize = (height + 2) / 2;
36157
36158                   for (var j = 0; j < sub.length - 1; j++) {
36159                       var a = sub[j];
36160                       var b = sub[j + 1];
36161
36162                       // split up the text into small collision boxes
36163                       var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
36164
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;
36171
36172                           bboxes.push({
36173                               minX: Math.min(x0, x1),
36174                               minY: Math.min(y0, y1),
36175                               maxX: Math.max(x0, x1),
36176                               maxY: Math.max(y0, y1)
36177                           });
36178                       }
36179                   }
36180
36181                   if (tryInsert(bboxes, entity.id, false)) {   // accept this one
36182                       return {
36183                           'font-size': height + 2,
36184                           lineString: lineString(sub),
36185                           startOffset: offset + '%'
36186                       };
36187                   }
36188               }
36189
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);
36193               }
36194
36195               function lineString(points) {
36196                   return 'M' + points.join('L');
36197               }
36198
36199               function subpath(points, from, to) {
36200                   var sofar = 0;
36201                   var start, end, i0, i1;
36202
36203                   for (var i = 0; i < points.length - 1; i++) {
36204                       var a = points[i];
36205                       var b = points[i + 1];
36206                       var current = geoVecLength(a, b);
36207                       var portion;
36208                       if (!start && sofar + current >= from) {
36209                           portion = (from - sofar) / current;
36210                           start = [
36211                               a[0] + portion * (b[0] - a[0]),
36212                               a[1] + portion * (b[1] - a[1])
36213                           ];
36214                           i0 = i + 1;
36215                       }
36216                       if (!end && sofar + current >= to) {
36217                           portion = (to - sofar) / current;
36218                           end = [
36219                               a[0] + portion * (b[0] - a[0]),
36220                               a[1] + portion * (b[1] - a[1])
36221                           ];
36222                           i1 = i + 1;
36223                       }
36224                       sofar += current;
36225                   }
36226
36227                   var result = points.slice(i0, i1);
36228                   result.unshift(start);
36229                   result.push(end);
36230                   return result;
36231               }
36232           }
36233
36234
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];
36239
36240               if (isNaN(centroid[0]) || areaWidth < 20) return;
36241
36242               var preset = context.presets().match(entity, context.graph());
36243               var picon = preset && preset.icon;
36244               var iconSize = 17;
36245               var padding = 2;
36246               var p = {};
36247
36248               if (picon) {  // icon and label..
36249                   if (addIcon()) {
36250                       addLabel(iconSize + padding);
36251                       return p;
36252                   }
36253               } else {   // label only..
36254                   if (addLabel(0)) {
36255                       return p;
36256                   }
36257               }
36258
36259
36260               function addIcon() {
36261                   var iconX = centroid[0] - (iconSize / 2);
36262                   var iconY = centroid[1] - (iconSize / 2);
36263                   var bbox = {
36264                       minX: iconX,
36265                       minY: iconY,
36266                       maxX: iconX + iconSize,
36267                       maxY: iconY + iconSize
36268                   };
36269
36270                   if (tryInsert([bbox], entity.id + 'I', true)) {
36271                       p.transform = 'translate(' + iconX + ',' + iconY + ')';
36272                       return true;
36273                   }
36274                   return false;
36275               }
36276
36277               function addLabel(yOffset) {
36278                   if (width && areaWidth >= width + 20) {
36279                       var labelX = centroid[0];
36280                       var labelY = centroid[1] + yOffset;
36281                       var bbox = {
36282                           minX: labelX - (width / 2) - padding,
36283                           minY: labelY - (height / 2) - padding,
36284                           maxX: labelX + (width / 2) + padding,
36285                           maxY: labelY + (height / 2) + padding
36286                       };
36287
36288                       if (tryInsert([bbox], entity.id, true)) {
36289                           p.x = labelX;
36290                           p.y = labelY;
36291                           p.textAnchor = 'middle';
36292                           p.height = height;
36293                           return true;
36294                       }
36295                   }
36296                   return false;
36297               }
36298           }
36299
36300
36301           // force insert a singular bounding box
36302           // singular box only, no array, id better be unique
36303           function doInsert(bbox, id) {
36304               bbox.id = id;
36305
36306               var oldbox = _entitybboxes[id];
36307               if (oldbox) {
36308                   _rdrawn.remove(oldbox);
36309               }
36310               _entitybboxes[id] = bbox;
36311               _rdrawn.insert(bbox);
36312           }
36313
36314
36315           function tryInsert(bboxes, id, saveSkipped) {
36316               var skipped = false;
36317
36318               for (var i = 0; i < bboxes.length; i++) {
36319                   var bbox = bboxes[i];
36320                   bbox.id = id;
36321
36322                   // Check that label is visible
36323                   if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
36324                       skipped = true;
36325                       break;
36326                   }
36327                   if (_rdrawn.collides(bbox)) {
36328                       skipped = true;
36329                       break;
36330                   }
36331               }
36332
36333               _entitybboxes[id] = bboxes;
36334
36335               if (skipped) {
36336                   if (saveSkipped) {
36337                       _rskipped.load(bboxes);
36338                   }
36339               } else {
36340                   _rdrawn.load(bboxes);
36341               }
36342
36343               return !skipped;
36344           }
36345
36346
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');
36351
36352           // points
36353           drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
36354           drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
36355
36356           // lines
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);
36360
36361           // areas
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);
36366
36367           // debug
36368           drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
36369           drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
36370
36371           layer.call(filterLabels);
36372       }
36373
36374
36375       function filterLabels(selection) {
36376           var layers = selection
36377               .selectAll('.layer-labels-label, .layer-labels-halo');
36378
36379           layers.selectAll('.nolabel')
36380               .classed('nolabel', false);
36381
36382           var mouse = context.mouse();
36383           var graph = context.graph();
36384           var selectedIDs = context.selectedIDs();
36385           var ids = [];
36386           var pad, bbox;
36387
36388           // hide labels near the mouse
36389           if (mouse) {
36390               pad = 20;
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'));
36393           }
36394
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]);
36400               }
36401           }
36402
36403           layers.selectAll(utilEntitySelector(ids))
36404               .classed('nolabel', true);
36405
36406
36407           // draw the mouse bbox if debugging is on..
36408           var debug = selection.selectAll('.layer-labels-debug');
36409           var gj = [];
36410           if (context.getDebug('collision')) {
36411               gj = bbox ? [{
36412                   type: 'Polygon',
36413                   coordinates: [[
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]
36419                   ]]
36420               }] : [];
36421           }
36422
36423           var box = debug.selectAll('.debug-mouse')
36424               .data(gj);
36425
36426           // exit
36427           box.exit()
36428               .remove();
36429
36430           // enter/update
36431           box.enter()
36432               .append('path')
36433               .attr('class', 'debug debug-mouse yellow')
36434               .merge(box)
36435               .attr('d', d3_geoPath());
36436       }
36437
36438
36439       var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
36440
36441
36442       drawLabels.observe = function(selection) {
36443           var listener = function() { throttleFilterLabels(selection); };
36444           selection.on('mousemove.hidelabels', listener);
36445           context.on('enter.hidelabels', listener);
36446       };
36447
36448
36449       drawLabels.off = function(selection) {
36450           throttleFilterLabels.cancel();
36451           selection.on('mousemove.hidelabels', null);
36452           context.on('enter.hidelabels', null);
36453       };
36454
36455
36456       return drawLabels;
36457   }
36458
36459   function svgStreetside$$1(projection, context, dispatch) {
36460       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
36461       var minZoom = 14;
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;
36468       var _streetside;
36469
36470       /**
36471        * init().
36472        */
36473       function init() {
36474           if (svgStreetside$$1.initialized) return;  // run once
36475           svgStreetside$$1.enabled = false;
36476           svgStreetside$$1.initialized = true;
36477       }
36478
36479       /**
36480        * getService().
36481        */
36482       function getService() {
36483           if (services.streetside && !_streetside) {
36484               _streetside = services.streetside;
36485               _streetside.event
36486                   .on('viewerChanged', viewerChanged)
36487                   .on('loadedBubbles', throttledRedraw);
36488           } else if (!services.streetside && _streetside) {
36489               _streetside = null;
36490           }
36491
36492           return _streetside;
36493       }
36494
36495       /**
36496        * showLayer().
36497        */
36498       function showLayer() {
36499           var service = getService();
36500           if (!service) return;
36501
36502           service.loadViewer(context);
36503           editOn();
36504
36505           layer
36506               .style('opacity', 0)
36507               .transition()
36508               .duration(250)
36509               .style('opacity', 1)
36510               .on('end', function () { dispatch.call('change'); });
36511       }
36512
36513       /**
36514        * hideLayer().
36515        */
36516       function hideLayer() {
36517           var service = getService();
36518           if (service) {
36519               service.hideViewer();
36520           }
36521
36522           throttledRedraw.cancel();
36523
36524           layer
36525               .transition()
36526               .duration(250)
36527               .style('opacity', 0)
36528               .on('end', editOff);
36529       }
36530
36531       /**
36532        * editOn().
36533        */
36534       function editOn() {
36535           layer.style('display', 'block');
36536       }
36537
36538       /**
36539        * editOff().
36540        */
36541       function editOff() {
36542           layer.selectAll('.viewfield-group').remove();
36543           layer.style('display', 'none');
36544       }
36545
36546       /**
36547        * click() Handles 'bubble' point click event.
36548        */
36549       function click(d) {
36550           var service = getService();
36551           if (!service) return;
36552
36553           // try to preserve the viewer rotation when staying on the same sequence
36554           if (d.sequenceKey !== _selectedSequence) {
36555               _viewerYaw = 0;  // reset
36556           }
36557           _selectedSequence = d.sequenceKey;
36558
36559           service
36560               .selectImage(d)
36561               .then(function(r) {
36562                   if (r.status === 'ok'){
36563                       service.showViewer(_viewerYaw);
36564                   }
36565               });
36566
36567
36568           context.map().centerEase(d.loc);
36569       }
36570
36571       /**
36572        * mouseover().
36573        */
36574       function mouseover(d) {
36575           var service = getService();
36576           _hoveredBubble = d;
36577           if (service) service.setStyles(d, true);
36578       }
36579
36580       /**
36581        * mouseout().
36582        */
36583       function mouseout() {
36584           var service = getService();
36585           _hoveredBubble = null;
36586           if (service) service.setStyles(null, true);
36587       }
36588
36589       /**
36590        * transform().
36591        */
36592       function transform(d) {
36593           var t = svgPointTransform(projection)(d);
36594           var rot = d.ca + _viewerYaw;
36595           if (rot) {
36596               t += ' rotate(' + Math.floor(rot) + ',0,0)';
36597           }
36598           return t;
36599       }
36600
36601
36602       function viewerChanged() {
36603           var service = getService();
36604           if (!service) return;
36605
36606           var viewer = service.viewer();
36607           if (!viewer) return;
36608
36609           // update viewfield rotation
36610           _viewerYaw = viewer.getYaw();
36611
36612           // avoid updating if the map is currently transformed
36613           // e.g. during drags or easing.
36614           if (context.map().isTransformed()) return;
36615
36616           layer.selectAll('.viewfield-group.selected')
36617               .attr('transform', transform);
36618       }
36619
36620
36621       /**
36622        * update().
36623        */
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();
36631
36632           var sequences = (service ? service.sequences(projection) : []);
36633           var bubbles = (service && showMarkers ? service.bubbles(projection) : []);
36634
36635           var traces = layer.selectAll('.sequences').selectAll('.sequence')
36636               .data(sequences, function(d) { return d.properties.key; });
36637
36638           // exit
36639           traces.exit()
36640               .remove();
36641
36642           // enter/update
36643           traces = traces.enter()
36644               .append('path')
36645               .attr('class', 'sequence')
36646               .merge(traces)
36647               .attr('d', svgPath(projection).geojson);
36648
36649
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');
36654               });
36655
36656           // exit
36657           groups.exit()
36658               .remove();
36659
36660           // enter
36661           var groupsEnter = groups.enter()
36662               .append('g')
36663               .attr('class', 'viewfield-group')
36664               .on('mouseover', mouseover)
36665               .on('mouseout', mouseout)
36666               .on('click', click);
36667
36668           groupsEnter
36669               .append('g')
36670               .attr('class', 'viewfield-scale');
36671
36672           // update
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];
36679               })
36680               .attr('transform', transform)
36681               .select('.viewfield-scale');
36682
36683
36684           markers.selectAll('circle')
36685               .data([0])
36686               .enter()
36687               .append('circle')
36688               .attr('dx', '0')
36689               .attr('dy', '0')
36690               .attr('r', '6');
36691
36692           var viewfields = markers.selectAll('.viewfield')
36693               .data(showViewfields ? [0] : []);
36694
36695           viewfields.exit()
36696               .remove();
36697
36698           // viewfields may or may not be drawn...
36699           // but if they are, draw below the circles
36700           viewfields.enter()
36701               .insert('path', 'circle')
36702               .attr('class', 'viewfield')
36703               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
36704               .attr('d', viewfieldPath);
36705
36706
36707           if (service) {
36708               service.setStyles(_hoveredBubble, true);
36709           }
36710
36711
36712           function viewfieldPath() {
36713               var d = this.parentNode.__data__;
36714               if (d.pano) {
36715                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
36716               } else {
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';
36718               }
36719           }
36720
36721       }
36722
36723       /**
36724        * drawImages()
36725        * drawImages is the method that is returned (and that runs) everytime 'svgStreetside()' is called.
36726        * 'svgStreetside()' is called from index.js
36727        */
36728       function drawImages(selection$$1) {
36729           var enabled = svgStreetside$$1.enabled;
36730           var service = getService();
36731
36732           layer = selection$$1.selectAll('.layer-streetside-images')
36733               .data(service ? [0] : []);
36734
36735           layer.exit()
36736               .remove();
36737
36738           var layerEnter = layer.enter()
36739               .append('g')
36740               .attr('class', 'layer-streetside-images')
36741               .style('display', enabled ? 'block' : 'none');
36742
36743           layerEnter
36744               .append('g')
36745               .attr('class', 'sequences');
36746
36747           layerEnter
36748               .append('g')
36749               .attr('class', 'markers');
36750
36751           layer = layerEnter
36752               .merge(layer);
36753
36754           if (enabled) {
36755               if (service && ~~context.map().zoom() >= minZoom) {
36756                   editOn();
36757                   update();
36758                   service.loadBubbles(projection);
36759               } else {
36760                   editOff();
36761               }
36762           }
36763       }
36764
36765
36766       /**
36767        * drawImages.enabled().
36768        */
36769       drawImages.enabled = function(_) {
36770           if (!arguments.length) return svgStreetside$$1.enabled;
36771           svgStreetside$$1.enabled = _;
36772           if (svgStreetside$$1.enabled) {
36773               showLayer();
36774           } else {
36775               hideLayer();
36776           }
36777           dispatch.call('change');
36778           return this;
36779       };
36780
36781       /**
36782        * drawImages.supported().
36783        */
36784       drawImages.supported = function() {
36785           return !!getService();
36786       };
36787
36788       init();
36789
36790       return drawImages;
36791   }
36792
36793   function svgMapillaryImages$$1(projection, context, dispatch) {
36794       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
36795       var minZoom = 12;
36796       var minMarkerZoom = 16;
36797       var minViewfieldZoom = 18;
36798       var layer = select(null);
36799       var _mapillary;
36800
36801
36802       function init() {
36803           if (svgMapillaryImages$$1.initialized) return;  // run once
36804           svgMapillaryImages$$1.enabled = false;
36805           svgMapillaryImages$$1.initialized = true;
36806       }
36807
36808
36809       function getService() {
36810           if (services.mapillary && !_mapillary) {
36811               _mapillary = services.mapillary;
36812               _mapillary.event.on('loadedImages', throttledRedraw);
36813           } else if (!services.mapillary && _mapillary) {
36814               _mapillary = null;
36815           }
36816
36817           return _mapillary;
36818       }
36819
36820
36821       function showLayer() {
36822           var service = getService();
36823           if (!service) return;
36824
36825           service.loadViewer(context);
36826           editOn();
36827
36828           layer
36829               .style('opacity', 0)
36830               .transition()
36831               .duration(250)
36832               .style('opacity', 1)
36833               .on('end', function () { dispatch.call('change'); });
36834       }
36835
36836
36837       function hideLayer() {
36838           var service = getService();
36839           if (service) {
36840               service.hideViewer();
36841           }
36842
36843           throttledRedraw.cancel();
36844
36845           layer
36846               .transition()
36847               .duration(250)
36848               .style('opacity', 0)
36849               .on('end', editOff);
36850       }
36851
36852
36853       function editOn() {
36854           layer.style('display', 'block');
36855       }
36856
36857
36858       function editOff() {
36859           layer.selectAll('.viewfield-group').remove();
36860           layer.style('display', 'none');
36861       }
36862
36863
36864       function click(d) {
36865           var service = getService();
36866           if (!service) return;
36867
36868           service
36869               .selectImage(d)
36870               .updateViewer(d.key, context)
36871               .showViewer();
36872
36873           context.map().centerEase(d.loc);
36874       }
36875
36876
36877       function mouseover(d) {
36878           var service = getService();
36879           if (service) service.setStyles(d);
36880       }
36881
36882
36883       function mouseout() {
36884           var service = getService();
36885           if (service) service.setStyles(null);
36886       }
36887
36888
36889       function transform(d) {
36890           var t = svgPointTransform(projection)(d);
36891           if (d.ca) {
36892               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
36893           }
36894           return t;
36895       }
36896
36897
36898       function update() {
36899           var viewer = select('#photoviewer');
36900           var selected = viewer.empty() ? undefined : viewer.datum();
36901
36902           var z = ~~context.map().zoom();
36903           var showMarkers = (z >= minMarkerZoom);
36904           var showViewfields = (z >= minViewfieldZoom);
36905
36906           var service = getService();
36907           var sequences = (service ? service.sequences(projection) : []);
36908           var images = (service && showMarkers ? service.images(projection) : []);
36909
36910           var traces = layer.selectAll('.sequences').selectAll('.sequence')
36911               .data(sequences, function(d) { return d.properties.key; });
36912
36913           // exit
36914           traces.exit()
36915               .remove();
36916
36917           // enter/update
36918           traces = traces.enter()
36919               .append('path')
36920               .attr('class', 'sequence')
36921               .merge(traces)
36922               .attr('d', svgPath(projection).geojson);
36923
36924
36925           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
36926               .data(images, function(d) { return d.key; });
36927
36928           // exit
36929           groups.exit()
36930               .remove();
36931
36932           // enter
36933           var groupsEnter = groups.enter()
36934               .append('g')
36935               .attr('class', 'viewfield-group')
36936               .on('mouseover', mouseover)
36937               .on('mouseout', mouseout)
36938               .on('click', click);
36939
36940           groupsEnter
36941               .append('g')
36942               .attr('class', 'viewfield-scale');
36943
36944           // update
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
36951               })
36952               .attr('transform', transform)
36953               .select('.viewfield-scale');
36954
36955
36956           markers.selectAll('circle')
36957               .data([0])
36958               .enter()
36959               .append('circle')
36960               .attr('dx', '0')
36961               .attr('dy', '0')
36962               .attr('r', '6');
36963
36964           var viewfields = markers.selectAll('.viewfield')
36965               .data(showViewfields ? [0] : []);
36966
36967           viewfields.exit()
36968               .remove();
36969
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);
36975
36976           function viewfieldPath() {
36977               var d = this.parentNode.__data__;
36978               if (d.pano) {
36979                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
36980               } else {
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';
36982               }
36983           }
36984       }
36985
36986
36987       function drawImages(selection$$1) {
36988           var enabled = svgMapillaryImages$$1.enabled,
36989               service = getService();
36990
36991           layer = selection$$1.selectAll('.layer-mapillary-images')
36992               .data(service ? [0] : []);
36993
36994           layer.exit()
36995               .remove();
36996
36997           var layerEnter = layer.enter()
36998               .append('g')
36999               .attr('class', 'layer-mapillary-images')
37000               .style('display', enabled ? 'block' : 'none');
37001
37002           layerEnter
37003               .append('g')
37004               .attr('class', 'sequences');
37005
37006           layerEnter
37007               .append('g')
37008               .attr('class', 'markers');
37009
37010           layer = layerEnter
37011               .merge(layer);
37012
37013           if (enabled) {
37014               if (service && ~~context.map().zoom() >= minZoom) {
37015                   editOn();
37016                   update();
37017                   service.loadImages(projection);
37018               } else {
37019                   editOff();
37020               }
37021           }
37022       }
37023
37024
37025       drawImages.enabled = function(_) {
37026           if (!arguments.length) return svgMapillaryImages$$1.enabled;
37027           svgMapillaryImages$$1.enabled = _;
37028           if (svgMapillaryImages$$1.enabled) {
37029               showLayer();
37030           } else {
37031               hideLayer();
37032           }
37033           dispatch.call('change');
37034           return this;
37035       };
37036
37037
37038       drawImages.supported = function() {
37039           return !!getService();
37040       };
37041
37042
37043       init();
37044       return drawImages;
37045   }
37046
37047   function svgMapillarySigns$$1(projection, context, dispatch) {
37048       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
37049       var minZoom = 12;
37050       var layer = select(null);
37051       var _mapillary;
37052
37053
37054       function init() {
37055           if (svgMapillarySigns$$1.initialized) return;  // run once
37056           svgMapillarySigns$$1.enabled = false;
37057           svgMapillarySigns$$1.initialized = true;
37058       }
37059
37060
37061       function getService() {
37062           if (services.mapillary && !_mapillary) {
37063               _mapillary = services.mapillary;
37064               _mapillary.event.on('loadedSigns', throttledRedraw);
37065           } else if (!services.mapillary && _mapillary) {
37066               _mapillary = null;
37067           }
37068           return _mapillary;
37069       }
37070
37071
37072       function showLayer() {
37073           var service = getService();
37074           if (!service) return;
37075
37076           service.loadViewer(context);
37077           editOn();
37078       }
37079
37080
37081       function hideLayer() {
37082           throttledRedraw.cancel();
37083           editOff();
37084       }
37085
37086
37087       function editOn() {
37088           layer.style('display', 'block');
37089       }
37090
37091
37092       function editOff() {
37093           layer.selectAll('.icon-sign').remove();
37094           layer.style('display', 'none');
37095       }
37096
37097
37098       function click(d) {
37099           var service = getService();
37100           if (!service) return;
37101
37102           context.map().centerEase(d.loc);
37103
37104           var selected = service.getSelectedImage();
37105           var selectedImageKey = selected && selected.key;
37106           var imageKey;
37107
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;
37113               }
37114           });
37115
37116           service
37117               .selectImage(null, imageKey)
37118               .updateViewer(imageKey, context)
37119               .showViewer();
37120       }
37121
37122
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);
37130
37131           var signs = layer.selectAll('.icon-sign')
37132               .data(data, function(d) { return d.key; });
37133
37134           // exit
37135           signs.exit()
37136               .remove();
37137
37138           // enter
37139           var enter = signs.enter()
37140               .append('use')
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;
37150                   });
37151               })
37152               .on('click', click);
37153
37154           // update
37155           signs
37156               .merge(enter)
37157               .sort(function(a, b) {
37158                   return (a === selected) ? 1
37159                       : (b === selected) ? -1
37160                       : b.loc[1] - a.loc[1];  // sort Y
37161               })
37162               .attr('transform', transform);
37163       }
37164
37165
37166       function drawSigns(selection$$1) {
37167           var enabled = svgMapillarySigns$$1.enabled;
37168           var service = getService();
37169
37170           layer = selection$$1.selectAll('.layer-mapillary-signs')
37171               .data(service ? [0] : []);
37172
37173           layer.exit()
37174               .remove();
37175
37176           layer = layer.enter()
37177               .append('g')
37178               .attr('class', 'layer-mapillary-signs')
37179               .style('display', enabled ? 'block' : 'none')
37180               .merge(layer);
37181
37182           if (enabled) {
37183               if (service && ~~context.map().zoom() >= minZoom) {
37184                   editOn();
37185                   update();
37186                   service.loadSigns(context, projection);
37187               } else {
37188                   editOff();
37189               }
37190           }
37191       }
37192
37193
37194       drawSigns.enabled = function(_) {
37195           if (!arguments.length) return svgMapillarySigns$$1.enabled;
37196           svgMapillarySigns$$1.enabled = _;
37197           if (svgMapillarySigns$$1.enabled) {
37198               showLayer();
37199           } else {
37200               hideLayer();
37201           }
37202           dispatch.call('change');
37203           return this;
37204       };
37205
37206
37207       drawSigns.supported = function() {
37208           return !!getService();
37209       };
37210
37211
37212       init();
37213       return drawSigns;
37214   }
37215
37216   function svgOpenstreetcamImages$$1(projection, context, dispatch) {
37217       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
37218       var minZoom = 12;
37219       var minMarkerZoom = 16;
37220       var minViewfieldZoom = 18;
37221       var layer = select(null);
37222       var _openstreetcam;
37223
37224
37225       function init() {
37226           if (svgOpenstreetcamImages$$1.initialized) return;  // run once
37227           svgOpenstreetcamImages$$1.enabled = false;
37228           svgOpenstreetcamImages$$1.initialized = true;
37229       }
37230
37231
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;
37238           }
37239
37240           return _openstreetcam;
37241       }
37242
37243
37244       function showLayer() {
37245           var service = getService();
37246           if (!service) return;
37247
37248           service.loadViewer(context);
37249           editOn();
37250
37251           layer
37252               .style('opacity', 0)
37253               .transition()
37254               .duration(250)
37255               .style('opacity', 1)
37256               .on('end', function () { dispatch.call('change'); });
37257       }
37258
37259
37260       function hideLayer() {
37261           var service = getService();
37262           if (service) {
37263               service.hideViewer();
37264           }
37265
37266           throttledRedraw.cancel();
37267
37268           layer
37269               .transition()
37270               .duration(250)
37271               .style('opacity', 0)
37272               .on('end', editOff);
37273       }
37274
37275
37276       function editOn() {
37277           layer.style('display', 'block');
37278       }
37279
37280
37281       function editOff() {
37282           layer.selectAll('.viewfield-group').remove();
37283           layer.style('display', 'none');
37284       }
37285
37286
37287       function click(d) {
37288           var service = getService();
37289           if (!service) return;
37290
37291           service
37292               .selectImage(d)
37293               .updateViewer(d)
37294               .showViewer();
37295
37296           context.map().centerEase(d.loc);
37297       }
37298
37299
37300       function mouseover(d) {
37301           var service = getService();
37302           if (service) service.setStyles(d);
37303       }
37304
37305
37306       function mouseout() {
37307           var service = getService();
37308           if (service) service.setStyles(null);
37309       }
37310
37311
37312       function transform(d) {
37313           var t = svgPointTransform(projection)(d);
37314           if (d.ca) {
37315               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
37316           }
37317           return t;
37318       }
37319
37320
37321       function update() {
37322           var viewer = select('#photoviewer');
37323           var selected = viewer.empty() ? undefined : viewer.datum();
37324
37325           var z = ~~context.map().zoom();
37326           var showMarkers = (z >= minMarkerZoom);
37327           var showViewfields = (z >= minViewfieldZoom);
37328
37329           var service = getService();
37330           var sequences = (service ? service.sequences(projection) : []);
37331           var images = (service && showMarkers ? service.images(projection) : []);
37332
37333           var traces = layer.selectAll('.sequences').selectAll('.sequence')
37334               .data(sequences, function(d) { return d.properties.key; });
37335
37336           // exit
37337           traces.exit()
37338               .remove();
37339
37340           // enter/update
37341           traces = traces.enter()
37342               .append('path')
37343               .attr('class', 'sequence')
37344               .merge(traces)
37345               .attr('d', svgPath(projection).geojson);
37346
37347
37348           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
37349               .data(images, function(d) { return d.key; });
37350
37351           // exit
37352           groups.exit()
37353               .remove();
37354
37355           // enter
37356           var groupsEnter = groups.enter()
37357               .append('g')
37358               .attr('class', 'viewfield-group')
37359               .on('mouseover', mouseover)
37360               .on('mouseout', mouseout)
37361               .on('click', click);
37362
37363           groupsEnter
37364               .append('g')
37365               .attr('class', 'viewfield-scale');
37366
37367           // update
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
37374               })
37375               .attr('transform', transform)
37376               .select('.viewfield-scale');
37377
37378
37379           markers.selectAll('circle')
37380               .data([0])
37381               .enter()
37382               .append('circle')
37383               .attr('dx', '0')
37384               .attr('dy', '0')
37385               .attr('r', '6');
37386
37387           var viewfields = markers.selectAll('.viewfield')
37388               .data(showViewfields ? [0] : []);
37389
37390           viewfields.exit()
37391               .remove();
37392
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');
37398       }
37399
37400
37401       function drawImages(selection$$1) {
37402           var enabled = svgOpenstreetcamImages$$1.enabled,
37403               service = getService();
37404
37405           layer = selection$$1.selectAll('.layer-openstreetcam-images')
37406               .data(service ? [0] : []);
37407
37408           layer.exit()
37409               .remove();
37410
37411           var layerEnter = layer.enter()
37412               .append('g')
37413               .attr('class', 'layer-openstreetcam-images')
37414               .style('display', enabled ? 'block' : 'none');
37415
37416           layerEnter
37417               .append('g')
37418               .attr('class', 'sequences');
37419
37420           layerEnter
37421               .append('g')
37422               .attr('class', 'markers');
37423
37424           layer = layerEnter
37425               .merge(layer);
37426
37427           if (enabled) {
37428               if (service && ~~context.map().zoom() >= minZoom) {
37429                   editOn();
37430                   update();
37431                   service.loadImages(projection);
37432               } else {
37433                   editOff();
37434               }
37435           }
37436       }
37437
37438
37439       drawImages.enabled = function(_) {
37440           if (!arguments.length) return svgOpenstreetcamImages$$1.enabled;
37441           svgOpenstreetcamImages$$1.enabled = _;
37442           if (svgOpenstreetcamImages$$1.enabled) {
37443               showLayer();
37444           } else {
37445               hideLayer();
37446           }
37447           dispatch.call('change');
37448           return this;
37449       };
37450
37451
37452       drawImages.supported = function() {
37453           return !!getService();
37454       };
37455
37456
37457       init();
37458       return drawImages;
37459   }
37460
37461   function svgOsm(projection, context, dispatch) {
37462       var enabled = true;
37463
37464
37465       function drawOsm(selection) {
37466           selection.selectAll('.layer-osm')
37467               .data(['covered', 'areas', 'lines', 'points', 'labels'])
37468               .enter()
37469               .append('g')
37470               .attr('class', function(d) { return 'layer-osm layer-' + d; });
37471
37472           selection.selectAll('.layer-areas').selectAll('.layer-areas-group')
37473               .data(['areas', 'targets'])
37474               .enter()
37475               .append('g')
37476               .attr('class', function(d) { return 'layer-areas-group layer-areas-' + d; });
37477
37478           selection.selectAll('.layer-lines').selectAll('.layer-lines-group')
37479               .data(['lines', 'targets'])
37480               .enter()
37481               .append('g')
37482               .attr('class', function(d) { return 'layer-lines-group layer-lines-' + d; });
37483
37484           selection.selectAll('.layer-points').selectAll('.layer-points-group')
37485               .data(['points', 'midpoints', 'vertices', 'turns', 'targets'])
37486               .enter()
37487               .append('g')
37488               .attr('class', function(d) { return 'layer-points-group layer-points-' + d; });
37489
37490           selection.selectAll('.layer-labels').selectAll('.layer-labels-group')
37491               .data(['halo', 'label', 'debug'])
37492               .enter()
37493               .append('g')
37494               .attr('class', function(d) { return 'layer-labels-group layer-labels-' + d; });
37495       }
37496
37497
37498       function showLayer() {
37499           var layer = context.surface().selectAll('.data-layer-osm');
37500           layer.interrupt();
37501
37502           layer
37503               .classed('disabled', false)
37504               .style('opacity', 0)
37505               .transition()
37506               .duration(250)
37507               .style('opacity', 1)
37508               .on('end interrupt', function () {
37509                   dispatch.call('change');
37510               });
37511       }
37512
37513
37514       function hideLayer() {
37515           var layer = context.surface().selectAll('.data-layer-osm');
37516           layer.interrupt();
37517
37518           layer
37519               .transition()
37520               .duration(250)
37521               .style('opacity', 0)
37522               .on('end interrupt', function () {
37523                   layer.classed('disabled', true);
37524                   dispatch.call('change');
37525               });
37526       }
37527
37528
37529       drawOsm.enabled = function(_) {
37530           if (!arguments.length) return enabled;
37531           enabled = _;
37532
37533           if (enabled) {
37534               showLayer();
37535           } else {
37536               hideLayer();
37537           }
37538
37539           dispatch.call('change');
37540           return this;
37541       };
37542
37543
37544       return drawOsm;
37545   }
37546
37547   function svgLayers(projection, context) {
37548       var dispatch$$1 = dispatch('change');
37549       var svg = select(null);
37550       var layers = [
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) }
37558       ];
37559
37560
37561       function drawLayers(selection$$1) {
37562           svg = selection$$1.selectAll('.surface')
37563               .data([0]);
37564
37565           svg = svg.enter()
37566               .append('svg')
37567               .attr('class', 'surface')
37568               .merge(svg);
37569
37570           var defs = svg.selectAll('.surface-defs')
37571               .data([0]);
37572
37573           defs.enter()
37574               .append('defs')
37575               .attr('class', 'surface-defs');
37576
37577           var groups = svg.selectAll('.data-layer')
37578               .data(layers);
37579
37580           groups.exit()
37581               .remove();
37582
37583           groups.enter()
37584               .append('g')
37585               .attr('class', function(d) { return 'data-layer data-layer-' + d.id; })
37586               .merge(groups)
37587               .each(function(d) { select(this).call(d.layer); });
37588       }
37589
37590
37591       drawLayers.all = function() {
37592           return layers;
37593       };
37594
37595
37596       drawLayers.layer = function(id) {
37597           var obj = find$1(layers, function(o) {return o.id === id;});
37598           return obj && obj.layer;
37599       };
37600
37601
37602       drawLayers.only = function(what) {
37603           var arr = [].concat(what);
37604           drawLayers.remove(difference(map$3(layers, 'id'), arr));
37605           return this;
37606       };
37607
37608
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;});
37613           });
37614           dispatch$$1.call('change');
37615           return this;
37616       };
37617
37618
37619       drawLayers.add = function(what) {
37620           var arr = [].concat(what);
37621           arr.forEach(function(obj) {
37622               if ('id' in obj && 'layer' in obj) {
37623                   layers.push(obj);
37624               }
37625           });
37626           dispatch$$1.call('change');
37627           return this;
37628       };
37629
37630
37631       drawLayers.dimensions = function(_) {
37632           if (!arguments.length) return utilGetDimensions(svg);
37633           utilSetDimensions(svg, _);
37634           return this;
37635       };
37636
37637
37638       return utilRebind(drawLayers, dispatch$$1, 'on');
37639   }
37640
37641   function svgLines$$1(projection, context) {
37642       var detected = utilDetect();
37643
37644       var highway_stack = {
37645           motorway: 0,
37646           motorway_link: 1,
37647           trunk: 2,
37648           trunk_link: 3,
37649           primary: 4,
37650           primary_link: 5,
37651           secondary: 6,
37652           tertiary: 7,
37653           unclassified: 8,
37654           residential: 9,
37655           service: 10,
37656           footway: 11
37657       };
37658
37659
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();
37665
37666           // The targets and nopes will be MultiLineString sub-segments of the ways
37667           var data = { targets: [], nopes: [] };
37668
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);
37673           });
37674
37675
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; });
37681
37682           // exit
37683           targets.exit()
37684               .remove();
37685
37686           // enter/update
37687           targets.enter()
37688               .append('path')
37689               .merge(targets)
37690               .attr('d', getPath)
37691               .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
37692
37693
37694           // NOPE
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; });
37699
37700           // exit
37701           nopes.exit()
37702               .remove();
37703
37704           // enter/update
37705           nopes.enter()
37706               .append('path')
37707               .merge(nopes)
37708               .attr('d', getPath)
37709               .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
37710       }
37711
37712
37713       function drawLines(selection, graph, entities, filter$$1) {
37714
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;
37719
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;
37723           }
37724
37725
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 ' : '';
37731
37732               var lines = selection
37733                   .selectAll('path')
37734                   .filter(filter$$1)
37735                   .data(getPathData(isSelected), osmEntity$$1.key);
37736
37737               lines.exit()
37738                   .remove();
37739
37740               // Optimization: Call expensive TagClasses only on enter selection. This
37741               // works because osmEntity.key is defined to include the entity v attribute.
37742               lines.enter()
37743                   .append('path')
37744                   .attr('class', function(d) {
37745                       var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
37746                       return 'way line ' + klass + ' ' + selectedClass + oldMPClass + d.id;
37747                   })
37748                   .call(svgTagClasses())
37749                   .merge(lines)
37750                   .sort(waystack)
37751                   .attr('d', getPath)
37752                   .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
37753
37754               return selection;
37755           }
37756
37757
37758           function getPathData(isSelected) {
37759               return function() {
37760                   var layer = this.parentNode.__data__;
37761                   var data = pathdata[layer] || [];
37762                   return data.filter(function(d) {
37763                       if (isSelected)
37764                           return context.selectedIDs().indexOf(d.id) !== -1;
37765                       else
37766                           return context.selectedIDs().indexOf(d.id) === -1;
37767                   });
37768               };
37769           }
37770
37771
37772           var getPath = svgPath(projection, graph);
37773           var ways = [];
37774           var pathdata = {};
37775           var onewaydata = {};
37776           var oldMultiPolygonOuters = {};
37777
37778           for (var i = 0; i < entities.length; i++) {
37779               var entity = entities[i];
37780               var outer = osmSimpleMultipolygonOuterMember(entity, graph);
37781               if (outer) {
37782                   ways.push(entity.mergeTags(outer.tags));
37783                   oldMultiPolygonOuters[outer.id] = true;
37784               } else if (entity.geometry(graph) === 'line') {
37785                   ways.push(entity);
37786               }
37787           }
37788
37789           ways = ways.filter(getPath);
37790           pathdata = groupBy(ways, function(way) { return way.layer(); });
37791
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)));
37795           });
37796
37797
37798           var covered = selection.selectAll('.layer-covered');                      // under areas
37799           var uncovered = selection.selectAll('.layer-lines .layer-lines-lines');   // over areas
37800
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')
37805                   .data(range$$1);
37806
37807               layergroup = layergroup.enter()
37808                   .append('g')
37809                   .attr('class', function(d) { return 'layergroup layer' + String(d); })
37810                   .merge(layergroup);
37811
37812               layergroup
37813                   .selectAll('g.linegroup')
37814                   .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
37815                   .enter()
37816                   .append('g')
37817                   .attr('class', function(d) { return 'linegroup line-' + d; });
37818
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);
37825
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);
37832
37833
37834               var onewaygroup = layergroup
37835                   .selectAll('g.onewaygroup')
37836                   .data(['oneway']);
37837
37838               onewaygroup = onewaygroup.enter()
37839                   .append('g')
37840                   .attr('class', 'onewaygroup')
37841                   .merge(onewaygroup);
37842
37843               var oneways = onewaygroup
37844                   .selectAll('path')
37845                   .filter(filter$$1)
37846                   .data(
37847                       function data() { return onewaydata[this.parentNode.__data__] || []; },
37848                       function key(d) { return [d.id, d.index]; }
37849                   );
37850
37851               oneways.exit()
37852                   .remove();
37853
37854               oneways = oneways.enter()
37855                   .append('path')
37856                   .attr('class', 'oneway')
37857                   .attr('marker-mid', 'url(#oneway-marker)')
37858                   .merge(oneways)
37859                   .attr('d', function(d) { return d.d; });
37860
37861               if (detected.ie) {
37862                   oneways.each(function() { this.parentNode.insertBefore(this, this); });
37863               }
37864           });
37865
37866           // touch targets
37867           selection.selectAll('.layer-lines .layer-lines-targets')
37868               .call(drawTargets, graph, ways, filter$$1);
37869       }
37870
37871
37872       return drawLines;
37873   }
37874
37875   function svgMidpoints$$1(projection, context) {
37876       var targetRadius = 8;
37877
37878       function drawTargets(selection, graph, entities, filter) {
37879           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
37880           var getTransform = svgPointTransform(projection).geojson;
37881
37882           var data = entities.map(function(midpoint) {
37883               return {
37884                   type: 'Feature',
37885                   id: midpoint.id,
37886                   properties: {
37887                       target: true,
37888                       entity: midpoint
37889                   },
37890                   geometry: {
37891                       type: 'Point',
37892                       coordinates: midpoint.loc
37893                   }
37894               };
37895           });
37896
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; });
37900
37901           // exit
37902           targets.exit()
37903               .remove();
37904
37905           // enter/update
37906           targets.enter()
37907               .append('circle')
37908               .attr('r', targetRadius)
37909               .merge(targets)
37910               .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
37911               .attr('transform', getTransform);
37912       }
37913
37914
37915       function drawMidpoints(selection, graph, entities, filter, extent) {
37916           var layer = selection.selectAll('.layer-points .layer-points-midpoints');
37917
37918           var mode = context.mode();
37919           if (mode && mode.id !== 'select') {
37920               layer.selectAll('g.midpoint')
37921                   .remove();
37922
37923               selection.selectAll('.layer-points .layer-points-targets .midpoint.target')
37924                   .remove();
37925
37926               return;
37927           }
37928
37929           var poly = extent.polygon();
37930           var midpoints = {};
37931
37932           for (var i = 0; i < entities.length; i++) {
37933               var entity = entities[i];
37934
37935               if (entity.type !== 'way')
37936                   continue;
37937               if (!filter(entity))
37938                   continue;
37939               if (context.selectedIDs().indexOf(entity.id) < 0)
37940                   continue;
37941
37942               var nodes = graph.childNodes(entity);
37943               for (var j = 0; j < nodes.length - 1; j++) {
37944
37945                   var a = nodes[j];
37946                   var b = nodes[j + 1];
37947                   var id = [a.id, b.id].sort().join('-');
37948
37949                   if (midpoints[id]) {
37950                       midpoints[id].parents.push(entity);
37951                   } else {
37952                       if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
37953                           var point = geoVecInterp(a.loc, b.loc, 0.5);
37954                           var loc = null;
37955
37956                           if (extent.intersects(point)) {
37957                               loc = point;
37958                           } else {
37959                               for (var k = 0; k < 4; k++) {
37960                                   point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
37961                                   if (point &&
37962                                       geoVecLength(projection(a.loc), projection(point)) > 20 &&
37963                                       geoVecLength(projection(b.loc), projection(point)) > 20)
37964                                   {
37965                                       loc = point;
37966                                       break;
37967                                   }
37968                               }
37969                           }
37970
37971                           if (loc) {
37972                               midpoints[id] = {
37973                                   type: 'midpoint',
37974                                   id: id,
37975                                   loc: loc,
37976                                   edge: [a.id, b.id],
37977                                   parents: [entity]
37978                               };
37979                           }
37980                       }
37981                   }
37982               }
37983           }
37984
37985
37986           function midpointFilter(d) {
37987               if (midpoints[d.id])
37988                   return true;
37989
37990               for (var i = 0; i < d.parents.length; i++) {
37991                   if (filter(d.parents[i])) {
37992                       return true;
37993                   }
37994               }
37995
37996               return false;
37997           }
37998
37999
38000           var groups = layer
38001               .selectAll('g.midpoint')
38002               .filter(midpointFilter)
38003               .data(values$1(midpoints), function(d) { return d.id; });
38004
38005           groups.exit()
38006               .remove();
38007
38008           var enter = groups.enter()
38009               .insert('g', ':first-child')
38010               .attr('class', 'midpoint');
38011
38012           enter
38013               .append('polygon')
38014               .attr('points', '-6,8 10,0 -6,-8')
38015               .attr('class', 'shadow');
38016
38017           enter
38018               .append('polygon')
38019               .attr('points', '-3,4 5,0 -3,-4')
38020               .attr('class', 'fill');
38021
38022           groups = groups
38023               .merge(enter)
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 + ')';
38030               })
38031               .call(svgTagClasses().tags(
38032                   function(d) { return d.parents[0].tags; }
38033               ));
38034
38035           // Propagate data bindings.
38036           groups.select('polygon.shadow');
38037           groups.select('polygon.fill');
38038
38039
38040           // Draw touch targets..
38041           selection.selectAll('.layer-points .layer-points-targets')
38042               .call(drawTargets, graph, values$1(midpoints), midpointFilter);
38043       }
38044
38045       return drawMidpoints;
38046   }
38047
38048   // Touch targets control which other vertices we can drag a vertex onto.
38049   //
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)
38055   //
38056   // returns
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
38060   //
38061   function svgPassiveVertex(node, graph, activeID) {
38062       if (!activeID) return 1;
38063       if (activeID === node.id) return 0;
38064
38065       var parents = graph.parentWays(node);
38066
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) {
38072                   var ix1 = j - 2;
38073                   var ix2 = j - 1;
38074                   var ix3 = j + 1;
38075                   var ix4 = j + 2;
38076
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;
38083                   }
38084
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
38090               }
38091           }
38092       }
38093
38094       return 1;   // ok
38095   }
38096
38097
38098   function svgOneWaySegments(projection$$1, graph, dt) {
38099       return function(entity) {
38100           var i = 0;
38101           var offset = dt;
38102           var segments = [];
38103           var clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream;
38104           var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
38105           var a, b;
38106
38107           if (entity.tags.oneway === '-1') {
38108               coordinates.reverse();
38109           }
38110
38111           var isReversible = (entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating');
38112
38113           geoStream({
38114               type: 'LineString',
38115               coordinates: coordinates
38116           }, projection$$1.stream(clip({
38117               lineStart: function() {},
38118               lineEnd: function() { a = null; },
38119               point: function(x, y) {
38120                   b = [x, y];
38121
38122                   if (a) {
38123                       var span = geoVecLength(a, b) - offset;
38124
38125                       if (span >= 0) {
38126                           var heading = geoVecAngle(a, b);
38127                           var dx = dt * Math.cos(heading);
38128                           var dy = dt * Math.sin(heading);
38129                           var p = [
38130                               a[0] + offset * Math.cos(heading),
38131                               a[1] + offset * Math.sin(heading)
38132                           ];
38133
38134                           // gather coordinates
38135                           var coord = [a, p];
38136                           for (span -= dt; span >= 0; span -= dt) {
38137                               p = geoVecAdd(p, [dx, dy]);
38138                               coord.push(p);
38139                           }
38140                           coord.push(b);
38141
38142                           // generate svg paths
38143                           var segment = '';
38144                           var j;
38145
38146                           for (j = 0; j < coord.length; j++) {
38147                               segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
38148                           }
38149                           segments.push({ id: entity.id, index: i++, d: segment });
38150
38151                           if (isReversible) {
38152                               segment = '';
38153                               for (j = coord.length - 1; j >= 0; j--) {
38154                                   segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
38155                               }
38156                               segments.push({ id: entity.id, index: i++, d: segment });
38157                           }
38158                       }
38159
38160                       offset = -span;
38161                   }
38162
38163                   a = b;
38164               }
38165           })));
38166
38167           return segments;
38168       };
38169   }
38170
38171
38172   function svgPath(projection$$1, graph, isArea) {
38173
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.
38178       //
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)
38182
38183       var cache = {};
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]
38189       ];
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)); }});
38194
38195       var svgpath = function(entity) {
38196           if (entity.id in cache) {
38197               return cache[entity.id];
38198           } else {
38199               return cache[entity.id] = path(entity.asGeoJSON(graph));
38200           }
38201       };
38202
38203       svgpath.geojson = path;
38204
38205       return svgpath;
38206   }
38207
38208
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] + ')';
38214       };
38215
38216       svgpoint.geojson = function(d) {
38217           return svgpoint(d.properties.entity);
38218       };
38219
38220       return svgpoint;
38221   }
38222
38223
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);
38231               }
38232           });
38233           return tags;
38234       };
38235   }
38236
38237
38238   function svgSegmentWay(way, graph, activeID) {
38239       var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
38240       var features = { passive: [], active: [] };
38241       var start = {};
38242       var end = {};
38243       var node, type;
38244
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 };
38249
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);
38255               } else {
38256                   pushPassive(start, end, i);
38257               }
38258           }
38259
38260           start = end;
38261       }
38262
38263       return features;
38264
38265
38266       function pushActive(start, end, index) {
38267           features.active.push({
38268               type: 'Feature',
38269               id: way.id + '-' + index + '-nope',
38270               properties: {
38271                   nope: true,
38272                   target: true,
38273                   entity: way,
38274                   nodes: [start.node, end.node],
38275                   index: index
38276               },
38277               geometry: {
38278                   type: 'LineString',
38279                   coordinates: [start.node.loc, end.node.loc]
38280               }
38281           });
38282       }
38283
38284       function pushPassive(start, end, index) {
38285           features.passive.push({
38286               type: 'Feature',
38287               id: way.id + '-' + index,
38288               properties: {
38289                   target: true,
38290                   entity: way,
38291                   nodes: [start.node, end.node],
38292                   index: index
38293               },
38294               geometry: {
38295                   type: 'LineString',
38296                   coordinates: [start.node.loc, end.node.loc]
38297               }
38298           });
38299       }
38300   }
38301
38302   function svgPoints$$1(projection, context) {
38303
38304       function markerPath(selection, klass) {
38305           selection
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');
38309       }
38310
38311       function sortY(a, b) {
38312           return b.loc[1] - a.loc[1];
38313       }
38314
38315
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);
38322       }
38323
38324
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();
38329           var data = [];
38330
38331           entities.forEach(function(node) {
38332               if (activeID === node.id) return;   // draw no target on the activeID
38333
38334               data.push({
38335                   type: 'Feature',
38336                   id: node.id,
38337                   properties: {
38338                       target: true,
38339                       entity: node
38340                   },
38341                   geometry: node.asGeoJSON()
38342               });
38343           });
38344
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; });
38348
38349           // exit
38350           targets.exit()
38351               .remove();
38352
38353           // enter/update
38354           targets.enter()
38355               .append('rect')
38356               .attr('x', -10)
38357               .attr('y', -26)
38358               .attr('width', 20)
38359               .attr('height', 30)
38360               .merge(targets)
38361               .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
38362               .attr('transform', getTransform);
38363       }
38364
38365
38366       function drawPoints(selection, graph, entities, filter) {
38367           var wireframe = context.surface().classed('fill-wireframe');
38368           var zoom = geoScaleToZoom(projection.scale());
38369
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);
38374           }
38375
38376           // all points will render as vertices in wireframe mode too
38377           var points = wireframe ? [] : entities.filter(renderAsPoint);
38378
38379           points.sort(sortY);
38380
38381
38382           var layer = selection.selectAll('.layer-points .layer-points-points');
38383
38384           var groups = layer.selectAll('g.point')
38385               .filter(filter)
38386               .data(points, fastEntityKey);
38387
38388           groups.exit()
38389               .remove();
38390
38391           var enter = groups.enter()
38392               .append('g')
38393               .attr('class', function(d) { return 'node point ' + d.id; })
38394               .order();
38395
38396           enter
38397               .append('path')
38398               .call(markerPath, 'shadow');
38399
38400           enter
38401               .append('ellipse')
38402               .attr('cx', 0.5)
38403               .attr('cy', 1)
38404               .attr('rx', 6.5)
38405               .attr('ry', 3)
38406               .attr('class', 'stroke');
38407
38408           enter
38409               .append('path')
38410               .call(markerPath, 'stroke');
38411
38412           enter
38413               .append('use')
38414               .attr('transform', 'translate(-5, -19)')
38415               .attr('class', 'icon')
38416               .attr('width', '11px')
38417               .attr('height', '11px');
38418
38419           groups = groups
38420               .merge(enter)
38421               .attr('transform', svgPointTransform(projection))
38422               .call(svgTagClasses());
38423
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;
38432
38433                   if (!picon)
38434                       return '';
38435                   else {
38436                       var isMaki = /^maki-/.test(picon);
38437                       return '#' + picon + (isMaki ? '-11' : '');
38438                   }
38439               });
38440
38441
38442           // touch targets
38443           selection.selectAll('.layer-points .layer-points-targets')
38444               .call(drawTargets, graph, points, filter);
38445       }
38446
38447
38448       return drawPoints;
38449   }
38450
38451   function svgTagClasses() {
38452       var primaries = [
38453               'building', 'highway', 'railway', 'waterway', 'aeroway',
38454               'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse',
38455               'leisure', 'military', 'place', 'man_made'
38456           ],
38457           statuses = [
38458               'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
38459               'razed', 'demolished', 'obliterated', 'intermittent'
38460           ],
38461           secondaries = [
38462               'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
38463               'surface', 'tracktype', 'crossing', 'service', 'sport'
38464           ],
38465           tagClassRe = /^tag-/,
38466           tags = function(entity) { return entity.tags; };
38467
38468
38469       var tagClasses = function(selection$$1) {
38470           selection$$1.each(function tagClassesEach(entity) {
38471               var value = this.className,
38472                   classes, primary, status;
38473
38474               if (value.baseVal !== undefined) value = value.baseVal;
38475
38476               classes = value.trim().split(/\s+/).filter(function(name) {
38477                   return name.length && !tagClassRe.test(name);
38478               }).join(' ');
38479
38480               var t = tags(entity), i, k, v;
38481
38482               // pick at most one primary classification tag..
38483               for (i = 0; i < primaries.length; i++) {
38484                   k = primaries[i];
38485                   v = t[k];
38486                   if (!v || v === 'no') continue;
38487
38488                   primary = k;
38489                   if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
38490                       status = v;
38491                       classes += ' tag-' + k;
38492                   } else {
38493                       classes += ' tag-' + k + ' tag-' + k + '-' + v;
38494                   }
38495
38496                   break;
38497               }
38498
38499               // add at most one status tag, only if relates to primary tag..
38500               if (!status) {
38501                   for (i = 0; i < statuses.length; i++) {
38502                       k = statuses[i];
38503                       v = t[k];
38504                       if (!v || v === 'no') continue;
38505
38506                       if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
38507                           status = k;
38508                       }
38509                       else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
38510                           status = k;
38511                       } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
38512                           status = k;
38513                           primary = v;
38514                           classes += ' tag-' + v;
38515                       }  // else ignore e.g.  `highway=path + abandoned=railway`
38516
38517                       if (status) break;
38518                   }
38519               }
38520
38521               if (status) {
38522                   classes += ' tag-status tag-status-' + status;
38523               }
38524
38525               // add any secondary (structure) tags
38526               for (i = 0; i < secondaries.length; i++) {
38527                   k = secondaries[i];
38528                   v = t[k];
38529                   if (!v || v === 'no') continue;
38530                   classes += ' tag-' + k + ' tag-' + k + '-' + v;
38531               }
38532
38533               // For highways, look for surface tagging..
38534               if (primary === 'highway') {
38535                   var paved = (t.highway !== 'track');
38536                   for (k in t) {
38537                       v = t[k];
38538                       if (k in osmPavedTags) {
38539                           paved = !!osmPavedTags[k][v];
38540                           break;
38541                       }
38542                   }
38543                   if (!paved) {
38544                       classes += ' tag-unpaved';
38545                   }
38546               }
38547
38548               classes = classes.trim();
38549
38550               if (classes !== value) {
38551                   select(this).attr('class', classes);
38552               }
38553           });
38554       };
38555
38556
38557       tagClasses.tags = function(_) {
38558           if (!arguments.length) return tags;
38559           tags = _;
38560           return tagClasses;
38561       };
38562
38563       return tagClasses;
38564   }
38565
38566   function svgTurns(projection) {
38567
38568       return function drawTurns(selection, graph, turns) {
38569
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;
38575           }
38576
38577           var layer = selection.selectAll('.data-layer-osm').selectAll('.layer-turns')
38578               .data([0]);
38579
38580           layer = layer.enter()
38581               .append('g')
38582               .attr('class', 'layer-osm layer-turns')
38583               .merge(layer);
38584
38585
38586           var groups = layer.selectAll('g.turn')
38587               .data(turns, function(d) { return d.key; });
38588
38589           groups.exit()
38590               .remove();
38591
38592
38593           var enter = groups.enter()
38594               .append('g')
38595               .attr('class', function(d) { return 'turn ' + d.key; });
38596
38597           var nEnter = enter
38598               .filter(function(d) { return !d.u; });
38599
38600           nEnter.append('rect')
38601               .attr('transform', 'translate(-22, -12)')
38602               .attr('width', '44')
38603               .attr('height', '24');
38604
38605           nEnter.append('use')
38606               .attr('transform', 'translate(-22, -12)')
38607               .attr('width', '44')
38608               .attr('height', '24');
38609
38610
38611           var uEnter = enter
38612               .filter(function(d) { return d.u; });
38613
38614           uEnter.append('circle')
38615               .attr('r', '16');
38616
38617           uEnter.append('use')
38618               .attr('transform', 'translate(-16, -16)')
38619               .attr('width', '32')
38620               .attr('height', '32');
38621
38622
38623           groups = groups
38624               .merge(enter);
38625
38626           groups
38627               .attr('opacity', function(d) {
38628                   return d.direct === false ? '0.7' : null;
38629               })
38630               .attr('transform', function(d) {
38631                   var pxRadius = 50;
38632                   var toWay = graph.entity(d.to.way);
38633                   var toPoints = graph.childNodes(toWay)
38634                       .map(function (n) { return n.loc; })
38635                       .map(projection);
38636                   var toLength = geoPathLength(toPoints);
38637                   var mid = toLength / 2;    // midpoint of destination way
38638
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
38646
38647                   return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
38648                       'rotate(' + a * 180 / Math.PI + ')';
38649               });
38650
38651           groups.select('use')
38652               .attr('xlink:href', icon);
38653
38654           groups.select('rect');
38655           groups.select('circle');
38656
38657           return this;
38658       };
38659   }
38660
38661   function svgVertices$$1(projection, context) {
38662       var radiuses = {
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]
38667       };
38668
38669       var _currHoverTarget;
38670       var _currPersistent = {};
38671       var _currHover = {};
38672       var _prevHover = {};
38673       var _currSelected = {};
38674       var _prevSelected = {};
38675       var _radii = {};
38676
38677
38678       function sortY(a, b) {
38679           return b.loc[1] - a.loc[1];
38680       }
38681
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);
38688       }
38689
38690
38691       function draw(selection$$1, graph, vertices, sets, filter) {
38692           sets = sets || { selected: {}, important: {}, hovered: {} };
38693
38694           var icons = {};
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);
38699
38700
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];
38705
38706               icons[entity.id] =
38707                   entity.hasInterestingTags() &&
38708                   context.presets().match(entity, graph).icon;
38709               return icons[entity.id];
38710           }
38711
38712
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];
38716
38717               var angles = entity.directions(graph, projection);
38718               directions[entity.id] = angles.length ? angles : false;
38719               return angles;
38720           }
38721
38722
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];
38730
38731                           // slightly increase the size of unconnected endpoints #3775
38732                           if (entity.isEndpoint(graph) && !entity.isConnected(graph)) {
38733                               r += 1.5;
38734                           }
38735
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
38738                           }
38739
38740                           select(this)
38741                               .attr('r', r)
38742                               .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
38743                       });
38744               });
38745           }
38746
38747           vertices.sort(sortY);
38748
38749           var groups = selection$$1.selectAll('g.vertex')
38750               .filter(filter)
38751               .data(vertices, fastEntityKey);
38752
38753           // exit
38754           groups.exit()
38755               .remove();
38756
38757           // enter
38758           var enter = groups.enter()
38759               .append('g')
38760               .attr('class', function(d) { return 'node vertex ' + d.id; })
38761               .order();
38762
38763           enter
38764               .append('circle')
38765               .attr('class', 'shadow');
38766
38767           enter
38768               .append('circle')
38769               .attr('class', 'stroke');
38770
38771           // Vertices with tags get a fill.
38772           enter.filter(function(d) { return d.hasInterestingTags(); })
38773               .append('circle')
38774               .attr('class', 'fill');
38775
38776           // update
38777           groups = groups
38778               .merge(enter)
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);
38784
38785
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);
38790
38791           // exit
38792           iconUse.exit()
38793               .remove();
38794
38795           // enter
38796           iconUse.enter()
38797               .append('use')
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' : '');
38806               });
38807
38808
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);
38813
38814           // exit
38815           dgroups.exit()
38816               .remove();
38817
38818           // enter/update
38819           dgroups = dgroups.enter()
38820               .insert('g', '.shadow')
38821               .attr('class', 'viewfieldgroup')
38822               .merge(dgroups);
38823
38824           var viewfields = dgroups.selectAll('.viewfield')
38825               .data(getDirections, function key(d) { return osmEntity$$1.key(d); });
38826
38827           // exit
38828           viewfields.exit()
38829               .remove();
38830
38831           // enter/update
38832           viewfields.enter()
38833               .append('path')
38834               .attr('class', 'viewfield')
38835               .attr('d', 'M0,0H0')
38836               .merge(viewfields)
38837               .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
38838               .attr('transform', function(d) { return 'rotate(' + d + ')'; });
38839       }
38840
38841
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: [] };
38848
38849           entities.forEach(function(node) {
38850               if (activeID === node.id) return;   // draw no target on the activeID
38851
38852               var vertexType = svgPassiveVertex(node, graph, activeID);
38853               if (vertexType !== 0) {     // passive or adjacent - allow to connect
38854                   data.targets.push({
38855                       type: 'Feature',
38856                       id: node.id,
38857                       properties: {
38858                           target: true,
38859                           entity: node
38860                       },
38861                       geometry: node.asGeoJSON()
38862                   });
38863               } else {
38864                   data.nopes.push({
38865                       type: 'Feature',
38866                       id: node.id + '-nope',
38867                       properties: {
38868                           nope: true,
38869                           target: true,
38870                           entity: node
38871                       },
38872                       geometry: node.asGeoJSON()
38873                   });
38874               }
38875           });
38876
38877
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; });
38882
38883           // exit
38884           targets.exit()
38885               .remove();
38886
38887           // enter/update
38888           targets.enter()
38889               .append('circle')
38890               .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
38891               .merge(targets)
38892               .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
38893               .attr('transform', getTransform);
38894
38895
38896           // NOPE
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; });
38900
38901           // exit
38902           nopes.exit()
38903               .remove();
38904
38905           // enter/update
38906           nopes.enter()
38907               .append('circle')
38908               .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
38909               .merge(nopes)
38910               .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
38911               .attr('transform', getTransform);
38912       }
38913
38914
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)
38922           ));
38923       }
38924
38925
38926       function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
38927           var results = {};
38928
38929           function addChildVertices(entity) {
38930               var geometry = entity.geometry(graph);
38931               if (!context.features().isHiddenFeature(entity, graph, geometry)) {
38932                   var i;
38933                   if (entity.type === 'way') {
38934                       for (i = 0; i < entity.nodes.length; i++) {
38935                           var child = graph.hasEntity(entity.nodes[i]);
38936                           if (child) {
38937                               addChildVertices(child);
38938                           }
38939                       }
38940                   } else if (entity.type === 'relation') {
38941                       for (i = 0; i < entity.members.length; i++) {
38942                           var member = graph.hasEntity(entity.members[i].id);
38943                           if (member) {
38944                               addChildVertices(member);
38945                           }
38946                       }
38947                   } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
38948                       results[entity.id] = entity;
38949                   }
38950               }
38951           }
38952
38953           ids.forEach(function(id) {
38954               var entity = graph.hasEntity(id);
38955               if (!entity) return;
38956
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);
38962                       });
38963                   }
38964               } else {  // way, relation
38965                   addChildVertices(entity);
38966               }
38967           });
38968
38969           return results;
38970       }
38971
38972
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);
38978
38979           if (fullRedraw) {
38980               _currPersistent = {};
38981               _radii = {};
38982           }
38983
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);
38989               var keep = false;
38990
38991               // a point that looks like a vertex..
38992               if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
38993                   _currPersistent[entity.id] = entity;
38994                   keep = true;
38995
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;
39000                   keep = true;
39001               }
39002
39003               // whatever this is, it's not a persistent vertex..
39004               if (!keep && !fullRedraw) {
39005                   delete _currPersistent[entity.id];
39006               }
39007           }
39008
39009           // 3 sets of vertices to consider:
39010           var sets = {
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)
39014           };
39015
39016           var all = assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
39017
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);
39023           };
39024           selection$$1.selectAll('.layer-points .layer-points-vertices')
39025               .call(draw, graph, currentVisible(all), sets, filterRendered);
39026
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);
39031           };
39032           selection$$1.selectAll('.layer-points .layer-points-targets')
39033               .call(drawTargets, graph, currentVisible(all), filterTouch);
39034
39035
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); });
39040           }
39041       }
39042
39043
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());
39048
39049           _prevSelected = _currSelected || {};
39050           _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
39051
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);
39055       };
39056
39057
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
39061
39062           var wireframe = context.surface().classed('fill-wireframe');
39063           var zoom = geoScaleToZoom(projection.scale());
39064
39065           _prevHover = _currHover || {};
39066           _currHoverTarget = target;
39067           var entity = target && target.properties && target.properties.entity;
39068
39069           if (entity) {
39070               _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
39071           } else {
39072               _currHover = {};
39073           }
39074
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);
39078       };
39079
39080       return drawVertices;
39081   }
39082
39083   /* global Mapillary:false */
39084
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;
39090   var tileZoom = 14;
39091   var dispatch$1 = dispatch('loadedImages', 'loadedSigns');
39092   var _mlyFallback = false;
39093   var _mlyCache;
39094   var _mlyClicks;
39095   var _mlySelectedImage;
39096   var _mlyViewer;
39097
39098
39099   function abortRequest(i) {
39100       i.abort();
39101   }
39102
39103
39104   function nearNullIsland(x, y, z) {
39105       if (z >= 7) {
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;
39111       }
39112       return false;
39113   }
39114
39115
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;
39123   }
39124
39125
39126   function localeTimestamp(s) {
39127       if (!s) return null;
39128       var detected = utilDetect();
39129       var options = {
39130           day: 'numeric', month: 'short', year: 'numeric',
39131           hour: 'numeric', minute: 'numeric', second: 'numeric',
39132           timeZone: 'UTC'
39133       };
39134       var d = new Date(s);
39135       if (isNaN(d.getTime())) return null;
39136       return d.toLocaleString(detected.locale, options);
39137   }
39138
39139
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);
39144       var origin = [
39145           s / 2 - projection.translate()[0],
39146           s / 2 - projection.translate()[1]
39147       ];
39148
39149       return d3geoTile()
39150           .scaleExtent([tileZoom, tileZoom])
39151           .scale(s)
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];
39157
39158               return {
39159                   id: tile.toString(),
39160                   xyz: tile,
39161                   extent: geoExtent$$1(
39162                       projection.invert([x, y + ts]),
39163                       projection.invert([x + ts, y])
39164                   )
39165               };
39166           });
39167   }
39168
39169
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));
39173
39174       var tiles = getTiles(projection).filter(function(t) {
39175           return !nearNullIsland(t.xyz[0], t.xyz[1], t.xyz[2]);
39176       });
39177
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];
39181           return !wanted;
39182       }).map(abortRequest);
39183
39184       tiles.forEach(function(tile) {
39185           loadNextTilePage(which, currZoom, url, tile);
39186       });
39187   }
39188
39189
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 +
39196           utilQsString({
39197               per_page: maxResults,
39198               page: nextPage,
39199               client_id: clientId,
39200               bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
39201           });
39202
39203       if (nextPage > maxPages) return;
39204
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');
39211               if (linkHeader) {
39212                   var pagination = parsePagination(xhr.getResponseHeader('Link'));
39213                   if (pagination.next) {
39214                       cache.nextURL[tile.id] = pagination.next;
39215                   }
39216               }
39217               return JSON.parse(xhr.responseText);
39218           })
39219           .get(function(err, data) {
39220               cache.loaded[id] = true;
39221               delete cache.inflight[id];
39222               if (err || !data.features || !data.features.length) return;
39223
39224               var features = data.features.map(function(feature) {
39225                   var loc = feature.geometry.coordinates;
39226                   var d;
39227
39228                   if (which === 'images') {
39229                       d = {
39230                           loc: loc,
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
39236                       };
39237                       cache.forImageKey[d.key] = d;     // cache imageKey -> image
39238
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
39244                       });
39245                       return false;  // because no `d` data worth loading into an rbush
39246
39247                   } else if (which === 'objects') {
39248                       d = {
39249                           loc: loc,
39250                           key: feature.properties.key,
39251                           value: feature.properties.value,
39252                           package: feature.properties.package,
39253                           detections: feature.properties.detections
39254                       };
39255
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] = {};
39262                           }
39263                           if (!_mlyCache.detections[imageKey][detectionKey]) {
39264                               _mlyCache.detections[imageKey][detectionKey] = {};
39265                           }
39266                       });
39267                   }
39268
39269                   return {
39270                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
39271                   };
39272
39273               }).filter(Boolean);
39274
39275               cache.rtree.load(features);
39276
39277               if (which === 'images' || which === 'sequences') {
39278                   dispatch$1.call('loadedImages');
39279               } else if (which === 'objects') {
39280                   dispatch$1.call('loadedSigns');
39281               }
39282
39283               if (data.features.length === maxResults) {  // more pages to load
39284                   cache.nextPage[tile.id] = nextPage + 1;
39285                   loadNextTilePage(which, currZoom, url, tile);
39286               } else {
39287                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
39288               }
39289           });
39290   }
39291
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) {
39297               return [
39298                   /<(.+)>/.exec(elements[0])[1],
39299                   /rel="(.+)"/.exec(elements[1])[1]
39300               ];
39301           } else {
39302               return ['',''];
39303           }
39304       }).reduce(function(pagination, val) {
39305           pagination[val[1]] = val[0];
39306           return pagination;
39307       }, {});
39308   }
39309
39310
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 = [];
39318
39319       rows.forEach(function(y) {
39320           cols.forEach(function(x) {
39321               var min$$1 = [x, y + psize];
39322               var max$$1 = [x + psize, y];
39323               partitions.push(
39324                   geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
39325           });
39326       });
39327
39328       return partitions;
39329   }
39330
39331
39332   // no more than `limit` results per partition.
39333   function searchLimited(psize, limit, projection, rtree) {
39334       limit = limit || 3;
39335
39336       var partitions = partitionViewport(psize, projection);
39337       var results;
39338
39339       // console.time('previous');
39340       results =  flatten(map$3(partitions, function(extent$$1) {
39341           return rtree.search(extent$$1.bbox())
39342               .slice(0, limit)
39343               .map(function(d) { return d.data; });
39344       }));
39345       // console.timeEnd('previous');
39346
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);
39354       //         })
39355       //         .slice(0, limit);
39356
39357       //     return (found.length ? result.concat(found) : result);
39358       // }, []);
39359       // console.timeEnd('new');
39360
39361       return results;
39362   }
39363
39364
39365
39366   var serviceMapillary = {
39367
39368       init: function() {
39369           if (!_mlyCache) {
39370               this.reset();
39371           }
39372
39373           this.event = utilRebind(this, dispatch$1, 'on');
39374       },
39375
39376       reset: function() {
39377           var cache = _mlyCache;
39378
39379           if (cache) {
39380               if (cache.images && cache.images.inflight) {
39381                   forEach(cache.images.inflight, abortRequest);
39382               }
39383               if (cache.objects && cache.objects.inflight) {
39384                   forEach(cache.objects.inflight, abortRequest);
39385               }
39386               if (cache.sequences && cache.sequences.inflight) {
39387                   forEach(cache.sequences.inflight, abortRequest);
39388               }
39389           }
39390
39391           _mlyCache = {
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: {} },
39395               detections: {}
39396           };
39397
39398           _mlySelectedImage = null;
39399           _mlyClicks = [];
39400       },
39401
39402
39403       images: function(projection) {
39404           var psize = 16, limit = 3;
39405           return searchLimited(psize, limit, projection, _mlyCache.images.rtree);
39406       },
39407
39408
39409       signs: function(projection) {
39410           var psize = 32, limit = 3;
39411           return searchLimited(psize, limit, projection, _mlyCache.objects.rtree);
39412       },
39413
39414
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 = {};
39421
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];
39426                   if (sequenceKey) {
39427                       sequenceKeys[sequenceKey] = true;
39428                   }
39429               });
39430
39431           // Return lineStrings for the sequences
39432           return Object.keys(sequenceKeys).map(function(sequenceKey) {
39433               return _mlyCache.sequences.lineString[sequenceKey];
39434           });
39435       },
39436
39437
39438       signsSupported: function() {
39439           return true;
39440       },
39441
39442
39443       loadImages: function(projection) {
39444           loadTiles('images', apibase + 'images?', projection);
39445           loadTiles('sequences', apibase + 'sequences?', projection);
39446       },
39447
39448
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);
39453       },
39454
39455
39456       loadViewer: function(context) {
39457           // add mly-wrapper
39458           var wrap = select('#photoviewer').selectAll('.mly-wrapper')
39459               .data([0]);
39460
39461           var wrapEnter = wrap.enter()
39462               .append('div')
39463               .attr('id', 'mly')
39464               .attr('class', 'photo-wrapper mly-wrapper')
39465               .classed('hide', true);
39466
39467           wrapEnter
39468               .append('div')
39469               .attr('class', 'photo-attribution fillD');
39470
39471
39472           // load mapillary-viewercss
39473           select('head').selectAll('#mapillary-viewercss')
39474               .data([0])
39475               .enter()
39476               .append('link')
39477               .attr('id', 'mapillary-viewercss')
39478               .attr('rel', 'stylesheet')
39479               .attr('href', context.asset(viewercss));
39480
39481           // load mapillary-viewerjs
39482           select('head').selectAll('#mapillary-viewerjs')
39483               .data([0])
39484               .enter()
39485               .append('script')
39486               .attr('id', 'mapillary-viewerjs')
39487               .attr('src', context.asset(viewerjs));
39488
39489           // load mapillary signs sprite
39490           var defs = context.container().select('defs');
39491           defs.call(svgDefs(context).addSprites, ['mapillary-sprite']);
39492       },
39493
39494
39495       showViewer: function() {
39496           var wrap = select('#photoviewer')
39497               .classed('hide', false);
39498
39499           var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
39500
39501           if (isHidden) {
39502               wrap
39503                   .selectAll('.photo-wrapper:not(.mly-wrapper)')
39504                   .classed('hide', true);
39505
39506               wrap
39507                   .selectAll('.photo-wrapper.mly-wrapper')
39508                   .classed('hide', false);
39509
39510               _mlyViewer.resize();
39511           }
39512
39513           return this;
39514       },
39515
39516
39517       hideViewer: function() {
39518           _mlySelectedImage = null;
39519
39520           if (!_mlyFallback && _mlyViewer) {
39521               _mlyViewer.getComponent('sequence').stop();
39522           }
39523
39524           var viewer = select('#photoviewer');
39525           if (!viewer.empty()) viewer.datum(null);
39526
39527           viewer
39528               .classed('hide', true)
39529               .selectAll('.photo-wrapper')
39530               .classed('hide', true);
39531
39532           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
39533               .classed('selected', false);
39534
39535           return this.setStyles(null, true);
39536       },
39537
39538
39539       parsePagination: parsePagination,
39540
39541
39542       updateViewer: function(imageKey, context) {
39543           if (!imageKey) return this;
39544
39545           if (!_mlyViewer) {
39546               this.initViewer(imageKey, context);
39547           } else {
39548               _mlyViewer.moveToKey(imageKey)
39549                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
39550           }
39551
39552           return this;
39553       },
39554
39555
39556       initViewer: function(imageKey, context) {
39557           var that = this;
39558           if (Mapillary && imageKey) {
39559               var opts = {
39560                   baseImageSize: 320,
39561                   component: {
39562                       cover: false,
39563                       keyboard: false,
39564                       tag: true
39565                   }
39566               };
39567
39568               // Disable components requiring WebGL support
39569               if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
39570                   _mlyFallback = true;
39571                   opts.component = {
39572                       cover: false,
39573                       direction: false,
39574                       imagePlane: false,
39575                       keyboard: false,
39576                       mouse: false,
39577                       sequence: false,
39578                       tag: false,
39579                       image: true,        // fallback
39580                       navigation: true    // fallback
39581                   };
39582               }
39583
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
39588           }
39589
39590           // nodeChanged: called after the viewer has changed images and is ready.
39591           //
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.
39595           //
39596           // Clicks are added to the array in `selectedImage` and removed here.
39597           //
39598           function nodeChanged(node) {
39599               if (!_mlyFallback) {
39600                   _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
39601               }
39602
39603               var clicks = _mlyClicks;
39604               var index = clicks.indexOf(node.key);
39605               var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
39606
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);
39613                   }
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);
39618               }
39619           }
39620       },
39621
39622
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];
39634           }
39635
39636           _mlySelectedImage = d;
39637           var viewer = select('#photoviewer');
39638           if (!viewer.empty()) viewer.datum(d);
39639
39640           imageKey = (d && d.key) || imageKey;
39641           if (!fromViewer && imageKey) {
39642               _mlyClicks.push(imageKey);
39643           }
39644
39645           this.setStyles(null, true);
39646
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;
39651                   });
39652               });
39653
39654           var wrap = select('#photoviewer .mly-wrapper');
39655           var attribution = wrap.selectAll('.photo-attribution').html('');
39656
39657           if (d) {
39658               if (d.captured_by) {
39659                   attribution
39660                       .append('a')
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);
39665
39666                   attribution
39667                       .append('span')
39668                       .text('|');
39669               }
39670
39671               if (d.captured_at) {
39672                   attribution
39673                       .append('span')
39674                       .attr('class', 'captured_at')
39675                       .text(localeTimestamp(d.captured_at));
39676
39677                   attribution
39678                       .append('span')
39679                       .text('|');
39680               }
39681
39682               attribution
39683                   .append('a')
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');
39689
39690               this.updateDetections(d);
39691           }
39692
39693           return this;
39694       },
39695
39696
39697       getSelectedImage: function() {
39698           return _mlySelectedImage;
39699       },
39700
39701
39702       getSequenceKeyForImage: function(d) {
39703           var imageKey = d && d.key;
39704           return imageKey && _mlyCache.sequences.forImageKey[imageKey];
39705       },
39706
39707
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);
39714
39715               d3_selectAll('.sequence')
39716                   .classed('highlighted', false)
39717                   .classed('selected', false);
39718           }
39719
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) || [];
39724
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) || [];
39731
39732           // highlight sibling viewfields on either the selected or the hovered sequences
39733           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
39734
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; });
39739
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; });
39743
39744           // update viewfields if needed
39745           d3_selectAll('.viewfield-group .viewfield')
39746               .attr('d', viewfieldPath);
39747
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';
39752               } else {
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';
39754               }
39755           }
39756
39757           return this;
39758       },
39759
39760
39761       updateDetections: function(d) {
39762           if (!_mlyViewer || _mlyFallback) return;
39763
39764           var imageKey = d && d.key;
39765           var detections = (imageKey && _mlyCache.detections[imageKey]) || [];
39766
39767           forEach(detections, function(data, k) {
39768               if (isEmpty(data)) {
39769                   loadDetection(k);
39770               } else {
39771                   var tag = makeTag(data);
39772                   if (tag) {
39773                       var tagComponent = _mlyViewer.getComponent('tag');
39774                       tagComponent.add([tag]);
39775                   }
39776               }
39777           });
39778
39779
39780           function loadDetection(detectionKey) {
39781               var url = apibase + 'detections/' +
39782                       detectionKey + '?' + utilQsString({ client_id: clientId });
39783
39784               request(url)
39785                   .mimeType('application/json')
39786                   .response(function(xhr) {
39787                       return JSON.parse(xhr.responseText);
39788                   })
39789                   .get(function(err, data) {
39790                       if (!data || !data.properties) return;
39791
39792                       var imageKey = data.properties.image_key;
39793                       _mlyCache.detections[imageKey][detectionKey] = data;
39794
39795                       var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
39796                       if (imageKey === selectedKey) {
39797                           var tag = makeTag(data);
39798                           if (tag) {
39799                               var tagComponent = _mlyViewer.getComponent('tag');
39800                               tagComponent.add([tag]);
39801                           }
39802                       }
39803                   });
39804           }
39805
39806
39807           function makeTag(data) {
39808               var valueParts = data.properties.value.split('--');
39809               if (valueParts.length !== 3) return;
39810
39811               var text = valueParts[1].replace(/-/g, ' ');
39812               var tag;
39813
39814               // Currently only two shapes <Polygon|Point>
39815               if (data.properties.shape.type === 'Polygon') {
39816                   var polygonGeometry = new Mapillary
39817                       .TagComponent
39818                       .PolygonGeometry(data.properties.shape.coordinates[0]);
39819
39820                   tag = new Mapillary.TagComponent.OutlineTag(
39821                       data.properties.key,
39822                       polygonGeometry,
39823                       {
39824                           text: text,
39825                           textColor: 0xffff00,
39826                           lineColor: 0xffff00,
39827                           lineWidth: 2,
39828                           fillColor: 0xffff00,
39829                           fillOpacity: 0.3,
39830                       }
39831                   );
39832
39833               } else if (data.properties.shape.type === 'Point') {
39834                   var pointGeometry = new Mapillary
39835                       .TagComponent
39836                       .PointGeometry(data.properties.shape.coordinates[0]);
39837
39838                   tag = new Mapillary.TagComponent.SpotTag(
39839                       data.properties.key,
39840                       pointGeometry,
39841                       {
39842                           text: text,
39843                           color: 0xffff00,
39844                           textColor: 0xffff00
39845                       }
39846                   );
39847               }
39848
39849               return tag;
39850           }
39851       },
39852
39853
39854       cache: function() {
39855           return _mlyCache;
39856       }
39857
39858   };
39859
39860   var apibase$1 = 'https://nominatim.openstreetmap.org/',
39861       inflight = {},
39862       nominatimCache;
39863
39864
39865   var serviceNominatim = {
39866
39867       init: function() {
39868           inflight = {};
39869           nominatimCache = rbush_1();
39870       },
39871
39872       reset: function() {
39873           forEach(inflight, function(req) { req.abort(); });
39874           inflight = {};
39875           nominatimCache = rbush_1();
39876       },
39877
39878
39879       countryCode: function (location, callback) {
39880           this.reverse(location, function(err, result) {
39881               if (err) {
39882                   return callback(err);
39883               } else if (result.address) {
39884                   return callback(null, result.address.country_code);
39885               } else {
39886                   return callback('Unable to geocode', null);
39887               }
39888           });
39889       },
39890
39891
39892       reverse: function (location, callback) {
39893           var cached = nominatimCache.search(
39894               { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
39895           );
39896
39897           if (cached.length > 0) {
39898               return callback(null, cached[0].data);
39899           }
39900
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;
39904
39905           inflight[url] = d3_json(url, function(err, result) {
39906               delete inflight[url];
39907
39908               if (err) {
39909                   return callback(err);
39910               } else if (result && result.error) {
39911                   return callback(result.error);
39912               }
39913
39914               var extent = geoExtent$$1(location).padByMeters(200);
39915               nominatimCache.insert(assign(extent.bbox(), {data: result}));
39916
39917               callback(null, result);
39918           });
39919       },
39920
39921
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;
39926
39927           inflight[url] = d3_json(url, function(err, result) {
39928               delete inflight[url];
39929               callback(err, result);
39930           });
39931       }
39932
39933   };
39934
39935   var apibase$2 = 'https://openstreetcam.org',
39936       maxResults$1 = 1000,
39937       tileZoom$1 = 14,
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),
39944       _oscCache,
39945       _oscSelectedImage;
39946
39947
39948   function abortRequest$1(i) {
39949       i.abort();
39950   }
39951
39952
39953   function nearNullIsland$1(x, y, z) {
39954       if (z >= 7) {
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;
39960       }
39961       return false;
39962   }
39963
39964
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;
39972   }
39973
39974
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),
39979           origin = [
39980               s / 2 - projection.translate()[0],
39981               s / 2 - projection.translate()[1]];
39982
39983       return d3geoTile()
39984           .scaleExtent([tileZoom$1, tileZoom$1])
39985           .scale(s)
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];
39991
39992               return {
39993                   id: tile.toString(),
39994                   xyz: tile,
39995                   extent: geoExtent$$1(
39996                       projection.invert([x, y + ts]),
39997                       projection.invert([x + ts, y])
39998                   )
39999               };
40000           });
40001   }
40002
40003
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));
40007
40008       var tiles = getTiles$1(projection).filter(function(t) {
40009               return !nearNullIsland$1(t.xyz[0], t.xyz[1], t.xyz[2]);
40010           });
40011
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];
40015           return !wanted;
40016       }).map(abortRequest$1);
40017
40018       tiles.forEach(function(tile) {
40019           loadNextTilePage$1(which, currZoom, url, tile);
40020       });
40021   }
40022
40023
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({
40030               ipp: maxResults$1,
40031               page: nextPage,
40032               // client_id: clientId,
40033               bbTopLeft: [bbox.maxY, bbox.minX].join(','),
40034               bbBottomRight: [bbox.minY, bbox.maxX].join(',')
40035           }, true);
40036
40037       if (nextPage > maxPages) return;
40038
40039       var id = tile.id + ',' + String(nextPage);
40040       if (cache.loaded[id] || cache.inflight[id]) return;
40041
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;
40050
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);
40058               }
40059
40060               var features = data.currentPageItems.map(function(item) {
40061                   var loc = [+item.lng, +item.lat],
40062                       d;
40063
40064                   if (which === 'images') {
40065                       d = {
40066                           loc: loc,
40067                           key: item.id,
40068                           ca: +item.heading,
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
40074                       };
40075
40076                       // cache sequence info
40077                       var seq = _oscCache.sequences[d.sequence_id];
40078                       if (!seq) {
40079                           seq = { rotation: 0, images: [] };
40080                           _oscCache.sequences[d.sequence_id] = seq;
40081                       }
40082                       seq.images[d.sequence_index] = d;
40083                   }
40084
40085                   return {
40086                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
40087                   };
40088               });
40089
40090               cache.rtree.load(features);
40091
40092               if (which === 'images') {
40093                   dispatch$2.call('loadedImages');
40094               }
40095
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);
40099               } else {
40100                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
40101               }
40102           });
40103   }
40104
40105
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),
40112           partitions = [];
40113
40114       rows.forEach(function(y) {
40115           cols.forEach(function(x) {
40116               var min$$1 = [x, y + psize],
40117                   max$$1 = [x + psize, y];
40118               partitions.push(
40119                   geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
40120           });
40121       });
40122
40123       return partitions;
40124   }
40125
40126
40127   // no more than `limit` results per partition.
40128   function searchLimited$1(psize, limit, projection, rtree) {
40129       limit = limit || 3;
40130
40131       var partitions = partitionViewport$1(psize, projection);
40132       var results;
40133
40134       results = flatten(map$3(partitions, function(extent$$1) {
40135           return rtree.search(extent$$1.bbox())
40136               .slice(0, limit)
40137               .map(function(d) { return d.data; });
40138       }));
40139       return results;
40140   }
40141
40142
40143   function zoomPan() {
40144       var t = event.transform;
40145       select('#photoviewer .osc-image-wrap')
40146           .call(utilSetTransform, t.x, t.y, t.k);
40147   }
40148
40149
40150   var serviceOpenstreetcam = {
40151
40152       init: function() {
40153           if (!_oscCache) {
40154               this.reset();
40155           }
40156
40157           this.event = utilRebind(this, dispatch$2, 'on');
40158       },
40159
40160       reset: function() {
40161           var cache = _oscCache;
40162
40163           if (cache) {
40164               if (cache.images && cache.images.inflight) {
40165                   forEach(cache.images.inflight, abortRequest$1);
40166               }
40167           }
40168
40169           _oscCache = {
40170               images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
40171               sequences: {}
40172           };
40173
40174           _oscSelectedImage = null;
40175       },
40176
40177
40178       images: function(projection) {
40179           var psize = 16, limit = 3;
40180           return searchLimited$1(psize, limit, projection, _oscCache.images.rtree);
40181       },
40182
40183
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 = {};
40190
40191           // all sequences for images in viewport
40192           _oscCache.images.rtree.search(bbox)
40193               .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
40194
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;
40201                   if (images) {
40202                       lineStrings.push({
40203                           type: 'LineString',
40204                           coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
40205                           properties: { key: sequenceKey }
40206                       });
40207                   }
40208               });
40209           return lineStrings;
40210       },
40211
40212
40213       loadImages: function(projection) {
40214           var url = apibase$2 + '/1.0/list/nearby-photos/';
40215           loadTiles$1('images', url, projection);
40216       },
40217
40218
40219       loadViewer: function(context) {
40220           var that = this;
40221
40222           // add osc-wrapper
40223           var wrap = select('#photoviewer').selectAll('.osc-wrapper')
40224               .data([0]);
40225
40226           var wrapEnter = wrap.enter()
40227               .append('div')
40228               .attr('class', 'photo-wrapper osc-wrapper')
40229               .classed('hide', true)
40230               .call(imgZoom)
40231               .on('dblclick.zoom', null);
40232
40233           wrapEnter
40234               .append('div')
40235               .attr('class', 'photo-attribution fillD');
40236
40237           var controlsEnter = wrapEnter
40238               .append('div')
40239               .attr('class', 'osc-controls-wrap')
40240               .append('div')
40241               .attr('class', 'osc-controls');
40242
40243           controlsEnter
40244               .append('button')
40245               .on('click.back', step(-1))
40246               .text('◄');
40247
40248           controlsEnter
40249               .append('button')
40250               .on('click.rotate-ccw', rotate(-90))
40251               .text('⤿');
40252
40253           controlsEnter
40254               .append('button')
40255               .on('click.rotate-cw', rotate(90))
40256               .text('⤾');
40257
40258           controlsEnter
40259               .append('button')
40260               .on('click.forward', step(1))
40261               .text('►');
40262
40263           wrapEnter
40264               .append('div')
40265               .attr('class', 'osc-image-wrap');
40266
40267
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;
40274
40275                   var r = sequence.rotation || 0;
40276                   r += deg;
40277
40278                   if (r > 180) r -= 360;
40279                   if (r < -180) r += 360;
40280                   sequence.rotation = r;
40281
40282                   var wrap = select('#photoviewer .osc-wrapper');
40283
40284                   wrap
40285                       .transition()
40286                       .duration(100)
40287                       .call(imgZoom.transform, identity$7);
40288
40289                   wrap.selectAll('.osc-image')
40290                       .transition()
40291                       .duration(100)
40292                       .style('transform', 'rotate(' + r + 'deg)');
40293               };
40294           }
40295
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;
40302
40303                   var nextIndex = _oscSelectedImage.sequence_index + stepBy;
40304                   var nextImage = sequence.images[nextIndex];
40305                   if (!nextImage) return;
40306
40307                   context.map().centerEase(nextImage.loc);
40308
40309                   that
40310                       .selectImage(nextImage)
40311                       .updateViewer(nextImage);
40312               };
40313           }
40314       },
40315
40316
40317       showViewer: function() {
40318           var viewer = select('#photoviewer')
40319               .classed('hide', false);
40320
40321           var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
40322
40323           if (isHidden) {
40324               viewer
40325                   .selectAll('.photo-wrapper:not(.osc-wrapper)')
40326                   .classed('hide', true);
40327
40328               viewer
40329                   .selectAll('.photo-wrapper.osc-wrapper')
40330                   .classed('hide', false);
40331           }
40332
40333           return this;
40334       },
40335
40336
40337       hideViewer: function() {
40338           _oscSelectedImage = null;
40339
40340           var viewer = select('#photoviewer');
40341           if (!viewer.empty()) viewer.datum(null);
40342
40343           viewer
40344               .classed('hide', true)
40345               .selectAll('.photo-wrapper')
40346               .classed('hide', true);
40347
40348           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
40349               .classed('selected', false);
40350
40351           return this.setStyles(null, true);
40352       },
40353
40354
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('');
40359
40360           wrap
40361               .transition()
40362               .duration(100)
40363               .call(imgZoom.transform, identity$7);
40364
40365           imageWrap
40366               .selectAll('.osc-image')
40367               .remove();
40368
40369           if (d) {
40370               var sequence = _oscCache.sequences[d.sequence_id];
40371               var r = (sequence && sequence.rotation) || 0;
40372
40373               imageWrap
40374                   .append('img')
40375                   .attr('class', 'osc-image')
40376                   .attr('src', apibase$2 + '/' + d.imagePath)
40377                   .style('transform', 'rotate(' + r + 'deg)');
40378
40379               if (d.captured_by) {
40380                   attribution
40381                       .append('a')
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);
40386
40387                   attribution
40388                       .append('span')
40389                       .text('|');
40390               }
40391
40392               if (d.captured_at) {
40393                   attribution
40394                       .append('span')
40395                       .attr('class', 'captured_at')
40396                       .text(d.captured_at);
40397
40398                   attribution
40399                       .append('span')
40400                       .text('|');
40401               }
40402
40403               attribution
40404                   .append('a')
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');
40409           }
40410           return this;
40411       },
40412
40413
40414       selectImage: function(d) {
40415           _oscSelectedImage = d;
40416           var viewer = select('#photoviewer');
40417           if (!viewer.empty()) viewer.datum(d);
40418
40419           this.setStyles(null, true);
40420
40421           d3_selectAll('.icon-sign')
40422               .classed('selected', false);
40423
40424           return this;
40425       },
40426
40427
40428       getSelectedImage: function() {
40429           return _oscSelectedImage;
40430       },
40431
40432
40433       getSequenceKeyForImage: function(d) {
40434           return d && d.sequence_id;
40435       },
40436
40437
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);
40444
40445               d3_selectAll('.sequence')
40446                   .classed('highlighted', false)
40447                   .classed('selected', false);
40448           }
40449
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; })) || [];
40454
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; })) || [];
40461
40462           // highlight sibling viewfields on either the selected or the hovered sequences
40463           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
40464
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; });
40469
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; });
40473
40474           // update viewfields if needed
40475           d3_selectAll('.viewfield-group .viewfield')
40476               .attr('d', viewfieldPath);
40477
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';
40482               } else {
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';
40484               }
40485           }
40486
40487           return this;
40488       },
40489
40490
40491       cache: function() {
40492           return _oscCache;
40493       }
40494
40495   };
40496
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;
40500
40501   /**
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
40504    * elements.
40505    *
40506    * @static
40507    * @memberOf _
40508    * @since 3.0.0
40509    * @category Array
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.
40514    * @example
40515    *
40516    * _.chunk(['a', 'b', 'c', 'd'], 2);
40517    * // => [['a', 'b'], ['c', 'd']]
40518    *
40519    * _.chunk(['a', 'b', 'c', 'd'], 3);
40520    * // => [['a', 'b', 'c'], ['d']]
40521    */
40522   function chunk(array, size, guard) {
40523     if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
40524       size = 1;
40525     } else {
40526       size = nativeMax$4(toInteger(size), 0);
40527     }
40528     var length = array == null ? 0 : array.length;
40529     if (!length || size < 1) {
40530       return [];
40531     }
40532     var index = 0,
40533         resIndex = 0,
40534         result = Array(nativeCeil(length / size));
40535
40536     while (index < length) {
40537       result[resIndex++] = baseSlice(array, index, (index += size));
40538     }
40539     return result;
40540   }
40541
40542   var hashes = createCommonjsModule(function (module, exports) {
40543   /**
40544    * jshashes - https://github.com/h2non/jshashes
40545    * Released under the "New BSD" license
40546    *
40547    * Algorithms specification:
40548    *
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
40555    */
40556   (function() {
40557     var Hashes;
40558
40559     function utf8Encode(str) {
40560       var x, y, output = '',
40561         i = -1,
40562         l;
40563
40564       if (str && str.length) {
40565         l = 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);
40572             i += 1;
40573           }
40574           /* Encode output as utf-8 */
40575           if (x <= 0x7F) {
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));
40589           }
40590         }
40591       }
40592       return output;
40593     }
40594
40595     function utf8Decode(str) {
40596       var i, ac, c1, c2, c3, arr = [],
40597         l;
40598       i = ac = c1 = c2 = c3 = 0;
40599
40600       if (str && str.length) {
40601         l = str.length;
40602         str += '';
40603
40604         while (i < l) {
40605           c1 = str.charCodeAt(i);
40606           ac += 1;
40607           if (c1 < 128) {
40608             arr[ac] = String.fromCharCode(c1);
40609             i += 1;
40610           } else if (c1 > 191 && c1 < 224) {
40611             c2 = str.charCodeAt(i + 1);
40612             arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
40613             i += 2;
40614           } else {
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));
40618             i += 3;
40619           }
40620         }
40621       }
40622       return arr.join('');
40623     }
40624
40625     /**
40626      * Add integers, wrapping at 2^32. This uses 16-bit operations internally
40627      * to work around bugs in some JS interpreters.
40628      */
40629
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);
40634     }
40635
40636     /**
40637      * Bitwise rotate a 32-bit number to the left.
40638      */
40639
40640     function bit_rol(num, cnt) {
40641       return (num << cnt) | (num >>> (32 - cnt));
40642     }
40643
40644     /**
40645      * Convert a raw string to a hex string
40646      */
40647
40648     function rstr2hex(input, hexcase) {
40649       var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
40650         output = '',
40651         x, i = 0,
40652         l = input.length;
40653       for (; i < l; i += 1) {
40654         x = input.charCodeAt(i);
40655         output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
40656       }
40657       return output;
40658     }
40659
40660     /**
40661      * Convert an array of big-endian words to a string
40662      */
40663
40664     function binb2rstr(input) {
40665       var i, l = input.length * 32,
40666         output = '';
40667       for (i = 0; i < l; i += 8) {
40668         output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
40669       }
40670       return output;
40671     }
40672
40673     /**
40674      * Convert an array of little-endian words to a string
40675      */
40676
40677     function binl2rstr(input) {
40678       var i, l = input.length * 32,
40679         output = '';
40680       for (i = 0; i < l; i += 8) {
40681         output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
40682       }
40683       return output;
40684     }
40685
40686     /**
40687      * Convert a raw string to an array of little-endian words
40688      * Characters >255 have their high-byte silently ignored.
40689      */
40690
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) {
40696         output[i] = 0;
40697       }
40698       for (i = 0; i < l; i += 8) {
40699         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
40700       }
40701       return output;
40702     }
40703
40704     /**
40705      * Convert a raw string to an array of big-endian words
40706      * Characters >255 have their high-byte silently ignored.
40707      */
40708
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) {
40714         output[i] = 0;
40715       }
40716       for (i = 0; i < l; i += 8) {
40717         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
40718       }
40719       return output;
40720     }
40721
40722     /**
40723      * Convert a raw string to an arbitrary string encoding
40724      */
40725
40726     function rstr2any(input, encoding) {
40727       var divisor = encoding.length,
40728         remainders = Array(),
40729         i, q, x, ld, quotient, dividend, output, full_length;
40730
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);
40736       }
40737
40738       /**
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.
40743        */
40744       while (dividend.length > 0) {
40745         quotient = Array();
40746         x = 0;
40747         for (i = 0; i < dividend.length; i += 1) {
40748           x = (x << 16) + dividend[i];
40749           q = Math.floor(x / divisor);
40750           x -= q * divisor;
40751           if (quotient.length > 0 || q > 0) {
40752             quotient[quotient.length] = q;
40753           }
40754         }
40755         remainders[remainders.length] = x;
40756         dividend = quotient;
40757       }
40758
40759       /* Convert the remainders to the output string */
40760       output = '';
40761       for (i = remainders.length - 1; i >= 0; i--) {
40762         output += encoding.charAt(remainders[i]);
40763       }
40764
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;
40769       }
40770       return output;
40771     }
40772
40773     /**
40774      * Convert a raw string to a base-64 string
40775      */
40776
40777     function rstr2b64(input, b64pad) {
40778       var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
40779         output = '',
40780         len = input.length,
40781         i, j, triplet;
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) {
40787             output += b64pad;
40788           } else {
40789             output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
40790           }
40791         }
40792       }
40793       return output;
40794     }
40795
40796     Hashes = {
40797       /**
40798        * @property {String} version
40799        * @readonly
40800        */
40801       VERSION: '1.0.6',
40802       /**
40803        * @member Hashes
40804        * @class Base64
40805        * @constructor
40806        */
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
40812
40813         // public method for encoding
40814         this.encode = function(input) {
40815           var i, j, triplet,
40816             output = '',
40817             len = input.length;
40818
40819           pad = pad || '=';
40820           input = (utf8) ? utf8Encode(input) : input;
40821
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) {
40826                 output += pad;
40827               } else {
40828                 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
40829               }
40830             }
40831           }
40832           return output;
40833         };
40834
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,
40839             dec = '',
40840             arr = [];
40841           if (!input) {
40842             return input;
40843           }
40844
40845           i = ac = 0;
40846           input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
40847           //input += '';
40848
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));
40854
40855             bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
40856
40857             o1 = bits >> 16 & 0xff;
40858             o2 = bits >> 8 & 0xff;
40859             o3 = bits & 0xff;
40860             ac += 1;
40861
40862             if (h3 === 64) {
40863               arr[ac] = String.fromCharCode(o1);
40864             } else if (h4 === 64) {
40865               arr[ac] = String.fromCharCode(o1, o2);
40866             } else {
40867               arr[ac] = String.fromCharCode(o1, o2, o3);
40868             }
40869           } while (i < input.length);
40870
40871           dec = arr.join('');
40872           dec = (utf8) ? utf8Decode(dec) : dec;
40873
40874           return dec;
40875         };
40876
40877         // set custom pad string
40878         this.setPad = function(str) {
40879           pad = str || pad;
40880           return this;
40881         };
40882         // set custom tab string characters
40883         this.setTab = function(str) {
40884           tab = str || tab;
40885           return this;
40886         };
40887         this.setUTF8 = function(bool) {
40888           if (typeof bool === 'boolean') {
40889             utf8 = bool;
40890           }
40891           return this;
40892         };
40893       },
40894
40895       /**
40896        * CRC-32 calculation
40897        * @member Hashes
40898        * @method CRC32
40899        * @static
40900        * @param {String} str Input String
40901        * @return {String}
40902        */
40903       CRC32: function(str) {
40904         var crc = 0,
40905           x = 0,
40906           y = 0,
40907           table, i, iTop;
40908         str = utf8Encode(str);
40909
40910         table = [
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'
40937         ].join('');
40938
40939         crc = crc ^ (-1);
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;
40944         }
40945         // always return a positive number (that's what >>> 0 does)
40946         return (crc ^ (-1)) >>> 0;
40947       },
40948       /**
40949        * @member Hashes
40950        * @class MD5
40951        * @constructor
40952        * @param {Object} [config]
40953        *
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.
40959        */
40960       MD5: function(options) {
40961         /**
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}
40965          */
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
40969
40970         // privileged (public) methods
40971         this.hex = function(s) {
40972           return rstr2hex(rstr(s, utf8), hexcase);
40973         };
40974         this.b64 = function(s) {
40975           return rstr2b64(rstr(s), b64pad);
40976         };
40977         this.any = function(s, e) {
40978           return rstr2any(rstr(s, utf8), e);
40979         };
40980         this.raw = function(s) {
40981           return rstr(s, utf8);
40982         };
40983         this.hex_hmac = function(k, d) {
40984           return rstr2hex(rstr_hmac(k, d), hexcase);
40985         };
40986         this.b64_hmac = function(k, d) {
40987           return rstr2b64(rstr_hmac(k, d), b64pad);
40988         };
40989         this.any_hmac = function(k, d, e) {
40990           return rstr2any(rstr_hmac(k, d), e);
40991         };
40992         /**
40993          * Perform a simple self-test to see if the VM is working
40994          * @return {String} Hexadecimal hash sample
40995          */
40996         this.vm_test = function() {
40997           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
40998         };
40999         /**
41000          * Enable/disable uppercase hexadecimal returned string
41001          * @param {Boolean}
41002          * @return {Object} this
41003          */
41004         this.setUpperCase = function(a) {
41005           if (typeof a === 'boolean') {
41006             hexcase = a;
41007           }
41008           return this;
41009         };
41010         /**
41011          * Defines a base64 pad string
41012          * @param {String} Pad
41013          * @return {Object} this
41014          */
41015         this.setPad = function(a) {
41016           b64pad = a || b64pad;
41017           return this;
41018         };
41019         /**
41020          * Defines a base64 pad string
41021          * @param {Boolean}
41022          * @return {Object} [this]
41023          */
41024         this.setUTF8 = function(a) {
41025           if (typeof a === 'boolean') {
41026             utf8 = a;
41027           }
41028           return this;
41029         };
41030
41031         // private methods
41032
41033         /**
41034          * Calculate the MD5 of a raw string
41035          */
41036
41037         function rstr(s) {
41038           s = (utf8) ? utf8Encode(s) : s;
41039           return binl2rstr(binl(rstr2binl(s), s.length * 8));
41040         }
41041
41042         /**
41043          * Calculate the HMAC-MD5, of a key and some data (raw strings)
41044          */
41045
41046         function rstr_hmac(key, data) {
41047           var bkey, ipad, opad, hash, i;
41048
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);
41054           }
41055
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;
41060           }
41061           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
41062           return binl2rstr(binl(opad.concat(hash), 512 + 128));
41063         }
41064
41065         /**
41066          * Calculate the MD5 of an array of little-endian words, and a bit length.
41067          */
41068
41069         function binl(x, len) {
41070           var i, olda, oldb, oldc, oldd,
41071             a = 1732584193,
41072             b = -271733879,
41073             c = -1732584194,
41074             d = 271733878;
41075
41076           /* append padding */
41077           x[len >> 5] |= 0x80 << ((len) % 32);
41078           x[(((len + 64) >>> 9) << 4) + 14] = len;
41079
41080           for (i = 0; i < x.length; i += 16) {
41081             olda = a;
41082             oldb = b;
41083             oldc = c;
41084             oldd = d;
41085
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);
41102
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);
41119
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);
41136
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);
41153
41154             a = safe_add(a, olda);
41155             b = safe_add(b, oldb);
41156             c = safe_add(c, oldc);
41157             d = safe_add(d, oldd);
41158           }
41159           return Array(a, b, c, d);
41160         }
41161
41162         /**
41163          * These functions implement the four basic operations the algorithm uses.
41164          */
41165
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);
41168         }
41169
41170         function md5_ff(a, b, c, d, x, s, t) {
41171           return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
41172         }
41173
41174         function md5_gg(a, b, c, d, x, s, t) {
41175           return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
41176         }
41177
41178         function md5_hh(a, b, c, d, x, s, t) {
41179           return md5_cmn(b ^ c ^ d, a, b, x, s, t);
41180         }
41181
41182         function md5_ii(a, b, c, d, x, s, t) {
41183           return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
41184         }
41185       },
41186       /**
41187        * @member Hashes
41188        * @class Hashes.SHA1
41189        * @param {Object} [config]
41190        * @constructor
41191        *
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.
41196        */
41197       SHA1: function(options) {
41198         /**
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}
41202          */
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
41206
41207         // public methods
41208         this.hex = function(s) {
41209           return rstr2hex(rstr(s, utf8), hexcase);
41210         };
41211         this.b64 = function(s) {
41212           return rstr2b64(rstr(s, utf8), b64pad);
41213         };
41214         this.any = function(s, e) {
41215           return rstr2any(rstr(s, utf8), e);
41216         };
41217         this.raw = function(s) {
41218           return rstr(s, utf8);
41219         };
41220         this.hex_hmac = function(k, d) {
41221           return rstr2hex(rstr_hmac(k, d));
41222         };
41223         this.b64_hmac = function(k, d) {
41224           return rstr2b64(rstr_hmac(k, d), b64pad);
41225         };
41226         this.any_hmac = function(k, d, e) {
41227           return rstr2any(rstr_hmac(k, d), e);
41228         };
41229         /**
41230          * Perform a simple self-test to see if the VM is working
41231          * @return {String} Hexadecimal hash sample
41232          * @public
41233          */
41234         this.vm_test = function() {
41235           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
41236         };
41237         /**
41238          * @description Enable/disable uppercase hexadecimal returned string
41239          * @param {boolean}
41240          * @return {Object} this
41241          * @public
41242          */
41243         this.setUpperCase = function(a) {
41244           if (typeof a === 'boolean') {
41245             hexcase = a;
41246           }
41247           return this;
41248         };
41249         /**
41250          * @description Defines a base64 pad string
41251          * @param {string} Pad
41252          * @return {Object} this
41253          * @public
41254          */
41255         this.setPad = function(a) {
41256           b64pad = a || b64pad;
41257           return this;
41258         };
41259         /**
41260          * @description Defines a base64 pad string
41261          * @param {boolean}
41262          * @return {Object} this
41263          * @public
41264          */
41265         this.setUTF8 = function(a) {
41266           if (typeof a === 'boolean') {
41267             utf8 = a;
41268           }
41269           return this;
41270         };
41271
41272         // private methods
41273
41274         /**
41275          * Calculate the SHA-512 of a raw string
41276          */
41277
41278         function rstr(s) {
41279           s = (utf8) ? utf8Encode(s) : s;
41280           return binb2rstr(binb(rstr2binb(s), s.length * 8));
41281         }
41282
41283         /**
41284          * Calculate the HMAC-SHA1 of a key and some data (raw strings)
41285          */
41286
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);
41292
41293           if (bkey.length > 16) {
41294             bkey = binb(bkey, key.length * 8);
41295           }
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;
41300           }
41301           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
41302           return binb2rstr(binb(opad.concat(hash), 512 + 160));
41303         }
41304
41305         /**
41306          * Calculate the SHA-1 of an array of big-endian words, and a bit length
41307          */
41308
41309         function binb(x, len) {
41310           var i, j, t, olda, oldb, oldc, oldd, olde,
41311             w = Array(80),
41312             a = 1732584193,
41313             b = -271733879,
41314             c = -1732584194,
41315             d = 271733878,
41316             e = -1009589776;
41317
41318           /* append padding */
41319           x[len >> 5] |= 0x80 << (24 - len % 32);
41320           x[((len + 64 >> 9) << 4) + 15] = len;
41321
41322           for (i = 0; i < x.length; i += 16) {
41323             olda = a;
41324             oldb = b;
41325             oldc = c;
41326             oldd = d;
41327             olde = e;
41328
41329             for (j = 0; j < 80; j += 1) {
41330               if (j < 16) {
41331                 w[j] = x[i + j];
41332               } else {
41333                 w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
41334               }
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)));
41337               e = d;
41338               d = c;
41339               c = bit_rol(b, 30);
41340               b = a;
41341               a = t;
41342             }
41343
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);
41349           }
41350           return Array(a, b, c, d, e);
41351         }
41352
41353         /**
41354          * Perform the appropriate triplet combination function for the current
41355          * iteration
41356          */
41357
41358         function sha1_ft(t, b, c, d) {
41359           if (t < 20) {
41360             return (b & c) | ((~b) & d);
41361           }
41362           if (t < 40) {
41363             return b ^ c ^ d;
41364           }
41365           if (t < 60) {
41366             return (b & c) | (b & d) | (c & d);
41367           }
41368           return b ^ c ^ d;
41369         }
41370
41371         /**
41372          * Determine the appropriate additive constant for the current iteration
41373          */
41374
41375         function sha1_kt(t) {
41376           return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
41377             (t < 60) ? -1894007588 : -899497514;
41378         }
41379       },
41380       /**
41381        * @class Hashes.SHA256
41382        * @param {config}
41383        *
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/
41389        */
41390       SHA256: function(options) {
41391         /**
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
41396          */
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 */
41402           sha256_K;
41403
41404         /* privileged (public) methods */
41405         this.hex = function(s) {
41406           return rstr2hex(rstr(s, utf8));
41407         };
41408         this.b64 = function(s) {
41409           return rstr2b64(rstr(s, utf8), b64pad);
41410         };
41411         this.any = function(s, e) {
41412           return rstr2any(rstr(s, utf8), e);
41413         };
41414         this.raw = function(s) {
41415           return rstr(s, utf8);
41416         };
41417         this.hex_hmac = function(k, d) {
41418           return rstr2hex(rstr_hmac(k, d));
41419         };
41420         this.b64_hmac = function(k, d) {
41421           return rstr2b64(rstr_hmac(k, d), b64pad);
41422         };
41423         this.any_hmac = function(k, d, e) {
41424           return rstr2any(rstr_hmac(k, d), e);
41425         };
41426         /**
41427          * Perform a simple self-test to see if the VM is working
41428          * @return {String} Hexadecimal hash sample
41429          * @public
41430          */
41431         this.vm_test = function() {
41432           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
41433         };
41434         /**
41435          * Enable/disable uppercase hexadecimal returned string
41436          * @param {boolean}
41437          * @return {Object} this
41438          * @public
41439          */
41440         this.setUpperCase = function(a) {
41441           if (typeof a === 'boolean') {
41442             hexcase = a;
41443           }
41444           return this;
41445         };
41446         /**
41447          * @description Defines a base64 pad string
41448          * @param {string} Pad
41449          * @return {Object} this
41450          * @public
41451          */
41452         this.setPad = function(a) {
41453           b64pad = a || b64pad;
41454           return this;
41455         };
41456         /**
41457          * Defines a base64 pad string
41458          * @param {boolean}
41459          * @return {Object} this
41460          * @public
41461          */
41462         this.setUTF8 = function(a) {
41463           if (typeof a === 'boolean') {
41464             utf8 = a;
41465           }
41466           return this;
41467         };
41468
41469         // private methods
41470
41471         /**
41472          * Calculate the SHA-512 of a raw string
41473          */
41474
41475         function rstr(s, utf8) {
41476           s = (utf8) ? utf8Encode(s) : s;
41477           return binb2rstr(binb(rstr2binb(s), s.length * 8));
41478         }
41479
41480         /**
41481          * Calculate the HMAC-sha256 of a key and some data (raw strings)
41482          */
41483
41484         function rstr_hmac(key, data) {
41485           key = (utf8) ? utf8Encode(key) : key;
41486           data = (utf8) ? utf8Encode(data) : data;
41487           var hash, i = 0,
41488             bkey = rstr2binb(key),
41489             ipad = Array(16),
41490             opad = Array(16);
41491
41492           if (bkey.length > 16) {
41493             bkey = binb(bkey, key.length * 8);
41494           }
41495
41496           for (; i < 16; i += 1) {
41497             ipad[i] = bkey[i] ^ 0x36363636;
41498             opad[i] = bkey[i] ^ 0x5C5C5C5C;
41499           }
41500
41501           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
41502           return binb2rstr(binb(opad.concat(hash), 512 + 256));
41503         }
41504
41505         /*
41506          * Main sha256 function, with its support functions
41507          */
41508
41509         function sha256_S(X, n) {
41510           return (X >>> n) | (X << (32 - n));
41511         }
41512
41513         function sha256_R(X, n) {
41514           return (X >>> n);
41515         }
41516
41517         function sha256_Ch(x, y, z) {
41518           return ((x & y) ^ ((~x) & z));
41519         }
41520
41521         function sha256_Maj(x, y, z) {
41522           return ((x & y) ^ (x & z) ^ (y & z));
41523         }
41524
41525         function sha256_Sigma0256(x) {
41526           return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
41527         }
41528
41529         function sha256_Sigma1256(x) {
41530           return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
41531         }
41532
41533         function sha256_Gamma0256(x) {
41534           return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
41535         }
41536
41537         function sha256_Gamma1256(x) {
41538           return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
41539         }
41540
41541         sha256_K = [
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
41549         ];
41550
41551         function binb(m, l) {
41552           var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
41553             1359893119, -1694144372, 528734635, 1541459225
41554           ];
41555           var W = new Array(64);
41556           var a, b, c, d, e, f, g, h;
41557           var i, j, T1, T2;
41558
41559           /* append padding */
41560           m[l >> 5] |= 0x80 << (24 - l % 32);
41561           m[((l + 64 >> 9) << 4) + 15] = l;
41562
41563           for (i = 0; i < m.length; i += 16) {
41564             a = HASH[0];
41565             b = HASH[1];
41566             c = HASH[2];
41567             d = HASH[3];
41568             e = HASH[4];
41569             f = HASH[5];
41570             g = HASH[6];
41571             h = HASH[7];
41572
41573             for (j = 0; j < 64; j += 1) {
41574               if (j < 16) {
41575                 W[j] = m[j + i];
41576               } else {
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]);
41579               }
41580
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));
41584               h = g;
41585               g = f;
41586               f = e;
41587               e = safe_add(d, T1);
41588               d = c;
41589               c = b;
41590               b = a;
41591               a = safe_add(T1, T2);
41592             }
41593
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]);
41602           }
41603           return HASH;
41604         }
41605
41606       },
41607
41608       /**
41609        * @class Hashes.SHA512
41610        * @param {config}
41611        *
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.
41616        */
41617       SHA512: function(options) {
41618         /**
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
41623          */
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 */
41630           sha512_k;
41631
41632         /* privileged (public) methods */
41633         this.hex = function(s) {
41634           return rstr2hex(rstr(s));
41635         };
41636         this.b64 = function(s) {
41637           return rstr2b64(rstr(s), b64pad);
41638         };
41639         this.any = function(s, e) {
41640           return rstr2any(rstr(s), e);
41641         };
41642         this.raw = function(s) {
41643           return rstr(s, utf8);
41644         };
41645         this.hex_hmac = function(k, d) {
41646           return rstr2hex(rstr_hmac(k, d));
41647         };
41648         this.b64_hmac = function(k, d) {
41649           return rstr2b64(rstr_hmac(k, d), b64pad);
41650         };
41651         this.any_hmac = function(k, d, e) {
41652           return rstr2any(rstr_hmac(k, d), e);
41653         };
41654         /**
41655          * Perform a simple self-test to see if the VM is working
41656          * @return {String} Hexadecimal hash sample
41657          * @public
41658          */
41659         this.vm_test = function() {
41660           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
41661         };
41662         /**
41663          * @description Enable/disable uppercase hexadecimal returned string
41664          * @param {boolean}
41665          * @return {Object} this
41666          * @public
41667          */
41668         this.setUpperCase = function(a) {
41669           if (typeof a === 'boolean') {
41670             hexcase = a;
41671           }
41672           return this;
41673         };
41674         /**
41675          * @description Defines a base64 pad string
41676          * @param {string} Pad
41677          * @return {Object} this
41678          * @public
41679          */
41680         this.setPad = function(a) {
41681           b64pad = a || b64pad;
41682           return this;
41683         };
41684         /**
41685          * @description Defines a base64 pad string
41686          * @param {boolean}
41687          * @return {Object} this
41688          * @public
41689          */
41690         this.setUTF8 = function(a) {
41691           if (typeof a === 'boolean') {
41692             utf8 = a;
41693           }
41694           return this;
41695         };
41696
41697         /* private methods */
41698
41699         /**
41700          * Calculate the SHA-512 of a raw string
41701          */
41702
41703         function rstr(s) {
41704           s = (utf8) ? utf8Encode(s) : s;
41705           return binb2rstr(binb(rstr2binb(s), s.length * 8));
41706         }
41707         /*
41708          * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
41709          */
41710
41711         function rstr_hmac(key, data) {
41712           key = (utf8) ? utf8Encode(key) : key;
41713           data = (utf8) ? utf8Encode(data) : data;
41714
41715           var hash, i = 0,
41716             bkey = rstr2binb(key),
41717             ipad = Array(32),
41718             opad = Array(32);
41719
41720           if (bkey.length > 32) {
41721             bkey = binb(bkey, key.length * 8);
41722           }
41723
41724           for (; i < 32; i += 1) {
41725             ipad[i] = bkey[i] ^ 0x36363636;
41726             opad[i] = bkey[i] ^ 0x5C5C5C5C;
41727           }
41728
41729           hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
41730           return binb2rstr(binb(opad.concat(hash), 1024 + 512));
41731         }
41732
41733         /**
41734          * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
41735          */
41736
41737         function binb(x, len) {
41738           var j, i, l,
41739             W = new Array(80),
41740             hash = new Array(16),
41741             //Initial hash values
41742             H = [
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)
41751             ],
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);
41770
41771           if (sha512_k === undefined) {
41772             //SHA512 constants
41773             sha512_k = [
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)
41814             ];
41815           }
41816
41817           for (i = 0; i < 80; i += 1) {
41818             W[i] = new int64(0, 0);
41819           }
41820
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;
41824           l = x.length;
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]);
41834
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];
41838             }
41839
41840             for (j = 16; j < 80; j += 1) {
41841               //sigma1
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;
41847               //sigma0
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;
41853
41854               int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
41855             }
41856
41857             for (j = 0; j < 80; j += 1) {
41858               //Ch
41859               Ch.l = (e.l & f.l) ^ (~e.l & g.l);
41860               Ch.h = (e.h & f.h) ^ (~e.h & g.h);
41861
41862               //Sigma1
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;
41868
41869               //Sigma0
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;
41875
41876               //Maj
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);
41879
41880               int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
41881               int64add(T2, s0, Maj);
41882
41883               int64copy(h, g);
41884               int64copy(g, f);
41885               int64copy(f, e);
41886               int64add(e, d, T1);
41887               int64copy(d, c);
41888               int64copy(c, b);
41889               int64copy(b, a);
41890               int64add(a, T1, T2);
41891             }
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);
41900           }
41901
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;
41906           }
41907           return hash;
41908         }
41909
41910         //A constructor for 64-bit numbers
41911
41912         function int64(h, l) {
41913           this.h = h;
41914           this.l = l;
41915           //this.toString = int64toString;
41916         }
41917
41918         //Copies src into dst, assuming both are 64-bit numbers
41919
41920         function int64copy(dst, src) {
41921           dst.h = src.h;
41922           dst.l = src.l;
41923         }
41924
41925         //Right-rotates a 64-bit number by shift
41926         //Won't handle cases of shift>=32
41927         //The function revrrot() is for that
41928
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));
41932         }
41933
41934         //Reverses the dwords of the source and then rotates right by shift.
41935         //This is equivalent to rotation by 32+shift
41936
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));
41940         }
41941
41942         //Bitwise-shifts right a 64-bit number by shift
41943         //Won't handle shift>=32, but it's never needed in SHA512
41944
41945         function int64shr(dst, x, shift) {
41946           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
41947           dst.h = (x.h >>> shift);
41948         }
41949
41950         //Adds two 64-bit numbers
41951         //Like the original implementation, does not rely on 32-bit operations
41952
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);
41960         }
41961
41962         //Same, except with 4 addends. Works faster than adding them one by one.
41963
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);
41971         }
41972
41973         //Same, except with 5 addends
41974
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);
41982         }
41983       },
41984       /**
41985        * @class Hashes.RMD160
41986        * @constructor
41987        * @param {Object} [config]
41988        *
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/
41994        */
41995       RMD160: function(options) {
41996         /**
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
42001          */
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 */
42008           rmd160_r1 = [
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
42014           ],
42015           rmd160_r2 = [
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
42021           ],
42022           rmd160_s1 = [
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
42028           ],
42029           rmd160_s2 = [
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
42035           ];
42036
42037         /* privileged (public) methods */
42038         this.hex = function(s) {
42039           return rstr2hex(rstr(s, utf8));
42040         };
42041         this.b64 = function(s) {
42042           return rstr2b64(rstr(s, utf8), b64pad);
42043         };
42044         this.any = function(s, e) {
42045           return rstr2any(rstr(s, utf8), e);
42046         };
42047         this.raw = function(s) {
42048           return rstr(s, utf8);
42049         };
42050         this.hex_hmac = function(k, d) {
42051           return rstr2hex(rstr_hmac(k, d));
42052         };
42053         this.b64_hmac = function(k, d) {
42054           return rstr2b64(rstr_hmac(k, d), b64pad);
42055         };
42056         this.any_hmac = function(k, d, e) {
42057           return rstr2any(rstr_hmac(k, d), e);
42058         };
42059         /**
42060          * Perform a simple self-test to see if the VM is working
42061          * @return {String} Hexadecimal hash sample
42062          * @public
42063          */
42064         this.vm_test = function() {
42065           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
42066         };
42067         /**
42068          * @description Enable/disable uppercase hexadecimal returned string
42069          * @param {boolean}
42070          * @return {Object} this
42071          * @public
42072          */
42073         this.setUpperCase = function(a) {
42074           if (typeof a === 'boolean') {
42075             hexcase = a;
42076           }
42077           return this;
42078         };
42079         /**
42080          * @description Defines a base64 pad string
42081          * @param {string} Pad
42082          * @return {Object} this
42083          * @public
42084          */
42085         this.setPad = function(a) {
42086           if (typeof a !== 'undefined') {
42087             b64pad = a;
42088           }
42089           return this;
42090         };
42091         /**
42092          * @description Defines a base64 pad string
42093          * @param {boolean}
42094          * @return {Object} this
42095          * @public
42096          */
42097         this.setUTF8 = function(a) {
42098           if (typeof a === 'boolean') {
42099             utf8 = a;
42100           }
42101           return this;
42102         };
42103
42104         /* private methods */
42105
42106         /**
42107          * Calculate the rmd160 of a raw string
42108          */
42109
42110         function rstr(s) {
42111           s = (utf8) ? utf8Encode(s) : s;
42112           return binl2rstr(binl(rstr2binl(s), s.length * 8));
42113         }
42114
42115         /**
42116          * Calculate the HMAC-rmd160 of a key and some data (raw strings)
42117          */
42118
42119         function rstr_hmac(key, data) {
42120           key = (utf8) ? utf8Encode(key) : key;
42121           data = (utf8) ? utf8Encode(data) : data;
42122           var i, hash,
42123             bkey = rstr2binl(key),
42124             ipad = Array(16),
42125             opad = Array(16);
42126
42127           if (bkey.length > 16) {
42128             bkey = binl(bkey, key.length * 8);
42129           }
42130
42131           for (i = 0; i < 16; i += 1) {
42132             ipad[i] = bkey[i] ^ 0x36363636;
42133             opad[i] = bkey[i] ^ 0x5C5C5C5C;
42134           }
42135           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
42136           return binl2rstr(binl(opad.concat(hash), 512 + 160));
42137         }
42138
42139         /**
42140          * Convert an array of little-endian words to a string
42141          */
42142
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);
42148           }
42149           return output;
42150         }
42151
42152         /**
42153          * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
42154          */
42155
42156         function binl(x, len) {
42157           var T, j, i, l,
42158             h0 = 0x67452301,
42159             h1 = 0xefcdab89,
42160             h2 = 0x98badcfe,
42161             h3 = 0x10325476,
42162             h4 = 0xc3d2e1f0,
42163             A1, B1, C1, D1, E1,
42164             A2, B2, C2, D2, E2;
42165
42166           /* append padding */
42167           x[len >> 5] |= 0x80 << (len % 32);
42168           x[(((len + 64) >>> 9) << 4) + 14] = len;
42169           l = x.length;
42170
42171           for (i = 0; i < l; i += 16) {
42172             A1 = A2 = h0;
42173             B1 = B2 = h1;
42174             C1 = C2 = h2;
42175             D1 = D2 = h3;
42176             E1 = E2 = h4;
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);
42182               A1 = E1;
42183               E1 = D1;
42184               D1 = bit_rol(C1, 10);
42185               C1 = B1;
42186               B1 = T;
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);
42191               A2 = E2;
42192               E2 = D2;
42193               D2 = bit_rol(C2, 10);
42194               C2 = B2;
42195               B2 = T;
42196             }
42197
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));
42203             h0 = T;
42204           }
42205           return [h0, h1, h2, h3, h4];
42206         }
42207
42208         // specific algorithm methods
42209
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';
42217         }
42218
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';
42226         }
42227
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';
42235         }
42236       }
42237     };
42238
42239     // exposes Hashes
42240     (function(window, undefined) {
42241       var freeExports = false;
42242       {
42243         freeExports = exports;
42244         if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
42245           window = commonjsGlobal;
42246         }
42247       }
42248
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() {
42252           return Hashes;
42253         });
42254       } else if (freeExports) {
42255         // in Node.js or RingoJS v0.8.0+
42256         if (module && module.exports === freeExports) {
42257           module.exports = Hashes;
42258         }
42259         // in Narwhal or RingoJS v0.7.0-
42260         else {
42261           freeExports.Hashes = Hashes;
42262         }
42263       } else {
42264         // in a browser or Rhino
42265         window.Hashes = Hashes;
42266       }
42267     }(this));
42268   }()); // IIFE
42269   });
42270
42271   var immutable = extend$2;
42272
42273   var hasOwnProperty$g = Object.prototype.hasOwnProperty;
42274
42275   function extend$2() {
42276       var target = {};
42277
42278       for (var i = 0; i < arguments.length; i++) {
42279           var source = arguments[i];
42280
42281           for (var key in source) {
42282               if (hasOwnProperty$g.call(source, key)) {
42283                   target[key] = source[key];
42284               }
42285           }
42286       }
42287
42288       return target
42289   }
42290
42291   var sha1 = new hashes.SHA1();
42292
42293   var ohauth = {};
42294
42295   ohauth.qsString = function(obj) {
42296       return Object.keys(obj).sort().map(function(key) {
42297           return ohauth.percentEncode(key) + '=' +
42298               ohauth.percentEncode(obj[key]);
42299       }).join('&');
42300   };
42301
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]);
42309           return obj;
42310       }, {});
42311   };
42312
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);
42320           }
42321       };
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]);
42325       xhr.send(data);
42326       return xhr;
42327   };
42328
42329   ohauth.xhr = function(method, url, auth, data, options, callback) {
42330       var headers = (options && options.header) || {
42331           'Content-Type': 'application/x-www-form-urlencoded'
42332       };
42333       headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
42334       return ohauth.rawxhr(method, url, data, headers, callback);
42335   };
42336
42337   ohauth.nonce = function() {
42338       for (var o = ''; o.length < 6;) {
42339           o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
42340       }
42341       return o;
42342   };
42343
42344   ohauth.authHeader = function(obj) {
42345       return Object.keys(obj).sort().map(function(key) {
42346           return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
42347       }).join(', ');
42348   };
42349
42350   ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
42351
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');
42356   };
42357
42358   ohauth.baseString = function(method, url, params) {
42359       if (params.oauth_signature) delete params.oauth_signature;
42360       return [
42361           method,
42362           ohauth.percentEncode(url),
42363           ohauth.percentEncode(ohauth.qsString(params))].join('&');
42364   };
42365
42366   ohauth.signature = function(oauth_secret, token_secret, baseString) {
42367       return sha1.b64_hmac(
42368           ohauth.percentEncode(oauth_secret) + '&' +
42369           ohauth.percentEncode(token_secret),
42370           baseString);
42371   };
42372
42373   /**
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
42377    * for given data.
42378    *
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.
42384    *
42385    * Returned function returns full OAuth header with "OAuth" string in it.
42386    */
42387
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 || '';
42396
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);
42401           }
42402
42403           var uri_parts = uri.split('?', 2),
42404           base_uri = uri_parts[0];
42405
42406           var query_params = uri_parts.length === 2 ?
42407               ohauth.stringQs(uri_parts[1]) : {};
42408
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()
42415           };
42416
42417           if (token) oauth_params.oauth_token = token;
42418
42419           var all_params = immutable({}, oauth_params, query_params, extra_params),
42420               base_str = ohauth.baseString(method, base_uri, all_params);
42421
42422           oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
42423
42424           return 'OAuth ' + ohauth.authHeader(oauth_params);
42425       };
42426   };
42427
42428   var ohauth_1 = ohauth;
42429
42430   var resolveUrl = createCommonjsModule(function (module, exports) {
42431   // Copyright 2014 Simon Lydell
42432   // X11 (“MIT”) Licensed. (See LICENSE.)
42433
42434   void (function(root, factory) {
42435     if (typeof undefined === "function" && undefined.amd) {
42436       undefined(factory);
42437     } else {
42438       module.exports = factory();
42439     }
42440   }(commonjsGlobal, function() {
42441
42442     function resolveUrl(/* ...urls */) {
42443       var numUrls = arguments.length;
42444
42445       if (numUrls === 0) {
42446         throw new Error("resolveUrl requires at least one argument; got none.")
42447       }
42448
42449       var base = document.createElement("base");
42450       base.href = arguments[0];
42451
42452       if (numUrls === 1) {
42453         return base.href
42454       }
42455
42456       var head = document.getElementsByTagName("head")[0];
42457       head.insertBefore(base, head.firstChild);
42458
42459       var a = document.createElement("a");
42460       var resolved;
42461
42462       for (var index = 1; index < numUrls; index++) {
42463         a.href = arguments[index];
42464         resolved = a.href;
42465         base.href = resolved;
42466       }
42467
42468       head.removeChild(base);
42469
42470       return resolved
42471     }
42472
42473     return resolveUrl
42474
42475   }));
42476   });
42477
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);
42482
42483   var util = {
42484         assign: assign$1,
42485         create: create$2,
42486         trim: trim,
42487         bind: bind,
42488         slice: slice$7,
42489         each: each,
42490         map: map$4,
42491         pluck: pluck,
42492         isList: isList,
42493         isFunction: isFunction$1,
42494         isObject: isObject$1,
42495         Global: Global
42496   };
42497
42498   function make_assign() {
42499         if (Object.assign) {
42500                 return Object.assign
42501         } else {
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) {
42505                                         obj[key] = val;
42506                                 });
42507                         }                       
42508                         return obj
42509                 }
42510         }
42511   }
42512
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))
42518                 }
42519         } else {
42520                 function F() {} // eslint-disable-line no-inner-declarations
42521                 return function create(obj, assignProps1, assignProps2, etc) {
42522                         var assignArgsList = slice$7(arguments, 1);
42523                         F.prototype = obj;
42524                         return assign$1.apply(this, [new F()].concat(assignArgsList))
42525                 }
42526         }
42527   }
42528
42529   function make_trim() {
42530         if (String.prototype.trim) {
42531                 return function trim(str) {
42532                         return String.prototype.trim.call(str)
42533                 }
42534         } else {
42535                 return function trim(str) {
42536                         return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
42537                 }
42538         }
42539   }
42540
42541   function bind(obj, fn) {
42542         return function() {
42543                 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
42544         }
42545   }
42546
42547   function slice$7(arr, index) {
42548         return Array.prototype.slice.call(arr, index || 0)
42549   }
42550
42551   function each(obj, fn) {
42552         pluck(obj, function(val, key) {
42553                 fn(val, key);
42554                 return false
42555         });
42556   }
42557
42558   function map$4(obj, fn) {
42559         var res = (isList(obj) ? [] : {});
42560         pluck(obj, function(v, k) {
42561                 res[k] = fn(v, k);
42562                 return false
42563         });
42564         return res
42565   }
42566
42567   function pluck(obj, fn) {
42568         if (isList(obj)) {
42569                 for (var i=0; i<obj.length; i++) {
42570                         if (fn(obj[i], i)) {
42571                                 return obj[i]
42572                         }
42573                 }
42574         } else {
42575                 for (var key in obj) {
42576                         if (obj.hasOwnProperty(key)) {
42577                                 if (fn(obj[key], key)) {
42578                                         return obj[key]
42579                                 }
42580                         }
42581                 }
42582         }
42583   }
42584
42585   function isList(val) {
42586         return (val != null && typeof val != 'function' && typeof val.length == 'number')
42587   }
42588
42589   function isFunction$1(val) {
42590         return val && {}.toString.call(val) === '[object Function]'
42591   }
42592
42593   function isObject$1(val) {
42594         return val && {}.toString.call(val) === '[object Object]'
42595   }
42596
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;
42605
42606   var storeEngine = {
42607         createStore: createStore
42608   };
42609
42610   var storeAPI = {
42611         version: '2.0.12',
42612         enabled: false,
42613         
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)
42619         },
42620
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)
42626                 }
42627                 this.storage.write(this._namespacePrefix + key, this._serialize(value));
42628                 return value
42629         },
42630
42631         // remove deletes the key and value stored at the given key.
42632         remove: function(key) {
42633                 this.storage.remove(this._namespacePrefix + key);
42634         },
42635
42636         // each will call the given callback once for each key-value pair
42637         // in this store.
42638         each: function(callback) {
42639                 var self = this;
42640                 this.storage.each(function(val, namespacedKey) {
42641                         callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
42642                 });
42643         },
42644
42645         // clearAll will remove all the stored key-value pairs in this store.
42646         clearAll: function() {
42647                 this.storage.clearAll();
42648         },
42649
42650         // additional functionality that can't live in plugins
42651         // ---------------------------------------------------
42652
42653         // hasNamespace returns true if this store instance has the given namespace.
42654         hasNamespace: function(namespace) {
42655                 return (this._namespacePrefix == '__storejs_'+namespace+'_')
42656         },
42657
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)
42663         },
42664         
42665         addPlugin: function(plugin) {
42666                 this._addPlugin(plugin);
42667         },
42668         
42669         namespace: function(namespace) {
42670                 return createStore(this.storage, this.plugins, namespace)
42671         }
42672   };
42673
42674   function _warn() {
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);
42679   }
42680
42681   function createStore(storages, plugins, namespace) {
42682         if (!namespace) {
42683                 namespace = '';
42684         }
42685         if (storages && !isList$1(storages)) {
42686                 storages = [storages];
42687         }
42688         if (plugins && !isList$1(plugins)) {
42689                 plugins = [plugins];
42690         }
42691
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')
42697         }
42698         
42699         var _privateStoreProps = {
42700                 _namespacePrefix: namespacePrefix,
42701                 _namespaceRegexp: namespaceRegexp,
42702
42703                 _testStorage: function(storage) {
42704                         try {
42705                                 var testStr = '__storejs__test__';
42706                                 storage.write(testStr, testStr);
42707                                 var ok = (storage.read(testStr) === testStr);
42708                                 storage.remove(testStr);
42709                                 return ok
42710                         } catch(e) {
42711                                 return false
42712                         }
42713                 },
42714
42715                 _assignPluginFnProp: function(pluginFnProp, propName) {
42716                         var oldFn = this[propName];
42717                         this[propName] = function pluginFn() {
42718                                 var args = slice$8(arguments, 0);
42719                                 var self = this;
42720
42721                                 // super_fn calls the old function which was overwritten by
42722                                 // this mixin.
42723                                 function super_fn() {
42724                                         if (!oldFn) { return }
42725                                         each$1(arguments, function(arg, i) {
42726                                                 args[i] = arg;
42727                                         });
42728                                         return oldFn.apply(self, args)
42729                                 }
42730
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);
42734
42735                                 return pluginFnProp.apply(self, newFnArgs)
42736                         };
42737                 },
42738
42739                 _serialize: function(obj) {
42740                         return JSON.stringify(obj)
42741                 },
42742
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
42750                         var val = '';
42751                         try { val = JSON.parse(strVal); }
42752                         catch(e) { val = strVal; }
42753
42754                         return (val !== undefined ? val : defaultVal)
42755                 },
42756                 
42757                 _addStorage: function(storage) {
42758                         if (this.enabled) { return }
42759                         if (this._testStorage(storage)) {
42760                                 this.storage = storage;
42761                                 this.enabled = true;
42762                         }
42763                 },
42764
42765                 _addPlugin: function(plugin) {
42766                         var self = this;
42767
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);
42773                                 });
42774                                 return
42775                         }
42776
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)
42781                         });
42782                         if (seenPlugin) {
42783                                 return
42784                         }
42785                         this.plugins.push(plugin);
42786
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')
42790                         }
42791
42792                         var pluginProperties = plugin.call(this);
42793                         if (!isObject$2(pluginProperties)) {
42794                                 throw new Error('Plugins must return an object of function properties')
42795                         }
42796
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.')
42801                                 }
42802                                 self._assignPluginFnProp(pluginFnProp, propName);
42803                         });
42804                 },
42805                 
42806                 // Put deprecated properties in the private API, so as to not expose it to accidential
42807                 // discovery through inspection of the store object.
42808                 
42809                 // Deprecated: addStorage
42810                 addStorage: function(storage) {
42811                         _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
42812                         this._addStorage(storage);
42813                 }
42814         };
42815
42816         var store = create$3(_privateStoreProps, storeAPI, {
42817                 plugins: []
42818         });
42819         store.raw = {};
42820         each$1(store, function(prop, propName) {
42821                 if (isFunction$2(prop)) {
42822                         store.raw[propName] = bind$1(store, prop);                      
42823                 }
42824         });
42825         each$1(storages, function(storage) {
42826                 store._addStorage(storage);
42827         });
42828         each$1(plugins, function(plugin) {
42829                 store._addPlugin(plugin);
42830         });
42831         return store
42832   }
42833
42834   var Global$1 = util.Global;
42835
42836   var localStorage_1 = {
42837         name: 'localStorage',
42838         read: read,
42839         write: write,
42840         each: each$2,
42841         remove: remove$2,
42842         clearAll: clearAll,
42843   };
42844
42845   function localStorage$1() {
42846         return Global$1.localStorage
42847   }
42848
42849   function read(key) {
42850         return localStorage$1().getItem(key)
42851   }
42852
42853   function write(key, data) {
42854         return localStorage$1().setItem(key, data)
42855   }
42856
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);
42861         }
42862   }
42863
42864   function remove$2(key) {
42865         return localStorage$1().removeItem(key)
42866   }
42867
42868   function clearAll() {
42869         return localStorage$1().clear()
42870   }
42871
42872   // oldFF-globalStorage provides storage for Firefox
42873   // versions 6 and 7, where no localStorage, etc
42874   // is available.
42875
42876
42877   var Global$2 = util.Global;
42878
42879   var oldFFGlobalStorage = {
42880         name: 'oldFF-globalStorage',
42881         read: read$1,
42882         write: write$1,
42883         each: each$3,
42884         remove: remove$3,
42885         clearAll: clearAll$1,
42886   };
42887
42888   var globalStorage = Global$2.globalStorage;
42889
42890   function read$1(key) {
42891         return globalStorage[key]
42892   }
42893
42894   function write$1(key, data) {
42895         globalStorage[key] = data;
42896   }
42897
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);
42902         }
42903   }
42904
42905   function remove$3(key) {
42906         return globalStorage.removeItem(key)
42907   }
42908
42909   function clearAll$1() {
42910         each$3(function(key, _) {
42911                 delete globalStorage[key];
42912         });
42913   }
42914
42915   // oldIE-userDataStorage provides storage for Internet Explorer
42916   // versions 6 and 7, where no localStorage, sessionStorage, etc
42917   // is available.
42918
42919
42920   var Global$3 = util.Global;
42921
42922   var oldIEUserDataStorage = {
42923         name: 'oldIE-userDataStorage',
42924         write: write$2,
42925         read: read$2,
42926         each: each$4,
42927         remove: remove$4,
42928         clearAll: clearAll$2,
42929   };
42930
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
42935
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);
42942         });
42943   }
42944
42945   function read$2(unfixedKey) {
42946         if (disable) { return }
42947         var fixedKey = fixKey(unfixedKey);
42948         var res = null;
42949         _withStorageEl(function(storageEl) {
42950                 res = storageEl.getAttribute(fixedKey);
42951         });
42952         return res
42953   }
42954
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);
42961                 }
42962         });
42963   }
42964
42965   function remove$4(unfixedKey) {
42966         var fixedKey = fixKey(unfixedKey);
42967         _withStorageEl(function(storageEl) {
42968                 storageEl.removeAttribute(fixedKey);
42969                 storageEl.save(storageName);
42970         });
42971   }
42972
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);
42979                 }
42980                 storageEl.save(storageName);
42981         });
42982   }
42983
42984   // Helpers
42985   //////////
42986
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, '___')
42993   }
42994
42995   function _makeIEStorageElFunction() {
42996         if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
42997                 return null
42998         }
42999         var scriptTag = 'script',
43000                 storageOwner,
43001                 storageContainer,
43002                 storageEl;
43003
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.
43014         try {
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');
43022         } catch(e) {
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;
43027         }
43028
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);
43039                 return
43040         }
43041   }
43042
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
43046
43047
43048   var Global$4 = util.Global;
43049   var trim$1 = util.trim;
43050
43051   var cookieStorage = {
43052         name: 'cookieStorage',
43053         read: read$3,
43054         write: write$3,
43055         each: each$5,
43056         remove: remove$5,
43057         clearAll: clearAll$3,
43058   };
43059
43060   var doc$1 = Global$4.document;
43061
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"))
43068   }
43069
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])) {
43074                         continue
43075                 }
43076                 var kvp = cookies[i].split('=');
43077                 var key = unescape(kvp[0]);
43078                 var val = unescape(kvp[1]);
43079                 callback(val, key);
43080         }
43081   }
43082
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=/";
43086   }
43087
43088   function remove$5(key) {
43089         if (!key || !_has(key)) {
43090                 return
43091         }
43092         doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
43093   }
43094
43095   function clearAll$3() {
43096         each$5(function(_, key) {
43097                 remove$5(key);
43098         });
43099   }
43100
43101   function _has(key) {
43102         return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
43103   }
43104
43105   var Global$5 = util.Global;
43106
43107   var sessionStorage_1 = {
43108         name: 'sessionStorage',
43109         read: read$4,
43110         write: write$4,
43111         each: each$6,
43112         remove: remove$6,
43113         clearAll: clearAll$4
43114   };
43115
43116   function sessionStorage() {
43117         return Global$5.sessionStorage
43118   }
43119
43120   function read$4(key) {
43121         return sessionStorage().getItem(key)
43122   }
43123
43124   function write$4(key, data) {
43125         return sessionStorage().setItem(key, data)
43126   }
43127
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);
43132         }
43133   }
43134
43135   function remove$6(key) {
43136         return sessionStorage().removeItem(key)
43137   }
43138
43139   function clearAll$4() {
43140         return sessionStorage().clear()
43141   }
43142
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.
43147
43148   var memoryStorage_1 = {
43149         name: 'memoryStorage',
43150         read: read$5,
43151         write: write$5,
43152         each: each$7,
43153         remove: remove$7,
43154         clearAll: clearAll$5,
43155   };
43156
43157   var memoryStorage = {};
43158
43159   function read$5(key) {
43160         return memoryStorage[key]
43161   }
43162
43163   function write$5(key, data) {
43164         memoryStorage[key] = data;
43165   }
43166
43167   function each$7(callback) {
43168         for (var key in memoryStorage) {
43169                 if (memoryStorage.hasOwnProperty(key)) {
43170                         callback(memoryStorage[key], key);
43171                 }
43172         }
43173   }
43174
43175   function remove$7(key) {
43176         delete memoryStorage[key];
43177   }
43178
43179   function clearAll$5(key) {
43180         memoryStorage = {};
43181   }
43182
43183   var all = [
43184         // Listed in order of usage preference
43185         localStorage_1,
43186         oldFFGlobalStorage,
43187         oldIEUserDataStorage,
43188         cookieStorage,
43189         sessionStorage_1,
43190         memoryStorage_1
43191   ];
43192
43193   /* eslint-disable */
43194
43195   //  json2.js
43196   //  2016-10-28
43197   //  Public Domain.
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
43202
43203   //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
43204   //  NOT CONTROL.
43205
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.
43210
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 "&nbsp;"),
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.
43230
43231   //          For example, this would serialize Dates as ISO strings.
43232
43233   //              Date.prototype.toJSON = function (key) {
43234   //                  function f(n) {
43235   //                      // Format integers to have at least two digits.
43236   //                      return (n < 10)
43237   //                          ? "0" + n
43238   //                          : n;
43239   //                  }
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";
43246   //              };
43247
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.
43253
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
43257   //          stringified.
43258
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.
43263
43264   //          JSON.stringify(undefined) returns undefined.
43265
43266   //          The optional space parameter produces a stringification of the
43267   //          value that is filled with line breaks and indentation to make it
43268   //          easier to read.
43269
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.
43273
43274   //          Example:
43275
43276   //          text = JSON.stringify(["e", {pluribus: "unum"}]);
43277   //          // text is '["e",{"pluribus":"unum"}]'
43278
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]'
43281
43282   //          text = JSON.stringify([new Date()], function (key, value) {
43283   //              return this[key] instanceof Date
43284   //                  ? "Date(" + this[key] + ")"
43285   //                  : value;
43286   //          });
43287   //          // text is '["Date(---current time---)"]'
43288
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.
43292
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.
43298
43299   //          Example:
43300
43301   //          // Parse the text. Values that look like ISO date strings will
43302   //          // be converted to Date objects.
43303
43304   //          myData = JSON.parse(text, function (key, value) {
43305   //              var a;
43306   //              if (typeof value === "string") {
43307   //                  a =
43308   //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
43309   //                  if (a) {
43310   //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
43311   //                          +a[5], +a[6]));
43312   //                  }
43313   //              }
43314   //              return value;
43315   //          });
43316
43317   //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
43318   //              var d;
43319   //              if (typeof value === "string" &&
43320   //                      value.slice(0, 5) === "Date(" &&
43321   //                      value.slice(-1) === ")") {
43322   //                  d = new Date(value.slice(5, -1));
43323   //                  if (d) {
43324   //                      return d;
43325   //                  }
43326   //              }
43327   //              return value;
43328   //          });
43329
43330   //  This is a reference implementation. You are free to copy, modify, or
43331   //  redistribute.
43332
43333   /*jslint
43334       eval, for, this
43335   */
43336
43337   /*property
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
43342   */
43343
43344
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.
43347
43348   if (typeof JSON !== "object") {
43349       JSON = {};
43350   }
43351
43352   (function () {
43353
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;
43360
43361       function f(n) {
43362           // Format integers to have at least two digits.
43363           return n < 10
43364               ? "0" + n
43365               : n;
43366       }
43367
43368       function this_value() {
43369           return this.valueOf();
43370       }
43371
43372       if (typeof Date.prototype.toJSON !== "function") {
43373
43374           Date.prototype.toJSON = function () {
43375
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"
43383                   : null;
43384           };
43385
43386           Boolean.prototype.toJSON = this_value;
43387           Number.prototype.toJSON = this_value;
43388           String.prototype.toJSON = this_value;
43389       }
43390
43391       var gap;
43392       var indent;
43393       var meta;
43394       var rep;
43395
43396
43397       function quote(string) {
43398
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
43402   // sequences.
43403
43404           rx_escapable.lastIndex = 0;
43405           return rx_escapable.test(string)
43406               ? "\"" + string.replace(rx_escapable, function (a) {
43407                   var c = meta[a];
43408                   return typeof c === "string"
43409                       ? c
43410                       : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
43411               }) + "\""
43412               : "\"" + string + "\"";
43413       }
43414
43415
43416       function str(key, holder) {
43417
43418   // Produce a string from holder[key].
43419
43420           var i;          // The loop counter.
43421           var k;          // The member key.
43422           var v;          // The member value.
43423           var length;
43424           var mind = gap;
43425           var partial;
43426           var value = holder[key];
43427
43428   // If the value has a toJSON method, call it to obtain a replacement value.
43429
43430           if (value && typeof value === "object" &&
43431                   typeof value.toJSON === "function") {
43432               value = value.toJSON(key);
43433           }
43434
43435   // If we were called with a replacer function, then call the replacer to
43436   // obtain a replacement value.
43437
43438           if (typeof rep === "function") {
43439               value = rep.call(holder, key, value);
43440           }
43441
43442   // What happens next depends on the value's type.
43443
43444           switch (typeof value) {
43445           case "string":
43446               return quote(value);
43447
43448           case "number":
43449
43450   // JSON numbers must be finite. Encode non-finite numbers as null.
43451
43452               return isFinite(value)
43453                   ? String(value)
43454                   : "null";
43455
43456           case "boolean":
43457           case "null":
43458
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.
43462
43463               return String(value);
43464
43465   // If the type is "object", we might be dealing with an object or an array or
43466   // null.
43467
43468           case "object":
43469
43470   // Due to a specification blunder in ECMAScript, typeof null is "object",
43471   // so watch out for that case.
43472
43473               if (!value) {
43474                   return "null";
43475               }
43476
43477   // Make an array to hold the partial results of stringifying this object value.
43478
43479               gap += indent;
43480               partial = [];
43481
43482   // Is the value an array?
43483
43484               if (Object.prototype.toString.apply(value) === "[object Array]") {
43485
43486   // The value is an array. Stringify every element. Use null as a placeholder
43487   // for non-JSON values.
43488
43489                   length = value.length;
43490                   for (i = 0; i < length; i += 1) {
43491                       partial[i] = str(i, value) || "null";
43492                   }
43493
43494   // Join all of the elements together, separated with commas, and wrap them in
43495   // brackets.
43496
43497                   v = partial.length === 0
43498                       ? "[]"
43499                       : gap
43500                           ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
43501                           : "[" + partial.join(",") + "]";
43502                   gap = mind;
43503                   return v;
43504               }
43505
43506   // If the replacer is an array, use it to select the members to be stringified.
43507
43508               if (rep && typeof rep === "object") {
43509                   length = rep.length;
43510                   for (i = 0; i < length; i += 1) {
43511                       if (typeof rep[i] === "string") {
43512                           k = rep[i];
43513                           v = str(k, value);
43514                           if (v) {
43515                               partial.push(quote(k) + (
43516                                   gap
43517                                       ? ": "
43518                                       : ":"
43519                               ) + v);
43520                           }
43521                       }
43522                   }
43523               } else {
43524
43525   // Otherwise, iterate through all of the keys in the object.
43526
43527                   for (k in value) {
43528                       if (Object.prototype.hasOwnProperty.call(value, k)) {
43529                           v = str(k, value);
43530                           if (v) {
43531                               partial.push(quote(k) + (
43532                                   gap
43533                                       ? ": "
43534                                       : ":"
43535                               ) + v);
43536                           }
43537                       }
43538                   }
43539               }
43540
43541   // Join all of the member texts together, separated with commas,
43542   // and wrap them in braces.
43543
43544               v = partial.length === 0
43545                   ? "{}"
43546                   : gap
43547                       ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
43548                       : "{" + partial.join(",") + "}";
43549               gap = mind;
43550               return v;
43551           }
43552       }
43553
43554   // If the JSON object does not yet have a stringify method, give it one.
43555
43556       if (typeof JSON.stringify !== "function") {
43557           meta = {    // table of character substitutions
43558               "\b": "\\b",
43559               "\t": "\\t",
43560               "\n": "\\n",
43561               "\f": "\\f",
43562               "\r": "\\r",
43563               "\"": "\\\"",
43564               "\\": "\\\\"
43565           };
43566           JSON.stringify = function (value, replacer, space) {
43567
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.
43573
43574               var i;
43575               gap = "";
43576               indent = "";
43577
43578   // If the space parameter is a number, make an indent string containing that
43579   // many spaces.
43580
43581               if (typeof space === "number") {
43582                   for (i = 0; i < space; i += 1) {
43583                       indent += " ";
43584                   }
43585
43586   // If the space parameter is a string, it will be used as the indent string.
43587
43588               } else if (typeof space === "string") {
43589                   indent = space;
43590               }
43591
43592   // If there is a replacer, it must be a function or an array.
43593   // Otherwise, throw an error.
43594
43595               rep = replacer;
43596               if (replacer && typeof replacer !== "function" &&
43597                       (typeof replacer !== "object" ||
43598                       typeof replacer.length !== "number")) {
43599                   throw new Error("JSON.stringify");
43600               }
43601
43602   // Make a fake root object containing our value under the key of "".
43603   // Return the result of stringifying the value.
43604
43605               return str("", {"": value});
43606           };
43607       }
43608
43609
43610   // If the JSON object does not yet have a parse method, give it one.
43611
43612       if (typeof JSON.parse !== "function") {
43613           JSON.parse = function (text, reviver) {
43614
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.
43617
43618               var j;
43619
43620               function walk(holder, key) {
43621
43622   // The walk method is used to recursively walk the resulting structure so
43623   // that modifications can be made.
43624
43625                   var k;
43626                   var v;
43627                   var value = holder[key];
43628                   if (value && typeof value === "object") {
43629                       for (k in value) {
43630                           if (Object.prototype.hasOwnProperty.call(value, k)) {
43631                               v = walk(value, k);
43632                               if (v !== undefined) {
43633                                   value[k] = v;
43634                               } else {
43635                                   delete value[k];
43636                               }
43637                           }
43638                       }
43639                   }
43640                   return reviver.call(holder, key, value);
43641               }
43642
43643
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.
43647
43648               text = String(text);
43649               rx_dangerous.lastIndex = 0;
43650               if (rx_dangerous.test(text)) {
43651                   text = text.replace(rx_dangerous, function (a) {
43652                       return "\\u" +
43653                               ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
43654                   });
43655               }
43656
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.
43661
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.
43669
43670               if (
43671                   rx_one.test(
43672                       text
43673                           .replace(rx_two, "@")
43674                           .replace(rx_three, "]")
43675                           .replace(rx_four, "")
43676                   )
43677               ) {
43678
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.
43683
43684                   j = eval("(" + text + ")");
43685
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.
43688
43689                   return (typeof reviver === "function")
43690                       ? walk({"": j}, "")
43691                       : j;
43692               }
43693
43694   // If the text is not JSON parseable, then a SyntaxError is thrown.
43695
43696               throw new SyntaxError("JSON.parse");
43697           };
43698       }
43699   }());
43700
43701   var json2 = json2Plugin;
43702
43703   function json2Plugin() {
43704         
43705         return {}
43706   }
43707
43708   var plugins = [json2];
43709
43710   var store_legacy = storeEngine.createStore(all, plugins);
43711
43712   // # osm-auth
43713   //
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) {
43718
43719       var oauth = {};
43720
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'));
43725       };
43726
43727       oauth.logout = function() {
43728           token('oauth_token', '');
43729           token('oauth_token_secret', '');
43730           token('oauth_request_token_secret', '');
43731           return oauth;
43732       };
43733
43734       // TODO: detect lack of click event
43735       oauth.authenticate = function(callback) {
43736           if (oauth.authenticated()) return callback();
43737
43738           oauth.logout();
43739
43740           // ## Getting a request token
43741           var params = timenonce(getAuth(o)),
43742               url = o.url + '/oauth/request_token';
43743
43744           params.oauth_signature = ohauth_1.signature(
43745               o.oauth_secret, '',
43746               ohauth_1.baseString('POST', url, params));
43747
43748           if (!o.singlepage) {
43749               // Create a 600x550 popup window in the center of the screen
43750               var w = 600, h = 550,
43751                   settings = [
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('=');
43756                       }).join(','),
43757                   popup = window.open('about:blank', 'oauth_window', settings);
43758           }
43759
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);
43763           o.loading();
43764
43765           function reqTokenDone(err, xhr) {
43766               o.done();
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)
43773               });
43774
43775               if (o.singlepage) {
43776                   location.href = authorize_url;
43777               } else {
43778                   popup.location = authorize_url;
43779               }
43780           }
43781
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;
43788           };
43789
43790           // ## Getting an request token
43791           //
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(
43800                   o.oauth_secret,
43801                   request_token_secret,
43802                   ohauth_1.baseString('POST', url, params));
43803
43804               // ## Getting an access token
43805               //
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);
43809               o.loading();
43810           }
43811
43812           function accessTokenDone(err, xhr) {
43813               o.done();
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);
43819           }
43820       };
43821
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(
43832                   o.oauth_secret,
43833                   request_token_secret,
43834                   ohauth_1.baseString('POST', url, params));
43835
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);
43840               o.loading();
43841           }
43842
43843           function accessTokenDone(err, xhr) {
43844               o.done();
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);
43850           }
43851
43852           get_access_token(oauth_token);
43853       };
43854
43855       // # xhr
43856       //
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()) {
43861               if (o.auto) {
43862                   return oauth.authenticate(run);
43863               } else {
43864                   callback('not authenticated', null);
43865                   return;
43866               }
43867           } else {
43868               return run();
43869           }
43870
43871           function run() {
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] : '';
43878
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') &&
43882                   options.content) {
43883                   params = immutable(params, ohauth_1.stringQs(options.content));
43884               }
43885
43886               params.oauth_token = token('oauth_token');
43887               params.oauth_signature = ohauth_1.signature(
43888                   o.oauth_secret,
43889                   oauth_token_secret,
43890                   ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
43891               );
43892
43893               return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
43894           }
43895
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);
43900           }
43901       };
43902
43903       // pre-authorize this object, if we can just get a token and token_secret
43904       // from the start
43905       oauth.preauth = function(c) {
43906           if (!c) return;
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);
43909           return oauth;
43910       };
43911
43912       oauth.options = function(_) {
43913           if (!arguments.length) return o;
43914
43915           o = _;
43916           o.url = o.url || 'https://www.openstreetmap.org';
43917           o.landing = o.landing || 'land.html';
43918           o.singlepage = o.singlepage || false;
43919
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() {};
43924
43925           return oauth.preauth(o);
43926       };
43927
43928       // 'stamp' an authentication object from `getAuth()`
43929       // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
43930       // and timestamp
43931       function timenonce(o) {
43932           o.oauth_timestamp = ohauth_1.timestamp();
43933           o.oauth_nonce = ohauth_1.nonce();
43934           return o;
43935       }
43936
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`
43939       // will not clash
43940       var token;
43941
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);
43946           };
43947       } else {
43948           var storage = {};
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;
43952           };
43953       }
43954
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) {
43959           return {
43960               oauth_consumer_key: o.oauth_consumer_key,
43961               oauth_signature_method: 'HMAC-SHA1'
43962           };
43963       }
43964
43965       // potentially pre-authorize
43966       oauth.options(o);
43967
43968       return oauth;
43969   };
43970
43971   var JXON = new (function () {
43972     var
43973       sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
43974       aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
43975
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); }
43981       return sValue;
43982     }
43983
43984     function EmptyTree () { }
43985     EmptyTree.prototype.toString = function () { return 'null'; };
43986     EmptyTree.prototype.valueOf = function () { return null; };
43987
43988     function objectify (vValue) {
43989       return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
43990     }
43991
43992     function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
43993       var
43994         nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
43995         bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
43996
43997       var
43998         sProp, vContent, nLength = 0, sCollectedTxt = '',
43999         vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
44000
44001       if (bChildren) {
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) */
44007         }
44008       }
44009
44010       var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
44011
44012       if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
44013
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);
44020         } else {
44021           vResult[sProp] = vContent;
44022           nLength++;
44023         }
44024       }
44025
44026       if (bAttributes) {
44027         var
44028           nAttrLen = oParentNode.attributes.length,
44029           sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
44030
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());
44034         }
44035
44036         if (bNesteAttr) {
44037           if (bFreeze) { Object.freeze(oAttrParent); }
44038           vResult[sAttributesProp] = oAttrParent;
44039           nLength -= nAttrLen - 1;
44040         }
44041       }
44042
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;
44047       }
44048
44049       if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
44050
44051       aCache.length = nLevelStart;
44052
44053       return vResult;
44054     }
44055
44056     function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
44057       var vValue, oChild;
44058
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()));    
44063       }
44064
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);
44079           }
44080         } else {
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()));
44086           }
44087           oParentEl.appendChild(oChild);
44088        }
44089      }
44090     }
44091
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);    
44095     };
44096
44097     this.unbuild = function (oObjTree) {    
44098       var oNewDoc = document.implementation.createDocument('', '', null);
44099       loadObjTree(oNewDoc, oNewDoc, oObjTree);
44100       return oNewDoc;
44101     };
44102
44103     this.stringify = function (oObjTree) {
44104       return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
44105     };
44106   })();
44107
44108   // var myObject = JXON.build(doc);
44109   // we got our javascript object! try: alert(JSON.stringify(myObject));
44110
44111   // var newDoc = JXON.unbuild(myObject);
44112   // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
44113
44114   var dispatch$3 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded');
44115   var urlroot = 'https://www.openstreetmap.org';
44116   var oauth = osmAuth({
44117       url: urlroot,
44118       oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
44119       oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
44120       loading: authLoading,
44121       done: authDone
44122   });
44123
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;
44132   var _userDetails;
44133   var _off;
44134
44135
44136   function authLoading() {
44137       dispatch$3.call('authLoading');
44138   }
44139
44140
44141   function authDone() {
44142       dispatch$3.call('authDone');
44143   }
44144
44145
44146   function abortRequest$2(i) {
44147       if (i) {
44148           i.abort();
44149       }
44150   }
44151
44152
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)];
44157   }
44158
44159
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;
44165       }
44166       return nodes;
44167   }
44168
44169
44170   function getTags(obj) {
44171       var elems = obj.getElementsByTagName('tag');
44172       var tags = {};
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;
44176       }
44177
44178       return tags;
44179   }
44180
44181
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;
44187           members[i] = {
44188               id: attrs.type.value[0] + attrs.ref.value,
44189               type: attrs.type.value,
44190               role: attrs.role.value
44191           };
44192       }
44193       return members;
44194   }
44195
44196
44197   function getVisible(attrs) {
44198       return (!attrs.visible || attrs.visible.value !== 'false');
44199   }
44200
44201
44202   var parsers = {
44203       node: function nodeData(obj, uid) {
44204           var attrs = obj.attributes;
44205           return new osmNode({
44206               id:uid,
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),
44214               tags: getTags(obj)
44215           });
44216       },
44217
44218       way: function wayData(obj, uid) {
44219           var attrs = obj.attributes;
44220           return new osmWay({
44221               id: uid,
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),
44230           });
44231       },
44232
44233       relation: function relationData(obj, uid) {
44234           var attrs = obj.attributes;
44235           return new osmRelation({
44236               id: uid,
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)
44245           });
44246       }
44247   };
44248
44249
44250   function parse$1(xml$$1, callback, options) {
44251       options = assignIn({ cache: true }, options);
44252       if (!xml$$1 || !xml$$1.childNodes) return;
44253
44254       var root = xml$$1.childNodes[0];
44255       var children = root.childNodes;
44256
44257       function parseChild(child) {
44258           var parser = parsers[child.nodeName];
44259           if (parser) {
44260               var uid = osmEntity$$1.id.fromOSM(child.nodeName, child.attributes.id.value);
44261               if (options.cache && _entityCache[uid]) {
44262                   return null;
44263               }
44264               return parser(child, uid);
44265           }
44266       }
44267
44268       utilIdleWorker(children, parseChild, callback);
44269   }
44270
44271
44272   var serviceOsm = {
44273
44274       init: function() {
44275           utilRebind(this, dispatch$3, 'on');
44276       },
44277
44278
44279       reset: function() {
44280           _connectionID++;
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: {} };
44287           _changeset = {};
44288           _entityCache = {};
44289           return this;
44290       },
44291
44292
44293       getConnectionId: function() {
44294           return _connectionID;
44295       },
44296
44297
44298       changesetURL: function(changesetId) {
44299           return urlroot + '/changeset/' + changesetId;
44300       },
44301
44302
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);
44309       },
44310
44311
44312       entityURL: function(entity) {
44313           return urlroot + '/' + entity.type + '/' + entity.osmId();
44314       },
44315
44316
44317       historyURL: function(entity) {
44318           return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
44319       },
44320
44321
44322       userURL: function(username) {
44323           return urlroot + '/user/' + username;
44324       },
44325
44326
44327       loadFromAPI: function(path, callback, options) {
44328           options = assignIn({ cache: true }, options);
44329           var that = this;
44330           var cid = _connectionID;
44331
44332           function done(err, xml$$1) {
44333               if (that.getConnectionId() !== cid) {
44334                   if (callback) callback({ message: 'Connection Switched', status: -1 });
44335                   return;
44336               }
44337
44338               var isAuthenticated = that.authenticated();
44339
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)) {
44343                   that.logout();
44344                   that.loadFromAPI(path, callback);
44345
44346               // else, no retry..
44347               } else {
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');
44354                   }
44355
44356                   if (callback) {
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;
44362                               }
44363                           }
44364                           callback(null, entities);
44365                       }, options);
44366                   }
44367               }
44368           }
44369
44370           if (this.authenticated()) {
44371               return oauth.xhr({ method: 'GET', path: path }, done);
44372           } else {
44373               var url = urlroot + path;
44374               return d3_xml(url).get(done);
44375           }
44376       },
44377
44378
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 };
44383
44384           this.loadFromAPI(
44385               '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
44386               function(err, entities) {
44387                   if (callback) callback(err, { data: entities });
44388               },
44389               options
44390           );
44391       },
44392
44393
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 };
44398
44399           this.loadFromAPI(
44400               '/api/0.6/' + type + '/' + osmID + '/' + version,
44401               function(err, entities) {
44402                   if (callback) callback(err, { data: entities });
44403               },
44404               options
44405           );
44406       },
44407
44408
44409       loadMultiple: function(ids, callback) {
44410           var that = this;
44411
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 };
44416
44417               forEach(chunk(osmIDs, 150), function(arr) {
44418                   that.loadFromAPI(
44419                       '/api/0.6/' + type + '?' + type + '=' + arr.join(),
44420                       function(err, entities) {
44421                           if (callback) callback(err, { data: entities });
44422                       },
44423                       options
44424                   );
44425               });
44426           });
44427       },
44428
44429
44430       authenticated: function() {
44431           return oauth.authenticated();
44432       },
44433
44434
44435       putChangeset: function(changeset, changes, callback) {
44436           if (_changeset.inflight) {
44437               return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
44438           }
44439
44440           var that = this;
44441           var cid = _connectionID;
44442
44443           if (_changeset.open) {   // reuse existing open changeset..
44444               createdChangeset(null, _changeset.open);
44445           } else {                 // open a new changeset..
44446               _changeset.inflight = oauth.xhr({
44447                   method: 'PUT',
44448                   path: '/api/0.6/changeset/create',
44449                   options: { header: { 'Content-Type': 'text/xml' } },
44450                   content: JXON.stringify(changeset.asJXON())
44451               }, createdChangeset);
44452           }
44453
44454
44455           function createdChangeset(err, changesetID) {
44456               _changeset.inflight = null;
44457
44458               if (err) {
44459                   // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
44460                   if (err.status === 400 || err.status === 401 || err.status === 403) {
44461                       that.logout();
44462                   }
44463                   return callback(err, changeset);
44464               }
44465               if (that.getConnectionId() !== cid) {
44466                   return callback({ message: 'Connection Switched', status: -1 }, changeset);
44467               }
44468
44469               _changeset.open = changesetID;
44470               changeset = changeset.update({ id: changesetID });
44471
44472               // Upload the changeset..
44473               _changeset.inflight = oauth.xhr({
44474                   method: 'POST',
44475                   path: '/api/0.6/changeset/' + changesetID + '/upload',
44476                   options: { header: { 'Content-Type': 'text/xml' } },
44477                   content: JXON.stringify(changeset.osmChangeJXON(changes))
44478               }, uploadedChangeset);
44479           }
44480
44481
44482           function uploadedChangeset(err) {
44483               _changeset.inflight = null;
44484
44485               if (err) return callback(err, changeset);
44486
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);
44491               }, 2500);
44492
44493               _changeset.open = null;
44494
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
44499                   oauth.xhr({
44500                       method: 'PUT',
44501                       path: '/api/0.6/changeset/' + changeset.id + '/close',
44502                       options: { header: { 'Content-Type': 'text/xml' } }
44503                   }, function() { return true; });
44504               }
44505           }
44506       },
44507
44508
44509       userDetails: function(callback) {
44510           if (_userDetails) {
44511               callback(undefined, _userDetails);
44512               return;
44513           }
44514
44515           var that = this;
44516           var cid = _connectionID;
44517
44518           function done(err, user_details) {
44519               if (err) {
44520                   // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
44521                   if (err.status === 400 || err.status === 401 || err.status === 403) {
44522                       that.logout();
44523                   }
44524                   return callback(err);
44525               }
44526               if (that.getConnectionId() !== cid) {
44527                   return callback({ message: 'Connection Switched', status: -1 });
44528               }
44529
44530
44531               var u = user_details.getElementsByTagName('user')[0];
44532               var img = u.getElementsByTagName('img');
44533               var image_url = '';
44534
44535               if (img && img[0] && img[0].getAttribute('href')) {
44536                   image_url = img[0].getAttribute('href');
44537               }
44538
44539               var changesets = u.getElementsByTagName('changesets');
44540               var changesets_count = 0;
44541
44542               if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
44543                   changesets_count = changesets[0].getAttribute('count');
44544               }
44545
44546               _userDetails = {
44547                   id: u.attributes.id.value,
44548                   display_name: u.attributes.display_name.value,
44549                   image_url: image_url,
44550                   changesets_count: changesets_count
44551               };
44552
44553               callback(undefined, _userDetails);
44554           }
44555
44556           oauth.xhr({ method: 'GET', path: '/api/0.6/user/details' }, done);
44557       },
44558
44559
44560       userChangesets: function(callback) {
44561           if (_userChangesets) {
44562               callback(undefined, _userChangesets);
44563               return;
44564           }
44565
44566           var that = this;
44567           var cid = _connectionID;
44568
44569           this.userDetails(function(err, user) {
44570               if (err) {
44571                   return callback(err);
44572               }
44573               if (that.getConnectionId() !== cid) {
44574                   return callback({ message: 'Connection Switched', status: -1 });
44575               }
44576
44577               function done(err, changesets) {
44578                   if (err) {
44579                       // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
44580                       if (err.status === 400 || err.status === 401 || err.status === 403) {
44581                           that.logout();
44582                       }
44583                       return callback(err);
44584                   }
44585                   if (that.getConnectionId() !== cid) {
44586                       return callback({ message: 'Connection Switched', status: -1 });
44587                   }
44588
44589                   _userChangesets = Array.prototype.map.call(
44590                       changesets.getElementsByTagName('changeset'),
44591                       function (changeset) {
44592                           return { tags: getTags(changeset) };
44593                       }
44594                   ).filter(function (changeset) {
44595                       var comment = changeset.tags.comment;
44596                       return comment && comment !== '';
44597                   });
44598
44599                   callback(undefined, _userChangesets);
44600               }
44601
44602               oauth.xhr({ method: 'GET', path: '/api/0.6/changesets?user=' + user.id }, done);
44603           });
44604       },
44605
44606
44607       status: function(callback) {
44608           var that = this;
44609           var cid = _connectionID;
44610
44611           function done(xml$$1) {
44612               if (that.getConnectionId() !== cid) {
44613                   return callback({ message: 'Connection Switched', status: -1 }, 'connectionSwitched');
44614               }
44615
44616               // update blacklists
44617               var elements = xml$$1.getElementsByTagName('blacklist');
44618               var regexes = [];
44619               for (var i = 0; i < elements.length; i++) {
44620                   var regex = elements[i].getAttribute('regex');  // needs unencode?
44621                   if (regex) {
44622                       regexes.push(regex);
44623                   }
44624               }
44625               if (regexes.length) {
44626                   _blacklists = regexes;
44627               }
44628
44629
44630               if (_rateLimitError) {
44631                   callback(_rateLimitError, 'rateLimited');
44632               } else {
44633                   var apiStatus = xml$$1.getElementsByTagName('status');
44634                   var val = apiStatus[0].getAttribute('api');
44635
44636                   callback(undefined, val);
44637               }
44638           }
44639
44640           d3_xml(urlroot + '/api/capabilities').get()
44641               .on('load', done)
44642               .on('error', callback);
44643       },
44644
44645
44646       imageryBlacklists: function() {
44647           return _blacklists;
44648       },
44649
44650
44651       tileZoom: function(_) {
44652           if (!arguments.length) return _tileZoom;
44653           _tileZoom = _;
44654           return this;
44655       },
44656
44657
44658       loadTiles: function(projection, dimensions, callback) {
44659           if (_off) return;
44660
44661           var that = this;
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);
44665           var origin = [
44666               s / 2 - projection.translate()[0],
44667               s / 2 - projection.translate()[1]
44668           ];
44669
44670           var tiles = d3geoTile()
44671               .scaleExtent([_tileZoom, _tileZoom])
44672               .scale(s)
44673               .size(dimensions)
44674               .translate(projection.translate())()
44675               .map(function(tile) {
44676                   var x = tile[0] * ts - origin[0];
44677                   var y = tile[1] * ts - origin[1];
44678
44679                   return {
44680                       id: tile.toString(),
44681                       extent: geoExtent$$1(
44682                           projection.invert([x, y + ts]),
44683                           projection.invert([x + ts, y]))
44684                   };
44685               });
44686
44687           filter(_tiles.inflight, function(v, i) {
44688               var wanted = find$1(tiles, function(tile) {
44689                   return i === tile.id;
44690               });
44691               if (!wanted) delete _tiles.inflight[i];
44692               return !wanted;
44693           }).map(abortRequest$2);
44694
44695           tiles.forEach(function(tile) {
44696               var id = tile.id;
44697
44698               if (_tiles.loaded[id] || _tiles.inflight[id]) return;
44699
44700               if (isEmpty(_tiles.inflight)) {
44701                   dispatch$3.call('loading');
44702               }
44703
44704               _tiles.inflight[id] = that.loadFromAPI(
44705                   '/api/0.6/map?bbox=' + tile.extent.toParam(),
44706                   function(err, parsed) {
44707                       delete _tiles.inflight[id];
44708                       if (!err) {
44709                           _tiles.loaded[id] = true;
44710                       }
44711
44712                       if (callback) {
44713                           callback(err, assignIn({ data: parsed }, tile));
44714                       }
44715
44716                       if (isEmpty(_tiles.inflight)) {
44717                           dispatch$3.call('loaded');
44718                       }
44719                   }
44720               );
44721           });
44722       },
44723
44724
44725       switch: function(options) {
44726           urlroot = options.urlroot;
44727
44728           oauth.options(assignIn({
44729               url: urlroot,
44730               loading: authLoading,
44731               done: authDone
44732           }, options));
44733
44734           this.reset();
44735           this.userChangesets(function() {});  // eagerly load user details/changesets
44736           dispatch$3.call('change');
44737           return this;
44738       },
44739
44740
44741       toggle: function(_) {
44742           _off = !_;
44743           return this;
44744       },
44745
44746
44747       loadedTiles: function(_) {
44748           if (!arguments.length) return _tiles.loaded;
44749           _tiles.loaded = _;
44750           return this;
44751       },
44752
44753
44754       logout: function() {
44755           _userChangesets = undefined;
44756           _userDetails = undefined;
44757           oauth.logout();
44758           dispatch$3.call('change');
44759           return this;
44760       },
44761
44762
44763       authenticate: function(callback) {
44764           var that = this;
44765           var cid = _connectionID;
44766           _userChangesets = undefined;
44767           _userDetails = undefined;
44768
44769           function done(err, res) {
44770               if (err) {
44771                   if (callback) callback(err);
44772                   return;
44773               }
44774               if (that.getConnectionId() !== cid) {
44775                   if (callback) callback({ message: 'Connection Switched', status: -1 });
44776                   return;
44777               }
44778               _rateLimitError = undefined;
44779               dispatch$3.call('change');
44780               if (callback) callback(err, res);
44781               that.userChangesets(function() {});  // eagerly load user details/changesets
44782           }
44783
44784           return oauth.authenticate(done);
44785       }
44786   };
44787
44788   var jsonpCache = {};
44789   window.jsonpCache = jsonpCache;
44790
44791   function jsonpRequest(url, callback) {
44792       var request = {
44793           abort: function() {}
44794       };
44795
44796       if (window.JSONP_FIX) {
44797           if (window.JSONP_DELAY === 0) {
44798               callback(window.JSONP_FIX);
44799           } else {
44800               var t = window.setTimeout(function() {
44801                   callback(window.JSONP_FIX);
44802               }, window.JSONP_DELAY || 0);
44803
44804               request.abort = function() { window.clearTimeout(t); };
44805           }
44806
44807           return request;
44808       }
44809
44810       function rand() {
44811           var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
44812           var c = '';
44813           var i = -1;
44814           while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
44815           return c;
44816       }
44817
44818       function create$$1(url) {
44819           var e = url.match(/callback=(\w+)/);
44820           var c = e ? e[1] : rand();
44821
44822           jsonpCache[c] = function(data) {
44823               if (jsonpCache[c]) {
44824                   callback(data);
44825               }
44826               finalize();
44827           };
44828
44829           function finalize() {
44830               delete jsonpCache[c];
44831               script.remove();
44832           }
44833
44834           request.abort = finalize;
44835           return 'jsonpCache.' + c;
44836       }
44837
44838       var cb = create$$1(url);
44839
44840       var script = select('head')
44841           .append('script')
44842           .attr('type', 'text/javascript')
44843           .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
44844
44845       return request;
44846   }
44847
44848   var q = createCommonjsModule(function (module, exports) {
44849   // vim:ts=4:sts=4:sw=4:
44850   /*!
44851    *
44852    * Copyright 2009-2017 Kris Kowal under the terms of the MIT
44853    * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
44854    *
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
44859    *
44860    * With parts by Mark Miller
44861    * Copyright (C) 2011 Google Inc.
44862    *
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
44866    *
44867    * http://www.apache.org/licenses/LICENSE-2.0
44868    *
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.
44874    *
44875    */
44876
44877   (function (definition) {
44878
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.
44883
44884       // Montage Require
44885       if (typeof bootstrap === "function") {
44886           bootstrap("promise", definition);
44887
44888       // CommonJS
44889       } else {
44890           module.exports = definition();
44891
44892       // RequireJS
44893       }
44894
44895   })(function () {
44896
44897   var hasStacks = false;
44898   try {
44899       throw new Error();
44900   } catch (e) {
44901       hasStacks = !!e.stack;
44902   }
44903
44904   // All code after this point will be filtered from stack traces reported
44905   // by Q.
44906   var qStartingLine = captureLine();
44907   var qFileName;
44908
44909   // shims
44910
44911   // used for fallback in "allResolved"
44912   var noop = function () {};
44913
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};
44919       var tail = head;
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 = [];
44925
44926       function flush() {
44927           /* jshint loopfunc: true */
44928           var task, domain;
44929
44930           while (head.next) {
44931               head = head.next;
44932               task = head.task;
44933               head.task = void 0;
44934               domain = head.domain;
44935
44936               if (domain) {
44937                   head.domain = void 0;
44938                   domain.enter();
44939               }
44940               runSingle(task, domain);
44941
44942           }
44943           while (laterQueue.length) {
44944               task = laterQueue.pop();
44945               runSingle(task);
44946           }
44947           flushing = false;
44948       }
44949       // runs a single function in the async queue
44950       function runSingle(task, domain) {
44951           try {
44952               task();
44953
44954           } catch (e) {
44955               if (isNodeJS) {
44956                   // In node, uncaught exceptions are considered fatal errors.
44957                   // Re-throw them synchronously to interrupt flushing!
44958
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.
44962                   if (domain) {
44963                       domain.exit();
44964                   }
44965                   setTimeout(flush, 0);
44966                   if (domain) {
44967                       domain.enter();
44968                   }
44969
44970                   throw e;
44971
44972               } else {
44973                   // In browsers, uncaught exceptions are not fatal.
44974                   // Re-throw them asynchronously to avoid slow-downs.
44975                   setTimeout(function () {
44976                       throw e;
44977                   }, 0);
44978               }
44979           }
44980
44981           if (domain) {
44982               domain.exit();
44983           }
44984       }
44985
44986       nextTick = function (task) {
44987           tail = tail.next = {
44988               task: task,
44989               domain: isNodeJS && process.domain,
44990               next: null
44991           };
44992
44993           if (!flushing) {
44994               flushing = true;
44995               requestTick();
44996           }
44997       };
44998
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]".
45009           isNodeJS = true;
45010
45011           requestTick = function () {
45012               process.nextTick(flush);
45013           };
45014
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);
45019           } else {
45020               requestTick = function () {
45021                   setImmediate(flush);
45022               };
45023           }
45024
45025       } else if (typeof MessageChannel !== "undefined") {
45026           // modern browsers
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;
45034               flush();
45035           };
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);
45040           };
45041           requestTick = function () {
45042               setTimeout(flush, 0);
45043               requestPortTick();
45044           };
45045
45046       } else {
45047           // old browsers
45048           requestTick = function () {
45049               setTimeout(flush, 0);
45050           };
45051       }
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);
45057           if (!flushing) {
45058               flushing = true;
45059               requestTick();
45060           }
45061       };
45062       return nextTick;
45063   })();
45064
45065   // Attempt to make generics safe in the face of downstream
45066   // modifications.
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);
45079       };
45080   }
45081   // This is equivalent, but slower:
45082   // uncurryThis = Function_bind.bind(Function_bind.call);
45083   // http://jsperf.com/uncurrythis
45084
45085   var array_slice = uncurryThis(Array.prototype.slice);
45086
45087   var array_reduce = uncurryThis(
45088       Array.prototype.reduce || function (callback, basis) {
45089           var index = 0,
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
45095               do {
45096                   if (index in this) {
45097                       basis = this[index++];
45098                       break;
45099                   }
45100                   if (++index >= length) {
45101                       throw new TypeError();
45102                   }
45103               } while (1);
45104           }
45105           // reduce
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);
45110               }
45111           }
45112           return basis;
45113       }
45114   );
45115
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) {
45121                   return i;
45122               }
45123           }
45124           return -1;
45125       }
45126   );
45127
45128   var array_map = uncurryThis(
45129       Array.prototype.map || function (callback, thisp) {
45130           var self = this;
45131           var collect = [];
45132           array_reduce(self, function (undefined, value, index) {
45133               collect.push(callback.call(thisp, value, index, self));
45134           }, void 0);
45135           return collect;
45136       }
45137   );
45138
45139   var object_create = Object.create || function (prototype) {
45140       function Type() { }
45141       Type.prototype = prototype;
45142       return new Type();
45143   };
45144
45145   var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
45146       obj[prop] = descriptor.value;
45147       return obj;
45148   };
45149
45150   var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
45151
45152   var object_keys = Object.keys || function (object) {
45153       var keys = [];
45154       for (var key in object) {
45155           if (object_hasOwnProperty(object, key)) {
45156               keys.push(key);
45157           }
45158       }
45159       return keys;
45160   };
45161
45162   var object_toString = uncurryThis(Object.prototype.toString);
45163
45164   function isObject(value) {
45165       return value === Object(value);
45166   }
45167
45168   // generator related shims
45169
45170   // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
45171   function isStopIteration(exception) {
45172       return (
45173           object_toString(exception) === "[object StopIteration]" ||
45174           exception instanceof QReturnValue
45175       );
45176   }
45177
45178   // FIXME: Remove this helper and Q.return once ES6 generators are in
45179   // SpiderMonkey.
45180   var QReturnValue;
45181   if (typeof ReturnValue !== "undefined") {
45182       QReturnValue = ReturnValue;
45183   } else {
45184       QReturnValue = function (value) {
45185           this.value = value;
45186       };
45187   }
45188
45189   // long stack traces
45190
45191   var STACK_JUMP_SEPARATOR = "From previous event:";
45192
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.
45196       if (hasStacks &&
45197           promise.stack &&
45198           typeof error === "object" &&
45199           error !== null &&
45200           error.stack
45201       ) {
45202           var stacks = [];
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);
45207               }
45208           }
45209           stacks.unshift(error.stack);
45210
45211           var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
45212           var stack = filterStackString(concatedStacks);
45213           object_defineProperty(error, "stack", {value: stack, configurable: true});
45214       }
45215   }
45216
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];
45222
45223           if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
45224               desiredLines.push(line);
45225           }
45226       }
45227       return desiredLines.join("\n");
45228   }
45229
45230   function isNodeFrame(stackLine) {
45231       return stackLine.indexOf("(module.js:") !== -1 ||
45232              stackLine.indexOf("(node.js:") !== -1;
45233   }
45234
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);
45239       if (attempt1) {
45240           return [attempt1[1], Number(attempt1[2])];
45241       }
45242
45243       // Anonymous functions: "at filename:lineNumber:columnNumber"
45244       var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
45245       if (attempt2) {
45246           return [attempt2[1], Number(attempt2[2])];
45247       }
45248
45249       // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
45250       var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
45251       if (attempt3) {
45252           return [attempt3[1], Number(attempt3[2])];
45253       }
45254   }
45255
45256   function isInternalFrame(stackLine) {
45257       var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
45258
45259       if (!fileNameAndLineNumber) {
45260           return false;
45261       }
45262
45263       var fileName = fileNameAndLineNumber[0];
45264       var lineNumber = fileNameAndLineNumber[1];
45265
45266       return fileName === qFileName &&
45267           lineNumber >= qStartingLine &&
45268           lineNumber <= qEndingLine;
45269   }
45270
45271   // discover own file name and line number range for filtering stack
45272   // traces
45273   function captureLine() {
45274       if (!hasStacks) {
45275           return;
45276       }
45277
45278       try {
45279           throw new Error();
45280       } catch (e) {
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) {
45285               return;
45286           }
45287
45288           qFileName = fileNameAndLineNumber[0];
45289           return fileNameAndLineNumber[1];
45290       }
45291   }
45292
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);
45299           }
45300           return callback.apply(callback, arguments);
45301       };
45302   }
45303
45304   // end of shims
45305   // beginning of real work
45306
45307   /**
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
45311    */
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) {
45317           return value;
45318       }
45319
45320       // assimilate thenables
45321       if (isPromiseAlike(value)) {
45322           return coerce(value);
45323       } else {
45324           return fulfill(value);
45325       }
45326   }
45327   Q.resolve = Q;
45328
45329   /**
45330    * Performs a task in a future turn of the event loop.
45331    * @param {Function} task
45332    */
45333   Q.nextTick = nextTick;
45334
45335   /**
45336    * Controls whether or not long stack traces will be on
45337    */
45338   Q.longStackSupport = false;
45339
45340   /**
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.
45345    */
45346   var longStackCounter = 1;
45347
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;
45351   }
45352
45353   /**
45354    * Constructs a {promise, resolve, reject} object.
45355    *
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.
45362    */
45363   Q.defer = defer;
45364   function defer() {
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;
45372
45373       var deferred = object_create(defer.prototype);
45374       var promise = object_create(Promise.prototype);
45375
45376       promise.promiseDispatch = function (resolve, op, operands) {
45377           var args = array_slice(arguments);
45378           if (messages) {
45379               messages.push(args);
45380               if (op === "when" && operands[1]) { // progress operand
45381                   progressListeners.push(operands[1]);
45382               }
45383           } else {
45384               Q.nextTick(function () {
45385                   resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
45386               });
45387           }
45388       };
45389
45390       // XXX deprecated
45391       promise.valueOf = function () {
45392           if (messages) {
45393               return promise;
45394           }
45395           var nearerValue = nearer(resolvedPromise);
45396           if (isPromise(nearerValue)) {
45397               resolvedPromise = nearerValue; // shorten chain
45398           }
45399           return nearerValue;
45400       };
45401
45402       promise.inspect = function () {
45403           if (!resolvedPromise) {
45404               return { state: "pending" };
45405           }
45406           return resolvedPromise.inspect();
45407       };
45408
45409       if (Q.longStackSupport && hasStacks) {
45410           try {
45411               throw new Error();
45412           } catch (e) {
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.
45416               //
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++;
45421           }
45422       }
45423
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.
45427
45428       function become(newPromise) {
45429           resolvedPromise = newPromise;
45430
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;
45435           }
45436
45437           array_reduce(messages, function (undefined, message) {
45438               Q.nextTick(function () {
45439                   newPromise.promiseDispatch.apply(newPromise, message);
45440               });
45441           }, void 0);
45442
45443           messages = void 0;
45444           progressListeners = void 0;
45445       }
45446
45447       deferred.promise = promise;
45448       deferred.resolve = function (value) {
45449           if (resolvedPromise) {
45450               return;
45451           }
45452
45453           become(Q(value));
45454       };
45455
45456       deferred.fulfill = function (value) {
45457           if (resolvedPromise) {
45458               return;
45459           }
45460
45461           become(fulfill(value));
45462       };
45463       deferred.reject = function (reason) {
45464           if (resolvedPromise) {
45465               return;
45466           }
45467
45468           become(reject(reason));
45469       };
45470       deferred.notify = function (progress) {
45471           if (resolvedPromise) {
45472               return;
45473           }
45474
45475           array_reduce(progressListeners, function (undefined, progressListener) {
45476               Q.nextTick(function () {
45477                   progressListener(progress);
45478               });
45479           }, void 0);
45480       };
45481
45482       return deferred;
45483   }
45484
45485   /**
45486    * Creates a Node-style callback that will resolve or reject the deferred
45487    * promise.
45488    * @returns a nodeback
45489    */
45490   defer.prototype.makeNodeResolver = function () {
45491       var self = this;
45492       return function (error, value) {
45493           if (error) {
45494               self.reject(error);
45495           } else if (arguments.length > 2) {
45496               self.resolve(array_slice(arguments, 1));
45497           } else {
45498               self.resolve(value);
45499           }
45500       };
45501   };
45502
45503   /**
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
45508    */
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.");
45514       }
45515       var deferred = defer();
45516       try {
45517           resolver(deferred.resolve, deferred.reject, deferred.notify);
45518       } catch (reason) {
45519           deferred.reject(reason);
45520       }
45521       return deferred.promise;
45522   }
45523
45524   promise.race = race; // ES6
45525   promise.all = all; // ES6
45526   promise.reject = reject; // ES6
45527   promise.resolve = Q; // ES6
45528
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) {
45533       //freeze(object);
45534       //passByCopies.set(object, true);
45535       return object;
45536   };
45537
45538   Promise.prototype.passByCopy = function () {
45539       //freeze(object);
45540       //passByCopies.set(object, true);
45541       return this;
45542   };
45543
45544   /**
45545    * If two promises eventually fulfill to the same value, promises that value,
45546    * but otherwise rejects.
45547    * @param x {Any*}
45548    * @param y {Any*}
45549    * @returns {Any*} a promise for x and y if they are the same, but a rejection
45550    * otherwise.
45551    *
45552    */
45553   Q.join = function (x, y) {
45554       return Q(x).join(y);
45555   };
45556
45557   Promise.prototype.join = function (that) {
45558       return Q([this, that]).spread(function (x, y) {
45559           if (x === y) {
45560               // TODO: "===" should be Object.is or equiv
45561               return x;
45562           } else {
45563               throw new Error("Q can't join: not the same: " + x + " " + y);
45564           }
45565       });
45566   };
45567
45568   /**
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
45572    */
45573   Q.race = race;
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);
45579           // });
45580           // Use this in the meantime
45581           for (var i = 0, len = answerPs.length; i < len; i++) {
45582               Q(answerPs[i]).then(resolve, reject);
45583           }
45584       });
45585   }
45586
45587   Promise.prototype.race = function () {
45588       return this.then(Q.race);
45589   };
45590
45591   /**
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
45600    * bought and sold.
45601    */
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
45608               ));
45609           };
45610       }
45611       if (inspect === void 0) {
45612           inspect = function () {
45613               return {state: "unknown"};
45614           };
45615       }
45616
45617       var promise = object_create(Promise.prototype);
45618
45619       promise.promiseDispatch = function (resolve, op, args) {
45620           var result;
45621           try {
45622               if (descriptor[op]) {
45623                   result = descriptor[op].apply(promise, args);
45624               } else {
45625                   result = fallback.call(promise, op, args);
45626               }
45627           } catch (exception) {
45628               result = reject(exception);
45629           }
45630           if (resolve) {
45631               resolve(result);
45632           }
45633       };
45634
45635       promise.inspect = inspect;
45636
45637       // XXX deprecated `valueOf` and `exception` support
45638       if (inspect) {
45639           var inspected = inspect();
45640           if (inspected.state === "rejected") {
45641               promise.exception = inspected.reason;
45642           }
45643
45644           promise.valueOf = function () {
45645               var inspected = inspect();
45646               if (inspected.state === "pending" ||
45647                   inspected.state === "rejected") {
45648                   return promise;
45649               }
45650               return inspected.value;
45651           };
45652       }
45653
45654       return promise;
45655   }
45656
45657   Promise.prototype.toString = function () {
45658       return "[object Promise]";
45659   };
45660
45661   Promise.prototype.then = function (fulfilled, rejected, progressed) {
45662       var self = this;
45663       var deferred = defer();
45664       var done = false;   // ensure the untrusted promise makes at most a
45665                           // single call to one of the callbacks
45666
45667       function _fulfilled(value) {
45668           try {
45669               return typeof fulfilled === "function" ? fulfilled(value) : value;
45670           } catch (exception) {
45671               return reject(exception);
45672           }
45673       }
45674
45675       function _rejected(exception) {
45676           if (typeof rejected === "function") {
45677               makeStackTraceLong(exception, self);
45678               try {
45679                   return rejected(exception);
45680               } catch (newException) {
45681                   return reject(newException);
45682               }
45683           }
45684           return reject(exception);
45685       }
45686
45687       function _progressed(value) {
45688           return typeof progressed === "function" ? progressed(value) : value;
45689       }
45690
45691       Q.nextTick(function () {
45692           self.promiseDispatch(function (value) {
45693               if (done) {
45694                   return;
45695               }
45696               done = true;
45697
45698               deferred.resolve(_fulfilled(value));
45699           }, "when", [function (exception) {
45700               if (done) {
45701                   return;
45702               }
45703               done = true;
45704
45705               deferred.resolve(_rejected(exception));
45706           }]);
45707       });
45708
45709       // Progress propagator need to be attached in the current tick.
45710       self.promiseDispatch(void 0, "when", [void 0, function (value) {
45711           var newValue;
45712           var threw = false;
45713           try {
45714               newValue = _progressed(value);
45715           } catch (e) {
45716               threw = true;
45717               if (Q.onerror) {
45718                   Q.onerror(e);
45719               } else {
45720                   throw e;
45721               }
45722           }
45723
45724           if (!threw) {
45725               deferred.notify(newValue);
45726           }
45727       }]);
45728
45729       return deferred.promise;
45730   };
45731
45732   Q.tap = function (promise, callback) {
45733       return Q(promise).tap(callback);
45734   };
45735
45736   /**
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}
45742    * @example
45743    * doSomething()
45744    *   .then(...)
45745    *   .tap(console.log)
45746    *   .then(...);
45747    */
45748   Promise.prototype.tap = function (callback) {
45749       callback = Q(callback);
45750
45751       return this.then(function (value) {
45752           return callback.fcall(value).thenResolve(value);
45753       });
45754   };
45755
45756   /**
45757    * Registers an observer on a promise.
45758    *
45759    * Guarantees:
45760    *
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.
45765    *
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
45771    */
45772   Q.when = when;
45773   function when(value, fulfilled, rejected, progressed) {
45774       return Q(value).then(fulfilled, rejected, progressed);
45775   }
45776
45777   Promise.prototype.thenResolve = function (value) {
45778       return this.then(function () { return value; });
45779   };
45780
45781   Q.thenResolve = function (promise, value) {
45782       return Q(promise).thenResolve(value);
45783   };
45784
45785   Promise.prototype.thenReject = function (reason) {
45786       return this.then(function () { throw reason; });
45787   };
45788
45789   Q.thenReject = function (promise, reason) {
45790       return Q(promise).thenReject(reason);
45791   };
45792
45793   /**
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".
45799    * @param object
45800    * @returns most resolved (nearest) form of the object
45801    */
45802
45803   // XXX should we re-do this?
45804   Q.nearer = nearer;
45805   function nearer(value) {
45806       if (isPromise(value)) {
45807           var inspected = value.inspect();
45808           if (inspected.state === "fulfilled") {
45809               return inspected.value;
45810           }
45811       }
45812       return value;
45813   }
45814
45815   /**
45816    * @returns whether the given object is a promise.
45817    * Otherwise it is a fulfilled value.
45818    */
45819   Q.isPromise = isPromise;
45820   function isPromise(object) {
45821       return object instanceof Promise;
45822   }
45823
45824   Q.isPromiseAlike = isPromiseAlike;
45825   function isPromiseAlike(object) {
45826       return isObject(object) && typeof object.then === "function";
45827   }
45828
45829   /**
45830    * @returns whether the given object is a pending promise, meaning not
45831    * fulfilled or rejected.
45832    */
45833   Q.isPending = isPending;
45834   function isPending(object) {
45835       return isPromise(object) && object.inspect().state === "pending";
45836   }
45837
45838   Promise.prototype.isPending = function () {
45839       return this.inspect().state === "pending";
45840   };
45841
45842   /**
45843    * @returns whether the given object is a value or fulfilled
45844    * promise.
45845    */
45846   Q.isFulfilled = isFulfilled;
45847   function isFulfilled(object) {
45848       return !isPromise(object) || object.inspect().state === "fulfilled";
45849   }
45850
45851   Promise.prototype.isFulfilled = function () {
45852       return this.inspect().state === "fulfilled";
45853   };
45854
45855   /**
45856    * @returns whether the given object is a rejected promise.
45857    */
45858   Q.isRejected = isRejected;
45859   function isRejected(object) {
45860       return isPromise(object) && object.inspect().state === "rejected";
45861   }
45862
45863   Promise.prototype.isRejected = function () {
45864       return this.inspect().state === "rejected";
45865   };
45866
45867   //// BEGIN UNHANDLED REJECTION TRACKING
45868
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;
45877
45878   function resetUnhandledRejections() {
45879       unhandledReasons.length = 0;
45880       unhandledRejections.length = 0;
45881
45882       if (!trackUnhandledRejections) {
45883           trackUnhandledRejections = true;
45884       }
45885   }
45886
45887   function trackRejection(promise, reason) {
45888       if (!trackUnhandledRejections) {
45889           return;
45890       }
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);
45896               }
45897           });
45898       }
45899
45900       unhandledRejections.push(promise);
45901       if (reason && typeof reason.stack !== "undefined") {
45902           unhandledReasons.push(reason.stack);
45903       } else {
45904           unhandledReasons.push("(no stack) " + reason);
45905       }
45906   }
45907
45908   function untrackRejection(promise) {
45909       if (!trackUnhandledRejections) {
45910           return;
45911       }
45912
45913       var at = array_indexOf(unhandledRejections, promise);
45914       if (at !== -1) {
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);
45921                   }
45922               });
45923           }
45924           unhandledRejections.splice(at, 1);
45925           unhandledReasons.splice(at, 1);
45926       }
45927   }
45928
45929   Q.resetUnhandledRejections = resetUnhandledRejections;
45930
45931   Q.getUnhandledReasons = function () {
45932       // Make a copy so that consumers can't interfere with our internal state.
45933       return unhandledReasons.slice();
45934   };
45935
45936   Q.stopUnhandledRejectionTracking = function () {
45937       resetUnhandledRejections();
45938       trackUnhandledRejections = false;
45939   };
45940
45941   resetUnhandledRejections();
45942
45943   //// END UNHANDLED REJECTION TRACKING
45944
45945   /**
45946    * Constructs a rejected promise.
45947    * @param reason value describing the failure
45948    */
45949   Q.reject = reject;
45950   function reject(reason) {
45951       var rejection = Promise({
45952           "when": function (rejected) {
45953               // note that the error has been handled
45954               if (rejected) {
45955                   untrackRejection(this);
45956               }
45957               return rejected ? rejected(reason) : this;
45958           }
45959       }, function fallback() {
45960           return this;
45961       }, function inspect() {
45962           return { state: "rejected", reason: reason };
45963       });
45964
45965       // Note that the reason has not been handled.
45966       trackRejection(rejection, reason);
45967
45968       return rejection;
45969   }
45970
45971   /**
45972    * Constructs a fulfilled promise for an immediate reference.
45973    * @param value immediate reference
45974    */
45975   Q.fulfill = fulfill;
45976   function fulfill(value) {
45977       return Promise({
45978           "when": function () {
45979               return value;
45980           },
45981           "get": function (name) {
45982               return value[name];
45983           },
45984           "set": function (name, rhs) {
45985               value[name] = rhs;
45986           },
45987           "delete": function (name) {
45988               delete value[name];
45989           },
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);
45995               } else {
45996                   return value[name].apply(value, args);
45997               }
45998           },
45999           "apply": function (thisp, args) {
46000               return value.apply(thisp, args);
46001           },
46002           "keys": function () {
46003               return object_keys(value);
46004           }
46005       }, void 0, function inspect() {
46006           return { state: "fulfilled", value: value };
46007       });
46008   }
46009
46010   /**
46011    * Converts thenables to Q promises.
46012    * @param promise thenable promise
46013    * @returns a Q promise
46014    */
46015   function coerce(promise) {
46016       var deferred = defer();
46017       Q.nextTick(function () {
46018           try {
46019               promise.then(deferred.resolve, deferred.reject, deferred.notify);
46020           } catch (exception) {
46021               deferred.reject(exception);
46022           }
46023       });
46024       return deferred.promise;
46025   }
46026
46027   /**
46028    * Annotates an object such that it will never be
46029    * transferred away from this process over any promise
46030    * communication channel.
46031    * @param object
46032    * @returns promise a wrapping of that object that
46033    * additionally responds to the "isDef" message
46034    * without a rejection.
46035    */
46036   Q.master = master;
46037   function master(object) {
46038       return Promise({
46039           "isDef": function () {}
46040       }, function fallback(op, args) {
46041           return dispatch(object, op, args);
46042       }, function () {
46043           return Q(object).inspect();
46044       });
46045   }
46046
46047   /**
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
46051    * promised array
46052    * @param rejected callback that receives the exception if the promise
46053    * is rejected.
46054    * @returns a promise for the return value or thrown exception of
46055    * either callback.
46056    */
46057   Q.spread = spread;
46058   function spread(value, fulfilled, rejected) {
46059       return Q(value).spread(fulfilled, rejected);
46060   }
46061
46062   Promise.prototype.spread = function (fulfilled, rejected) {
46063       return this.all().then(function (array) {
46064           return fulfilled.apply(void 0, array);
46065       }, rejected);
46066   };
46067
46068   /**
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.
46074    *
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.
46079    *
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
46085    *    stops iterating)
46086    *  - the decorated function returns a promise for the return value
46087    *    of the generator or the first rejected promise among those
46088    *    yielded.
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.
46093    */
46094   Q.async = async;
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) {
46100               var result;
46101
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
46108               // this block.
46109
46110               if (typeof StopIteration === "undefined") {
46111                   // ES6 Generators
46112                   try {
46113                       result = generator[verb](arg);
46114                   } catch (exception) {
46115                       return reject(exception);
46116                   }
46117                   if (result.done) {
46118                       return Q(result.value);
46119                   } else {
46120                       return when(result.value, callback, errback);
46121                   }
46122               } else {
46123                   // SpiderMonkey Generators
46124                   // FIXME: Remove this case when SM does ES6 generators.
46125                   try {
46126                       result = generator[verb](arg);
46127                   } catch (exception) {
46128                       if (isStopIteration(exception)) {
46129                           return Q(exception.value);
46130                       } else {
46131                           return reject(exception);
46132                       }
46133                   }
46134                   return when(result, callback, errback);
46135               }
46136           }
46137           var generator = makeGenerator.apply(this, arguments);
46138           var callback = continuer.bind(continuer, "next");
46139           var errback = continuer.bind(continuer, "throw");
46140           return callback();
46141       };
46142   }
46143
46144   /**
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.
46150    */
46151   Q.spawn = spawn;
46152   function spawn(makeGenerator) {
46153       Q.done(Q.async(makeGenerator)());
46154   }
46155
46156   // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
46157   /**
46158    * Throws a ReturnValue exception to stop an asynchronous generator.
46159    *
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
46163    * functions.
46164    *
46165    * @param value the return value for the surrounding generator
46166    * @throws ReturnValue exception with the value.
46167    * @example
46168    * // ES6 style
46169    * Q.async(function* () {
46170    *      var foo = yield getFooPromise();
46171    *      var bar = yield getBarPromise();
46172    *      return foo + bar;
46173    * })
46174    * // Older SpiderMonkey style
46175    * Q.async(function () {
46176    *      var foo = yield getFooPromise();
46177    *      var bar = yield getBarPromise();
46178    *      Q.return(foo + bar);
46179    * })
46180    */
46181   Q["return"] = _return;
46182   function _return(value) {
46183       throw new QReturnValue(value);
46184   }
46185
46186   /**
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.
46191    *
46192    * @example
46193    * var add = Q.promised(function (a, b) {
46194    *     return a + b;
46195    * });
46196    * add(Q(a), Q(B));
46197    *
46198    * @param {function} callback The function to decorate
46199    * @returns {function} a function that has been decorated.
46200    */
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);
46206           });
46207       };
46208   }
46209
46210   /**
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
46216    */
46217   Q.dispatch = dispatch;
46218   function dispatch(object, op, args) {
46219       return Q(object).dispatch(op, args);
46220   }
46221
46222   Promise.prototype.dispatch = function (op, args) {
46223       var self = this;
46224       var deferred = defer();
46225       Q.nextTick(function () {
46226           self.promiseDispatch(deferred.resolve, op, args);
46227       });
46228       return deferred.promise;
46229   };
46230
46231   /**
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
46236    */
46237   Q.get = function (object, key) {
46238       return Q(object).dispatch("get", [key]);
46239   };
46240
46241   Promise.prototype.get = function (key) {
46242       return this.dispatch("get", [key]);
46243   };
46244
46245   /**
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
46251    */
46252   Q.set = function (object, key, value) {
46253       return Q(object).dispatch("set", [key, value]);
46254   };
46255
46256   Promise.prototype.set = function (key, value) {
46257       return this.dispatch("set", [key, value]);
46258   };
46259
46260   /**
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
46265    */
46266   Q.del = // XXX legacy
46267   Q["delete"] = function (object, key) {
46268       return Q(object).dispatch("delete", [key]);
46269   };
46270
46271   Promise.prototype.del = // XXX legacy
46272   Promise.prototype["delete"] = function (key) {
46273       return this.dispatch("delete", [key]);
46274   };
46275
46276   /**
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
46287    */
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]);
46292   };
46293
46294   Promise.prototype.mapply = // XXX As proposed by "Redsandro"
46295   Promise.prototype.post = function (name, args) {
46296       return this.dispatch("post", [name, args]);
46297   };
46298
46299   /**
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
46305    */
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)]);
46310   };
46311
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)]);
46316   };
46317
46318   /**
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
46322    */
46323   Q.fapply = function (object, args) {
46324       return Q(object).dispatch("apply", [void 0, args]);
46325   };
46326
46327   Promise.prototype.fapply = function (args) {
46328       return this.dispatch("apply", [void 0, args]);
46329   };
46330
46331   /**
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
46335    */
46336   Q["try"] =
46337   Q.fcall = function (object /* ...args*/) {
46338       return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
46339   };
46340
46341   Promise.prototype.fcall = function (/*...args*/) {
46342       return this.dispatch("apply", [void 0, array_slice(arguments)]);
46343   };
46344
46345   /**
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
46350    */
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", [
46356               this,
46357               args.concat(array_slice(arguments))
46358           ]);
46359       };
46360   };
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", [
46366               this,
46367               args.concat(array_slice(arguments))
46368           ]);
46369       };
46370   };
46371
46372   /**
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
46377    */
46378   Q.keys = function (object) {
46379       return Q(object).dispatch("keys", []);
46380   };
46381
46382   Promise.prototype.keys = function () {
46383       return this.dispatch("keys", []);
46384   };
46385
46386   /**
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
46392    */
46393   // By Mark Miller
46394   // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
46395   Q.all = all;
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) {
46401               var snapshot;
46402               if (
46403                   isPromise(promise) &&
46404                   (snapshot = promise.inspect()).state === "fulfilled"
46405               ) {
46406                   promises[index] = snapshot.value;
46407               } else {
46408                   ++pendingCount;
46409                   when(
46410                       promise,
46411                       function (value) {
46412                           promises[index] = value;
46413                           if (--pendingCount === 0) {
46414                               deferred.resolve(promises);
46415                           }
46416                       },
46417                       deferred.reject,
46418                       function (progress) {
46419                           deferred.notify({ index: index, value: progress });
46420                       }
46421                   );
46422               }
46423           }, void 0);
46424           if (pendingCount === 0) {
46425               deferred.resolve(promises);
46426           }
46427           return deferred.promise;
46428       });
46429   }
46430
46431   Promise.prototype.all = function () {
46432       return all(this);
46433   };
46434
46435   /**
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.
46441    */
46442   Q.any = any;
46443
46444   function any(promises) {
46445       if (promises.length === 0) {
46446           return Q.resolve();
46447       }
46448
46449       var deferred = Q.defer();
46450       var pendingCount = 0;
46451       array_reduce(promises, function (prev, current, index) {
46452           var promise = promises[index];
46453
46454           pendingCount++;
46455
46456           when(promise, onFulfilled, onRejected, onProgress);
46457           function onFulfilled(result) {
46458               deferred.resolve(result);
46459           }
46460           function onRejected(err) {
46461               pendingCount--;
46462               if (pendingCount === 0) {
46463                   var rejection = err || new Error("" + err);
46464
46465                   rejection.message = ("Q can't get fulfillment value from any promise, all " +
46466                       "promises were rejected. Last error message: " + rejection.message);
46467
46468                   deferred.reject(rejection);
46469               }
46470           }
46471           function onProgress(progress) {
46472               deferred.notify({
46473                   index: index,
46474                   value: progress
46475               });
46476           }
46477       }, undefined);
46478
46479       return deferred.promise;
46480   }
46481
46482   Promise.prototype.any = function () {
46483       return any(this);
46484   };
46485
46486   /**
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
46492    * (or values)
46493    * @return a promise for an array of promises
46494    */
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);
46501           })), function () {
46502               return promises;
46503           });
46504       });
46505   }
46506
46507   Promise.prototype.allResolved = function () {
46508       return allResolved(this);
46509   };
46510
46511   /**
46512    * @see Promise#allSettled
46513    */
46514   Q.allSettled = allSettled;
46515   function allSettled(promises) {
46516       return Q(promises).allSettled();
46517   }
46518
46519   /**
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.
46525    */
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();
46532               }
46533               return promise.then(regardless, regardless);
46534           }));
46535       });
46536   };
46537
46538   /**
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
46546    */
46547   Q.fail = // XXX legacy
46548   Q["catch"] = function (object, rejected) {
46549       return Q(object).then(void 0, rejected);
46550   };
46551
46552   Promise.prototype.fail = // XXX legacy
46553   Promise.prototype["catch"] = function (rejected) {
46554       return this.then(void 0, rejected);
46555   };
46556
46557   /**
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
46564    */
46565   Q.progress = progress;
46566   function progress(object, progressed) {
46567       return Q(object).then(void 0, void 0, progressed);
46568   }
46569
46570   Promise.prototype.progress = function (progressed) {
46571       return this.then(void 0, void 0, progressed);
46572   };
46573
46574   /**
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
46583    * ``fin`` is done.
46584    */
46585   Q.fin = // XXX legacy
46586   Q["finally"] = function (object, callback) {
46587       return Q(object)["finally"](callback);
46588   };
46589
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");
46594       }
46595       callback = Q(callback);
46596       return this.then(function (value) {
46597           return callback.fcall().then(function () {
46598               return value;
46599           });
46600       }, function (reason) {
46601           // TODO attempt to recycle the rejection with "this".
46602           return callback.fcall().then(function () {
46603               throw reason;
46604           });
46605       });
46606   };
46607
46608   /**
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
46612    * @returns nothing
46613    */
46614   Q.done = function (object, fulfilled, rejected, progress) {
46615       return Q(object).done(fulfilled, rejected, progress);
46616   };
46617
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);
46624               if (Q.onerror) {
46625                   Q.onerror(error);
46626               } else {
46627                   throw error;
46628               }
46629           });
46630       };
46631
46632       // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
46633       var promise = fulfilled || rejected || progress ?
46634           this.then(fulfilled, rejected, progress) :
46635           this;
46636
46637       if (typeof process === "object" && process && process.domain) {
46638           onUnhandledError = process.domain.bind(onUnhandledError);
46639       }
46640
46641       promise.then(void 0, onUnhandledError);
46642   };
46643
46644   /**
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.
46652    */
46653   Q.timeout = function (object, ms, error) {
46654       return Q(object).timeout(ms, error);
46655   };
46656
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";
46663           }
46664           deferred.reject(error);
46665       }, ms);
46666
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);
46674
46675       return deferred.promise;
46676   };
46677
46678   /**
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.
46686    */
46687   Q.delay = function (object, timeout) {
46688       if (timeout === void 0) {
46689           timeout = object;
46690           object = void 0;
46691       }
46692       return Q(object).delay(timeout);
46693   };
46694
46695   Promise.prototype.delay = function (timeout) {
46696       return this.then(function (value) {
46697           var deferred = defer();
46698           setTimeout(function () {
46699               deferred.resolve(value);
46700           }, timeout);
46701           return deferred.promise;
46702       });
46703   };
46704
46705   /**
46706    * Passes a continuation to a Node function, which is called with the given
46707    * arguments provided as an array, and returns a promise.
46708    *
46709    *      Q.nfapply(FS.readFile, [__filename])
46710    *      .then(function (content) {
46711    *      })
46712    *
46713    */
46714   Q.nfapply = function (callback, args) {
46715       return Q(callback).nfapply(args);
46716   };
46717
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;
46724   };
46725
46726   /**
46727    * Passes a continuation to a Node function, which is called with the given
46728    * arguments provided individually, and returns a promise.
46729    * @example
46730    * Q.nfcall(FS.readFile, __filename)
46731    * .then(function (content) {
46732    * })
46733    *
46734    */
46735   Q.nfcall = function (callback /*...args*/) {
46736       var args = array_slice(arguments, 1);
46737       return Q(callback).nfapply(args);
46738   };
46739
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;
46746   };
46747
46748   /**
46749    * Wraps a NodeJS continuation passing function and returns an equivalent
46750    * version that returns a promise.
46751    * @example
46752    * Q.nfbind(FS.readFile, __filename)("utf-8")
46753    * .then(console.log)
46754    * .done()
46755    */
46756   Q.nfbind =
46757   Q.denodeify = function (callback /*...args*/) {
46758       if (callback === undefined) {
46759           throw new Error("Q can't wrap an undefined function");
46760       }
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;
46768       };
46769   };
46770
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);
46776   };
46777
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());
46784           function bound() {
46785               return callback.apply(thisp, arguments);
46786           }
46787           Q(bound).fapply(nodeArgs).fail(deferred.reject);
46788           return deferred.promise;
46789       };
46790   };
46791
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);
46796   };
46797
46798   /**
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
46806    */
46807   Q.nmapply = // XXX As proposed by "Redsandro"
46808   Q.npost = function (object, name, args) {
46809       return Q(object).npost(name, args);
46810   };
46811
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;
46819   };
46820
46821   /**
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
46830    */
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;
46839   };
46840
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;
46849   };
46850
46851   /**
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
46860    */
46861   Q.nodeify = nodeify;
46862   function nodeify(object, nodeback) {
46863       return Q(object).nodeify(nodeback);
46864   }
46865
46866   Promise.prototype.nodeify = function (nodeback) {
46867       if (nodeback) {
46868           this.then(function (value) {
46869               Q.nextTick(function () {
46870                   nodeback(null, value);
46871               });
46872           }, function (error) {
46873               Q.nextTick(function () {
46874                   nodeback(error);
46875               });
46876           });
46877       } else {
46878           return this;
46879       }
46880   };
46881
46882   Q.noConflict = function() {
46883       throw new Error("Q.noConflict only works when Q is used as a global");
46884   };
46885
46886   // All code before this point will be filtered from stack traces.
46887   var qEndingLine = captureLine();
46888
46889   return Q;
46890
46891   });
46892   });
46893
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;
46908   var _ssCache;
46909   var _pannellumViewer;
46910   var _sceneOptions;
46911   var _dataUrlArray = [];
46912
46913   /**
46914    * abortRequest().
46915    */
46916   function abortRequest$3(i) {
46917       i.abort();
46918   }
46919
46920   /**
46921    * nearNullIsland().
46922    */
46923   function nearNullIsland$2(x, y, z) {
46924       if (z >= 7) {
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;
46930       }
46931       return false;
46932   }
46933
46934   /**
46935    * localeTimeStamp().
46936    */
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);
46944   }
46945
46946   /**
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.
46950    */
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);
46960       var origin = [
46961           s / 2 - projection.translate()[0],
46962           s / 2 - projection.translate()[1]
46963       ];
46964
46965       var tiler = d3geoTile()
46966           .scaleExtent([tileZoom$2, tileZoom$2])
46967           .scale(s)
46968           .size(projection.clipExtent()[1])
46969           .translate(projection.translate())
46970           .margin(margin || 0);   // request nearby tiles so we can connect sequences.
46971
46972       return tiler()
46973           .map(function(tile) {
46974               var x = tile[0] * ts - origin[0];
46975               var y = tile[1] * ts - origin[1];
46976               return {
46977                   id: tile.toString(),
46978                   xyz: tile,
46979                   extent: geoExtent$$1(
46980                       projection.invert([x, y + ts]),
46981                       projection.invert([x + ts, y])
46982                   )
46983               };
46984           });
46985   }
46986
46987   /**
46988    * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
46989    */
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));
46993
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]);
46997       });
46998
46999       tiles.forEach(function (tile) {
47000          loadNextTilePage$2(which, currZoom, url, tile);
47001       });
47002   }
47003
47004   /**
47005    * loadNextTilePage() load data for the next tile page in line.
47006    */
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;
47012
47013       cache.inflight[id] = getBubbles(url, tile, function(bubbles) {
47014           cache.loaded[id] = true;
47015           delete cache.inflight[id];
47016           if (!bubbles) return;
47017
47018           // [].shift() removes the first element, some statistics info, not a bubble point
47019           bubbles.shift();
47020
47021           var features = bubbles.map(function (bubble) {
47022               if (cache.points[bubble.id]) return null;  // skip duplicates
47023
47024               var loc = [bubble.lo, bubble.la];
47025               var d = {
47026                   loc: loc,
47027                   key: bubble.id,
47028                   ca: bubble.he,
47029                   captured_at: bubble.cd,
47030                   captured_by: 'microsoft',
47031                   // nbn: bubble.nbn,
47032                   // pbn: bubble.pbn,
47033                   // ad: bubble.ad,
47034                   // rn: bubble.rn,
47035                   pr: bubble.pr,  // previous
47036                   ne: bubble.ne,  // next
47037                   pano: true,
47038                   sequenceKey: null
47039               };
47040
47041               cache.points[bubble.id] = d;
47042
47043               // a sequence starts here
47044               if (bubble.pr === undefined) {
47045                   cache.leaders.push(bubble.id);
47046               }
47047
47048               return {
47049                   minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
47050               };
47051
47052           }).filter(Boolean);
47053
47054           cache.rtree.load(features);
47055
47056           connectSequences();
47057
47058           if (which === 'bubbles') {
47059               dispatch$4.call('loadedBubbles');
47060           }
47061       });
47062   }
47063
47064
47065   // call this sometimes to connect the bubbles into sequences
47066   function connectSequences() {
47067       var cache = _ssCache.bubbles;
47068       var keepLeaders = [];
47069
47070       for (var i = 0; i < cache.leaders.length; i++) {
47071           var bubble = cache.points[cache.leaders[i]];
47072           var seen = {};
47073
47074           // try to make a sequence.. use the key of the leader bubble.
47075           var sequence = { key: bubble.key, bubbles: [] };
47076           var complete = false;
47077
47078           do {
47079               sequence.bubbles.push(bubble);
47080               seen[bubble.key] = true;
47081
47082               if (bubble.ne === undefined) {
47083                   complete = true;
47084               } else {
47085                   bubble = cache.points[bubble.ne];  // advance to next
47086               }
47087           } while (bubble && !seen[bubble.key] && !complete);
47088
47089
47090           if (complete) {
47091               _ssCache.sequences[sequence.key] = sequence;
47092
47093               // assign bubbles to the sequence
47094               for (var j = 0; j < sequence.bubbles.length; j++) {
47095                   sequence.bubbles[j].sequenceKey = sequence.key;
47096               }
47097
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; })
47103               };
47104
47105           } else {
47106               keepLeaders.push(cache.leaders[i]);
47107           }
47108       }
47109
47110       // couldn't complete these, save for later
47111       cache.leaders = keepLeaders;
47112   }
47113
47114   /**
47115    * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
47116    */
47117   function getBubbles(url, tile, callback) {
47118       var rect = tile.extent.rectangle();
47119       var urlForRequest = url + utilQsString({
47120           n: rect[3],
47121           s: rect[1],
47122           e: rect[2],
47123           w: rect[0],
47124           c: maxResults$2,
47125           appkey: bubbleAppKey,
47126           jsCallback: '{callback}'
47127       });
47128
47129       return jsonpRequest(urlForRequest, function (data) {
47130           if (!data || data.error) {
47131               callback(null);
47132           } else {
47133               callback(data);
47134           }
47135       });
47136   }
47137
47138   /**
47139    * partitionViewport() partition viewport into `psize` x `psize` regions.
47140    */
47141   function partitionViewport$2(psize, projection) {
47142       var dimensions = projection.clipExtent()[1];
47143       psize = psize || 16;
47144
47145       var cols = range(0, dimensions[0], psize);
47146       var rows = range(0, dimensions[1], psize);
47147       var partitions = [];
47148
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)));
47154           });
47155       });
47156
47157       return partitions;
47158   }
47159
47160
47161   /**
47162    * searchLimited().
47163    */
47164   function searchLimited$2(psize, limit, projection, rtree) {
47165       limit = limit || 3;
47166
47167       var partitions = partitionViewport$2(psize, projection);
47168       var results;
47169
47170       results = flatten(map$3(partitions, function (extent$$1) {
47171           return rtree.search(extent$$1.bbox())
47172               .slice(0, limit)
47173               .map(function (d) { return d.data; });
47174       }));
47175
47176       return results;
47177   }
47178
47179
47180   /**
47181    * getImage()
47182    */
47183   function getImage(imgInfo) {
47184       var response = q.defer();
47185       var img = new Image();
47186
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'});
47192       };
47193       img.onerror = function() {
47194           response.resolve({data: imgInfo, status: 'error'});
47195       };
47196       img.setAttribute('crossorigin', '');
47197       img.src = imgInfo.url;
47198
47199       return response.promise;
47200   }
47201
47202
47203   /**
47204    * loadCanvas()
47205    */
47206   function loadCanvas(imgInfoGroup) {
47207       var response = q.defer();
47208       var getImagePromises = imgInfoGroup.map(function(imgInfo) {
47209           return getImage(imgInfo);
47210       });
47211
47212       q.all(getImagePromises).then(function(data) {
47213           var canvas = document.getElementById('canvas' + data[0].imgInfo.face);
47214           switch (data[0].imgInfo.face) {
47215               case '01':
47216                   _dataUrlArray[0] = canvas.toDataURL('image/jpeg', 1.0);
47217                   break;
47218               case '02':
47219                   _dataUrlArray[1] = canvas.toDataURL('image/jpeg', 1.0);
47220                   break;
47221               case '03':
47222                   _dataUrlArray[2] = canvas.toDataURL('image/jpeg', 1.0);
47223                   break;
47224               case '10':
47225                   _dataUrlArray[3] = canvas.toDataURL('image/jpeg', 1.0);
47226                   break;
47227               case '11':
47228                   _dataUrlArray[4] = canvas.toDataURL('image/jpeg', 1.0);
47229                   break;
47230               case '12':
47231                   _dataUrlArray[5] = canvas.toDataURL('image/jpeg', 1.0);
47232                   break;
47233           }
47234           response.resolve({status:'loadCanvas for face ' + data[0].imgInfo.face + 'ok'});
47235       });
47236
47237       return response.promise;
47238   }
47239
47240
47241   function setupCanvas(selection$$1, reset) {
47242       if (reset) {
47243           selection$$1.selectAll('#divForCanvasWork')
47244               .remove();
47245       }
47246
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')
47250           .data([0])
47251           .enter()
47252           .append('div')
47253           .attr('id', 'divForCanvasWork')
47254           .attr('display', 'none')
47255           .selectAll('canvas')
47256           .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
47257           .enter()
47258           .append('canvas')
47259           .attr('id', function(d) { return d; })
47260           .attr('width', _resolution)
47261           .attr('height', _resolution);
47262   }
47263
47264
47265   /**
47266    * processFaces()
47267    */
47268   function processFaces(imgFaceInfoGroups) {
47269       var response = q.defer();
47270       var loadCanvasPromises = imgFaceInfoGroups.map(function(faceImgGroup) {
47271           return loadCanvas(faceImgGroup);
47272       });
47273
47274       q.all(loadCanvasPromises).then(function() {
47275           response.resolve({status: 'processFaces done'});
47276       });
47277
47278       return response.promise;
47279   }
47280
47281
47282
47283   function qkToXY(qk) {
47284       var x = 0;
47285       var y = 0;
47286       var scale = 256;
47287       for (var i = qk.length; i > 0; i--) {
47288           var key = qk[i-1];
47289           x += (+(key === '1' || key === '3')) * scale;
47290           y += (+(key === '2' || key === '3')) * scale;
47291           scale *= 2;
47292       }
47293       return [x, y];
47294   }
47295
47296
47297   function getQuadKeys() {
47298       var dim = _resolution / 256;
47299       var quadKeys;
47300
47301       if (dim === 16) {
47302           quadKeys = [
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',
47311
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'
47320           ];
47321
47322       } else if (dim === 8) {
47323           quadKeys = [
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',
47328
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'
47333           ];
47334
47335       } else if (dim === 4) {
47336           quadKeys = [
47337               '00','01',  '10','11',
47338               '02','03',  '12','13',
47339
47340               '20','21',  '30','31',
47341               '22','23',  '32','33'
47342           ];
47343
47344       } else {  // dim === 2
47345           quadKeys = [
47346               '0', '1',
47347               '2', '3'
47348           ];
47349       }
47350
47351       return quadKeys;
47352   }
47353
47354
47355
47356   var serviceStreetside = {
47357       /**
47358        * init() initialize streetside.
47359        */
47360       init: function () {
47361           if (!_ssCache) {
47362               this.reset();
47363           }
47364
47365           this.event = utilRebind(this, dispatch$4, 'on');
47366       },
47367
47368       /**
47369        * reset() reset the cache.
47370        */
47371       reset: function () {
47372           var cache = _ssCache;
47373
47374           if (cache) {
47375               if (cache.bubbles && cache.bubbles.inflight) {
47376                   forEach(cache.bubbles.inflight, abortRequest$3);
47377               }
47378           }
47379
47380           _ssCache = {
47381               bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1(), points: {}, leaders: [] },
47382               sequences: {}
47383           };
47384       },
47385
47386       /**
47387        * bubbles()
47388        */
47389       bubbles: function (projection) {
47390           var psize = 32, limit = 3;
47391           return searchLimited$2(psize, limit, projection, _ssCache.bubbles.rtree);
47392       },
47393
47394
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();
47400           var seen = {};
47401           var results = [];
47402
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]) {
47408                       seen[key] = true;
47409                       results.push(_ssCache.sequences[key].geojson);
47410                   }
47411               });
47412
47413           return results;
47414       },
47415
47416
47417       /**
47418        * loadBubbles()
47419        */
47420       loadBubbles: function (projection, margin) {
47421           // by default: request 2 nearby tiles so we can connect sequences.
47422           if (margin === undefined) margin = 2;
47423
47424           loadTiles$2('bubbles', bubbleApi, projection, margin);
47425       },
47426
47427
47428       viewer: function() {
47429           return _pannellumViewer;
47430       },
47431
47432
47433       initViewer: function () {
47434           if (!window.pannellum) return;
47435           if (_pannellumViewer) return;
47436
47437           var sceneID = ++_currScene + '';
47438           var options = {
47439               'default': { firstScene: sceneID },
47440               scenes: {}
47441           };
47442           options.scenes[sceneID] = _sceneOptions;
47443
47444           _pannellumViewer = window.pannellum.viewer('viewer-streetside', options);
47445
47446           _pannellumViewer
47447               .on('mousedown', function() {
47448                   select(window).on('mousemove.pannellum', function() {
47449                       dispatch$4.call('viewerChanged');
47450                   });
47451               })
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) {
47458                           t$$1.stop();
47459                       }
47460                   });
47461               });
47462       },
47463
47464
47465       /**
47466        * loadViewer() create the streeside viewer.
47467        */
47468       loadViewer: function (context) {
47469           // create ms-wrapper, a photo wrapper class
47470           var wrap = select('#photoviewer').selectAll('.ms-wrapper')
47471               .data([0]);
47472
47473           // inject ms-wrapper into the photoviewer div
47474           // (used by all to house each custom photo viewer)
47475           var wrapEnter = wrap.enter()
47476               .append('div')
47477               .attr('id', 'ms')
47478               .attr('class', 'photo-wrapper ms-wrapper')
47479               .classed('hide', true);
47480
47481           // inject div to support streetside viewer (pannellum) and attribution line
47482           wrapEnter
47483               .append('div')
47484               .attr('id', 'viewer-streetside')
47485               .append('div')
47486               .attr('class', 'photo-attribution fillD');
47487
47488           // create working canvas for stitching together images
47489           wrap = wrap
47490               .merge(wrapEnter)
47491               .call(setupCanvas, true);
47492
47493           // load streetside pannellum viewer css
47494           select('head').selectAll('#streetside-viewercss')
47495               .data([0])
47496               .enter()
47497               .append('link')
47498               .attr('id', 'streetside-viewercss')
47499               .attr('rel', 'stylesheet')
47500               .attr('href', context.asset(pannellumViewerCSS));
47501
47502           // load streetside pannellum viewer js
47503           select('head').selectAll('#streetside-viewerjs')
47504               .data([0])
47505               .enter()
47506               .append('script')
47507               .attr('id', 'streetside-viewerjs')
47508               .attr('src', context.asset(pannellumViewerJS));
47509       },
47510
47511       /**
47512        * showViewer()
47513        */
47514       showViewer: function (yaw) {
47515           if (!_sceneOptions) return;
47516
47517           if (yaw !== undefined) {
47518               _sceneOptions.yaw = yaw;
47519           }
47520
47521           if (!_pannellumViewer) {
47522               this.initViewer();
47523           } else {
47524               // make a new scene
47525               var sceneID = ++_currScene + '';
47526               _pannellumViewer
47527                   .addScene(sceneID, _sceneOptions)
47528                   .loadScene(sceneID);
47529
47530               // remove previous scene
47531               if (_currScene > 2) {
47532                   sceneID = (_currScene - 1) + '';
47533                   _pannellumViewer
47534                       .removeScene(sceneID);
47535               }
47536           }
47537
47538           var wrap = select('#photoviewer')
47539               .classed('hide', false);
47540
47541           var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
47542
47543           if (isHidden) {
47544               wrap
47545                   .selectAll('.photo-wrapper:not(.ms-wrapper)')
47546                   .classed('hide', true);
47547
47548               wrap
47549                   .selectAll('.photo-wrapper.ms-wrapper')
47550                   .classed('hide', false);
47551           }
47552
47553           return this;
47554       },
47555
47556       /**
47557        * hideViewer()
47558        */
47559       hideViewer: function () {
47560           var viewer = select('#photoviewer');
47561           if (!viewer.empty()) viewer.datum(null);
47562
47563           viewer
47564               .classed('hide', true)
47565               .selectAll('.photo-wrapper')
47566               .classed('hide', true);
47567
47568           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
47569               .classed('selected', false);
47570
47571           return this.setStyles(null, true);
47572       },
47573
47574       /**
47575        * selectImage().
47576        */
47577       selectImage: function (d) {
47578           var response = q.defer();
47579           var that = this;
47580
47581           var viewer = select('#photoviewer');
47582           if (!viewer.empty()) viewer.datum(d);
47583
47584           this.setStyles(null, true);
47585
47586           var wrap = select('#photoviewer .ms-wrapper');
47587           var attribution = wrap.selectAll('.photo-attribution').html('');
47588
47589           wrap.selectAll('.pnlm-load-box')   // display "loading.."
47590               .style('display', 'block');
47591
47592           if (!d) {
47593               response.resolve({status: 'ok'});
47594               return response.promise;
47595           }
47596
47597           // Add hires checkbox
47598           var label = attribution
47599               .append('label')
47600               .attr('class', 'streetside-hires');
47601
47602           label
47603               .append('input')
47604               .attr('type', 'checkbox')
47605               .attr('id', 'streetside-hires-input')
47606               .property('checked', _hires)
47607               .on('click', function() {
47608                   event.stopPropagation();
47609
47610                   _hires = !_hires;
47611                   _resolution = _hires ? 1024 : 512;
47612                   wrap.call(setupCanvas, true);
47613
47614                   var viewstate = {
47615                       yaw: _pannellumViewer.getYaw(),
47616                       pitch: _pannellumViewer.getPitch(),
47617                       hfov: _pannellumViewer.getHfov()
47618                   };
47619
47620                   that.selectImage(d)
47621                       .then(function(r) {
47622                           if (r.status === 'ok') {
47623                               _sceneOptions = assignIn(_sceneOptions, viewstate);
47624                               that.showViewer();
47625                           }
47626                       });
47627               });
47628
47629           label
47630               .append('span')
47631               .text(t('streetside.hires'));
47632
47633
47634           // Add capture date
47635           if (d.captured_by) {
47636               var yyyy = (new Date()).getFullYear();
47637
47638               attribution
47639                   .append('a')
47640                   .attr('class', 'captured_by')
47641                   .attr('target', '_blank')
47642                   .attr('href', 'https://www.microsoft.com/en-us/maps/streetside')
47643                   .text('©' + yyyy + ' Microsoft');
47644
47645               attribution
47646                   .append('span')
47647                   .text('|');
47648           }
47649
47650           if (d.captured_at) {
47651               attribution
47652                   .append('span')
47653                   .attr('class', 'captured_at')
47654                   .text(localeTimestamp$1(d.captured_at));
47655           }
47656
47657           // Add image link
47658           attribution
47659               .append('a')
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'));
47665
47666
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;
47671           }
47672           var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
47673           var imgUrlSuffix = '.jpg?g=6338&n=z';
47674
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'];
47677
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);
47683                   return {
47684                       face: faceKey,
47685                       url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
47686                       x: xy[0],
47687                       y: xy[1]
47688                   };
47689               });
47690           });
47691
47692           processFaces(faces).then(function() {
47693               _sceneOptions = {
47694                   showFullscreenCtrl: false,
47695                   autoLoad: true,
47696                   compass: true,
47697                   northOffset: d.ca,
47698                   yaw: 0,
47699                   minHfov: minHfov,
47700                   maxHfov: maxHfov,
47701                   hfov: defaultHfov,
47702                   type: 'cubemap',
47703                   cubeMap: [
47704                       _dataUrlArray[0],
47705                       _dataUrlArray[1],
47706                       _dataUrlArray[2],
47707                       _dataUrlArray[3],
47708                       _dataUrlArray[4],
47709                       _dataUrlArray[5]
47710                   ]
47711               };
47712               response.resolve({status: 'ok'});
47713           });
47714
47715           return response.promise;
47716       },
47717
47718
47719       getSequenceKeyForBubble: function(d) {
47720           return d && d.sequenceKey;
47721       },
47722
47723
47724       /**
47725        * setStyles().
47726        */
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);
47733
47734               d3_selectAll('.sequence')
47735                   .classed('highlighted', false)
47736                   .classed('selected', false);
47737           }
47738
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; })) || [];
47743
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; })) || [];
47750
47751           // highlight sibling viewfields on either the selected or the hovered sequences
47752           var highlightedBubbleKeys = union(hoveredBubbleKeys, selectedBubbleKeys);
47753
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; });
47758
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; });
47762
47763           // update viewfields if needed
47764           d3_selectAll('.viewfield-group .viewfield')
47765               .attr('d', viewfieldPath);
47766
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';
47771               } else {
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';
47773               }
47774           }
47775
47776           return this;
47777       },
47778
47779       /**
47780        * cache().
47781        */
47782       cache: function () {
47783           return _ssCache;
47784       }
47785   };
47786
47787   var apibase$3 = 'https://taginfo.openstreetmap.org/api/4/',
47788       inflight$1 = {},
47789       popularKeys = {},
47790       taginfoCache = {},
47791       tag_sorts = {
47792           point: 'count_nodes',
47793           vertex: 'count_nodes',
47794           area: 'count_ways',
47795           line: 'count_ways'
47796       },
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'
47803       },
47804       tag_filters = {
47805           point: 'nodes',
47806           vertex: 'nodes',
47807           area: 'ways',
47808           line: 'ways'
47809       },
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'
47816       };
47817
47818
47819   function sets(params, n, o) {
47820       if (params.geometry && o[params.geometry]) {
47821           params[n] = o[params.geometry];
47822       }
47823       return params;
47824   }
47825
47826
47827   function setFilter(params) {
47828       return sets(params, 'filter', tag_filters);
47829   }
47830
47831
47832   function setSort(params) {
47833       return sets(params, 'sortname', tag_sorts);
47834   }
47835
47836
47837   function setSortMembers(params) {
47838       return sets(params, 'sortname', tag_sort_members);
47839   }
47840
47841
47842   function clean(params) {
47843       return omit(params, ['geometry', 'debounce']);
47844   }
47845
47846
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;
47851       };
47852   }
47853
47854
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);
47861       };
47862   }
47863
47864
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;
47870       };
47871   }
47872
47873
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;
47879       };
47880   }
47881
47882
47883   function valKey(d) {
47884       return {
47885           value: d.key,
47886           title: d.key
47887       };
47888   }
47889
47890
47891   function valKeyDescription(d) {
47892       return {
47893           value: d.value,
47894           title: d.description || d.value
47895       };
47896   }
47897
47898
47899   function roleKey(d) {
47900       return {
47901           value: d.role,
47902           title: d.role
47903       };
47904   }
47905
47906
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
47911           : 0;
47912   }
47913
47914
47915   var debouncedRequest = debounce(request$1, 500, { leading: false });
47916
47917   function request$1(url, params, exactMatch, callback, loaded) {
47918       if (inflight$1[url]) return;
47919
47920       if (checkCache(url, params, exactMatch, callback)) return;
47921
47922       inflight$1[url] = d3_json(url, function (err, data) {
47923           delete inflight$1[url];
47924           loaded(err, data);
47925       });
47926   }
47927
47928
47929   function checkCache(url, params, exactMatch, callback) {
47930       var rp = params.rp || 25,
47931           testQuery = params.query || '',
47932           testUrl = url;
47933
47934       do {
47935           var hit = taginfoCache[testUrl];
47936
47937           // exact match, or shorter match yielding fewer than max results (rp)
47938           if (hit && (url === testUrl || hit.length < rp)) {
47939               callback(null, hit);
47940               return true;
47941           }
47942
47943           // don't try to shorten the query
47944           if (exactMatch || !testQuery.length) return false;
47945
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);
47951
47952       return false;
47953   }
47954
47955
47956   var serviceTaginfo = {
47957
47958       init: function() {
47959           inflight$1 = {};
47960           taginfoCache = {};
47961           popularKeys = {};
47962
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) {
47968               if (err) return;
47969               data.forEach(function(d) {
47970                   if (d.value === 'opening_hours') return;  // exception
47971                   popularKeys[d.value] = true;
47972               });
47973           });
47974       },
47975
47976
47977       reset: function() {
47978           forEach(inflight$1, function(req) { req.abort(); });
47979           inflight$1 = {};
47980       },
47981
47982
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);
47987
47988           var url = apibase$3 + 'keys/all?' + utilQsString(params);
47989           doRequest(url, params, false, callback, function(err, d) {
47990               if (err) {
47991                   callback(err);
47992               } else {
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);
47997               }
47998           });
47999       },
48000
48001
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;
48007
48008           var url = apibase$3 + 'keys/all?' + utilQsString(params);
48009           doRequest(url, params, true, callback, function(err, d) {
48010               if (err) {
48011                   callback(err);
48012               } else {
48013                   var f = filterMultikeys(prefix);
48014                   var result = d.data.filter(f).map(valKey);
48015                   taginfoCache[url] = result;
48016                   callback(null, result);
48017               }
48018           });
48019       },
48020
48021
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, []);
48027               return;
48028           }
48029
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);
48033
48034           var url = apibase$3 + 'key/values?' + utilQsString(params);
48035           doRequest(url, params, false, callback, function(err, d) {
48036               if (err) {
48037                   callback(err);
48038               } else {
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);
48046
48047                   var result = d.data.filter(f).map(valKeyDescription);
48048                   taginfoCache[url] = result;
48049                   callback(null, result);
48050               }
48051           });
48052       },
48053
48054
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);
48060
48061           var url = apibase$3 + 'relation/roles?' + utilQsString(params);
48062           doRequest(url, params, true, callback, function(err, d) {
48063               if (err) {
48064                   callback(err);
48065               } else {
48066                   var f = filterRoles(geometry);
48067                   var result = d.data.filter(f).map(roleKey);
48068                   taginfoCache[url] = result;
48069                   callback(null, result);
48070               }
48071           });
48072       },
48073
48074
48075       docs: function(params, callback) {
48076           var doRequest = params.debounce ? debouncedRequest : request$1;
48077           params = clean(setSort(params));
48078
48079           var path = 'key/wiki_pages?';
48080           if (params.value) path = 'tag/wiki_pages?';
48081           else if (params.rtype) path = 'relation/wiki_pages?';
48082
48083           var url = apibase$3 + path + utilQsString(params);
48084           doRequest(url, params, true, callback, function(err, d) {
48085               if (err) {
48086                   callback(err);
48087               } else {
48088                   taginfoCache[url] = d.data;
48089                   callback(null, d.data);
48090               }
48091           });
48092       },
48093
48094
48095       apibase: function(_) {
48096           if (!arguments.length) return apibase$3;
48097           apibase$3 = _;
48098           return this;
48099       }
48100
48101   };
48102
48103   var endpoint = 'https://www.wikidata.org/w/api.php?';
48104
48105   var serviceWikidata = {
48106
48107       init: function() {},
48108       reset: function() {},
48109
48110
48111       // Given a Wikipedia language and article title, return an array of
48112       // corresponding Wikidata entities.
48113       itemsByTitle: function(lang, title, callback) {
48114           if (!title) {
48115               callback('', {});
48116               return;
48117           }
48118
48119           lang = lang || 'en';
48120           jsonpRequest(endpoint + utilQsString({
48121               action: 'wbgetentities',
48122               format: 'json',
48123               sites: lang.replace(/-/g, '_') + 'wiki',
48124               titles: title,
48125               languages: 'en', // shrink response by filtering to one language
48126               callback: '{callback}'
48127           }), function(data) {
48128               if (!data || data.error) {
48129                   callback('', {});
48130               } else {
48131                   callback(title, data.entities || {});
48132               }
48133           });
48134       }
48135
48136   };
48137
48138   var endpoint$1 = 'https://en.wikipedia.org/w/api.php?';
48139
48140   var serviceWikipedia = {
48141
48142       init: function() {},
48143       reset: function() {},
48144
48145
48146       search: function(lang, query, callback) {
48147           if (!query) {
48148               callback('', []);
48149               return;
48150           }
48151
48152           lang = lang || 'en';
48153           jsonpRequest(endpoint$1.replace('en', lang) +
48154               utilQsString({
48155                   action: 'query',
48156                   list: 'search',
48157                   srlimit: '10',
48158                   srinfo: 'suggestion',
48159                   format: 'json',
48160                   callback: '{callback}',
48161                   srsearch: query
48162               }), function(data) {
48163                   if (!data || !data.query || !data.query.search || data.error) {
48164                       callback('', []);
48165                   } else {
48166                       var results = data.query.search.map(function(d) { return d.title; });
48167                       callback(query, results);
48168                   }
48169               }
48170           );
48171       },
48172
48173
48174       suggestions: function(lang, query, callback) {
48175           if (!query) {
48176               callback('', []);
48177               return;
48178           }
48179
48180           lang = lang || 'en';
48181           jsonpRequest(endpoint$1.replace('en', lang) +
48182               utilQsString({
48183                   action: 'opensearch',
48184                   namespace: 0,
48185                   suggest: '',
48186                   format: 'json',
48187                   callback: '{callback}',
48188                   search: query
48189               }), function(data) {
48190                   if (!data || data.error) {
48191                       callback('', []);
48192                   } else {
48193                       callback(data[0], data[1] || []);
48194                   }
48195               }
48196           );
48197       },
48198
48199
48200       translations: function(lang, title, callback) {
48201           if (!title) {
48202               callback({});
48203               return;
48204           }
48205
48206           jsonpRequest(endpoint$1.replace('en', lang) +
48207               utilQsString({
48208                   action: 'query',
48209                   prop: 'langlinks',
48210                   format: 'json',
48211                   callback: '{callback}',
48212                   lllimit: 500,
48213                   titles: title
48214               }), function(data) {
48215                   if (!data || !data.query || !data.query.pages || data.error) {
48216                       callback({});
48217                   } else {
48218                       var list = data.query.pages[Object.keys(data.query.pages)[0]],
48219                           translations = {};
48220                       if (list && list.langlinks) {
48221                           list.langlinks.forEach(function(d) {
48222                               translations[d.lang] = d['*'];
48223                           });
48224                       }
48225                       callback(translations);
48226                   }
48227               }
48228           );
48229       }
48230
48231   };
48232
48233   var services = {
48234       geocoder: serviceNominatim,
48235       mapillary: serviceMapillary,
48236       openstreetcam: serviceOpenstreetcam,
48237       osm: serviceOsm,
48238       streetside: serviceStreetside,
48239       taginfo: serviceTaginfo,
48240       wikidata: serviceWikidata,
48241       wikipedia: serviceWikipedia
48242   };
48243
48244   var _isSaving = false;
48245
48246
48247   function modeSave$$1(context) {
48248       var mode = { id: 'save' };
48249       var keybinding = d3keybinding('modeSave');
48250
48251       var loading = uiLoading(context)
48252           .message(t('save.uploading'))
48253           .blocking(true);
48254
48255       var commit = uiCommit(context)
48256           .on('cancel', cancel)
48257           .on('save', save);
48258
48259       var _toCheck = [];
48260       var _toLoad = [];
48261       var _loaded = {};
48262       var _toLoadCount = 0;
48263       var _toLoadTotal = 0;
48264
48265       var _conflicts = [];
48266       var _errors = [];
48267       var _origChanges;
48268       var _location;
48269
48270
48271       function cancel(selectedID) {
48272           if (selectedID) {
48273               context.enter(modeSelect(context, [selectedID]));
48274           } else {
48275               context.enter(modeBrowse(context));
48276           }
48277       }
48278
48279
48280       function save(changeset, tryAgain, checkConflicts) {
48281           // Guard against accidentally entering save code twice - #4641
48282           if (_isSaving && !tryAgain) {
48283               return;
48284           }
48285
48286           var osm = context.connection();
48287           if (!osm) {
48288               cancel();
48289               return;
48290           }
48291
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) {
48296                   if (err) {
48297                       cancel();   // quit save mode..
48298                   } else {
48299                       save(changeset, tryAgain, checkConflicts);  // continue where we left off..
48300                   }
48301               });
48302               return;
48303           }
48304
48305           if (!_isSaving) {
48306               keybindingOff();
48307               context.container().call(loading);  // block input
48308               _isSaving = true;
48309           }
48310
48311           var history = context.history();
48312           var localGraph = context.graph();
48313           var remoteGraph = coreGraph$$1(history.base(), true);
48314
48315           _conflicts = [];
48316           _errors = [];
48317
48318           // Store original changes, in case user wants to download them as an .osc file
48319           _origChanges = history.changes(actionDiscardTags(history.difference()));
48320
48321           // First time, `history.perform` a no-op action.
48322           // Any conflict resolutions will be done as `history.replace`
48323           if (!tryAgain) {
48324               history.perform(actionNoop());
48325           }
48326
48327           // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
48328           if (!checkConflicts) {
48329               upload(changeset);
48330
48331           // Do the full (slow) conflict check..
48332           } else {
48333               var modified = filter(history.difference().summary(), { changeType: 'modified' });
48334               _toCheck = map$3(map$3(modified, 'entity'), 'id');
48335               _toLoad = withChildNodes(_toCheck, localGraph);
48336               _loaded = {};
48337               _toLoadCount = 0;
48338               _toLoadTotal = _toLoad.length;
48339
48340               if (_toCheck.length) {
48341                   showProgress(_toLoadCount, _toLoadTotal);
48342                   _toLoad.forEach(function(id) { _loaded[id] = false; });
48343                   osm.loadMultiple(_toLoad, loaded);
48344               } else {
48345                   upload(changeset);
48346               }
48347           }
48348
48349           return;
48350
48351
48352           function withChildNodes(ids, graph) {
48353               return uniq(reduce(ids, function(result, id) {
48354                   var entity = graph.entity(id);
48355                   if (entity.type === 'way') {
48356                       try {
48357                           var children = graph.childNodes(entity);
48358                           result.push.apply(result, map$3(filter(children, 'version'), 'id'));
48359                       } catch (err) {
48360                           /* eslint-disable no-console */
48361                           if (typeof console !== 'undefined') console.error(err);
48362                           /* eslint-enable no-console */
48363                       }
48364                   }
48365                   return result;
48366               }, clone(ids)));
48367           }
48368
48369
48370           // Reload modified entities into an alternate graph and check for conflicts..
48371           function loaded(err, result) {
48372               if (_errors.length) return;
48373
48374               if (err) {
48375                   _errors.push({
48376                       msg: err.message || err.responseText,
48377                       details: [ t('save.status_code', { code: err.status }) ]
48378                   });
48379                   showErrors();
48380
48381               } else {
48382                   var loadMore = [];
48383
48384                   result.data.forEach(function(entity) {
48385                       remoteGraph.replace(entity);
48386                       _loaded[entity.id] = true;
48387                       _toLoad = without(_toLoad, entity.id);
48388
48389                       if (!entity.visible) return;
48390
48391                       // Because loadMultiple doesn't download /full like loadEntity,
48392                       // need to also load children that aren't already being checked..
48393                       var i, id;
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;
48399                                   loadMore.push(id);
48400                               }
48401                           }
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;
48407                                   loadMore.push(id);
48408                               }
48409                           }
48410                       }
48411                   });
48412
48413                   _toLoadCount += result.data.length;
48414                   _toLoadTotal += loadMore.length;
48415                   showProgress(_toLoadCount, _toLoadTotal);
48416
48417                   if (loadMore.length) {
48418                       _toLoad.push.apply(_toLoad, loadMore);
48419                       osm.loadMultiple(loadMore, loaded);
48420                   }
48421
48422                   if (!_toLoad.length) {
48423                       detectConflicts();
48424                   }
48425               }
48426           }
48427
48428
48429           function detectConflicts() {
48430               function choice(id, text, action) {
48431                   return { id: id, text: text, action: function() { history.replace(action); } };
48432               }
48433               function formatUser(d) {
48434                   return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
48435               }
48436               function entityName(entity) {
48437                   return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
48438               }
48439
48440               function sameVersions(local$$1, remote) {
48441                   if (local$$1.version !== remote.version) return false;
48442
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;
48449                       }
48450                   }
48451
48452                   return true;
48453               }
48454
48455               _toCheck.forEach(function(id) {
48456                   var local$$1 = localGraph.entity(id);
48457                   var remote = remoteGraph.entity(id);
48458
48459                   if (sameVersions(local$$1, remote)) return;
48460
48461                   var action = actionMergeRemoteChanges;
48462                   var merge = action(id, localGraph, remoteGraph, formatUser);
48463
48464                   history.replace(merge);
48465
48466                   var mergeConflicts = merge.conflicts();
48467                   if (!mergeConflicts.length) return;  // merged safely
48468
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'));
48473
48474                   _conflicts.push({
48475                       id: id,
48476                       name: entityName(local$$1),
48477                       details: mergeConflicts,
48478                       chosen: 1,
48479                       choices: [
48480                           choice(id, keepMine, forceLocal),
48481                           choice(id, keepTheirs, forceRemote)
48482                       ]
48483                   });
48484               });
48485
48486               upload(changeset);
48487           }
48488       }
48489
48490
48491       function upload(changeset) {
48492           var osm = context.connection();
48493           if (!osm) {
48494               _errors.push({ msg: 'No OSM Service' });
48495           }
48496
48497           if (_conflicts.length) {
48498               _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
48499               showConflicts(changeset);
48500
48501           } else if (_errors.length) {
48502               showErrors();
48503
48504           } else {
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();
48512                   loading.close();
48513                   _isSaving = false;
48514                   context.flush();
48515                   cancel();
48516               }
48517           }
48518       }
48519
48520
48521       function uploadCallback(err, changeset) {
48522           if (err) {
48523               if (err.status === 409) {          // 409 Conflict
48524                   save(changeset, true, true);   // tryAgain = true, checkConflicts = true
48525               } else {
48526                   _errors.push({
48527                       msg: err.message || err.responseText,
48528                       details: [ t('save.status_code', { code: err.status }) ]
48529                   });
48530                   showErrors();
48531               }
48532
48533           } else {
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();
48539                   loading.close();
48540                   _isSaving = false;
48541                   context.flush();
48542               }, 2500);
48543           }
48544       }
48545
48546
48547       function showProgress(num, total) {
48548           var modal = context.container().select('.loading-modal .modal-section');
48549           var progress = modal.selectAll('.progress')
48550               .data([0]);
48551
48552           // enter/update
48553           progress.enter()
48554               .append('div')
48555               .attr('class', 'progress')
48556               .merge(progress)
48557               .text(t('save.conflict_progress', { num: num, total: total }));
48558       }
48559
48560
48561       function showConflicts(changeset) {
48562           var history = context.history();
48563           var selection$$1 = context.container()
48564               .select('#sidebar')
48565               .append('div')
48566               .attr('class','sidebar-component');
48567
48568           loading.close();
48569           _isSaving = false;
48570
48571           var ui = uiConflicts(context)
48572               .conflictList(_conflicts)
48573               .origChanges(_origChanges)
48574               .on('cancel', function() {
48575                   history.pop();
48576                   selection$$1.remove();
48577                   keybindingOn();
48578               })
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]));
48587                               }
48588                           }
48589                           history.replace(actionRevert(_conflicts[i].id));
48590                       }
48591                   }
48592
48593                   selection$$1.remove();
48594                   save(changeset, true, false);  // tryAgain = true, checkConflicts = false
48595               });
48596
48597           selection$$1.call(ui);
48598       }
48599
48600
48601       function showErrors() {
48602           keybindingOn();
48603           context.history().pop();
48604           loading.close();
48605           _isSaving = false;
48606
48607           var selection$$1 = uiConfirm(context.container());
48608           selection$$1
48609               .select('.modal-section.header')
48610               .append('h3')
48611               .text(t('save.error'));
48612
48613           addErrors(selection$$1, _errors);
48614           selection$$1.okButton();
48615       }
48616
48617
48618       function addErrors(selection$$1, data) {
48619           var message = selection$$1
48620               .select('.modal-section.message-text');
48621
48622           var items = message
48623               .selectAll('.error-container')
48624               .data(data);
48625
48626           var enter = items.enter()
48627               .append('div')
48628               .attr('class', 'error-container');
48629
48630           enter
48631               .append('a')
48632               .attr('class', 'error-description')
48633               .attr('href', '#')
48634               .classed('hide-toggle', true)
48635               .text(function(d) { return d.msg || t('save.unknown_error_details'); })
48636               .on('click', function() {
48637                   event.preventDefault();
48638
48639                   var error = select(this);
48640                   var detail = select(this.nextElementSibling);
48641                   var exp = error.classed('expanded');
48642
48643                   detail.style('display', exp ? 'none' : 'block');
48644                   error.classed('expanded', !exp);
48645               });
48646
48647           var details = enter
48648               .append('div')
48649               .attr('class', 'error-detail-container')
48650               .style('display', 'none');
48651
48652           details
48653               .append('ul')
48654               .attr('class', 'error-detail-list')
48655               .selectAll('li')
48656               .data(function(d) { return d.details || []; })
48657               .enter()
48658               .append('li')
48659               .attr('class', 'error-detail-item')
48660               .text(function(d) { return d; });
48661
48662           items.exit()
48663               .remove();
48664       }
48665
48666
48667       function success(changeset) {
48668           commit.reset();
48669
48670           var ui = uiSuccess$$1(context)
48671               .changeset(changeset)
48672               .location(_location)
48673               .on('cancel', function() { context.ui().sidebar.hide(); });
48674
48675           context.enter(modeBrowse(context).sidebar(ui));
48676       }
48677
48678
48679       function keybindingOn() {
48680           select(document)
48681               .call(keybinding.on('⎋', cancel, true));
48682       }
48683
48684
48685       function keybindingOff() {
48686           select(document)
48687               .call(keybinding.off);
48688       }
48689
48690
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() {
48694           _location = null;
48695           if (!services.geocoder) return;
48696
48697           services.geocoder.reverse(context.map().center(), function(err, result) {
48698               if (err || !result || !result.address) return;
48699
48700               var parts = [];
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);
48706
48707               _location = parts.join(', ');
48708           });
48709       }
48710
48711
48712       mode.enter = function() {
48713           function done() {
48714               context.ui().sidebar.show(commit);
48715           }
48716
48717           keybindingOn();
48718
48719           context.container().selectAll('#content')
48720               .attr('class', 'inactive');
48721
48722           var osm = context.connection();
48723           if (!osm) {
48724               cancel();
48725               return;
48726           }
48727
48728           if (osm.authenticated()) {
48729               done();
48730           } else {
48731               osm.authenticate(function(err) {
48732                   if (err) {
48733                       cancel();
48734                   } else {
48735                       done();
48736                   }
48737               });
48738           }
48739       };
48740
48741
48742       mode.exit = function() {
48743           _isSaving = false;
48744
48745           keybindingOff();
48746
48747           context.container().selectAll('#content')
48748               .attr('class', 'active');
48749
48750           context.ui().sidebar.hide();
48751       };
48752
48753       return mode;
48754   }
48755
48756   /* Built-in method references for those with the same name as other `lodash` methods. */
48757   var nativeMin$1 = Math.min;
48758
48759   /**
48760    * The base implementation of methods like `_.intersection`, without support
48761    * for iteratee shorthands, that accepts an array of arrays to inspect.
48762    *
48763    * @private
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.
48768    */
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,
48776         result = [];
48777
48778     while (othIndex--) {
48779       var array = arrays[othIndex];
48780       if (othIndex && iteratee) {
48781         array = arrayMap(array, baseUnary(iteratee));
48782       }
48783       maxLength = nativeMin$1(array.length, maxLength);
48784       caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
48785         ? new SetCache(othIndex && array)
48786         : undefined;
48787     }
48788     array = arrays[0];
48789
48790     var index = -1,
48791         seen = caches[0];
48792
48793     outer:
48794     while (++index < length && result.length < maxLength) {
48795       var value = array[index],
48796           computed = iteratee ? iteratee(value) : value;
48797
48798       value = (comparator || value !== 0) ? value : 0;
48799       if (!(seen
48800             ? cacheHas(seen, computed)
48801             : includes(result, computed, comparator)
48802           )) {
48803         othIndex = othLength;
48804         while (--othIndex) {
48805           var cache = caches[othIndex];
48806           if (!(cache
48807                 ? cacheHas(cache, computed)
48808                 : includes(arrays[othIndex], computed, comparator))
48809               ) {
48810             continue outer;
48811           }
48812         }
48813         if (seen) {
48814           seen.push(computed);
48815         }
48816         result.push(value);
48817       }
48818     }
48819     return result;
48820   }
48821
48822   /**
48823    * Casts `value` to an empty array if it's not an array like object.
48824    *
48825    * @private
48826    * @param {*} value The value to inspect.
48827    * @returns {Array|Object} Returns the cast array-like object.
48828    */
48829   function castArrayLikeObject(value) {
48830     return isArrayLikeObject(value) ? value : [];
48831   }
48832
48833   /**
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.
48838    *
48839    * @static
48840    * @memberOf _
48841    * @since 0.1.0
48842    * @category Array
48843    * @param {...Array} [arrays] The arrays to inspect.
48844    * @returns {Array} Returns the new array of intersecting values.
48845    * @example
48846    *
48847    * _.intersection([2, 1], [2, 3]);
48848    * // => [2]
48849    */
48850   var intersection = baseRest(function(arrays) {
48851     var mapped = arrayMap(arrays, castArrayLikeObject);
48852     return (mapped.length && mapped[0] === arrays[0])
48853       ? baseIntersection(mapped)
48854       : [];
48855   });
48856
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();
48861
48862       if (detected.os === 'mac') {
48863           return code;
48864       }
48865
48866       if (detected.os === 'win') {
48867           if (code === '⌘⇧Z') return 'Ctrl+Y';
48868       }
48869
48870       var result = '',
48871           replacements = {
48872               '⌘': 'Ctrl',
48873               '⇧': 'Shift',
48874               '⌥': 'Alt',
48875               '⌫': 'Backspace',
48876               '⌦': 'Delete'
48877           };
48878
48879       for (var i = 0; i < code.length; i++) {
48880           if (code[i] in replacements) {
48881               result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
48882           } else {
48883               result += code[i];
48884           }
48885       }
48886
48887       return result;
48888   };
48889
48890
48891   // return a display-focused string for a given keyboard code
48892   uiCmd.display = function(code) {
48893       if (code.length !== 1) return code;
48894
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'),
48910       };
48911
48912       return replacements[code] || code;
48913   };
48914
48915   var relatedParent;
48916
48917
48918   function modeSelect(context, selectedIDs) {
48919       var mode = {
48920           id: 'select',
48921           button: 'browse'
48922       };
48923
48924       var keybinding = d3keybinding('select');
48925       var timeout = null;
48926       var behaviors = [
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
48934       ];
48935       var inspector;
48936       var editMenu;
48937       var newFeature = false;
48938       var suppressMenu = true;
48939       var follow = false;
48940
48941
48942       var wrap = context.container()
48943           .select('.inspector-wrap');
48944
48945
48946       function singular() {
48947           if (selectedIDs.length === 1) {
48948               return context.hasEntity(selectedIDs[0]);
48949           }
48950       }
48951
48952
48953       function checkSelectedIDs() {
48954           var ids = [];
48955           if (Array.isArray(selectedIDs)) {
48956               ids = selectedIDs.filter(function(id) {
48957                   return context.hasEntity(id);
48958               });
48959           }
48960
48961           if (ids.length) {
48962               selectedIDs = ids;
48963           } else {
48964               context.enter(modeBrowse(context));
48965           }
48966           return !!ids.length;
48967       }
48968
48969
48970       // find the common parent ways for nextVertex, previousVertex
48971       function commonParents() {
48972           var graph = context.graph();
48973           var commonParents = [];
48974
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
48979               }
48980
48981               var currParents = map$3(graph.parentWays(entity), 'id');
48982               if (!commonParents.length) {
48983                   commonParents = currParents;
48984                   continue;
48985               }
48986
48987               commonParents = intersection(commonParents, currParents);
48988               if (!commonParents.length) {
48989                   return [];
48990               }
48991           }
48992
48993           return commonParents;
48994       }
48995
48996
48997       function singularParent() {
48998           var parents = commonParents();
48999           if (!parents || parents.length === 0) {
49000               relatedParent = null;
49001               return null;
49002           }
49003
49004           // relatedParent is used when we visit a vertex with multiple
49005           // parents, and we want to remember which parent line we started on.
49006
49007           if (parents.length === 1) {
49008               relatedParent = parents[0];  // remember this parent for later
49009               return relatedParent;
49010           }
49011
49012           if (parents.indexOf(relatedParent) !== -1) {
49013               return relatedParent;   // prefer the previously seen parent
49014           }
49015
49016           return parents[0];
49017       }
49018
49019
49020       function closeMenu() {
49021           if (editMenu) {
49022               context.surface().call(editMenu.close);
49023           }
49024       }
49025
49026
49027       function positionMenu() {
49028           if (!editMenu) { return; }
49029
49030           var entity = singular();
49031           if (entity && context.geometry(entity.id) === 'relation') {
49032               suppressMenu = true;
49033           } else {
49034               var point$$1 = context.mouse();
49035               var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
49036
49037               if (point$$1 && geoPointInPolygon(point$$1, viewport)) {
49038                   editMenu.center(point$$1);
49039               } else {
49040                   suppressMenu = true;
49041               }
49042           }
49043       }
49044
49045
49046       function showMenu() {
49047           closeMenu();
49048           if (editMenu) {
49049               context.surface().call(editMenu);
49050           }
49051       }
49052
49053
49054       function toggleMenu() {
49055           // deprecation warning - Radial Menu to be removed in iD v3
49056           if (select('.edit-menu, .radial-menu').empty()) {
49057               positionMenu();
49058               showMenu();
49059           } else {
49060               closeMenu();
49061           }
49062       }
49063
49064
49065       mode.selectedIDs = function() {
49066           return selectedIDs;
49067       };
49068
49069
49070       mode.reselect = function() {
49071           if (!checkSelectedIDs()) return;
49072
49073           var surfaceNode = context.surface().node();
49074           if (surfaceNode.focus) {   // FF doesn't support it
49075               surfaceNode.focus();
49076           }
49077
49078           positionMenu();
49079           if (!suppressMenu) {
49080               showMenu();
49081           }
49082       };
49083
49084
49085       mode.newFeature = function(_) {
49086           if (!arguments.length) return newFeature;
49087           newFeature = _;
49088           return mode;
49089       };
49090
49091
49092       mode.suppressMenu = function(_) {
49093           if (!arguments.length) return suppressMenu;
49094           suppressMenu = _;
49095           return mode;
49096       };
49097
49098
49099       mode.follow = function(_) {
49100           if (!arguments.length) return follow;
49101           follow = _;
49102           return mode;
49103       };
49104
49105
49106       mode.enter = function() {
49107
49108           function update() {
49109               closeMenu();
49110               checkSelectedIDs();
49111           }
49112
49113
49114           function dblclick() {
49115               var target = select(event.target);
49116
49117               var datum = target.datum();
49118               var entity = datum && datum.properties && datum.properties.entity;
49119               if (!entity) return;
49120
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];
49125
49126                   context.perform(
49127                       actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
49128                       t('operations.add.annotation.vertex')
49129                   );
49130
49131                   event.preventDefault();
49132                   event.stopPropagation();
49133
49134               } else if (entity.type === 'midpoint') {
49135                   context.perform(
49136                       actionAddMidpoint({loc: entity.loc, edge: entity.edge}, osmNode()),
49137                       t('operations.add.annotation.vertex'));
49138
49139                   event.preventDefault();
49140                   event.stopPropagation();
49141               }
49142           }
49143
49144
49145           function selectElements(drawn) {
49146               if (!checkSelectedIDs()) return;
49147
49148               var surface = context.surface();
49149               var entity = singular();
49150
49151               if (entity && context.geometry(entity.id) === 'relation') {
49152                   suppressMenu = true;
49153                   return;
49154               }
49155
49156               surface.selectAll('.related')
49157                   .classed('related', false);
49158
49159               singularParent();
49160               if (relatedParent) {
49161                   surface.selectAll(utilEntitySelector([relatedParent]))
49162                       .classed('related', true);
49163               }
49164
49165               var selection$$1 = context.surface()
49166                   .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
49167
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));
49174                   }
49175               } else {
49176                   selection$$1
49177                       .classed('selected', true);
49178               }
49179           }
49180
49181
49182           function esc() {
49183               context.enter(modeBrowse(context));
49184           }
49185
49186
49187           function firstVertex() {
49188               event.preventDefault();
49189               var entity = singular();
49190               var parent = singularParent();
49191               var way;
49192
49193               if (entity && entity.type === 'way') {
49194                   way = entity;
49195               } else if (parent) {
49196                   way = context.entity(parent);
49197               }
49198
49199               if (way) {
49200                   context.enter(
49201                       modeSelect(context, [way.first()]).follow(true)
49202                   );
49203               }
49204           }
49205
49206
49207           function lastVertex() {
49208               event.preventDefault();
49209               var entity = singular();
49210               var parent = singularParent();
49211               var way;
49212
49213               if (entity && entity.type === 'way') {
49214                   way = entity;
49215               } else if (parent) {
49216                   way = context.entity(parent);
49217               }
49218
49219               if (way) {
49220                   context.enter(
49221                       modeSelect(context, [way.last()]).follow(true)
49222                   );
49223               }
49224           }
49225
49226
49227           function previousVertex() {
49228               event.preventDefault();
49229               var parent = singularParent();
49230               if (!parent) return;
49231
49232               var way = context.entity(parent);
49233               var length = way.nodes.length;
49234               var curr = way.nodes.indexOf(selectedIDs[0]);
49235               var index = -1;
49236
49237               if (curr > 0) {
49238                   index = curr - 1;
49239               } else if (way.isClosed()) {
49240                   index = length - 2;
49241               }
49242
49243               if (index !== -1) {
49244                   context.enter(
49245                       modeSelect(context, [way.nodes[index]]).follow(true)
49246                   );
49247               }
49248           }
49249
49250
49251           function nextVertex() {
49252               event.preventDefault();
49253               var parent = singularParent();
49254               if (!parent) return;
49255
49256               var way = context.entity(parent);
49257               var length = way.nodes.length;
49258               var curr = way.nodes.indexOf(selectedIDs[0]);
49259               var index = -1;
49260
49261               if (curr < length - 1) {
49262                   index = curr + 1;
49263               } else if (way.isClosed()) {
49264                   index = 0;
49265               }
49266
49267               if (index !== -1) {
49268                   context.enter(
49269                       modeSelect(context, [way.nodes[index]]).follow(true)
49270                   );
49271               }
49272           }
49273
49274
49275           function nextParent() {
49276               event.preventDefault();
49277               var parents = uniq(commonParents());
49278               if (!parents || parents.length < 2) return;
49279
49280               var index = parents.indexOf(relatedParent);
49281               if (index < 0 || index > parents.length - 2) {
49282                   relatedParent = parents[0];
49283               } else {
49284                   relatedParent = parents[index + 1];
49285               }
49286
49287               var surface = context.surface();
49288               surface.selectAll('.related')
49289                   .classed('related', false);
49290
49291               if (relatedParent) {
49292                   surface.selectAll(utilEntitySelector([relatedParent]))
49293                       .classed('related', true);
49294               }
49295           }
49296
49297
49298           if (!checkSelectedIDs()) return;
49299
49300           var operations = without(values$1(Operations), operationDelete)
49301               .map(function(o) { return o(selectedIDs, context); })
49302               .filter(function(o) { return o.available(); });
49303
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));
49309           } else {
49310               operations.push(operationDelete(selectedIDs, context));
49311           }
49312
49313           operations.forEach(function(operation) {
49314               if (operation.behavior) {
49315                   behaviors.push(operation.behavior);
49316               }
49317           });
49318
49319           behaviors.forEach(function(behavior) {
49320               context.install(behavior);
49321           });
49322
49323           keybinding
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);
49331
49332           select(document)
49333               .call(keybinding);
49334
49335
49336           // deprecation warning - Radial Menu to be removed in iD v3
49337           editMenu = isRadialMenu
49338               ? uiRadialMenu(context, operations)
49339               : uiEditMenu(context, operations);
49340
49341           context.ui().sidebar
49342               .select(singular() ? singular().id : null, newFeature);
49343
49344           context.history()
49345               .on('undone.select', update)
49346               .on('redone.select', update);
49347
49348           context.map()
49349               .on('move.select', closeMenu)
49350               .on('drawn.select', selectElements);
49351
49352           context.surface()
49353               .on('dblclick.select', dblclick);
49354
49355
49356           selectElements();
49357
49358           if (selectedIDs.length > 1) {
49359               var entities = uiSelectionList(context, selectedIDs);
49360               context.ui().sidebar.show(entities);
49361           }
49362
49363           if (follow) {
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));
49369               });
49370
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
49375           }
49376
49377           timeout = window.setTimeout(function() {
49378               positionMenu();
49379               if (!suppressMenu) {
49380                   showMenu();
49381               }
49382           }, 270);  /* after any centerEase completes */
49383
49384       };
49385
49386
49387       mode.exit = function() {
49388           if (timeout) window.clearTimeout(timeout);
49389           if (inspector) wrap.call(inspector.close);
49390
49391           behaviors.forEach(function(behavior) {
49392               context.uninstall(behavior);
49393           });
49394
49395           keybinding.off();
49396           closeMenu();
49397           editMenu = undefined;
49398
49399           context.history()
49400               .on('undone.select', null)
49401               .on('redone.select', null);
49402
49403           var surface = context.surface();
49404
49405           surface
49406               .on('dblclick.select', null);
49407
49408           surface
49409               .selectAll('.selected')
49410               .classed('selected', false);
49411
49412           surface
49413               .selectAll('.related')
49414               .classed('related', false);
49415
49416           context.map().on('drawn.select', null);
49417           context.ui().sidebar.hide();
49418       };
49419
49420
49421       return mode;
49422   }
49423
49424   function behaviorAddWay(context) {
49425       var dispatch$$1 = dispatch('start', 'startFromWay', 'startFromNode'),
49426           draw = behaviorDraw(context);
49427
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);
49434
49435           context.map()
49436               .dblclickEnable(false);
49437
49438           surface.call(draw);
49439       };
49440
49441
49442       addWay.off = function(surface) {
49443           surface.call(draw.off);
49444       };
49445
49446
49447       addWay.cancel = function() {
49448           window.setTimeout(function() {
49449               context.map().dblclickEnable(true);
49450           }, 1000);
49451
49452           context.enter(modeBrowse(context));
49453       };
49454
49455
49456       addWay.tail = function(text) {
49457           draw.tail(text);
49458           return addWay;
49459       };
49460
49461
49462       return utilRebind(addWay, dispatch$$1, 'on');
49463   }
49464
49465   function behaviorBreathe() {
49466       var duration = 800,
49467           steps = 4,
49468           selector$$1 = '.selected.shadow, .selected .shadow',
49469           selected = select(null),
49470           classed = '',
49471           params = {},
49472           done = false,
49473           timer$$1;
49474
49475
49476       function ratchetyInterpolator(a, b, steps, units) {
49477           a = parseFloat(a);
49478           b = parseFloat(b);
49479           var sample = quantize()
49480               .domain([0, 1])
49481               .range(d3_quantize(interpolateNumber(a, b), steps));
49482
49483           return function(t) {
49484               return String(sample(t)) + (units || '');
49485           };
49486       }
49487
49488
49489       function reset(selection$$1) {
49490           selection$$1
49491               .style('stroke-opacity', null)
49492               .style('stroke-width', null)
49493               .style('fill-opacity', null)
49494               .style('r', null);
49495       }
49496
49497
49498       function setAnimationParams(transition, fromTo) {
49499           var toFrom = (fromTo === 'from' ? 'to' : 'from');
49500
49501           transition
49502               .styleTween('stroke-opacity', function(d) {
49503                   return ratchetyInterpolator(
49504                       params[d.id][toFrom].opacity,
49505                       params[d.id][fromTo].opacity,
49506                       steps
49507                   );
49508               })
49509               .styleTween('stroke-width', function(d) {
49510                   return ratchetyInterpolator(
49511                       params[d.id][toFrom].width,
49512                       params[d.id][fromTo].width,
49513                       steps,
49514                       'px'
49515                   );
49516               })
49517               .styleTween('fill-opacity', function(d) {
49518                   return ratchetyInterpolator(
49519                       params[d.id][toFrom].opacity,
49520                       params[d.id][fromTo].opacity,
49521                       steps
49522                   );
49523               })
49524               .styleTween('r', function(d) {
49525                   return ratchetyInterpolator(
49526                       params[d.id][toFrom].width,
49527                       params[d.id][fromTo].width,
49528                       steps,
49529                       'px'
49530                   );
49531               });
49532       }
49533
49534
49535       function calcAnimationParams(selection$$1) {
49536           selection$$1
49537               .call(reset)
49538               .each(function(d) {
49539                   var s = select(this),
49540                       tag = s.node().tagName,
49541                       p = {'from': {}, 'to': {}},
49542                       opacity, width;
49543
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);
49548                   } else {
49549                       opacity = parseFloat(s.style('stroke-opacity') || 0.7);
49550                       width = parseFloat(s.style('stroke-width') || 10);
49551                   }
49552
49553                   // calculate from/to interpolation params..
49554                   p.tag = tag;
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);
49559                   params[d.id] = p;
49560               });
49561       }
49562
49563
49564       function run(surface, fromTo) {
49565           var toFrom = (fromTo === 'from' ? 'to' : 'from'),
49566               currSelected = surface.selectAll(selector$$1),
49567               currClassed = surface.attr('class');
49568
49569           if (done || currSelected.empty()) {
49570               selected.call(reset);
49571               return;
49572           }
49573
49574           if (!isEqual(currSelected.data(), selected.data()) || currClassed !== classed) {
49575               selected.call(reset);
49576               classed = currClassed;
49577               selected = currSelected.call(calcAnimationParams);
49578           }
49579
49580           selected
49581               .transition()
49582               .duration(duration)
49583               .call(setAnimationParams, fromTo)
49584               .on('end', function() {
49585                   surface.call(run, toFrom);
49586               });
49587       }
49588
49589
49590       var breathe = function(surface) {
49591           done = false;
49592           timer$$1 = timer(function() {
49593               // wait for elements to actually become selected
49594               if (surface.selectAll(selector$$1).empty()) {
49595                   return false;
49596               }
49597
49598               surface.call(run, 'from');
49599               timer$$1.stop();
49600               return true;
49601           }, 20);
49602       };
49603
49604
49605       breathe.off = function() {
49606           done = true;
49607           if (timer$$1) {
49608               timer$$1.stop();
49609           }
49610           selected
49611               .interrupt()
49612               .call(reset);
49613       };
49614
49615
49616       return breathe;
49617   }
49618
49619   function behaviorCopy(context) {
49620       var keybinding = d3keybinding('copy');
49621
49622
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; }));
49627       }
49628
49629
49630       function getDescendants(id, graph, descendants) {
49631           var entity = graph.entity(id),
49632               i, children;
49633
49634           descendants = descendants || {};
49635
49636           if (entity.type === 'relation') {
49637               children = map$3(entity.members, 'id');
49638           } else if (entity.type === 'way') {
49639               children = entity.nodes;
49640           } else {
49641               children = [];
49642           }
49643
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);
49648               }
49649           }
49650
49651           return descendants;
49652       }
49653
49654
49655       function doCopy() {
49656           if (!getSelectionText()) event.preventDefault();
49657
49658           var graph = context.graph(),
49659               selected = groupEntities(context.selectedIDs(), graph),
49660               canCopy = [],
49661               skip = {},
49662               i, entity;
49663
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);
49669               }
49670           }
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);
49676               }
49677           }
49678           for (i = 0; i < selected.node.length; i++) {
49679               entity = selected.node[i];
49680               if (!skip[entity.id]) {
49681                   canCopy.push(entity.id);
49682               }
49683           }
49684
49685           context.copyIDs(canCopy);
49686       }
49687
49688
49689       function copy() {
49690           keybinding.on(uiCmd('⌘C'), doCopy);
49691           select(document).call(keybinding);
49692           return copy;
49693       }
49694
49695       function getSelectionText() {
49696           return window.getSelection().toString();
49697       }
49698
49699       copy.off = function() {
49700           select(document).call(keybinding.off);
49701       };
49702
49703
49704       return copy;
49705   }
49706
49707   /*
49708       `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
49709
49710       * The `origin` function is expected to return an [x, y] tuple rather than an
49711         {x, y} object.
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.
49720    */
49721
49722   function behaviorDrag() {
49723       var dispatch$$1 = dispatch('start', 'move', 'end');
49724       var _origin = null;
49725       var _selector = '';
49726       var _event;
49727       var _target;
49728       var _surface;
49729
49730
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);
49738               };
49739           };
49740
49741
49742       function d3_eventCancel() {
49743           event.stopPropagation();
49744           event.preventDefault();
49745       }
49746
49747
49748       function eventOf(thiz, argumentz) {
49749           return function(e1) {
49750               e1.target = drag;
49751               customEvent(e1, dispatch$$1.apply, dispatch$$1, [e1.type, thiz, argumentz]);
49752           };
49753       }
49754
49755
49756       function dragstart() {
49757           _target = this;
49758           _event = eventOf(_target, arguments);
49759
49760           var eventTarget = event.target;
49761           var touchId = event.touches ? event.changedTouches[0].identifier : null;
49762           var offset;
49763           var startOrigin = point$$1();
49764           var started = false;
49765           var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
49766
49767           select(window)
49768               .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
49769               .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
49770
49771           if (_origin) {
49772               offset = _origin.apply(_target, arguments);
49773               offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
49774           } else {
49775               offset = [0, 0];
49776           }
49777
49778           if (touchId === null) {
49779               event.stopPropagation();
49780           }
49781
49782
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;
49787               })[0] : mouse(p);
49788           }
49789
49790
49791           function dragmove() {
49792               var p = point$$1();
49793               var dx = p[0] - startOrigin[0];
49794               var dy = p[1] - startOrigin[1];
49795
49796               if (dx === 0 && dy === 0)
49797                   return;
49798
49799               startOrigin = p;
49800               d3_eventCancel();
49801
49802               if (!started) {
49803                   started = true;
49804                   _event({ type: 'start' });
49805               } else {
49806                   _event({
49807                       type: 'move',
49808                       point: [p[0] + offset[0],  p[1] + offset[1]],
49809                       delta: [dx, dy]
49810                   });
49811               }
49812           }
49813
49814
49815           function dragend() {
49816               if (started) {
49817                   _event({ type: 'end' });
49818
49819                   d3_eventCancel();
49820                   if (event.target === eventTarget) {
49821                       select(window)
49822                           .on('click.drag', click, true);
49823                   }
49824               }
49825
49826               select(window)
49827                   .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
49828                   .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
49829
49830               selectEnable();
49831           }
49832
49833
49834           function click() {
49835               d3_eventCancel();
49836               select(window)
49837                   .on('click.drag', null);
49838           }
49839       }
49840
49841
49842       function drag(selection$$1) {
49843           var matchesSelector = utilPrefixDOMProperty('matchesSelector');
49844           var delegate = dragstart;
49845
49846           if (_selector) {
49847               delegate = function() {
49848                   var root = this;
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);
49855                       }
49856                   }
49857               };
49858           }
49859
49860           selection$$1
49861               .on('mousedown.drag' + _selector, delegate)
49862               .on('touchstart.drag' + _selector, delegate);
49863       }
49864
49865
49866       drag.off = function(selection$$1) {
49867           selection$$1
49868               .on('mousedown.drag' + _selector, null)
49869               .on('touchstart.drag' + _selector, null);
49870       };
49871
49872
49873       drag.selector = function(_) {
49874           if (!arguments.length) return _selector;
49875           _selector = _;
49876           return drag;
49877       };
49878
49879
49880       drag.origin = function (_) {
49881           if (!arguments.length) return _origin;
49882           _origin = _;
49883           return drag;
49884       };
49885
49886
49887       drag.cancel = function() {
49888           select(window)
49889               .on('mousemove.drag', null)
49890               .on('mouseup.drag', null);
49891           return drag;
49892       };
49893
49894
49895       drag.target = function() {
49896           if (!arguments.length) return _target;
49897           _target = arguments[0];
49898           _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
49899           return drag;
49900       };
49901
49902
49903       drag.surface = function() {
49904           if (!arguments.length) return _surface;
49905           _surface = arguments[0];
49906           return drag;
49907       };
49908
49909
49910       return utilRebind(drag, dispatch$$1, 'on');
49911   }
49912
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)
49918       );
49919       var behavior = behaviorDraw(context);
49920       var _tempEdits = 0;
49921
49922       var end = osmNode({ loc: context.map().mouseCoordinates() });
49923
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);
49927       _tempEdits++;
49928
49929       // Add the drawing node to the graph.
49930       // We must make sure to remove this edit later.
49931       context.perform(_actionAddDrawNode());
49932       _tempEdits++;
49933
49934
49935
49936       function keydown() {
49937           if (event.keyCode === d3keybinding.modifierCodes.alt) {
49938               if (context.surface().classed('nope')) {
49939                   context.surface()
49940                       .classed('nope-suppressed', true);
49941               }
49942               context.surface()
49943                   .classed('nope', false)
49944                   .classed('nope-disabled', true);
49945           }
49946       }
49947
49948
49949       function keyup() {
49950           if (event.keyCode === d3keybinding.modifierCodes.alt) {
49951               if (context.surface().classed('nope-suppressed')) {
49952                   context.surface()
49953                       .classed('nope', true);
49954               }
49955               context.surface()
49956                   .classed('nope-suppressed', false)
49957                   .classed('nope-disabled', false);
49958           }
49959       }
49960
49961
49962       // related code
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);
49968
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();
49972
49973           if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
49974               loc = targetLoc;
49975
49976           } else if (targetNodes) {   // snap to way - a line target with `.nodes`
49977               var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
49978               if (choice) {
49979                   loc = choice.loc;
49980               }
49981           }
49982
49983           context.replace(actionMoveNode(end.id, loc));
49984           end = context.entity(end.id);
49985           checkGeometry(false);
49986       }
49987
49988
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);
49995
49996           if (nopeDisabled) {
49997               context.surface()
49998                   .classed('nope', false)
49999                   .classed('nope-suppressed', isInvalid);
50000           } else {
50001               context.surface()
50002                   .classed('nope', isInvalid)
50003                   .classed('nope-suppressed', false);
50004           }
50005       }
50006
50007
50008       function isInvalidGeometry(entity, graph, finishDraw) {
50009           var parents = graph.parentWays(entity);
50010
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); });
50014               
50015               if (origWay.isClosed()) { // Check if Area
50016                   if (finishDraw) {
50017                       nodes.splice(-2, 1);
50018                       entity = nodes[nodes.length-2];
50019                   } else {
50020                       nodes.pop();
50021                   }
50022               } else { // Line
50023                   if (finishDraw) {
50024                       nodes.pop();
50025                   }
50026               }
50027
50028               if (geoHasSelfIntersections(nodes, entity.id)) {
50029                   return true;
50030               }
50031           }
50032
50033           return false;
50034       }
50035
50036
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.
50040           context.pop(2);
50041           _tempEdits = 0;
50042
50043           if (context.hasEntity(wayId)) {
50044               context.enter(mode);
50045           } else {
50046               context.enter(modeBrowse(context));
50047           }
50048       }
50049
50050
50051       function setActiveElements() {
50052           context.surface().selectAll('.' + end.id)
50053               .classed('active', true);
50054       }
50055
50056
50057       var drawWay = function(surface) {
50058           behavior
50059               .on('move', move)
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);
50066
50067           select(window)
50068               .on('keydown.drawWay', keydown)
50069               .on('keyup.drawWay', keyup);
50070
50071           context.map()
50072               .dblclickEnable(false)
50073               .on('drawn.draw', setActiveElements);
50074
50075           setActiveElements();
50076
50077           surface.call(behavior);
50078
50079           context.history()
50080               .on('undone.draw', undone);
50081       };
50082
50083
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.
50088           if (_tempEdits) {
50089               context.pop(_tempEdits);
50090               while (context.graph() !== startGraph) {
50091                   context.pop();
50092               }
50093           }
50094
50095           context.map()
50096               .on('drawn.draw', null);
50097
50098           surface.call(behavior.off)
50099               .selectAll('.active')
50100               .classed('active', false);
50101
50102           surface
50103               .classed('nope', false)
50104               .classed('nope-suppressed', false)
50105               .classed('nope-disabled', false);
50106
50107           select(window)
50108               .on('keydown.hover', null)
50109               .on('keyup.hover', null);
50110
50111           context.history()
50112               .on('undone.draw', null);
50113       };
50114
50115
50116       function _actionAddDrawNode() {
50117           return function(graph) {
50118               return graph
50119                   .replace(end)
50120                   .replace(origWay.addNode(end.id, index));
50121           };
50122       }
50123
50124
50125       function _actionReplaceDrawNode(newNode) {
50126           return function(graph) {
50127               return graph
50128                   .replace(origWay.addNode(newNode.id, index))
50129                   .remove(end);
50130           };
50131       }
50132
50133
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
50138           }
50139
50140           context.pop(_tempEdits);
50141           _tempEdits = 0;
50142
50143           context.perform(
50144               _actionAddDrawNode(),
50145               annotation
50146           );
50147
50148           checkGeometry(false);   // finishDraw = false
50149           context.enter(mode);
50150       };
50151
50152
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
50157           }
50158
50159           context.pop(_tempEdits);
50160           _tempEdits = 0;
50161
50162           context.perform(
50163               _actionAddDrawNode(),
50164               actionAddMidpoint({ loc: loc, edge: edge }, end),
50165               annotation
50166           );
50167
50168           checkGeometry(false);   // finishDraw = false
50169           context.enter(mode);
50170       };
50171
50172
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
50177           }
50178
50179           context.pop(_tempEdits);
50180           _tempEdits = 0;
50181
50182           context.perform(
50183               _actionReplaceDrawNode(node),
50184               annotation
50185           );
50186
50187           checkGeometry(false);   // finishDraw = false
50188           context.enter(mode);
50189       };
50190
50191
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
50199           }
50200
50201           context.pop(_tempEdits);
50202           _tempEdits = 0;
50203
50204           var way = context.hasEntity(wayId);
50205           if (!way || way.isDegenerate()) {
50206               drawWay.cancel();
50207               return;
50208           }
50209
50210           window.setTimeout(function() {
50211               context.map().dblclickEnable(true);
50212           }, 1000);
50213
50214           context.enter(modeSelect(context, [wayId]).newFeature(true));
50215       };
50216
50217
50218       // Cancel the draw operation, delete everything, and return to browse mode.
50219       drawWay.cancel = function() {
50220           context.pop(_tempEdits);
50221           _tempEdits = 0;
50222
50223           while (context.graph() !== startGraph) {
50224               context.pop();
50225           }
50226
50227           window.setTimeout(function() {
50228               context.map().dblclickEnable(true);
50229           }, 1000);
50230
50231           context.surface()
50232               .classed('nope', false)
50233               .classed('nope-disabled', false)
50234               .classed('nope-suppressed', false);
50235
50236           context.enter(modeBrowse(context));
50237       };
50238
50239
50240       drawWay.activeID = function() {
50241           if (!arguments.length) return end.id;
50242           // no assign
50243           return drawWay;
50244       };
50245
50246
50247       drawWay.tail = function(text) {
50248           behavior.tail(text);
50249           return drawWay;
50250       };
50251
50252
50253       return drawWay;
50254   }
50255
50256   function behaviorHash(context) {
50257       var s0 = null; // cached window.location.hash
50258       var lat = 90 - 1e-8; // allowable latitude range
50259
50260
50261       var parser = function(map, s) {
50262           var q = utilStringQs(s);
50263           var args = (q.map || '').split('/').map(Number);
50264
50265           if (args.length < 3 || args.some(isNaN)) {
50266               return true; // replace bogus hash
50267
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]]),
50271                   maxdist = 500;
50272
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));
50277               }
50278
50279               map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
50280           }
50281       };
50282
50283
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']
50290           );
50291           var newParams = {};
50292
50293           delete q.id;
50294           var selected = context.selectedIDs().filter(function(id) {
50295               return !context.entity(id).isNew();
50296           });
50297           if (selected.length) {
50298               newParams.id = selected.join(',');
50299           }
50300
50301           newParams.map = zoom.toFixed(2) +
50302               '/' + center[1].toFixed(precision) +
50303               '/' + center[0].toFixed(precision);
50304
50305           return '#' + utilQsString(assign(q, newParams), true);
50306       };
50307
50308
50309       function update() {
50310           if (context.inIntro()) return;
50311           var s1 = formatter(context.map());
50312           if (s0 !== s1) {
50313               window.location.replace(s0 = s1);  // don't recenter the map!
50314           }
50315       }
50316
50317
50318       var throttledUpdate = throttle(update, 500);
50319
50320
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
50325           }
50326       }
50327
50328
50329       function hash() {
50330           context.map()
50331               .on('move.hash', throttledUpdate);
50332
50333           context
50334               .on('enter.hash', throttledUpdate);
50335
50336           select(window)
50337               .on('hashchange.hash', hashchange);
50338
50339           if (window.location.hash) {
50340
50341               var q = utilStringQs(window.location.hash.substring(1));
50342
50343               if (q.id) {
50344                   context.zoomToEntity(q.id.split(',')[0], !q.map);
50345               }
50346
50347               if (q.comment) {
50348                   context.storage('comment', q.comment);
50349                   context.storage('commentDate', Date.now());
50350               }
50351
50352               if (q.source) {
50353                   context.storage('source', q.source);
50354                   context.storage('commentDate', Date.now());
50355               }
50356
50357               if (q.hashtags) {
50358                   context.storage('hashtags', q.hashtags);
50359               }
50360
50361               if (q.walkthrough === 'true') {
50362                   hash.startWalkthrough = true;
50363               }
50364
50365               hashchange();
50366
50367               if (q.map) {
50368                   hash.hadHash = true;
50369               }
50370           }
50371       }
50372
50373
50374       hash.off = function() {
50375           throttledUpdate.cancel();
50376
50377           context.map()
50378               .on('move.hash', null);
50379
50380           context
50381               .on('enter.hash', null);
50382
50383           select(window)
50384               .on('hashchange.hash', null);
50385
50386           window.location.hash = '';
50387       };
50388
50389
50390       return hash;
50391   }
50392
50393   function behaviorLasso(context) {
50394
50395       var behavior = function(selection$$1) {
50396           var lasso;
50397
50398
50399           function mousedown() {
50400               var button = 0;  // left
50401               if (event.button === button && event.shiftKey === true) {
50402                   lasso = null;
50403
50404                   select(window)
50405                       .on('mousemove.lasso', mousemove)
50406                       .on('mouseup.lasso', mouseup);
50407
50408                   event.stopPropagation();
50409               }
50410           }
50411
50412
50413           function mousemove() {
50414               if (!lasso) {
50415                   lasso = uiLasso(context);
50416                   context.surface().call(lasso);
50417               }
50418
50419               lasso.p(context.mouse());
50420           }
50421
50422
50423           function normalize(a, b) {
50424               return [
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])]];
50427           }
50428
50429
50430           function lassoed() {
50431               if (!lasso) return [];
50432
50433               var graph = context.graph(),
50434                   bounds = lasso.extent().map(context.projection.invert),
50435                   extent = geoExtent$$1(normalize(bounds[0], bounds[1]));
50436
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));
50441               }), 'id');
50442           }
50443
50444
50445           function mouseup() {
50446               select(window)
50447                   .on('mousemove.lasso', null)
50448                   .on('mouseup.lasso', null);
50449
50450               if (!lasso) return;
50451
50452               var ids = lassoed();
50453               lasso.close();
50454
50455               if (ids.length) {
50456                   context.enter(modeSelect(context, ids));
50457               }
50458           }
50459
50460           selection$$1
50461               .on('mousedown.lasso', mousedown);
50462       };
50463
50464
50465       behavior.off = function(selection$$1) {
50466           selection$$1.on('mousedown.lasso', null);
50467       };
50468
50469
50470       return behavior;
50471   }
50472
50473   /* Creates a keybinding behavior for an operation */
50474   function behaviorOperation() {
50475       var _operation, keybinding;
50476
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();
50483                   var flash;
50484
50485                   if (disabled) {
50486                       flash = uiFlash()
50487                           .duration(4000)
50488                           .iconName('#iD-operation-' + _operation.id)
50489                           .iconClass('operation disabled')
50490                           .text(_operation.tooltip);
50491
50492                       flash();
50493
50494                   } else {
50495                       flash = uiFlash()
50496                           .duration(2000)
50497                           .iconName('#iD-operation-' + _operation.id)
50498                           .iconClass('operation')
50499                           .text(_operation.annotation() || _operation.title);
50500
50501                       flash();
50502                       _operation();
50503                   }
50504               });
50505
50506               select(document).call(keybinding);
50507           }
50508
50509           return behavior;
50510       };
50511
50512
50513       behavior.off = function() {
50514           if (keybinding) {
50515               select(document).call(keybinding.off);
50516           }
50517       };
50518
50519
50520       behavior.which = function (_) {
50521           if (!arguments.length) return _operation;
50522           _operation = _;
50523           return behavior;
50524       };
50525
50526
50527       return behavior;
50528   }
50529
50530   /**
50531    * The base implementation of `_.invert` and `_.invertBy` which inverts
50532    * `object` with values transformed by `iteratee` and set by `setter`.
50533    *
50534    * @private
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`.
50540    */
50541   function baseInverter(object, setter, iteratee, accumulator) {
50542     baseForOwn(object, function(value, key, object) {
50543       setter(accumulator, iteratee(value), key, object);
50544     });
50545     return accumulator;
50546   }
50547
50548   /**
50549    * Creates a function like `_.invertBy`.
50550    *
50551    * @private
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.
50555    */
50556   function createInverter(setter, toIteratee) {
50557     return function(object, iteratee) {
50558       return baseInverter(object, setter, toIteratee(iteratee), {});
50559     };
50560   }
50561
50562   /** Used for built-in method references. */
50563   var objectProto$j = Object.prototype;
50564
50565   /**
50566    * Used to resolve the
50567    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
50568    * of values.
50569    */
50570   var nativeObjectToString$2 = objectProto$j.toString;
50571
50572   /**
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.
50576    *
50577    * @static
50578    * @memberOf _
50579    * @since 0.7.0
50580    * @category Object
50581    * @param {Object} object The object to invert.
50582    * @returns {Object} Returns the new inverted object.
50583    * @example
50584    *
50585    * var object = { 'a': 1, 'b': 2, 'c': 1 };
50586    *
50587    * _.invert(object);
50588    * // => { '1': 'c', '2': 'b' }
50589    */
50590   var invert = createInverter(function(result, value, key) {
50591     if (value != null &&
50592         typeof value.toString != 'function') {
50593       value = nativeObjectToString$2.call(value);
50594     }
50595
50596     result[value] = key;
50597   }, constant$d(identity$8));
50598
50599   /**
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).
50604    *
50605    * @static
50606    * @memberOf _
50607    * @since 2.4.0
50608    * @category 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.
50612    * @see _.mapKeys
50613    * @example
50614    *
50615    * var users = {
50616    *   'fred':    { 'user': 'fred',    'age': 40 },
50617    *   'pebbles': { 'user': 'pebbles', 'age': 1 }
50618    * };
50619    *
50620    * _.mapValues(users, function(o) { return o.age; });
50621    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
50622    *
50623    * // The `_.property` iteratee shorthand.
50624    * _.mapValues(users, 'age');
50625    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
50626    */
50627   function mapValues(object, iteratee) {
50628     var result = {};
50629     iteratee = baseIteratee(iteratee, 3);
50630
50631     baseForOwn(object, function(value, key, object) {
50632       baseAssignValue(result, key, iteratee(value, key, object));
50633     });
50634     return result;
50635   }
50636
50637   function behaviorPaste(context) {
50638       var keybinding = d3keybinding('paste');
50639
50640
50641       function doPaste() {
50642           event.preventDefault();
50643
50644           var baseGraph = context.graph(),
50645               mouse$$1 = context.mouse(),
50646               projection = context.projection,
50647               viewport = geoExtent$$1(projection.clipExtent()).polygon();
50648
50649           if (!geoPointInPolygon(mouse$$1, viewport)) return;
50650
50651           var extent = geoExtent$$1(),
50652               oldIDs = context.copyIDs(),
50653               oldGraph = context.copyGraph(),
50654               newIDs = [];
50655
50656           if (!oldIDs.length) return;
50657
50658           var action = actionCopyEntities(oldIDs, oldGraph);
50659           context.perform(action);
50660
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];
50666
50667               extent._extend(oldEntity.extent(oldGraph));
50668
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;
50675                       break;
50676                   }
50677               }
50678
50679               if (!parentCopied) {
50680                   newIDs.push(newEntity.id);
50681               }
50682           }
50683
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] ];
50687
50688           context.perform(actionMove(newIDs, delta, projection));
50689           context.enter(modeMove$$1(context, newIDs, baseGraph));
50690       }
50691
50692
50693       function paste() {
50694           keybinding.on(uiCmd('⌘V'), doPaste);
50695           select(document).call(keybinding);
50696           return paste;
50697       }
50698
50699
50700       paste.off = function() {
50701           select(document).call(keybinding.off);
50702       };
50703
50704
50705       return paste;
50706   }
50707
50708   function behaviorSelect(context) {
50709       var lastMouse = null;
50710       var suppressMenu = true;
50711       var tolerance = 4;
50712       var p1 = null;
50713
50714
50715       function point$$1() {
50716           return mouse(context.container().node());
50717       }
50718
50719
50720       function keydown() {
50721           var e = event;
50722           if (e && e.shiftKey) {
50723               context.surface()
50724                   .classed('behavior-multiselect', true);
50725           }
50726
50727           if (e && e.keyCode === 93) {  // context menu
50728               e.preventDefault();
50729               e.stopPropagation();
50730           }
50731       }
50732
50733
50734       function keyup() {
50735           var e = event;
50736           if (!e || !e.shiftKey) {
50737               context.surface()
50738                   .classed('behavior-multiselect', false);
50739           }
50740
50741
50742           if (e && e.keyCode === 93) {  // context menu
50743               e.preventDefault();
50744               e.stopPropagation();
50745               contextmenu();
50746           }
50747       }
50748
50749
50750       function mousedown() {
50751           if (!p1) p1 = point$$1();
50752           select(window)
50753               .on('mouseup.select', mouseup, true);
50754
50755           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
50756           suppressMenu = !isShowAlways;
50757       }
50758
50759
50760       function mousemove() {
50761           if (event) lastMouse = event;
50762       }
50763
50764
50765       function mouseup() {
50766           click();
50767       }
50768
50769
50770       function contextmenu() {
50771           var e = event;
50772           e.preventDefault();
50773           e.stopPropagation();
50774
50775           if (!+e.clientX && !+e.clientY) {
50776               if (lastMouse) {
50777                   e.sourceEvent = lastMouse;
50778               } else {
50779                   return;
50780               }
50781           }
50782
50783           if (!p1) p1 = point$$1();
50784           suppressMenu = false;
50785           click();
50786       }
50787
50788
50789       function click() {
50790           select(window)
50791               .on('mouseup.select', null, true);
50792
50793           if (!p1) return;
50794           var p2 = point$$1();
50795           var dist = geoVecLength(p1, p2);
50796
50797           p1 = null;
50798           if (dist > tolerance) {
50799               return;
50800           }
50801
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();
50806
50807           var entity = datum && datum.properties && datum.properties.entity;
50808           if (entity) datum = entity;
50809
50810           if (datum && datum.type === 'midpoint') {
50811               datum = datum.parents[0];
50812           }
50813
50814           if (!(datum instanceof osmEntity$$1)) {
50815               // clicked nothing..
50816               if (!isMultiselect && mode.id !== 'browse') {
50817                   context.enter(modeBrowse(context));
50818               }
50819
50820           } else {
50821               // clicked an entity..
50822               var selectedIDs = context.selectedIDs();
50823
50824               if (!isMultiselect) {
50825                   if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
50826                       // multiple things already selected, just show the menu...
50827                       mode.suppressMenu(false).reselect();
50828                   } else {
50829                       // select a single thing..
50830                       context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
50831                   }
50832
50833               } else {
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();
50839                       } else {
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));
50843                       }
50844                   } else {
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));
50848                   }
50849               }
50850           }
50851
50852           // reset for next time..
50853           suppressMenu = true;
50854       }
50855
50856
50857       var behavior = function(selection$$1) {
50858           lastMouse = null;
50859           suppressMenu = true;
50860           p1 = null;
50861
50862           select(window)
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.
50869                   var e = event;
50870                   if (+e.clientX === 0 && +e.clientY === 0) {
50871                       event.preventDefault();
50872                       event.stopPropagation();
50873                   }
50874               });
50875
50876           selection$$1
50877               .on('mousedown.select', mousedown)
50878               .on('mousemove.select', mousemove)
50879               .on('contextmenu.select', contextmenu);
50880
50881           if (event && event.shiftKey) {
50882               context.surface()
50883                   .classed('behavior-multiselect', true);
50884           }
50885       };
50886
50887
50888       behavior.off = function(selection$$1) {
50889           select(window)
50890               .on('keydown.select', null)
50891               .on('keyup.select', null)
50892               .on('contextmenu.select-window', null)
50893               .on('mouseup.select', null, true);
50894
50895           selection$$1
50896               .on('mousedown.select', null)
50897               .on('mousemove.select', null)
50898               .on('contextmenu.select', null);
50899
50900           context.surface()
50901               .classed('behavior-multiselect', false);
50902       };
50903
50904
50905       return behavior;
50906   }
50907
50908   function uiAccount(context) {
50909       var osm = context.connection();
50910
50911
50912       function update(selection$$1) {
50913           if (!osm) return;
50914
50915           if (!osm.authenticated()) {
50916               selection$$1.selectAll('#userLink, #logoutLink')
50917                   .classed('hide', true);
50918               return;
50919           }
50920
50921           osm.userDetails(function(err, details) {
50922               var userLink = selection$$1.select('#userLink'),
50923                   logoutLink = selection$$1.select('#logoutLink');
50924
50925               userLink.html('');
50926               logoutLink.html('');
50927
50928               if (err) return;
50929
50930               selection$$1.selectAll('#userLink, #logoutLink')
50931                   .classed('hide', false);
50932
50933               // Link
50934               userLink.append('a')
50935                   .attr('href', osm.userURL(details.display_name))
50936                   .attr('target', '_blank');
50937
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);
50943               } else {
50944                   userLink
50945                       .call(svgIcon('#iD-icon-avatar', 'pre-text light'));
50946               }
50947
50948               // Add user name
50949               userLink.append('span')
50950                   .attr('class', 'label')
50951                   .text(details.display_name);
50952
50953               logoutLink.append('a')
50954                   .attr('class', 'logout')
50955                   .attr('href', '#')
50956                   .text(t('logout'))
50957                   .on('click.logout', function() {
50958                       event.preventDefault();
50959                       osm.logout();
50960                   });
50961           });
50962       }
50963
50964
50965       return function(selection$$1) {
50966           selection$$1.append('li')
50967               .attr('id', 'logoutLink')
50968               .classed('hide', true);
50969
50970           selection$$1.append('li')
50971               .attr('id', 'userLink')
50972               .classed('hide', true);
50973
50974           if (osm) {
50975               osm.on('change.account', function() { update(selection$$1); });
50976               update(selection$$1);
50977           }
50978       };
50979   }
50980
50981   function uiAttribution(context) {
50982       var selection$$1;
50983
50984
50985       function attribution(data, klass) {
50986           var div = selection$$1.selectAll('.' + klass)
50987               .data([0]);
50988
50989           div = div.enter()
50990               .append('div')
50991               .attr('class', klass)
50992               .merge(div);
50993
50994
50995           var background = div.selectAll('.attribution')
50996               .data(data, function(d) { return d.name(); });
50997
50998           background.exit()
50999               .remove();
51000
51001           background = background.enter()
51002               .append('span')
51003               .attr('class', 'attribution')
51004               .each(function(d) {
51005                   if (d.terms_html) {
51006                       select(this)
51007                           .html(d.terms_html);
51008                       return;
51009                   }
51010
51011                   var selection$$1;
51012                   if (d.terms_url) {
51013                       selection$$1 = select(this)
51014                           .append('a')
51015                           .attr('href', d.terms_url)
51016                           .attr('target', '_blank');
51017                   } else {
51018                       selection$$1 = select(this);
51019                   }
51020
51021
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() }
51025                   );
51026
51027                   if (d.icon && !d.overlay) {
51028                       selection$$1
51029                           .append('img')
51030                           .attr('class', 'source-image')
51031                           .attr('src', d.icon);
51032                   }
51033
51034                   selection$$1
51035                       .append('span')
51036                       .attr('class', 'attribution-text')
51037                       .text(terms_text);
51038               })
51039               .merge(background);
51040
51041
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] : [];
51046               });
51047
51048           copyright.exit()
51049               .remove();
51050
51051           copyright = copyright.enter()
51052               .append('span')
51053               .attr('class', 'copyright-notice')
51054               .merge(copyright);
51055
51056           copyright
51057               .text(String);
51058       }
51059
51060
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');
51066       }
51067
51068
51069       return function(select$$1) {
51070           selection$$1 = select$$1;
51071
51072           context.background()
51073               .on('change.attribution', update);
51074
51075           context.map()
51076               .on('move.attribution', throttle(update, 400, {leading: false}));
51077
51078           update();
51079       };
51080   }
51081
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) {
51088           selection$$1
51089               .style('opacity', show ? 0 : 1)
51090               .classed('hide', false)
51091               .transition()
51092               .style('opacity', show ? 1 : 0)
51093               .on('end', function() {
51094                   select(this)
51095                       .classed('hide', !show)
51096                       .style('opacity', null);
51097                   if (callback) callback.apply(this);
51098               });
51099       };
51100   }
51101
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'));
51106       var _title;
51107       var _updatePreference = true;
51108       var _content = function () {};
51109
51110
51111       var disclosure = function(selection$$1) {
51112           var hideToggle = selection$$1.selectAll('.hide-toggle-' + key)
51113               .data([0]);
51114
51115           // enter
51116           var hideToggleEnter = hideToggle.enter()
51117               .append('a')
51118               .attr('href', '#')
51119               .attr('class', 'hide-toggle hide-toggle-' + key)
51120               .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
51121
51122           hideToggleEnter
51123               .append('span')
51124               .attr('class', 'hide-toggle-text');
51125
51126           // update
51127           hideToggle = hideToggleEnter
51128               .merge(hideToggle);
51129
51130           hideToggle
51131               .on('click', toggle)
51132               .classed('expanded', _expanded);
51133
51134           hideToggle.selectAll('.hide-toggle-text')
51135               .text(_title);
51136
51137           hideToggle.selectAll('.hide-toggle-icon')
51138               .attr('xlink:href', _expanded ? '#iD-icon-down'
51139                   : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
51140               );
51141
51142
51143           var wrap = selection$$1.selectAll('.disclosure-wrap')
51144               .data([0]);
51145
51146           wrap = wrap.enter()
51147               .append('div')
51148               .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
51149               .merge(wrap);
51150
51151           wrap
51152               .classed('hide', !_expanded)
51153               .call(_content);
51154
51155
51156           function toggle() {
51157               event.preventDefault();
51158
51159               _expanded = !_expanded;
51160
51161               if (_updatePreference) {
51162                   context.storage('disclosure.' + key + '.expanded', _expanded);
51163               }
51164
51165               hideToggle
51166                   .classed('expanded', _expanded);
51167
51168               hideToggle.selectAll('.hide-toggle-icon')
51169                   .attr('xlink:href', _expanded ? '#iD-icon-down'
51170                       : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
51171                   );
51172
51173               wrap
51174                   .call(uiToggle(_expanded));
51175
51176               dispatch$$1.call('toggled', this, _expanded);
51177           }
51178       };
51179
51180
51181       disclosure.title = function(_) {
51182           if (!arguments.length) return _title;
51183           _title = _;
51184           return disclosure;
51185       };
51186
51187
51188       disclosure.expanded = function(_) {
51189           if (!arguments.length) return _expanded;
51190           _expanded = _;
51191           return disclosure;
51192       };
51193
51194
51195       disclosure.updatePreference = function(_) {
51196           if (!arguments.length) return _updatePreference;
51197           _updatePreference = _;
51198           return disclosure;
51199       };
51200
51201
51202       disclosure.content = function(_) {
51203           if (!arguments.length) return _content;
51204           _content = _;
51205           return disclosure;
51206       };
51207
51208
51209       return utilRebind(disclosure, dispatch$$1, 'on');
51210   }
51211
51212   function uiBackgroundDisplayOptions(context) {
51213       var detected = utilDetect();
51214       var storedOpacity = context.storage('background-opacity');
51215       var minVal = 0.25;
51216       var maxVal = detected.cssfilters ? 2 : 1;
51217
51218       var sliders = detected.cssfilters
51219           ? ['brightness', 'contrast', 'saturation', 'sharpness']
51220           : ['brightness'];
51221
51222       var _options = {
51223           brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
51224           contrast: 1,
51225           saturation: 1,
51226           sharpness: 1
51227       };
51228
51229       var _selection = select(null);
51230
51231
51232       function clamp(x, min, max) {
51233           return Math.max(min, Math.min(x, max));
51234       }
51235
51236
51237       function updateValue(d, val) {
51238           if (!val && event && event.target) {
51239               val = event.target.value;
51240           }
51241
51242           val = clamp(val, minVal, maxVal);
51243
51244           _options[d] = val;
51245           context.background()[d](val);
51246
51247           if (d === 'brightness') {
51248               context.storage('background-opacity', val);
51249           }
51250
51251           _selection
51252               .call(render);
51253       }
51254
51255
51256       function render(selection$$1) {
51257           var container = selection$$1.selectAll('.display-options-container')
51258               .data([0]);
51259
51260           var containerEnter = container.enter()
51261               .append('div')
51262               .attr('class', 'display-options-container controls-list');
51263
51264           // add slider controls
51265           var slidersEnter = containerEnter.selectAll('.display-control')
51266               .data(sliders)
51267               .enter()
51268               .append('div')
51269               .attr('class', function(d) { return 'display-control display-control-' + d; });
51270
51271           slidersEnter
51272               .append('h5')
51273               .text(function(d) { return t('background.' + d); })
51274               .append('span')
51275               .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
51276
51277           slidersEnter
51278               .append('input')
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);
51287               });
51288
51289           slidersEnter
51290               .append('button')
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;
51295                   updateValue(d, 1);
51296               })
51297               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
51298
51299
51300           // update
51301           container = containerEnter
51302               .merge(container);
51303
51304           container.selectAll('.display-option-input')
51305               .property('value', function(d) { return _options[d]; });
51306
51307           container.selectAll('.display-option-value')
51308               .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
51309
51310           container.selectAll('.display-option-reset')
51311               .classed('disabled', function(d) { return _options[d] === 1; });
51312
51313           // first time only, set brightness if needed
51314           if (containerEnter.size() && _options.brightness !== 1) {
51315               context.background().brightness(_options.brightness);
51316           }
51317       }
51318
51319
51320       function backgroundDisplayOptions(selection$$1) {
51321           _selection = selection$$1;
51322
51323           selection$$1
51324               .call(uiDisclosure(context, 'background_display_options', true)
51325                   .title(t('background.display_options'))
51326                   .content(render)
51327               );
51328       }
51329
51330
51331       return backgroundDisplayOptions;
51332   }
51333
51334   function uiBackgroundOffset(context) {
51335       var directions = [
51336           ['right', [0.5, 0]],
51337           ['top', [0, -0.5]],
51338           ['left', [-0.5, 0]],
51339           ['bottom', [0, 0.5]]
51340       ];
51341
51342
51343       function d3_eventCancel() {
51344           event.stopPropagation();
51345           event.preventDefault();
51346       }
51347
51348
51349       function updateValue() {
51350           var meters = geoOffsetToMeters(context.background().offset());
51351           var x = +meters[0].toFixed(2);
51352           var y = +meters[1].toFixed(2);
51353
51354           d3_selectAll('.nudge-inner-rect')
51355               .select('input')
51356               .classed('error', false)
51357               .property('value', x + ', ' + y);
51358
51359           d3_selectAll('.nudge-reset')
51360               .classed('disabled', function() {
51361                   return (x === 0 && y === 0);
51362               });
51363       }
51364
51365
51366       function resetOffset() {
51367           context.background().offset([0, 0]);
51368           updateValue();
51369       }
51370
51371
51372       function nudge(d) {
51373           context.background().nudge(d, context.map().zoom());
51374           updateValue();
51375       }
51376
51377
51378       function clickNudgeButton(d) {
51379           var interval;
51380           var timeout = window.setTimeout(function() {
51381                   interval = window.setInterval(nudge.bind(null, d), 100);
51382               }, 500);
51383
51384           function doneNudge() {
51385               window.clearTimeout(timeout);
51386               window.clearInterval(interval);
51387               select(window)
51388                   .on('mouseup.buttonoffset', null, true)
51389                   .on('mousedown.buttonoffset', null, true);
51390           }
51391
51392           select(window)
51393               .on('mouseup.buttonoffset', doneNudge, true)
51394               .on('mousedown.buttonoffset', doneNudge, true);
51395
51396           nudge(d);
51397       }
51398
51399
51400       function inputOffset() {
51401           var input = select(this);
51402           var d = input.node().value;
51403
51404           if (d === '') return resetOffset();
51405
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;
51409           });
51410
51411           if (d.length !== 2 || !d[0] || !d[1]) {
51412               input.classed('error', true);
51413               return;
51414           }
51415
51416           context.background().offset(geoMetersToOffset(d));
51417           updateValue();
51418       }
51419
51420
51421       function dragOffset() {
51422           event.preventDefault();
51423           if (event.button !== 0) return;
51424
51425           var origin = [event.clientX, event.clientY];
51426
51427           context.container()
51428               .append('div')
51429               .attr('class', 'nudge-surface');
51430
51431           select(window)
51432               .on('mousemove.offset', function() {
51433                   var latest = [event.clientX, event.clientY];
51434                   var d = [
51435                       -(origin[0] - latest[0]) / 4,
51436                       -(origin[1] - latest[1]) / 4
51437                   ];
51438
51439                   origin = latest;
51440                   nudge(d);
51441               })
51442               .on('mouseup.offset', function() {
51443                   if (event.button !== 0) return;
51444                   d3_selectAll('.nudge-surface')
51445                       .remove();
51446
51447                   select(window)
51448                       .on('mousemove.offset', null)
51449                       .on('mouseup.offset', null);
51450               });
51451       }
51452
51453
51454       function render(selection$$1) {
51455           var container = selection$$1.selectAll('.nudge-container')
51456               .data([0]);
51457
51458           var containerEnter = container.enter()
51459               .append('div')
51460               .attr('class', 'nudge-container cf');
51461
51462           containerEnter
51463               .append('div')
51464               .attr('class', 'nudge-instructions')
51465               .text(t('background.offset'));
51466
51467           var nudgeEnter = containerEnter
51468               .append('div')
51469               .attr('class', 'nudge-outer-rect')
51470               .on('mousedown', dragOffset);
51471
51472           nudgeEnter
51473               .append('div')
51474               .attr('class', 'nudge-inner-rect')
51475               .append('input')
51476               .on('change', inputOffset);
51477
51478           containerEnter
51479               .append('div')
51480               .selectAll('button')
51481               .data(directions).enter()
51482               .append('button')
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]);
51488               });
51489
51490           containerEnter
51491               .append('button')
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;
51497                   resetOffset();
51498               })
51499               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
51500
51501           updateValue();
51502       }
51503
51504
51505       function backgroundOffset(selection$$1) {
51506           selection$$1
51507               .call(uiDisclosure(context, 'background_offset', false)
51508                   .title(t('background.fix_misalignment'))
51509                   .content(render)
51510               );
51511       }
51512
51513
51514       context.background()
51515           .on('change.backgroundOffset-update', updateValue);
51516
51517       return backgroundOffset;
51518   }
51519
51520   var marked = createCommonjsModule(function (module, exports) {
51521   (function(root) {
51522
51523   /**
51524    * Block-Level Grammar
51525    */
51526
51527   var block = {
51528     newline: /^\n+/,
51529     code: /^( {4}[^\n]+\n*)+/,
51530     fences: noop,
51531     hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
51532     heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
51533     nptable: noop,
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
51545       + ')',
51546     def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
51547     table: noop,
51548     lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
51549     paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
51550     text: /^[^\n]+/
51551   };
51552
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)
51558     .getRegex();
51559
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)
51564     .getRegex();
51565
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 + ')')
51570     .getRegex();
51571
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'
51577     + '|track|ul';
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"'=<>`]+)?/)
51583     .getRegex();
51584
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
51590     .getRegex();
51591
51592   block.blockquote = edit(block.blockquote)
51593     .replace('paragraph', block.paragraph)
51594     .getRegex();
51595
51596   /**
51597    * Normal Block Grammar
51598    */
51599
51600   block.normal = merge({}, block);
51601
51602   /**
51603    * GFM Block Grammar
51604    */
51605
51606   block.gfm = merge({}, block.normal, {
51607     fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,
51608     paragraph: /^/,
51609     heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
51610   });
51611
51612   block.gfm.paragraph = edit(block.paragraph)
51613     .replace('(?!', '(?!'
51614       + block.gfm.fences.source.replace('\\1', '\\2') + '|'
51615       + block.list.source.replace('\\1', '\\3') + '|')
51616     .getRegex();
51617
51618   /**
51619    * GFM + Tables Block Grammar
51620    */
51621
51622   block.tables = merge({}, block.gfm, {
51623     nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
51624     table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
51625   });
51626
51627   /**
51628    * Pedantic grammar
51629    */
51630
51631   block.pedantic = merge({}, block.normal, {
51632     html: edit(
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')
51641       .getRegex(),
51642     def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
51643   });
51644
51645   /**
51646    * Block Lexer
51647    */
51648
51649   function Lexer(options) {
51650     this.tokens = [];
51651     this.tokens.links = {};
51652     this.options = options || marked.defaults;
51653     this.rules = block.normal;
51654
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;
51660       } else {
51661         this.rules = block.gfm;
51662       }
51663     }
51664   }
51665
51666   /**
51667    * Expose Block Rules
51668    */
51669
51670   Lexer.rules = block;
51671
51672   /**
51673    * Static Lex Method
51674    */
51675
51676   Lexer.lex = function(src, options) {
51677     var lexer = new Lexer(options);
51678     return lexer.lex(src);
51679   };
51680
51681   /**
51682    * Preprocessing
51683    */
51684
51685   Lexer.prototype.lex = function(src) {
51686     src = src
51687       .replace(/\r\n|\r/g, '\n')
51688       .replace(/\t/g, '    ')
51689       .replace(/\u00a0/g, ' ')
51690       .replace(/\u2424/g, '\n');
51691
51692     return this.token(src, true);
51693   };
51694
51695   /**
51696    * Lexing
51697    */
51698
51699   Lexer.prototype.token = function(src, top) {
51700     src = src.replace(/^ +$/gm, '');
51701     var next,
51702         loose,
51703         cap,
51704         bull,
51705         b,
51706         item,
51707         space,
51708         i,
51709         tag,
51710         l,
51711         isordered,
51712         istask,
51713         ischecked;
51714
51715     while (src) {
51716       // newline
51717       if (cap = this.rules.newline.exec(src)) {
51718         src = src.substring(cap[0].length);
51719         if (cap[0].length > 1) {
51720           this.tokens.push({
51721             type: 'space'
51722           });
51723         }
51724       }
51725
51726       // code
51727       if (cap = this.rules.code.exec(src)) {
51728         src = src.substring(cap[0].length);
51729         cap = cap[0].replace(/^ {4}/gm, '');
51730         this.tokens.push({
51731           type: 'code',
51732           text: !this.options.pedantic
51733             ? cap.replace(/\n+$/, '')
51734             : cap
51735         });
51736         continue;
51737       }
51738
51739       // fences (gfm)
51740       if (cap = this.rules.fences.exec(src)) {
51741         src = src.substring(cap[0].length);
51742         this.tokens.push({
51743           type: 'code',
51744           lang: cap[2],
51745           text: cap[3] || ''
51746         });
51747         continue;
51748       }
51749
51750       // heading
51751       if (cap = this.rules.heading.exec(src)) {
51752         src = src.substring(cap[0].length);
51753         this.tokens.push({
51754           type: 'heading',
51755           depth: cap[1].length,
51756           text: cap[2]
51757         });
51758         continue;
51759       }
51760
51761       // table no leading pipe (gfm)
51762       if (top && (cap = this.rules.nptable.exec(src))) {
51763         item = {
51764           type: 'table',
51765           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
51766           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
51767           cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
51768         };
51769
51770         if (item.header.length === item.align.length) {
51771           src = src.substring(cap[0].length);
51772
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';
51780             } else {
51781               item.align[i] = null;
51782             }
51783           }
51784
51785           for (i = 0; i < item.cells.length; i++) {
51786             item.cells[i] = splitCells(item.cells[i], item.header.length);
51787           }
51788
51789           this.tokens.push(item);
51790
51791           continue;
51792         }
51793       }
51794
51795       // hr
51796       if (cap = this.rules.hr.exec(src)) {
51797         src = src.substring(cap[0].length);
51798         this.tokens.push({
51799           type: 'hr'
51800         });
51801         continue;
51802       }
51803
51804       // blockquote
51805       if (cap = this.rules.blockquote.exec(src)) {
51806         src = src.substring(cap[0].length);
51807
51808         this.tokens.push({
51809           type: 'blockquote_start'
51810         });
51811
51812         cap = cap[0].replace(/^ *> ?/gm, '');
51813
51814         // Pass `top` to keep the current
51815         // "toplevel" state. This is exactly
51816         // how markdown.pl works.
51817         this.token(cap, top);
51818
51819         this.tokens.push({
51820           type: 'blockquote_end'
51821         });
51822
51823         continue;
51824       }
51825
51826       // list
51827       if (cap = this.rules.list.exec(src)) {
51828         src = src.substring(cap[0].length);
51829         bull = cap[2];
51830         isordered = bull.length > 1;
51831
51832         this.tokens.push({
51833           type: 'list_start',
51834           ordered: isordered,
51835           start: isordered ? +bull : ''
51836         });
51837
51838         // Get each top-level item.
51839         cap = cap[0].match(this.rules.item);
51840
51841         next = false;
51842         l = cap.length;
51843         i = 0;
51844
51845         for (; i < l; i++) {
51846           item = cap[i];
51847
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+\.) +/, '');
51852
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, '');
51860           }
51861
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;
51868               i = l - 1;
51869             }
51870           }
51871
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);
51876           if (i !== l - 1) {
51877             next = item.charAt(item.length - 1) === '\n';
51878             if (!loose) loose = next;
51879           }
51880
51881           // Check for task list items
51882           istask = /^\[[ xX]\] /.test(item);
51883           ischecked = undefined;
51884           if (istask) {
51885             ischecked = item[1] !== ' ';
51886             item = item.replace(/^\[[ xX]\] +/, '');
51887           }
51888
51889           this.tokens.push({
51890             type: loose
51891               ? 'loose_item_start'
51892               : 'list_item_start',
51893             task: istask,
51894             checked: ischecked
51895           });
51896
51897           // Recurse.
51898           this.token(item, false);
51899
51900           this.tokens.push({
51901             type: 'list_item_end'
51902           });
51903         }
51904
51905         this.tokens.push({
51906           type: 'list_end'
51907         });
51908
51909         continue;
51910       }
51911
51912       // html
51913       if (cap = this.rules.html.exec(src)) {
51914         src = src.substring(cap[0].length);
51915         this.tokens.push({
51916           type: this.options.sanitize
51917             ? 'paragraph'
51918             : 'html',
51919           pre: !this.options.sanitizer
51920             && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
51921           text: cap[0]
51922         });
51923         continue;
51924       }
51925
51926       // def
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] = {
51933             href: cap[2],
51934             title: cap[3]
51935           };
51936         }
51937         continue;
51938       }
51939
51940       // table (gfm)
51941       if (top && (cap = this.rules.table.exec(src))) {
51942         item = {
51943           type: 'table',
51944           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
51945           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
51946           cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : []
51947         };
51948
51949         if (item.header.length === item.align.length) {
51950           src = src.substring(cap[0].length);
51951
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';
51959             } else {
51960               item.align[i] = null;
51961             }
51962           }
51963
51964           for (i = 0; i < item.cells.length; i++) {
51965             item.cells[i] = splitCells(
51966               item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
51967               item.header.length);
51968           }
51969
51970           this.tokens.push(item);
51971
51972           continue;
51973         }
51974       }
51975
51976       // lheading
51977       if (cap = this.rules.lheading.exec(src)) {
51978         src = src.substring(cap[0].length);
51979         this.tokens.push({
51980           type: 'heading',
51981           depth: cap[2] === '=' ? 1 : 2,
51982           text: cap[1]
51983         });
51984         continue;
51985       }
51986
51987       // top-level paragraph
51988       if (top && (cap = this.rules.paragraph.exec(src))) {
51989         src = src.substring(cap[0].length);
51990         this.tokens.push({
51991           type: 'paragraph',
51992           text: cap[1].charAt(cap[1].length - 1) === '\n'
51993             ? cap[1].slice(0, -1)
51994             : cap[1]
51995         });
51996         continue;
51997       }
51998
51999       // text
52000       if (cap = this.rules.text.exec(src)) {
52001         // Top-level should never reach here.
52002         src = src.substring(cap[0].length);
52003         this.tokens.push({
52004           type: 'text',
52005           text: cap[0]
52006         });
52007         continue;
52008       }
52009
52010       if (src) {
52011         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
52012       }
52013     }
52014
52015     return this.tokens;
52016   };
52017
52018   /**
52019    * Inline-Level Grammar
52020    */
52021
52022   var inline = {
52023     escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
52024     autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
52025     url: noop,
52026     tag: '^comment'
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*$)/,
52039     del: noop,
52040     text: /^[\s\S]+?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
52041   };
52042
52043   inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
52044
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)
52050     .getRegex();
52051
52052   inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
52053
52054   inline.tag = edit(inline.tag)
52055     .replace('comment', block._comment)
52056     .replace('attribute', inline._attribute)
52057     .getRegex();
52058
52059   inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/;
52060   inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f()\\]*\)|[^\s\x00-\x1f()\\])*?)/;
52061   inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
52062
52063   inline.link = edit(inline.link)
52064     .replace('label', inline._label)
52065     .replace('href', inline._href)
52066     .replace('title', inline._title)
52067     .getRegex();
52068
52069   inline.reflink = edit(inline.reflink)
52070     .replace('label', inline._label)
52071     .getRegex();
52072
52073   /**
52074    * Normal Inline Grammar
52075    */
52076
52077   inline.normal = merge({}, inline);
52078
52079   /**
52080    * Pedantic Inline Grammar
52081    */
52082
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)
52088       .getRegex(),
52089     reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
52090       .replace('label', inline._label)
52091       .getRegex()
52092   });
52093
52094   /**
52095    * GFM Inline Grammar
52096    */
52097
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)
52102       .getRegex(),
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.!#$%&\'*+/=?^_`{\\|}~-]+@|')
52108       .getRegex()
52109   });
52110
52111   /**
52112    * GFM + Line Breaks Inline Grammar
52113    */
52114
52115   inline.breaks = merge({}, inline.gfm, {
52116     br: edit(inline.br).replace('{2,}', '*').getRegex(),
52117     text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
52118   });
52119
52120   /**
52121    * Inline Lexer & Compiler
52122    */
52123
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;
52130
52131     if (!this.links) {
52132       throw new Error('Tokens array requires a `links` property.');
52133     }
52134
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;
52140       } else {
52141         this.rules = inline.gfm;
52142       }
52143     }
52144   }
52145
52146   /**
52147    * Expose Inline Rules
52148    */
52149
52150   InlineLexer.rules = inline;
52151
52152   /**
52153    * Static Lexing/Compiling Method
52154    */
52155
52156   InlineLexer.output = function(src, links, options) {
52157     var inline = new InlineLexer(links, options);
52158     return inline.output(src);
52159   };
52160
52161   /**
52162    * Lexing/Compiling
52163    */
52164
52165   InlineLexer.prototype.output = function(src) {
52166     var out = '',
52167         link,
52168         text,
52169         href,
52170         title,
52171         cap;
52172
52173     while (src) {
52174       // escape
52175       if (cap = this.rules.escape.exec(src)) {
52176         src = src.substring(cap[0].length);
52177         out += cap[1];
52178         continue;
52179       }
52180
52181       // autolink
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;
52187         } else {
52188           text = escape(cap[1]);
52189           href = text;
52190         }
52191         out += this.renderer.link(href, null, text);
52192         continue;
52193       }
52194
52195       // url (gfm)
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;
52202         } else {
52203           text = escape(cap[0]);
52204           if (cap[1] === 'www.') {
52205             href = 'http://' + text;
52206           } else {
52207             href = text;
52208           }
52209         }
52210         out += this.renderer.link(href, null, text);
52211         continue;
52212       }
52213
52214       // tag
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;
52220         }
52221         src = src.substring(cap[0].length);
52222         out += this.options.sanitize
52223           ? this.options.sanitizer
52224             ? this.options.sanitizer(cap[0])
52225             : escape(cap[0])
52226           : cap[0];
52227         continue;
52228       }
52229
52230       // link
52231       if (cap = this.rules.link.exec(src)) {
52232         src = src.substring(cap[0].length);
52233         this.inLink = true;
52234         href = cap[2];
52235         if (this.options.pedantic) {
52236           link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
52237
52238           if (link) {
52239             href = link[1];
52240             title = link[3];
52241           } else {
52242             title = '';
52243           }
52244         } else {
52245           title = cap[3] ? cap[3].slice(1, -1) : '';
52246         }
52247         href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
52248         out += this.outputLink(cap, {
52249           href: InlineLexer.escapes(href),
52250           title: InlineLexer.escapes(title)
52251         });
52252         this.inLink = false;
52253         continue;
52254       }
52255
52256       // reflink, nolink
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;
52265           continue;
52266         }
52267         this.inLink = true;
52268         out += this.outputLink(cap, link);
52269         this.inLink = false;
52270         continue;
52271       }
52272
52273       // strong
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]));
52277         continue;
52278       }
52279
52280       // em
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]));
52284         continue;
52285       }
52286
52287       // code
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));
52291         continue;
52292       }
52293
52294       // br
52295       if (cap = this.rules.br.exec(src)) {
52296         src = src.substring(cap[0].length);
52297         out += this.renderer.br();
52298         continue;
52299       }
52300
52301       // del (gfm)
52302       if (cap = this.rules.del.exec(src)) {
52303         src = src.substring(cap[0].length);
52304         out += this.renderer.del(this.output(cap[1]));
52305         continue;
52306       }
52307
52308       // text
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])));
52312         continue;
52313       }
52314
52315       if (src) {
52316         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
52317       }
52318     }
52319
52320     return out;
52321   };
52322
52323   InlineLexer.escapes = function(text) {
52324     return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
52325   };
52326
52327   /**
52328    * Compile Link
52329    */
52330
52331   InlineLexer.prototype.outputLink = function(cap, link) {
52332     var href = link.href,
52333         title = link.title ? escape(link.title) : null;
52334
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]));
52338   };
52339
52340   /**
52341    * Smartypants Transformations
52342    */
52343
52344   InlineLexer.prototype.smartypants = function(text) {
52345     if (!this.options.smartypants) return text;
52346     return text
52347       // em-dashes
52348       .replace(/---/g, '\u2014')
52349       // en-dashes
52350       .replace(/--/g, '\u2013')
52351       // opening singles
52352       .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
52353       // closing singles & apostrophes
52354       .replace(/'/g, '\u2019')
52355       // opening doubles
52356       .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
52357       // closing doubles
52358       .replace(/"/g, '\u201d')
52359       // ellipses
52360       .replace(/\.{3}/g, '\u2026');
52361   };
52362
52363   /**
52364    * Mangle Links
52365    */
52366
52367   InlineLexer.prototype.mangle = function(text) {
52368     if (!this.options.mangle) return text;
52369     var out = '',
52370         l = text.length,
52371         i = 0,
52372         ch;
52373
52374     for (; i < l; i++) {
52375       ch = text.charCodeAt(i);
52376       if (Math.random() > 0.5) {
52377         ch = 'x' + ch.toString(16);
52378       }
52379       out += '&#' + ch + ';';
52380     }
52381
52382     return out;
52383   };
52384
52385   /**
52386    * Renderer
52387    */
52388
52389   function Renderer(options) {
52390     this.options = options || marked.defaults;
52391   }
52392
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) {
52397         escaped = true;
52398         code = out;
52399       }
52400     }
52401
52402     if (!lang) {
52403       return '<pre><code>'
52404         + (escaped ? code : escape(code, true))
52405         + '</code></pre>';
52406     }
52407
52408     return '<pre><code class="'
52409       + this.options.langPrefix
52410       + escape(lang, true)
52411       + '">'
52412       + (escaped ? code : escape(code, true))
52413       + '</code></pre>\n';
52414   };
52415
52416   Renderer.prototype.blockquote = function(quote) {
52417     return '<blockquote>\n' + quote + '</blockquote>\n';
52418   };
52419
52420   Renderer.prototype.html = function(html) {
52421     return html;
52422   };
52423
52424   Renderer.prototype.heading = function(text, level, raw) {
52425     if (this.options.headerIds) {
52426       return '<h'
52427         + level
52428         + ' id="'
52429         + this.options.headerPrefix
52430         + raw.toLowerCase().replace(/[^\w]+/g, '-')
52431         + '">'
52432         + text
52433         + '</h'
52434         + level
52435         + '>\n';
52436     }
52437     // ignore IDs
52438     return '<h' + level + '>' + text + '</h' + level + '>\n';
52439   };
52440
52441   Renderer.prototype.hr = function() {
52442     return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
52443   };
52444
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';
52449   };
52450
52451   Renderer.prototype.listitem = function(text) {
52452     return '<li>' + text + '</li>\n';
52453   };
52454
52455   Renderer.prototype.checkbox = function(checked) {
52456     return '<input '
52457       + (checked ? 'checked="" ' : '')
52458       + 'disabled="" type="checkbox"'
52459       + (this.options.xhtml ? ' /' : '')
52460       + '> ';
52461   };
52462
52463   Renderer.prototype.paragraph = function(text) {
52464     return '<p>' + text + '</p>\n';
52465   };
52466
52467   Renderer.prototype.table = function(header, body) {
52468     if (body) body = '<tbody>' + body + '</tbody>';
52469
52470     return '<table>\n'
52471       + '<thead>\n'
52472       + header
52473       + '</thead>\n'
52474       + body
52475       + '</table>\n';
52476   };
52477
52478   Renderer.prototype.tablerow = function(content) {
52479     return '<tr>\n' + content + '</tr>\n';
52480   };
52481
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';
52488   };
52489
52490   // span level renderer
52491   Renderer.prototype.strong = function(text) {
52492     return '<strong>' + text + '</strong>';
52493   };
52494
52495   Renderer.prototype.em = function(text) {
52496     return '<em>' + text + '</em>';
52497   };
52498
52499   Renderer.prototype.codespan = function(text) {
52500     return '<code>' + text + '</code>';
52501   };
52502
52503   Renderer.prototype.br = function() {
52504     return this.options.xhtml ? '<br/>' : '<br>';
52505   };
52506
52507   Renderer.prototype.del = function(text) {
52508     return '<del>' + text + '</del>';
52509   };
52510
52511   Renderer.prototype.link = function(href, title, text) {
52512     if (this.options.sanitize) {
52513       try {
52514         var prot = decodeURIComponent(unescape(href))
52515           .replace(/[^\w:]/g, '')
52516           .toLowerCase();
52517       } catch (e) {
52518         return text;
52519       }
52520       if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
52521         return text;
52522       }
52523     }
52524     if (this.options.baseUrl && !originIndependentUrl.test(href)) {
52525       href = resolveUrl(this.options.baseUrl, href);
52526     }
52527     try {
52528       href = encodeURI(href).replace(/%25/g, '%');
52529     } catch (e) {
52530       return text;
52531     }
52532     var out = '<a href="' + escape(href) + '"';
52533     if (title) {
52534       out += ' title="' + title + '"';
52535     }
52536     out += '>' + text + '</a>';
52537     return out;
52538   };
52539
52540   Renderer.prototype.image = function(href, title, text) {
52541     if (this.options.baseUrl && !originIndependentUrl.test(href)) {
52542       href = resolveUrl(this.options.baseUrl, href);
52543     }
52544     var out = '<img src="' + href + '" alt="' + text + '"';
52545     if (title) {
52546       out += ' title="' + title + '"';
52547     }
52548     out += this.options.xhtml ? '/>' : '>';
52549     return out;
52550   };
52551
52552   Renderer.prototype.text = function(text) {
52553     return text;
52554   };
52555
52556   /**
52557    * TextRenderer
52558    * returns only the textual part of the token
52559    */
52560
52561   function TextRenderer() {}
52562
52563   // no need for block level renderers
52564
52565   TextRenderer.prototype.strong =
52566   TextRenderer.prototype.em =
52567   TextRenderer.prototype.codespan =
52568   TextRenderer.prototype.del =
52569   TextRenderer.prototype.text = function (text) {
52570     return text;
52571   };
52572
52573   TextRenderer.prototype.link =
52574   TextRenderer.prototype.image = function(href, title, text) {
52575     return '' + text;
52576   };
52577
52578   TextRenderer.prototype.br = function() {
52579     return '';
52580   };
52581
52582   /**
52583    * Parsing & Compiling
52584    */
52585
52586   function Parser(options) {
52587     this.tokens = [];
52588     this.token = null;
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;
52593   }
52594
52595   /**
52596    * Static Parse Method
52597    */
52598
52599   Parser.parse = function(src, options) {
52600     var parser = new Parser(options);
52601     return parser.parse(src);
52602   };
52603
52604   /**
52605    * Parse Loop
52606    */
52607
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(
52612       src.links,
52613       merge({}, this.options, {renderer: new TextRenderer()})
52614     );
52615     this.tokens = src.reverse();
52616
52617     var out = '';
52618     while (this.next()) {
52619       out += this.tok();
52620     }
52621
52622     return out;
52623   };
52624
52625   /**
52626    * Next Token
52627    */
52628
52629   Parser.prototype.next = function() {
52630     return this.token = this.tokens.pop();
52631   };
52632
52633   /**
52634    * Preview Next Token
52635    */
52636
52637   Parser.prototype.peek = function() {
52638     return this.tokens[this.tokens.length - 1] || 0;
52639   };
52640
52641   /**
52642    * Parse Text Tokens
52643    */
52644
52645   Parser.prototype.parseText = function() {
52646     var body = this.token.text;
52647
52648     while (this.peek().type === 'text') {
52649       body += '\n' + this.next().text;
52650     }
52651
52652     return this.inline.output(body);
52653   };
52654
52655   /**
52656    * Parse Current Token
52657    */
52658
52659   Parser.prototype.tok = function() {
52660     switch (this.token.type) {
52661       case 'space': {
52662         return '';
52663       }
52664       case 'hr': {
52665         return this.renderer.hr();
52666       }
52667       case 'heading': {
52668         return this.renderer.heading(
52669           this.inline.output(this.token.text),
52670           this.token.depth,
52671           unescape(this.inlineText.output(this.token.text)));
52672       }
52673       case 'code': {
52674         return this.renderer.code(this.token.text,
52675           this.token.lang,
52676           this.token.escaped);
52677       }
52678       case 'table': {
52679         var header = '',
52680             body = '',
52681             i,
52682             row,
52683             cell,
52684             j;
52685
52686         // header
52687         cell = '';
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] }
52692           );
52693         }
52694         header += this.renderer.tablerow(cell);
52695
52696         for (i = 0; i < this.token.cells.length; i++) {
52697           row = this.token.cells[i];
52698
52699           cell = '';
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] }
52704             );
52705           }
52706
52707           body += this.renderer.tablerow(cell);
52708         }
52709         return this.renderer.table(header, body);
52710       }
52711       case 'blockquote_start': {
52712         body = '';
52713
52714         while (this.next().type !== 'blockquote_end') {
52715           body += this.tok();
52716         }
52717
52718         return this.renderer.blockquote(body);
52719       }
52720       case 'list_start': {
52721         body = '';
52722         var ordered = this.token.ordered,
52723             start = this.token.start;
52724
52725         while (this.next().type !== 'list_end') {
52726           body += this.tok();
52727         }
52728
52729         return this.renderer.list(body, ordered, start);
52730       }
52731       case 'list_item_start': {
52732         body = '';
52733
52734         if (this.token.task) {
52735           body += this.renderer.checkbox(this.token.checked);
52736         }
52737
52738         while (this.next().type !== 'list_item_end') {
52739           body += this.token.type === 'text'
52740             ? this.parseText()
52741             : this.tok();
52742         }
52743
52744         return this.renderer.listitem(body);
52745       }
52746       case 'loose_item_start': {
52747         body = '';
52748
52749         while (this.next().type !== 'list_item_end') {
52750           body += this.tok();
52751         }
52752
52753         return this.renderer.listitem(body);
52754       }
52755       case 'html': {
52756         // TODO parse inline content if parameter markdown=1
52757         return this.renderer.html(this.token.text);
52758       }
52759       case 'paragraph': {
52760         return this.renderer.paragraph(this.inline.output(this.token.text));
52761       }
52762       case 'text': {
52763         return this.renderer.paragraph(this.parseText());
52764       }
52765     }
52766   };
52767
52768   /**
52769    * Helpers
52770    */
52771
52772   function escape(html, encode) {
52773     return html
52774       .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
52775       .replace(/</g, '&lt;')
52776       .replace(/>/g, '&gt;')
52777       .replace(/"/g, '&quot;')
52778       .replace(/'/g, '&#39;');
52779   }
52780
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));
52790       }
52791       return '';
52792     });
52793   }
52794
52795   function edit(regex, opt) {
52796     regex = regex.source || regex;
52797     opt = opt || '';
52798     return {
52799       replace: function(name, val) {
52800         val = val.source || val;
52801         val = val.replace(/(^|[^\[])\^/g, '$1');
52802         regex = regex.replace(name, val);
52803         return this;
52804       },
52805       getRegex: function() {
52806         return new RegExp(regex, opt);
52807       }
52808     };
52809   }
52810
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 + '/';
52818       } else {
52819         baseUrls[' ' + base] = base.replace(/[^/]*$/, '');
52820       }
52821     }
52822     base = baseUrls[' ' + base];
52823
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;
52828     } else {
52829       return base + href;
52830     }
52831   }
52832   var baseUrls = {};
52833   var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
52834
52835   function noop() {}
52836   noop.exec = noop;
52837
52838   function merge(obj) {
52839     var i = 1,
52840         target,
52841         key;
52842
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];
52848         }
52849       }
52850     }
52851
52852     return obj;
52853   }
52854
52855   function splitCells(tableRow, count) {
52856     var cells = tableRow.replace(/([^\\])\|/g, '$1 |').split(/ +\| */),
52857         i = 0;
52858
52859     if (cells.length > count) {
52860       cells.splice(count);
52861     } else {
52862       while (cells.length < count) cells.push('');
52863     }
52864
52865     for (; i < cells.length; i++) {
52866       cells[i] = cells[i].replace(/\\\|/g, '|');
52867     }
52868     return cells;
52869   }
52870
52871   /**
52872    * Marked
52873    */
52874
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');
52879     }
52880     if (typeof src !== 'string') {
52881       throw new Error('marked(): input parameter is of type '
52882         + Object.prototype.toString.call(src) + ', string expected');
52883     }
52884
52885     if (callback || typeof opt === 'function') {
52886       if (!callback) {
52887         callback = opt;
52888         opt = null;
52889       }
52890
52891       opt = merge({}, marked.defaults, opt || {});
52892
52893       var highlight = opt.highlight,
52894           tokens,
52895           pending,
52896           i = 0;
52897
52898       try {
52899         tokens = Lexer.lex(src, opt);
52900       } catch (e) {
52901         return callback(e);
52902       }
52903
52904       pending = tokens.length;
52905
52906       var done = function(err) {
52907         if (err) {
52908           opt.highlight = highlight;
52909           return callback(err);
52910         }
52911
52912         var out;
52913
52914         try {
52915           out = Parser.parse(tokens, opt);
52916         } catch (e) {
52917           err = e;
52918         }
52919
52920         opt.highlight = highlight;
52921
52922         return err
52923           ? callback(err)
52924           : callback(null, out);
52925       };
52926
52927       if (!highlight || highlight.length < 3) {
52928         return done();
52929       }
52930
52931       delete opt.highlight;
52932
52933       if (!pending) return done();
52934
52935       for (; i < tokens.length; i++) {
52936         (function(token) {
52937           if (token.type !== 'code') {
52938             return --pending || done();
52939           }
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();
52944             }
52945             token.text = code;
52946             token.escaped = true;
52947             --pending || done();
52948           });
52949         })(tokens[i]);
52950       }
52951
52952       return;
52953     }
52954     try {
52955       if (opt) opt = merge({}, marked.defaults, opt);
52956       return Parser.parse(Lexer.lex(src, opt), opt);
52957     } catch (e) {
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)
52962           + '</pre>';
52963       }
52964       throw e;
52965     }
52966   }
52967
52968   /**
52969    * Options
52970    */
52971
52972   marked.options =
52973   marked.setOptions = function(opt) {
52974     merge(marked.defaults, opt);
52975     return marked;
52976   };
52977
52978   marked.getDefaults = function () {
52979     return {
52980       baseUrl: null,
52981       breaks: false,
52982       gfm: true,
52983       headerIds: true,
52984       headerPrefix: '',
52985       highlight: null,
52986       langPrefix: 'language-',
52987       mangle: true,
52988       pedantic: false,
52989       renderer: new Renderer(),
52990       sanitize: false,
52991       sanitizer: null,
52992       silent: false,
52993       smartLists: false,
52994       smartypants: false,
52995       tables: true,
52996       xhtml: false
52997     };
52998   };
52999
53000   marked.defaults = marked.getDefaults();
53001
53002   /**
53003    * Expose
53004    */
53005
53006   marked.Parser = Parser;
53007   marked.parser = Parser.parse;
53008
53009   marked.Renderer = Renderer;
53010   marked.TextRenderer = TextRenderer;
53011
53012   marked.Lexer = Lexer;
53013   marked.lexer = Lexer.lex;
53014
53015   marked.InlineLexer = InlineLexer;
53016   marked.inlineLexer = InlineLexer.output;
53017
53018   marked.parse = marked;
53019
53020   {
53021     module.exports = marked;
53022   }
53023   })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
53024   });
53025
53026   function pointBox(loc, context) {
53027       var rect = context.surfaceRect();
53028       var point$$1 = context.curtainProjection(loc);
53029       return {
53030           left: point$$1[0] + rect.left - 40,
53031           top: point$$1[1] + rect.top - 60,
53032           width: 80,
53033           height: 90
53034       };
53035   }
53036
53037
53038   function pad$1(locOrBox, padding, context) {
53039       var box;
53040       if (locOrBox instanceof Array) {
53041           var rect = context.surfaceRect();
53042           var point$$1 = context.curtainProjection(locOrBox);
53043           box = {
53044               left: point$$1[0] + rect.left,
53045               top: point$$1[1] + rect.top
53046           };
53047       } else {
53048           box = locOrBox;
53049       }
53050
53051       return {
53052           left: box.left - padding,
53053           top: box.top - padding,
53054           width: (box.width || 0) + 2 * padding,
53055           height: (box.width || 0) + 2 * padding
53056       };
53057   }
53058
53059
53060   function icon(name, svgklass, useklass) {
53061       return '<svg class="icon ' + (svgklass || '') + '">' +
53062            '<use xlink:href="' + name + '"' +
53063            (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
53064   }
53065
53066
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
53074   }
53075
53076
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
53085       }
53086   }
53087
53088
53089   function localize(obj) {
53090       var key;
53091
53092       // Assign name if entity has one..
53093       var name = obj.tags && obj.tags.name;
53094       if (name) {
53095           key = 'intro.graph.name.' + slugify(name);
53096           obj.tags.name = t(key, { default: name });
53097           checkKey(key, name);
53098       }
53099
53100       // Assign street name if entity has one..
53101       var street = obj.tags && obj.tags['addr:street'];
53102       if (street) {
53103           key = 'intro.graph.name.' + slugify(street);
53104           obj.tags['addr:street'] = t(key, { default: street });
53105           checkKey(key, street);
53106
53107           // Add address details common across walkthrough..
53108           var addrTags = [
53109               'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
53110               'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
53111           ];
53112           addrTags.forEach(function(k) {
53113               var key = 'intro.graph.' + k,
53114                   tag = 'addr:' + k,
53115                   val = obj.tags && obj.tags[tag],
53116                   str = t(key, { default: val });
53117
53118               if (str) {
53119                   if (str.match(/^<.*>$/) !== null) {
53120                       delete obj.tags[tag];
53121                   } else {
53122                       obj.tags[tag] = str;
53123                   }
53124               }
53125           });
53126       }
53127
53128       return obj;
53129   }
53130
53131
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
53139           mag;
53140
53141       for (var i = 0; i < points.length; i++) {
53142           mag = Math.abs(normalizedDotProduct(i, points));
53143           if (mag > lowerBound && mag < upperBound) {
53144               return false;
53145           }
53146       }
53147
53148       return true;
53149
53150
53151       function normalizedDotProduct(i, points) {
53152           var a = points[(i - 1 + points.length) % points.length],
53153               b = points[i],
53154               c = points[(i + 1) % points.length],
53155               p = subtractPoints(a, b),
53156               q = subtractPoints(c, b);
53157
53158           p = normalizePoint(p);
53159           q = normalizePoint(q);
53160
53161           return p[0] * q[0] + p[1] * q[1];
53162
53163
53164           function subtractPoints(a, b) {
53165               return [a[0] - b[0], a[1] - b[1]];
53166           }
53167
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;
53174               }
53175               return vector;
53176           }
53177       }
53178   }
53179
53180
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);
53185   }
53186
53187
53188   function transitionTime(point1, point2) {
53189       var distance = geoSphericalDistance(point1, point2);
53190       if (distance === 0)
53191           return 0;
53192       else if (distance < 80)
53193           return 500;
53194       else
53195           return 1000;
53196   }
53197
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]}};
53199
53200   // Tooltips and svg mask used to highlight certain features
53201   function uiCurtain() {
53202
53203       var surface = select(null),
53204           tooltip = select(null),
53205           darkness = select(null);
53206
53207       function curtain(selection$$1) {
53208           surface = selection$$1
53209               .append('svg')
53210               .attr('id', 'curtain')
53211               .style('z-index', 1000)
53212               .style('pointer-events', 'none')
53213               .style('position', 'absolute')
53214               .style('top', 0)
53215               .style('left', 0);
53216
53217           darkness = surface.append('path')
53218               .attr('x', 0)
53219               .attr('y', 0)
53220               .attr('class', 'curtain-darkness');
53221
53222           select(window).on('resize.curtain', resize);
53223
53224           tooltip = selection$$1.append('div')
53225               .attr('class', 'tooltip')
53226               .style('z-index', 1002);
53227
53228           tooltip
53229               .append('div')
53230               .attr('class', 'tooltip-arrow');
53231
53232           tooltip
53233               .append('div')
53234               .attr('class', 'tooltip-inner');
53235
53236           resize();
53237
53238
53239           function resize() {
53240               surface
53241                   .attr('width', window.innerWidth)
53242                   .attr('height', window.innerHeight);
53243               curtain.cut(darkness.datum());
53244           }
53245       }
53246
53247
53248       /**
53249        * Reveal cuts the curtain to highlight the given box,
53250        * and shows a tooltip with instructions next to the box.
53251        *
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
53260        */
53261       curtain.reveal = function(box, text, options) {
53262           if (typeof box === 'string') {
53263               box = select(box).node();
53264           }
53265           if (box && box.getBoundingClientRect) {
53266               box = copyBox(box.getBoundingClientRect());
53267           }
53268
53269           options = options || {};
53270
53271           var tooltipBox;
53272           if (options.tooltipBox) {
53273               tooltipBox = options.tooltipBox;
53274               if (typeof tooltipBox === 'string') {
53275                   tooltipBox = select(tooltipBox).node();
53276               }
53277               if (tooltipBox && tooltipBox.getBoundingClientRect) {
53278                   tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
53279               }
53280           } else {
53281               tooltipBox = box;
53282           }
53283
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>' : '';
53288               if (parts[1]) {
53289                   html += '<span class="instruction">' + parts[1] + '</span>';
53290               }
53291
53292               html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
53293               html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
53294
53295               if (options.buttonText && options.buttonCallback) {
53296                   html += '<div class="button-section">' +
53297                       '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
53298               }
53299
53300               var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
53301               tooltip
53302                   .classed(classes, true)
53303                   .selectAll('.tooltip-inner')
53304                   .html(html);
53305
53306               if (options.buttonText && options.buttonCallback) {
53307                   var button = tooltip.selectAll('.button-section .button.action');
53308                   button
53309                       .on('click', function() {
53310                           event.preventDefault();
53311                           options.buttonCallback();
53312                       });
53313               }
53314
53315               var tip = copyBox(tooltip.node().getBoundingClientRect()),
53316                   w = window.innerWidth,
53317                   h = window.innerHeight,
53318                   tooltipWidth = 200,
53319                   tooltipArrow = 5,
53320                   side, pos;
53321
53322
53323               // hack: this will have bottom placement,
53324               // so need to reserve extra space for the tooltip illustration.
53325               if (options.tooltipClass === 'intro-mouse') {
53326                   tip.height += 80;
53327               }
53328
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);
53332               }
53333               if (tooltipBox.left + tooltipBox.width > w) {
53334                   tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
53335               }
53336
53337               // determine tooltip placement..
53338
53339               if (tooltipBox.top + tooltipBox.height < 100) {
53340                   // tooltip below box..
53341                   side = 'bottom';
53342                   pos = [
53343                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
53344                       tooltipBox.top + tooltipBox.height
53345                   ];
53346
53347               } else if (tooltipBox.top > h - 140) {
53348                   // tooltip above box..
53349                   side = 'top';
53350                   pos = [
53351                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
53352                       tooltipBox.top - tip.height
53353                   ];
53354
53355               } else {
53356                   // tooltip to the side of the tooltipBox..
53357                   var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
53358
53359                   if (textDirection === 'rtl') {
53360                       if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
53361                           side = 'right';
53362                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
53363
53364                       } else {
53365                           side = 'left';
53366                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
53367                       }
53368
53369                   } else {
53370                       if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
53371                           side = 'left';
53372                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
53373                       }
53374                       else {
53375                           side = 'right';
53376                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
53377                       }
53378                   }
53379               }
53380
53381               if (options.duration !== 0 || !tooltip.classed(side)) {
53382                   tooltip.call(uiToggle(true));
53383               }
53384
53385               tooltip
53386                   .style('top', pos[1] + 'px')
53387                   .style('left', pos[0] + 'px')
53388                   .attr('class', classes + ' ' + side);
53389
53390
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)
53393               var shiftY = 0;
53394               if (side === 'left' || side === 'right') {
53395                   if (pos[1] < 60) {
53396                       shiftY = 60 - pos[1];
53397                   }
53398                   else if (pos[1] + tip.height > h - 100) {
53399                       shiftY = h - pos[1] - tip.height - 100;
53400                   }
53401               }
53402               tooltip.selectAll('.tooltip-inner')
53403                   .style('top', shiftY + 'px');
53404
53405           } else {
53406               tooltip
53407                   .classed('in', false)
53408                   .call(uiToggle(false));
53409           }
53410
53411           curtain.cut(box, options.duration);
53412
53413           return tooltip;
53414       };
53415
53416
53417       curtain.cut = function(datum, duration) {
53418           darkness.datum(datum)
53419               .interrupt();
53420
53421           var selection$$1;
53422           if (duration === 0) {
53423               selection$$1 = darkness;
53424           } else {
53425               selection$$1 = darkness
53426                   .transition()
53427                   .duration(duration || 600)
53428                   .ease(linear$1);
53429           }
53430
53431           selection$$1
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';
53436
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';
53443
53444               });
53445       };
53446
53447
53448       curtain.remove = function() {
53449           surface.remove();
53450           tooltip.remove();
53451           select(window).on('resize.curtain', null);
53452       };
53453
53454
53455       // ClientRects are immutable, so copy them to an object,
53456       // in case we need to trim the height/width.
53457       function copyBox(src) {
53458           return {
53459               top: src.top,
53460               right: src.right,
53461               bottom: src.bottom,
53462               left: src.left,
53463               width: src.width,
53464               height: src.height
53465           };
53466       }
53467
53468
53469       return curtain;
53470   }
53471
53472   function uiIntroWelcome(context, reveal) {
53473       var dispatch$$1 = dispatch('done'),
53474           listener = clickListener();
53475
53476       var chapter = {
53477           title: 'intro.welcome.title'
53478       };
53479
53480
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 }
53486           );
53487       }
53488
53489       function practice() {
53490           reveal('.intro-nav-wrap .chapter-welcome',
53491               t('intro.welcome.practice'),
53492               { buttonText: t('intro.ok'), buttonCallback: words }
53493           );
53494       }
53495
53496       function words() {
53497           reveal('.intro-nav-wrap .chapter-welcome',
53498               t('intro.welcome.words'),
53499               { buttonText: t('intro.ok'), buttonCallback: mouse$$1 }
53500           );
53501       }
53502
53503
53504       function mouse$$1() {
53505           reveal('.intro-nav-wrap .chapter-welcome',
53506               t('intro.welcome.mouse'),
53507               { buttonText: t('intro.ok'), buttonCallback: leftClick }
53508           );
53509       }
53510
53511
53512       function leftClick() {
53513           var counter = 0,
53514               times = 5;
53515
53516           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
53517               t('intro.welcome.leftclick', { num: times }),
53518               { tooltipClass: 'intro-mouse' }
53519           );
53520
53521           tooltip.selectAll('.tooltip-inner')
53522               .insert('svg', 'span')
53523               .attr('class', 'tooltip-illustration')
53524               .append('use')
53525               .attr('xlink:href', '#iD-walkthrough-mouse');
53526
53527           tooltip
53528               .append('div')
53529               .attr('class', 'counter');
53530
53531           tooltip.call(listener);
53532
53533           listener.on('click', function(which) {
53534               if (which === 'left') {
53535                   select('.curtain-tooltip.intro-mouse .counter')
53536                       .text(String(++counter));
53537
53538                   if (counter === times) {
53539                       window.setTimeout(function() { continueTo(rightClick); }, 1000);
53540                   }
53541               }
53542           });
53543
53544           function continueTo(nextStep) {
53545               listener.on('click', null);
53546               tooltip.call(listener.off);
53547               tooltip.select('.counter').remove();
53548               nextStep();
53549           }
53550       }
53551
53552
53553       function rightClick() {
53554           var counter = 0,
53555               times = 5;
53556
53557           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
53558               t('intro.welcome.rightclick', { num: times }),
53559               { tooltipClass: 'intro-mouse' }
53560           );
53561
53562           tooltip.selectAll('.tooltip-inner')
53563               .insert('svg', 'span')
53564               .attr('class', 'tooltip-illustration')
53565               .append('use')
53566               .attr('xlink:href', '#iD-walkthrough-mouse');
53567
53568           tooltip
53569               .append('div')
53570               .attr('class', 'counter');
53571
53572           tooltip.call(listener);
53573
53574           listener.on('click', function(which) {
53575               if (which === 'right') {
53576                   select('.curtain-tooltip.intro-mouse .counter')
53577                       .text(String(++counter));
53578
53579                   if (counter === times) {
53580                       window.setTimeout(function() { continueTo(chapters); }, 1000);
53581                   }
53582               }
53583           });
53584
53585           function continueTo(nextStep) {
53586               listener.on('click', null);
53587               tooltip.call(listener.off);
53588               tooltip.select('.counter').remove();
53589               nextStep();
53590           }
53591       }
53592
53593
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') })
53598           );
53599       }
53600
53601
53602       chapter.enter = function() {
53603           welcome();
53604       };
53605
53606
53607       chapter.exit = function() {
53608           listener.off();
53609           select('.curtain-tooltip.intro-mouse')
53610               .selectAll('.counter')
53611               .remove();
53612       };
53613
53614
53615       chapter.restart = function() {
53616           chapter.exit();
53617           chapter.enter();
53618       };
53619
53620
53621       return utilRebind(chapter, dispatch$$1, 'on');
53622   }
53623
53624
53625
53626   function clickListener() {
53627       var dispatch$$1 = dispatch('click'),
53628           minTime = 120,
53629           tooltip = select(null),
53630           down = {};
53631
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
53636
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);
53643           }
53644       }
53645
53646
53647       function keyup() {
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;
53654
53655               window.setTimeout(function() {
53656                   tooltip.classed('rightclick', false);
53657                   down.menu = undefined;  // delayed, for Windows
53658               }, delay);
53659
53660               dispatch$$1.call('click', this, 'right');
53661           }
53662       }
53663
53664
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);
53671           }
53672           down[button] = event.timeStamp;
53673       }
53674
53675
53676       function mouseup() {
53677           var button = event.button,
53678               endTime = event.timeStamp,
53679               startTime = down[button] || endTime,
53680               delay = (endTime - startTime < minTime) ? minTime : 0;
53681
53682           if (button === 0 && !event.ctrlKey) {
53683               window.setTimeout(function() {
53684                   tooltip.classed('leftclick', false);
53685                   down[button] = undefined;  // delayed, for Windows
53686               }, delay);
53687
53688               dispatch$$1.call('click', this, 'left');
53689
53690           } else if (button === 2) {
53691               window.setTimeout(function() {
53692                   tooltip.classed('rightclick', false);
53693                   down[button] = undefined;  // delayed, for Windows
53694               }, delay);
53695
53696               dispatch$$1.call('click', this, 'right');
53697
53698           } else {
53699               window.setTimeout(function() {
53700                   down[button] = undefined;  // delayed, for Windows
53701               }, delay);
53702           }
53703       }
53704
53705
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);
53713               }, minTime);
53714               dispatch$$1.call('click', this, 'right');
53715           }
53716       }
53717
53718
53719       var behavior = function(selection$$1) {
53720           tooltip = selection$$1;
53721           down = {};
53722
53723           select(window)
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);
53729       };
53730
53731
53732       behavior.off = function() {
53733           select(window)
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);
53739
53740           tooltip
53741               .classed('leftclick', false)
53742               .classed('rightclick', false);
53743       };
53744
53745       return utilRebind(behavior, dispatch$$1, 'on');
53746   }
53747
53748   function uiIntroNavigation(context, reveal) {
53749       var dispatch$$1 = dispatch('done'),
53750           timeouts = [],
53751           hallId = 'n2061',
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');
53758
53759
53760       var chapter = {
53761           title: 'intro.navigation.title'
53762       };
53763
53764
53765       function timeout(f, t$$1) {
53766           timeouts.push(window.setTimeout(f, t$$1));
53767       }
53768
53769
53770       function eventCancel() {
53771           event.stopPropagation();
53772           event.preventDefault();
53773       }
53774
53775
53776       function isTownHallSelected() {
53777           var ids = context.selectedIDs();
53778           return ids.length === 1 && ids[0] === hallId;
53779       }
53780
53781
53782       function dragMap() {
53783           context.enter(modeBrowse(context));
53784           context.history().reset('initial');
53785
53786           var msec = transitionTime(townHall, context.map().center());
53787           if (msec) { reveal(null, null, { duration: 0 }); }
53788           context.map().zoom(19).centerEase(townHall, msec);
53789
53790           timeout(function() {
53791               var centerStart = context.map().center();
53792
53793               reveal('#surface', t('intro.navigation.drag'));
53794               context.map().on('drawn.intro', function() {
53795                   reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
53796               });
53797
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);
53803                   }
53804               });
53805
53806           }, msec + 100);
53807
53808           function continueTo(nextStep) {
53809               context.map().on('move.intro drawn.intro', null);
53810               nextStep();
53811           }
53812       }
53813
53814
53815       function zoomMap() {
53816           var zoomStart = context.map().zoom();
53817
53818           reveal('#surface',
53819               t('intro.navigation.zoom', {
53820                   plus: icon('#iD-icon-plus', 'pre-text'),
53821                   minus: icon('#iD-icon-minus', 'pre-text')
53822               })
53823           );
53824
53825           context.map().on('drawn.intro', function() {
53826               reveal('#surface',
53827                   t('intro.navigation.zoom', {
53828                       plus: icon('#iD-icon-plus', 'pre-text'),
53829                       minus: icon('#iD-icon-minus', 'pre-text')
53830                   }), { duration: 0 }
53831               );
53832           });
53833
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);
53838               }
53839           });
53840
53841           function continueTo(nextStep) {
53842               context.map().on('move.intro drawn.intro', null);
53843               nextStep();
53844           }
53845       }
53846
53847
53848       function features() {
53849           var onClick = function() { continueTo(pointsLinesAreas); };
53850
53851           reveal('#surface', t('intro.navigation.features'),
53852               { buttonText: t('intro.ok'), buttonCallback: onClick }
53853           );
53854
53855           context.map().on('drawn.intro', function() {
53856               reveal('#surface', t('intro.navigation.features'),
53857                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
53858               );
53859           });
53860
53861           function continueTo(nextStep) {
53862               context.map().on('drawn.intro', null);
53863               nextStep();
53864           }
53865       }
53866
53867       function pointsLinesAreas() {
53868           var onClick = function() { continueTo(nodesWays); };
53869
53870           reveal('#surface', t('intro.navigation.points_lines_areas'),
53871               { buttonText: t('intro.ok'), buttonCallback: onClick }
53872           );
53873
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 }
53877               );
53878           });
53879
53880           function continueTo(nextStep) {
53881               context.map().on('drawn.intro', null);
53882               nextStep();
53883           }
53884       }
53885
53886       function nodesWays() {
53887           var onClick = function() { continueTo(clickTownHall); };
53888
53889           reveal('#surface', t('intro.navigation.nodes_ways'),
53890               { buttonText: t('intro.ok'), buttonCallback: onClick }
53891           );
53892
53893           context.map().on('drawn.intro', function() {
53894               reveal('#surface', t('intro.navigation.nodes_ways'),
53895                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
53896               );
53897           });
53898
53899           function continueTo(nextStep) {
53900               context.map().on('drawn.intro', null);
53901               nextStep();
53902           }
53903       }
53904
53905       function clickTownHall() {
53906           context.enter(modeBrowse(context));
53907           context.history().reset('initial');
53908
53909           reveal(null, null, { duration: 0 });
53910           context.map().zoomEase(19, 500);
53911
53912           timeout(function() {
53913               var entity = context.hasEntity(hallId);
53914               if (!entity) return;
53915               context.map().centerEase(entity.loc, 500);
53916
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'));
53922
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 });
53928                   });
53929
53930                   context.on('enter.intro', function() {
53931                       if (isTownHallSelected()) continueTo(selectedTownHall);
53932                   });
53933
53934               }, 550);  // after centerEase
53935
53936           }, 550); // after zoomEase
53937
53938           context.history().on('change.intro', function() {
53939               if (!context.hasEntity(hallId)) {
53940                   continueTo(clickTownHall);
53941               }
53942           });
53943
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);
53948               nextStep();
53949           }
53950       }
53951
53952
53953       function selectedTownHall() {
53954           if (!isTownHallSelected()) return clickTownHall();
53955
53956           var entity = context.hasEntity(hallId);
53957           if (!entity) return clickTownHall();
53958
53959           var box = pointBox(entity.loc, context);
53960           var onClick = function() { continueTo(editorTownHall); };
53961
53962           reveal(box, t('intro.navigation.selected_townhall'),
53963               { buttonText: t('intro.ok'), buttonCallback: onClick }
53964           );
53965
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 }
53972               );
53973           });
53974
53975           context.history().on('change.intro', function() {
53976               if (!context.hasEntity(hallId)) {
53977                   continueTo(clickTownHall);
53978               }
53979           });
53980
53981           function continueTo(nextStep) {
53982               context.map().on('move.intro drawn.intro', null);
53983               context.history().on('change.intro', null);
53984               nextStep();
53985           }
53986       }
53987
53988
53989       function editorTownHall() {
53990           if (!isTownHallSelected()) return clickTownHall();
53991
53992           // disallow scrolling
53993           select('.inspector-wrap').on('wheel.intro', eventCancel);
53994
53995           var onClick = function() { continueTo(presetTownHall); };
53996
53997           reveal('.entity-editor-pane',
53998               t('intro.navigation.editor_townhall'),
53999               { buttonText: t('intro.ok'), buttonCallback: onClick }
54000           );
54001
54002           context.on('exit.intro', function() {
54003               continueTo(clickTownHall);
54004           });
54005
54006           context.history().on('change.intro', function() {
54007               if (!context.hasEntity(hallId)) {
54008                   continueTo(clickTownHall);
54009               }
54010           });
54011
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);
54016               nextStep();
54017           }
54018       }
54019
54020
54021       function presetTownHall() {
54022           if (!isTownHallSelected()) return clickTownHall();
54023
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);
54028
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());
54032
54033           var onClick = function() { continueTo(fieldsTownHall); };
54034
54035           context.on('exit.intro', function() {
54036               continueTo(clickTownHall);
54037           });
54038
54039           context.history().on('change.intro', function() {
54040               if (!context.hasEntity(hallId)) {
54041                   continueTo(clickTownHall);
54042               }
54043           });
54044
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 }
54048           );
54049
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);
54054               nextStep();
54055           }
54056       }
54057
54058
54059       function fieldsTownHall() {
54060           if (!isTownHallSelected()) return clickTownHall();
54061
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);
54066
54067           var onClick = function() { continueTo(closeTownHall); };
54068
54069           reveal('.inspector-body .preset-editor',
54070               t('intro.navigation.fields_townhall'),
54071               { buttonText: t('intro.ok'), buttonCallback: onClick }
54072           );
54073
54074           context.on('exit.intro', function() {
54075               continueTo(clickTownHall);
54076           });
54077
54078           context.history().on('change.intro', function() {
54079               if (!context.hasEntity(hallId)) {
54080                   continueTo(clickTownHall);
54081               }
54082           });
54083
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);
54088               nextStep();
54089           }
54090       }
54091
54092
54093       function closeTownHall() {
54094           if (!isTownHallSelected()) return clickTownHall();
54095
54096           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
54097           var href = select(selector$$1).attr('href') || '#iD-icon-close';
54098
54099           reveal('.entity-editor-pane',
54100               t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
54101           );
54102
54103           context.on('exit.intro', function() {
54104               continueTo(searchStreet);
54105           });
54106
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';
54111
54112               reveal('.entity-editor-pane',
54113                   t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
54114                   { duration: 0 }
54115               );
54116           });
54117
54118           function continueTo(nextStep) {
54119               context.on('exit.intro', null);
54120               context.history().on('change.intro', null);
54121               nextStep();
54122           }
54123       }
54124
54125
54126       function searchStreet() {
54127           context.enter(modeBrowse(context));
54128           context.history().reset('initial');  // ensure spring street exists
54129
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
54133
54134           timeout(function() {
54135               reveal('.search-header input',
54136                   t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
54137               );
54138
54139               select('.search-header input')
54140                   .on('keyup.intro', checkSearchResult);
54141           }, msec + 100);
54142       }
54143
54144
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');
54149
54150           if (!firstName.empty() && firstName.text() === name) {
54151               reveal(first.node(),
54152                   t('intro.navigation.choose_street', { name: name }),
54153                   { duration: 300 }
54154               );
54155
54156               context.on('exit.intro', function() {
54157                   continueTo(selectedStreet);
54158               });
54159
54160               select('.search-header input')
54161                   .on('keydown.intro', eventCancel, true)
54162                   .on('keyup.intro', null);
54163           }
54164
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);
54170               nextStep();
54171           }
54172       }
54173
54174
54175       function selectedStreet() {
54176           if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
54177               return searchStreet();
54178           }
54179
54180           var onClick = function() { continueTo(editorStreet); };
54181           var entity = context.entity(springStreetEndId);
54182           var box = pointBox(entity.loc, context);
54183           box.height = 500;
54184
54185           reveal(box,
54186               t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
54187               { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
54188           );
54189
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);
54195                   box.height = 500;
54196                   reveal(box,
54197                       t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
54198                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
54199                   );
54200               });
54201           }, 600);  // after reveal.
54202
54203           context.on('enter.intro', function(mode) {
54204               if (!context.hasEntity(springStreetId)) {
54205                   return continueTo(searchStreet);
54206               }
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]));
54211               }
54212           });
54213
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)
54219               }
54220           });
54221
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);
54226               nextStep();
54227           }
54228       }
54229
54230
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';
54234
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()
54240               })
54241           );
54242
54243           context.on('exit.intro', function() {
54244               continueTo(play);
54245           });
54246
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';
54251
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 }
54258               );
54259           });
54260
54261           function continueTo(nextStep) {
54262               context.on('exit.intro', null);
54263               context.history().on('change.intro', null);
54264               nextStep();
54265           }
54266       }
54267
54268
54269       function play() {
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'); }
54276               }
54277           );
54278       }
54279
54280
54281       chapter.enter = function() {
54282           dragMap();
54283       };
54284
54285
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);
54293       };
54294
54295
54296       chapter.restart = function() {
54297           chapter.exit();
54298           chapter.enter();
54299       };
54300
54301
54302       return utilRebind(chapter, dispatch$$1, 'on');
54303   }
54304
54305   function uiIntroPoint(context, reveal) {
54306       var dispatch$$1 = dispatch('done'),
54307           timeouts = [],
54308           intersection = [-85.63279, 41.94394],
54309           building = [-85.632422, 41.944045],
54310           cafePreset = context.presets().item('amenity/cafe'),
54311           pointId = null;
54312
54313
54314       var chapter = {
54315           title: 'intro.points.title'
54316       };
54317
54318
54319       function timeout(f, t$$1) {
54320           timeouts.push(window.setTimeout(f, t$$1));
54321       }
54322
54323
54324       function revealEditMenu(loc, text, options) {
54325           var rect = context.surfaceRect();
54326           var point$$1 = context.curtainProjection(loc);
54327           var pad = 40;
54328           var width = 250 + (2 * pad);
54329           var height = 250;
54330           var startX = rect.left + point$$1[0];
54331           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
54332           var box = {
54333               left: left,
54334               top: point$$1[1] + rect.top - 60,
54335               width: width,
54336               height: height
54337           };
54338           reveal(box, text, options);
54339       }
54340
54341
54342       function eventCancel() {
54343           event.stopPropagation();
54344           event.preventDefault();
54345       }
54346
54347
54348       function addPoint() {
54349           context.enter(modeBrowse(context));
54350           context.history().reset('initial');
54351
54352           var msec = transitionTime(intersection, context.map().center());
54353           if (msec) { reveal(null, null, { duration: 0 }); }
54354           context.map().zoom(19).centerEase(intersection, msec);
54355
54356           timeout(function() {
54357               var tooltip = reveal('button.add-point',
54358                   t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') }));
54359
54360               pointId = null;
54361
54362               tooltip.selectAll('.tooltip-inner')
54363                   .insert('svg', 'span')
54364                   .attr('class', 'tooltip-illustration')
54365                   .append('use')
54366                   .attr('xlink:href', '#iD-graphic-points');
54367
54368               context.on('enter.intro', function(mode) {
54369                   if (mode.id !== 'add-point') return;
54370                   continueTo(placePoint);
54371               });
54372           }, msec + 100);
54373
54374           function continueTo(nextStep) {
54375               context.on('enter.intro', null);
54376               nextStep();
54377           }
54378       }
54379
54380
54381       function placePoint() {
54382           if (context.mode().id !== 'add-point') {
54383               return chapter.restart();
54384           }
54385
54386           var pointBox$$1 = pad$1(building, 150, context);
54387           reveal(pointBox$$1, t('intro.points.place_point'));
54388
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 });
54392           });
54393
54394           context.on('enter.intro', function(mode) {
54395               if (mode.id !== 'select') return chapter.restart();
54396               pointId = context.mode().selectedIDs()[0];
54397               continueTo(searchPreset);
54398           });
54399
54400           function continueTo(nextStep) {
54401               context.map().on('move.intro drawn.intro', null);
54402               context.on('enter.intro', null);
54403               nextStep();
54404           }
54405       }
54406
54407
54408       function searchPreset() {
54409           if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
54410               return addPoint();
54411           }
54412
54413           // disallow scrolling
54414           select('.inspector-wrap').on('wheel.intro', eventCancel);
54415
54416           select('.preset-search-input')
54417               .on('keydown.intro', null)
54418               .on('keyup.intro', checkPresetSearch);
54419
54420           reveal('.preset-search-input',
54421               t('intro.points.search_cafe', { preset: cafePreset.name() })
54422           );
54423
54424           context.on('enter.intro', function(mode) {
54425               if (!pointId || !context.hasEntity(pointId)) {
54426                   return continueTo(addPoint);
54427               }
54428
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]));
54433
54434                   // disallow scrolling
54435                   select('.inspector-wrap').on('wheel.intro', eventCancel);
54436
54437                   select('.preset-search-input')
54438                       .on('keydown.intro', null)
54439                       .on('keyup.intro', checkPresetSearch);
54440
54441                   reveal('.preset-search-input',
54442                       t('intro.points.search_cafe', { preset: cafePreset.name() })
54443                   );
54444
54445                   context.history().on('change.intro', null);
54446               }
54447           });
54448
54449
54450           function checkPresetSearch() {
54451               var first = select('.preset-list-item:first-child');
54452
54453               if (first.classed('preset-amenity-cafe')) {
54454                   select('.preset-search-input')
54455                       .on('keydown.intro', eventCancel, true)
54456                       .on('keyup.intro', null);
54457
54458                   reveal(first.select('.preset-list-button').node(),
54459                       t('intro.points.choose_cafe', { preset: cafePreset.name() }),
54460                       { duration: 300 }
54461                   );
54462
54463                   context.history().on('change.intro', function() {
54464                       continueTo(aboutFeatureEditor);
54465                   });
54466               }
54467           }
54468
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);
54474               nextStep();
54475           }
54476       }
54477
54478
54479       function aboutFeatureEditor() {
54480           if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
54481               return addPoint();
54482           }
54483
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); }
54489               });
54490           }, 400);
54491
54492           context.on('exit.intro', function() {
54493               // if user leaves select mode here, just continue with the tutorial.
54494               continueTo(reselectPoint);
54495           });
54496
54497           function continueTo(nextStep) {
54498               context.on('exit.intro', null);
54499               nextStep();
54500           }
54501       }
54502
54503
54504       function addName() {
54505           if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
54506               return addPoint();
54507           }
54508
54509           // reset pane, in case user happened to change it..
54510           select('.inspector-wrap .panewrap').style('right', '0%');
54511
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); }
54522                   });
54523                   tooltip.select('.instruction').style('display', 'none');
54524
54525               } else {
54526                   reveal('.entity-editor-pane', t('intro.points.add_name'),
54527                       { tooltipClass: 'intro-points-describe' }
54528                   );
54529               }
54530           }, 400);
54531
54532           context.history().on('change.intro', function() {
54533               continueTo(addCloseEditor);
54534           });
54535
54536           context.on('exit.intro', function() {
54537               // if user leaves select mode here, just continue with the tutorial.
54538               continueTo(reselectPoint);
54539           });
54540
54541           function continueTo(nextStep) {
54542               context.on('exit.intro', null);
54543               context.history().on('change.intro', null);
54544               nextStep();
54545           }
54546       }
54547
54548
54549       function addCloseEditor() {
54550           // reset pane, in case user happened to change it..
54551           select('.inspector-wrap .panewrap').style('right', '0%');
54552
54553           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
54554           var href = select(selector$$1).attr('href') || '#iD-icon-close';
54555
54556           context.on('exit.intro', function() {
54557               continueTo(reselectPoint);
54558           });
54559
54560           reveal('.entity-editor-pane',
54561               t('intro.points.add_close', { button: icon(href, 'pre-text') })
54562           );
54563
54564           function continueTo(nextStep) {
54565               context.on('exit.intro', null);
54566               nextStep();
54567           }
54568       }
54569
54570
54571       function reselectPoint() {
54572           if (!pointId) return chapter.restart();
54573           var entity = context.hasEntity(pointId);
54574           if (!entity) return chapter.restart();
54575
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));
54579
54580           context.enter(modeBrowse(context));
54581
54582           var msec = transitionTime(entity.loc, context.map().center());
54583           if (msec) { reveal(null, null, { duration: 0 }); }
54584           context.map().centerEase(entity.loc, msec);
54585
54586           timeout(function() {
54587               var box = pointBox(entity.loc, context);
54588               reveal(box, t('intro.points.reselect'), { duration: 600 });
54589
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 });
54596                   });
54597               }, 600); // after reveal..
54598
54599               context.on('enter.intro', function(mode) {
54600                   if (mode.id !== 'select') return;
54601                   continueTo(updatePoint);
54602               });
54603
54604           }, msec + 100);
54605
54606           function continueTo(nextStep) {
54607               context.map().on('move.intro drawn.intro', null);
54608               context.on('enter.intro', null);
54609               nextStep();
54610           }
54611       }
54612
54613
54614       function updatePoint() {
54615           if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
54616               return continueTo(reselectPoint);
54617           }
54618
54619           // reset pane, in case user happened to untag the point..
54620           select('.inspector-wrap .panewrap').style('right', '0%');
54621
54622           context.on('exit.intro', function() {
54623               continueTo(reselectPoint);
54624           });
54625
54626           context.history().on('change.intro', function() {
54627               continueTo(updateCloseEditor);
54628           });
54629
54630           timeout(function() {
54631               reveal('.entity-editor-pane', t('intro.points.update'),
54632                   { tooltipClass: 'intro-points-describe' }
54633               );
54634           }, 400);
54635
54636           function continueTo(nextStep) {
54637               context.on('exit.intro', null);
54638               context.history().on('change.intro', null);
54639               nextStep();
54640           }
54641       }
54642
54643
54644       function updateCloseEditor() {
54645           if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
54646               return continueTo(reselectPoint);
54647           }
54648
54649           // reset pane, in case user happened to change it..
54650           select('.inspector-wrap .panewrap').style('right', '0%');
54651
54652           context.on('exit.intro', function() {
54653               continueTo(rightClickPoint);
54654           });
54655
54656           timeout(function() {
54657               reveal('.entity-editor-pane',
54658                   t('intro.points.update_close', { button: icon('#iD-icon-apply', 'pre-text') })
54659               );
54660           }, 500);
54661
54662           function continueTo(nextStep) {
54663               context.on('exit.intro', null);
54664               nextStep();
54665           }
54666       }
54667
54668
54669       function rightClickPoint() {
54670           if (!pointId) return chapter.restart();
54671           var entity = context.hasEntity(pointId);
54672           if (!entity) return chapter.restart();
54673
54674           context.enter(modeBrowse(context));
54675
54676           var box = pointBox(entity.loc, context);
54677           reveal(box, t('intro.points.rightclick'), { duration: 600 });
54678
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 });
54685               });
54686           }, 600); // after reveal
54687
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;
54692
54693               timeout(function() {
54694                   var node = selectMenuItem('delete').node();
54695                   if (!node) return;
54696                   continueTo(enterDelete);
54697               }, 300);  // after menu visible
54698           });
54699
54700           function continueTo(nextStep) {
54701               context.on('enter.intro', null);
54702               context.map().on('move.intro drawn.intro', null);
54703               nextStep();
54704           }
54705       }
54706
54707
54708       function enterDelete() {
54709           if (!pointId) return chapter.restart();
54710           var entity = context.hasEntity(pointId);
54711           if (!entity) return chapter.restart();
54712
54713           var node = selectMenuItem('delete').node();
54714           if (!node) { return continueTo(rightClickPoint); }
54715
54716           revealEditMenu(entity.loc,
54717               t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') })
54718           );
54719
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') }),
54724                       { duration: 0}
54725                   );
54726               });
54727           }, 300); // after menu visible
54728
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
54733           });
54734
54735           context.history().on('change.intro', function(changed) {
54736               if (changed.deleted().length) {
54737                   continueTo(undo);
54738               }
54739           });
54740
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);
54745               nextStep();
54746           }
54747       }
54748
54749
54750       function undo() {
54751           context.history().on('change.intro', function() {
54752               continueTo(play);
54753           });
54754
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') })
54758           );
54759
54760           function continueTo(nextStep) {
54761               context.history().on('change.intro', null);
54762               nextStep();
54763           }
54764       }
54765
54766
54767       function play() {
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'); }
54774               }
54775           );
54776       }
54777
54778
54779       chapter.enter = function() {
54780           addPoint();
54781       };
54782
54783
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);
54791       };
54792
54793
54794       chapter.restart = function() {
54795           chapter.exit();
54796           chapter.enter();
54797       };
54798
54799
54800       return utilRebind(chapter, dispatch$$1, 'on');
54801   }
54802
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'),
54808           timeouts = [],
54809           areaId;
54810
54811
54812       var chapter = {
54813           title: 'intro.areas.title'
54814       };
54815
54816
54817       function timeout(f, t$$1) {
54818           timeouts.push(window.setTimeout(f, t$$1));
54819       }
54820
54821
54822       function eventCancel() {
54823           event.stopPropagation();
54824           event.preventDefault();
54825       }
54826
54827
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);
54832       }
54833
54834
54835       function addArea() {
54836           context.enter(modeBrowse(context));
54837           context.history().reset('initial');
54838           areaId = null;
54839
54840           var msec = transitionTime(playground, context.map().center());
54841           if (msec) { reveal(null, null, { duration: 0 }); }
54842           context.map().zoom(19).centerEase(playground, msec);
54843
54844           timeout(function() {
54845               var tooltip = reveal('button.add-area',
54846                   t('intro.areas.add_playground', { button: icon('#iD-icon-area', 'pre-text') }));
54847
54848               tooltip.selectAll('.tooltip-inner')
54849                   .insert('svg', 'span')
54850                   .attr('class', 'tooltip-illustration')
54851                   .append('use')
54852                   .attr('xlink:href', '#iD-graphic-areas');
54853
54854               context.on('enter.intro', function(mode) {
54855                   if (mode.id !== 'add-area') return;
54856                   continueTo(startPlayground);
54857               });
54858           }, msec + 100);
54859
54860           function continueTo(nextStep) {
54861               context.on('enter.intro', null);
54862               nextStep();
54863           }
54864       }
54865
54866
54867       function startPlayground() {
54868           if (context.mode().id !== 'add-area') {
54869               return chapter.restart();
54870           }
54871
54872           areaId = null;
54873           context.map().zoomEase(19.5, 500);
54874
54875           timeout(function() {
54876               revealPlayground(playground,
54877                   t('intro.areas.start_playground'), { duration: 250 }
54878               );
54879
54880               timeout(function() {
54881                   context.map().on('move.intro drawn.intro', function() {
54882                       revealPlayground(playground,
54883                           t('intro.areas.start_playground'), { duration: 0 }
54884                       );
54885                   });
54886                   context.on('enter.intro', function(mode) {
54887                       if (mode.id !== 'draw-area') return chapter.restart();
54888                       continueTo(continuePlayground);
54889                   });
54890               }, 250);  // after reveal
54891
54892           }, 550);  // after easing
54893
54894           function continueTo(nextStep) {
54895               context.map().on('move.intro drawn.intro', null);
54896               context.on('enter.intro', null);
54897               nextStep();
54898           }
54899       }
54900
54901
54902       function continuePlayground() {
54903           if (context.mode().id !== 'draw-area') {
54904               return chapter.restart();
54905           }
54906
54907           areaId = null;
54908           revealPlayground(playground,
54909               t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
54910               { duration: 250 }
54911           );
54912
54913           timeout(function() {
54914               context.map().on('move.intro drawn.intro', function() {
54915                   revealPlayground(playground,
54916                       t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
54917                       { duration: 0 }
54918                   );
54919               });
54920           }, 250);  // after reveal
54921
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);
54927                   } else {
54928                       return;
54929                   }
54930               } else if (mode.id === 'select') {
54931                   areaId = context.selectedIDs()[0];
54932                   return continueTo(searchPresets);
54933               } else {
54934                   return chapter.restart();
54935               }
54936           });
54937
54938           function continueTo(nextStep) {
54939               context.map().on('move.intro drawn.intro', null);
54940               context.on('enter.intro', null);
54941               nextStep();
54942           }
54943       }
54944
54945
54946       function finishPlayground() {
54947           if (context.mode().id !== 'draw-area') {
54948               return chapter.restart();
54949           }
54950
54951           areaId = null;
54952           revealPlayground(playground,
54953               t('intro.areas.finish_playground'), { duration: 250 }
54954           );
54955
54956           timeout(function() {
54957               context.map().on('move.intro drawn.intro', function() {
54958                   revealPlayground(playground,
54959                       t('intro.areas.finish_playground'), { duration: 0 }
54960                   );
54961               });
54962           }, 250);  // after reveal
54963
54964           context.on('enter.intro', function(mode) {
54965               if (mode.id === 'draw-area') {
54966                   return;
54967               } else if (mode.id === 'select') {
54968                   areaId = context.selectedIDs()[0];
54969                   return continueTo(searchPresets);
54970               } else {
54971                   return chapter.restart();
54972               }
54973           });
54974
54975           function continueTo(nextStep) {
54976               context.map().on('move.intro drawn.intro', null);
54977               context.on('enter.intro', null);
54978               nextStep();
54979           }
54980       }
54981
54982
54983       function searchPresets() {
54984           if (!areaId || !context.hasEntity(areaId)) {
54985               return addArea();
54986           }
54987           var ids = context.selectedIDs();
54988           if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
54989               context.enter(modeSelect(context, [areaId]));
54990           }
54991
54992           // disallow scrolling
54993           select('.inspector-wrap').on('wheel.intro', eventCancel);
54994
54995           timeout(function() {
54996               // reset pane, in case user somehow happened to change it..
54997               select('.inspector-wrap .panewrap').style('right', '-100%');
54998
54999               select('.preset-search-input')
55000                   .on('keydown.intro', null)
55001                   .on('keyup.intro', checkPresetSearch);
55002
55003               reveal('.preset-search-input',
55004                   t('intro.areas.search_playground', { preset: playgroundPreset.name() })
55005               );
55006           }, 400);  // after preset list pane visible..
55007
55008           context.on('enter.intro', function(mode) {
55009               if (!areaId || !context.hasEntity(areaId)) {
55010                   return continueTo(addArea);
55011               }
55012
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]));
55017
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);
55022
55023                   select('.preset-search-input')
55024                       .on('keydown.intro', null)
55025                       .on('keyup.intro', checkPresetSearch);
55026
55027                   reveal('.preset-search-input',
55028                       t('intro.areas.search_playground', { preset: playgroundPreset.name() })
55029                   );
55030
55031                   context.history().on('change.intro', null);
55032               }
55033           });
55034
55035           function checkPresetSearch() {
55036               var first = select('.preset-list-item:first-child');
55037
55038               if (first.classed('preset-leisure-playground')) {
55039                   reveal(first.select('.preset-list-button').node(),
55040                       t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
55041                       { duration: 300 }
55042                   );
55043
55044                   select('.preset-search-input')
55045                       .on('keydown.intro', eventCancel, true)
55046                       .on('keyup.intro', null);
55047
55048                   context.history().on('change.intro', function() {
55049                       continueTo(clickAddField);
55050                   });
55051               }
55052           }
55053
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);
55059               nextStep();
55060           }
55061       }
55062
55063
55064       function clickAddField() {
55065           if (!areaId || !context.hasEntity(areaId)) {
55066               return addArea();
55067           }
55068           var ids = context.selectedIDs();
55069           if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
55070               return searchPresets();
55071           }
55072
55073           if (!select('.form-field-description').empty()) {
55074               return continueTo(describePlayground);
55075           }
55076
55077           // disallow scrolling
55078           select('.inspector-wrap').on('wheel.intro', eventCancel);
55079
55080           timeout(function() {
55081               // reset pane, in case user somehow happened to change it..
55082               select('.inspector-wrap .panewrap').style('right', '0%');
55083
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);
55089               }
55090
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);
55097
55098                   pane
55099                       .transition()
55100                       .duration(250)
55101                       .tween('scroll.inspector', function() {
55102                           var node = this;
55103                           var i = interpolateNumber(start, end);
55104                           return function(t$$1) {
55105                               node.scrollTop = i(t$$1);
55106                           };
55107                       });
55108               }
55109
55110               timeout(function() {
55111                   reveal('.more-fields .combobox-input',
55112                       t('intro.areas.add_field'),
55113                       { duration: 300 }
55114                   );
55115
55116                   select('.more-fields .combobox-input')
55117                       .on('click.intro', function() {
55118                           continueTo(chooseDescriptionField);
55119                       });
55120               }, 300);  // after "Add Field" visible
55121
55122           }, 400);  // after editor pane visible
55123
55124           context.on('exit.intro', function() {
55125               return continueTo(searchPresets);
55126           });
55127
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);
55132               nextStep();
55133           }
55134       }
55135
55136
55137       function chooseDescriptionField() {
55138           if (!areaId || !context.hasEntity(areaId)) {
55139               return addArea();
55140           }
55141           var ids = context.selectedIDs();
55142           if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
55143               return searchPresets();
55144           }
55145
55146           if (!select('.form-field-description').empty()) {
55147               return continueTo(describePlayground);
55148           }
55149
55150           // Make sure combobox is ready..
55151           if (select('div.combobox').empty()) {
55152               return continueTo(clickAddField);
55153           }
55154           // Watch for the combobox to go away..
55155           var watcher;
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);
55162                       } else {
55163                           continueTo(describePlayground);
55164                       }
55165                   }, 300);  // after description field added.
55166               }
55167           }, 300);
55168
55169           reveal('div.combobox',
55170               t('intro.areas.choose_field', { field: descriptionField.label() }),
55171               { duration: 300 }
55172           );
55173
55174           context.on('exit.intro', function() {
55175               return continueTo(searchPresets);
55176           });
55177
55178           function continueTo(nextStep) {
55179               if (watcher) window.clearInterval(watcher);
55180               context.on('exit.intro', null);
55181               nextStep();
55182           }
55183       }
55184
55185
55186       function describePlayground() {
55187           if (!areaId || !context.hasEntity(areaId)) {
55188               return addArea();
55189           }
55190           var ids = context.selectedIDs();
55191           if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
55192               return searchPresets();
55193           }
55194
55195           // reset pane, in case user happened to change it..
55196           select('.inspector-wrap .panewrap').style('right', '0%');
55197
55198           if (select('.form-field-description').empty()) {
55199               return continueTo(retryChooseDescription);
55200           }
55201
55202           context.on('exit.intro', function() {
55203               continueTo(play);
55204           });
55205
55206           reveal('.entity-editor-pane',
55207               t('intro.areas.describe_playground', { button: icon('#iD-icon-apply', 'pre-text') }),
55208               { duration: 300 }
55209           );
55210
55211           function continueTo(nextStep) {
55212               context.on('exit.intro', null);
55213               nextStep();
55214           }
55215       }
55216
55217
55218       function retryChooseDescription() {
55219           if (!areaId || !context.hasEntity(areaId)) {
55220               return addArea();
55221           }
55222           var ids = context.selectedIDs();
55223           if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
55224               return searchPresets();
55225           }
55226
55227           // reset pane, in case user happened to change it..
55228           select('.inspector-wrap .panewrap').style('right', '0%');
55229
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); }
55234           });
55235
55236           context.on('exit.intro', function() {
55237               return continueTo(searchPresets);
55238           });
55239
55240           function continueTo(nextStep) {
55241               context.on('exit.intro', null);
55242               nextStep();
55243           }
55244       }
55245
55246
55247       function play() {
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'); }
55254               }
55255           );
55256       }
55257
55258
55259       chapter.enter = function() {
55260           addArea();
55261       };
55262
55263
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);
55272       };
55273
55274
55275       chapter.restart = function() {
55276           chapter.exit();
55277           chapter.enter();
55278       };
55279
55280
55281       return utilRebind(chapter, dispatch$$1, 'on');
55282   }
55283
55284   function uiIntroLine(context, reveal) {
55285       var dispatch$$1 = dispatch('done'),
55286           timeouts = [],
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];
55308
55309
55310       var chapter = {
55311           title: 'intro.lines.title'
55312       };
55313
55314
55315       function timeout(f, t$$1) {
55316           timeouts.push(window.setTimeout(f, t$$1));
55317       }
55318
55319
55320       function eventCancel() {
55321           event.stopPropagation();
55322           event.preventDefault();
55323       }
55324
55325
55326       function revealEditMenu(loc, text, options) {
55327           var rect = context.surfaceRect();
55328           var point$$1 = context.curtainProjection(loc);
55329           var pad = 40;
55330           var width = 250 + (2 * pad);
55331           var height = 350;
55332           var startX = rect.left + point$$1[0];
55333           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
55334           var box = {
55335               left: left,
55336               top: point$$1[1] + rect.top - 60,
55337               width: width,
55338               height: height
55339           };
55340           reveal(box, text, options);
55341       }
55342
55343
55344       function addLine() {
55345           context.enter(modeBrowse(context));
55346           context.history().reset('initial');
55347
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);
55351
55352           timeout(function() {
55353               var tooltip = reveal('button.add-line',
55354                   t('intro.lines.add_line', { button: icon('#iD-icon-line', 'pre-text') }));
55355
55356               tooltip.selectAll('.tooltip-inner')
55357                   .insert('svg', 'span')
55358                   .attr('class', 'tooltip-illustration')
55359                   .append('use')
55360                   .attr('xlink:href', '#iD-graphic-lines');
55361
55362               context.on('enter.intro', function(mode) {
55363                   if (mode.id !== 'add-line') return;
55364                   continueTo(startLine);
55365               });
55366           }, msec + 100);
55367
55368           function continueTo(nextStep) {
55369               context.on('enter.intro', null);
55370               nextStep();
55371           }
55372       }
55373
55374
55375       function startLine() {
55376           if (context.mode().id !== 'add-line') {
55377               return chapter.restart();
55378           }
55379
55380           tulipRoadId = null;
55381
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'));
55386
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 });
55392           });
55393
55394           context.on('enter.intro', function(mode) {
55395               if (mode.id !== 'draw-line') return chapter.restart();
55396               continueTo(drawLine);
55397           });
55398
55399           function continueTo(nextStep) {
55400               context.map().on('move.intro drawn.intro', null);
55401               context.on('enter.intro', null);
55402               nextStep();
55403           }
55404       }
55405
55406
55407       function drawLine() {
55408           if (context.mode().id !== 'draw-line') {
55409               return chapter.restart();
55410           }
55411
55412           tulipRoadId = context.mode().selectedIDs()[0];
55413           context.map().centerEase(tulipRoadMidpoint, 500);
55414
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;
55419               reveal(box,
55420                   t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
55421               );
55422
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;
55427                   reveal(box,
55428                       t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
55429                       { duration: 0 }
55430                   );
55431               });
55432           }, 550);  // after easing..
55433
55434           context.history().on('change.intro', function() {
55435               var entity = tulipRoadId && context.hasEntity(tulipRoadId);
55436               if (!entity) return chapter.restart();
55437
55438               if (isLineConnected()) {
55439                   continueTo(continueLine);
55440               }
55441           });
55442
55443           context.on('enter.intro', function(mode) {
55444               if (mode.id === 'draw-line')
55445                   return;
55446               else if (mode.id === 'select') {
55447                   continueTo(retryIntersect);
55448                   return;
55449               }
55450               else
55451                   return chapter.restart();
55452           });
55453
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);
55458               nextStep();
55459           }
55460       }
55461
55462
55463       function isLineConnected() {
55464           var entity = tulipRoadId && context.hasEntity(tulipRoadId);
55465           if (!entity) return false;
55466
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;
55471               });
55472           });
55473       }
55474
55475
55476       function retryIntersect() {
55477           select(window).on('mousedown.intro', eventCancel, true);
55478
55479           var box = pad$1(tulipRoadIntersection, 80, context);
55480           reveal(box,
55481               t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
55482           );
55483
55484           timeout(chapter.restart, 3000);
55485       }
55486
55487
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();
55492
55493           context.map().centerEase(tulipRoadIntersection, 500);
55494
55495           reveal('#surface', t('intro.lines.continue_line'));
55496
55497           context.on('enter.intro', function(mode) {
55498               if (mode.id === 'draw-line')
55499                   return;
55500               else if (mode.id === 'select')
55501                   return continueTo(chooseCategoryRoad);
55502               else
55503                   return chapter.restart();
55504           });
55505
55506           function continueTo(nextStep) {
55507               context.on('enter.intro', null);
55508               nextStep();
55509           }
55510       }
55511
55512
55513       function chooseCategoryRoad() {
55514           if (context.mode().id !== 'select') {
55515               return chapter.restart();
55516           }
55517
55518           context.on('exit.intro', function() {
55519               return chapter.restart();
55520           });
55521
55522           var button = select('.preset-category-road .preset-list-button');
55523           if (button.empty()) return chapter.restart();
55524
55525           // disallow scrolling
55526           select('.inspector-wrap').on('wheel.intro', eventCancel);
55527
55528           timeout(function() {
55529               // reset pane, in case user somehow happened to change it..
55530               select('.inspector-wrap .panewrap').style('right', '-100%');
55531
55532               reveal(button.node(),
55533                   t('intro.lines.choose_category_road', { category: roadCategory.name() })
55534               );
55535
55536               button.on('click.intro', function() {
55537                   continueTo(choosePresetResidential);
55538               });
55539
55540           }, 400);  // after editor pane visible
55541
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);
55546               nextStep();
55547           }
55548       }
55549
55550
55551       function choosePresetResidential() {
55552           if (context.mode().id !== 'select') {
55553               return chapter.restart();
55554           }
55555
55556           context.on('exit.intro', function() {
55557               return chapter.restart();
55558           });
55559
55560           var subgrid = select('.preset-category-road .subgrid');
55561           if (subgrid.empty()) return chapter.restart();
55562
55563           subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
55564               .on('click.intro', function() {
55565                   continueTo(retryPresetResidential);
55566               });
55567
55568           subgrid.selectAll('.preset-highway-residential .preset-list-button')
55569               .on('click.intro', function() {
55570                   continueTo(nameRoad);
55571               });
55572
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 }
55577               );
55578           }, 300);
55579
55580           function continueTo(nextStep) {
55581               select('.preset-list-button').on('click.intro', null);
55582               context.on('exit.intro', null);
55583               nextStep();
55584           }
55585       }
55586
55587
55588       // selected wrong road type
55589       function retryPresetResidential() {
55590           if (context.mode().id !== 'select') {
55591               return chapter.restart();
55592           }
55593
55594           context.on('exit.intro', function() {
55595               return chapter.restart();
55596           });
55597
55598           // disallow scrolling
55599           select('.inspector-wrap').on('wheel.intro', eventCancel);
55600
55601           timeout(function() {
55602               var button = select('.entity-editor-pane .preset-list-button');
55603
55604               reveal(button.node(),
55605                   t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
55606               );
55607
55608               button.on('click.intro', function() {
55609                   continueTo(chooseCategoryRoad);
55610               });
55611
55612           }, 500);
55613
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);
55618               nextStep();
55619           }
55620       }
55621
55622
55623       function nameRoad() {
55624           context.on('exit.intro', function() {
55625               continueTo(didNameRoad);
55626           });
55627
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' }
55632               );
55633           }, 500);
55634
55635           function continueTo(nextStep) {
55636               context.on('exit.intro', null);
55637               nextStep();
55638           }
55639       }
55640
55641
55642       function didNameRoad() {
55643           context.history().checkpoint('doneAddLine');
55644
55645           timeout(function() {
55646               reveal('#surface', t('intro.lines.did_name_road'), {
55647                   buttonText: t('intro.ok'),
55648                   buttonCallback: function() { continueTo(updateLine); }
55649               });
55650           }, 500);
55651
55652           function continueTo(nextStep) {
55653               nextStep();
55654           }
55655       }
55656
55657
55658       function updateLine() {
55659           context.history().reset('doneAddLine');
55660           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55661               return chapter.restart();
55662           }
55663
55664           var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
55665           if (msec) { reveal(null, null, { duration: 0 }); }
55666           context.map().zoom(19).centerEase(woodRoadDragMidpoint, msec);
55667
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); };
55672
55673               reveal(box, t('intro.lines.update_line'),
55674                   { buttonText: t('intro.ok'), buttonCallback: advance }
55675               );
55676
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 }
55682                   );
55683               });
55684           }, msec + 100);
55685
55686           function continueTo(nextStep) {
55687               context.map().on('move.intro drawn.intro', null);
55688               nextStep();
55689           }
55690       }
55691
55692
55693       function addNode() {
55694           context.history().reset('doneAddLine');
55695           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55696               return chapter.restart();
55697           }
55698
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'));
55702
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 });
55707           });
55708
55709           context.history().on('change.intro', function(changed) {
55710               if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55711                   return continueTo(updateLine);
55712               }
55713               if (changed.created().length === 1) {
55714                   timeout(function() { continueTo(startDragEndpoint); }, 500);
55715               }
55716           });
55717
55718           context.on('enter.intro', function(mode) {
55719               if (mode.id !== 'select') {
55720                   continueTo(updateLine);
55721               }
55722           });
55723
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);
55728               nextStep();
55729           }
55730       }
55731
55732
55733       function startDragEndpoint() {
55734           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55735               return continueTo(updateLine);
55736           }
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'));
55740
55741           context.map().on('move.intro drawn.intro', function() {
55742               if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55743                   return continueTo(updateLine);
55744               }
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 });
55748
55749               var entity = context.entity(woodRoadEndId);
55750               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
55751                   continueTo(finishDragEndpoint);
55752               }
55753           });
55754
55755           function continueTo(nextStep) {
55756               context.map().on('move.intro drawn.intro', null);
55757               nextStep();
55758           }
55759       }
55760
55761
55762       function finishDragEndpoint() {
55763           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55764               return continueTo(updateLine);
55765           }
55766
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'));
55770
55771           context.map().on('move.intro drawn.intro', function() {
55772               if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55773                   return continueTo(updateLine);
55774               }
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 });
55778
55779               var entity = context.entity(woodRoadEndId);
55780               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
55781                   continueTo(startDragEndpoint);
55782               }
55783           });
55784
55785           context.on('enter.intro', function() {
55786               continueTo(startDragMidpoint);
55787           });
55788
55789           function continueTo(nextStep) {
55790               context.map().on('move.intro drawn.intro', null);
55791               context.on('enter.intro', null);
55792               nextStep();
55793           }
55794       }
55795
55796
55797       function startDragMidpoint() {
55798           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55799               return continueTo(updateLine);
55800           }
55801           if (context.selectedIDs().indexOf(woodRoadId) === -1) {
55802               context.enter(modeSelect(context, [woodRoadId]));
55803           }
55804
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'));
55808
55809           context.map().on('move.intro drawn.intro', function() {
55810               if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55811                   return continueTo(updateLine);
55812               }
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 });
55816           });
55817
55818           context.history().on('change.intro', function(changed) {
55819               if (changed.created().length === 1) {
55820                   continueTo(continueDragMidpoint);
55821               }
55822           });
55823
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]));
55828               }
55829           });
55830
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);
55835               nextStep();
55836           }
55837       }
55838
55839
55840       function continueDragMidpoint() {
55841           if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55842               return continueTo(updateLine);
55843           }
55844
55845           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
55846           var box = pad$1(woodRoadDragEndpoint, padding, context);
55847           box.height += 400;
55848
55849           var advance = function() {
55850               context.history().checkpoint('doneUpdateLine');
55851               continueTo(deleteLines);
55852           };
55853
55854           reveal(box, t('intro.lines.continue_drag_midpoint'),
55855               { buttonText: t('intro.ok'), buttonCallback: advance }
55856           );
55857
55858           context.map().on('move.intro drawn.intro', function() {
55859               if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
55860                   return continueTo(updateLine);
55861               }
55862               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
55863               var box = pad$1(woodRoadDragEndpoint, padding, context);
55864               box.height += 400;
55865               reveal(box, t('intro.lines.continue_drag_midpoint'),
55866                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
55867               );
55868           });
55869
55870           function continueTo(nextStep) {
55871               context.map().on('move.intro drawn.intro', null);
55872               nextStep();
55873           }
55874       }
55875
55876
55877       function deleteLines() {
55878           context.history().reset('doneUpdateLine');
55879           context.enter(modeBrowse(context));
55880
55881           if (!context.hasEntity(washingtonStreetId) ||
55882               !context.hasEntity(twelfthAvenueId) ||
55883               !context.hasEntity(eleventhAvenueEndId)) {
55884               return chapter.restart();
55885           }
55886
55887           var msec = transitionTime(deleteLinesLoc, context.map().center());
55888           if (msec) { reveal(null, null, { duration: 0 }); }
55889           context.map().zoom(18).centerEase(deleteLinesLoc, msec);
55890
55891           timeout(function() {
55892               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
55893               var box = pad$1(deleteLinesLoc, padding, context);
55894               box.top -= 200;
55895               box.height += 400;
55896               var advance = function() { continueTo(rightClickIntersection); };
55897
55898               reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
55899                   { buttonText: t('intro.ok'), buttonCallback: advance }
55900               );
55901
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);
55905                   box.top -= 200;
55906                   box.height += 400;
55907                   reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
55908                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
55909                   );
55910               });
55911
55912               context.history().on('change.intro', function() {
55913                   timeout(function() {
55914                       continueTo(deleteLines);
55915                   }, 500);  // after any transition (e.g. if user deleted intersection)
55916               });
55917
55918           }, msec + 100);
55919
55920           function continueTo(nextStep) {
55921               context.map().on('move.intro drawn.intro', null);
55922               context.history().on('change.intro', null);
55923               nextStep();
55924           }
55925       }
55926
55927
55928       function rightClickIntersection() {
55929           context.history().reset('doneUpdateLine');
55930           context.enter(modeBrowse(context));
55931
55932           context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
55933
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') })
55939               );
55940
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') }),
55946                       { duration: 0 }
55947                   );
55948               });
55949
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;
55954
55955                   timeout(function() {
55956                       var node = selectMenuItem('split').node();
55957                       if (!node) return;
55958                       continueTo(splitIntersection);
55959                   }, 300);  // after menu visible
55960               });
55961
55962               context.history().on('change.intro', function() {
55963                   timeout(function() {
55964                       continueTo(deleteLines);
55965                   }, 300);  // after any transition (e.g. if user deleted intersection)
55966               });
55967
55968           }, 600);
55969
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);
55974               nextStep();
55975           }
55976       }
55977
55978
55979       function splitIntersection() {
55980           if (!context.hasEntity(washingtonStreetId) ||
55981               !context.hasEntity(twelfthAvenueId) ||
55982               !context.hasEntity(eleventhAvenueEndId)) {
55983               return continueTo(deleteLines);
55984           }
55985
55986           var node = selectMenuItem('split').node();
55987           if (!node) { return continueTo(rightClickIntersection); }
55988
55989           var wasChanged = false;
55990           var menuCoords = context.map().mouseCoordinates();
55991           washingtonSegmentId = null;
55992
55993           revealEditMenu(menuCoords, t('intro.lines.split_intersection',
55994               { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
55995           );
55996
55997           context.map().on('move.intro drawn.intro', function() {
55998               var node = selectMenuItem('split').node();
55999               if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
56000
56001               revealEditMenu(menuCoords, t('intro.lines.split_intersection',
56002                   { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
56003                   { duration: 0 }
56004               );
56005           });
56006
56007           context.history().on('change.intro', function(changed) {
56008               wasChanged = true;
56009               timeout(function() {
56010                   if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
56011                       washingtonSegmentId = changed.created()[0].id;
56012                       continueTo(didSplit);
56013                   } else {
56014                       washingtonSegmentId = null;
56015                       continueTo(retrySplit);
56016                   }
56017               }, 300);  // after any transition (e.g. if user deleted intersection)
56018           });
56019
56020           function continueTo(nextStep) {
56021               context.map().on('move.intro drawn.intro', null);
56022               context.history().on('change.intro', null);
56023               nextStep();
56024           }
56025       }
56026
56027
56028       function retrySplit() {
56029           context.enter(modeBrowse(context));
56030           context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
56031           var advance = function() { continueTo(rightClickIntersection); };
56032
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 }
56037           );
56038
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 }
56044               );
56045           });
56046
56047           function continueTo(nextStep) {
56048               context.map().on('move.intro drawn.intro', null);
56049               nextStep();
56050           }
56051       }
56052
56053
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);
56061           }
56062
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');
56066
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 }),
56071               { duration: 500 }
56072           );
56073
56074           timeout(function() {
56075               context.map().zoom(18).centerEase(twelfthAvenue, 500);
56076
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 }),
56082                       { duration: 0 }
56083                   );
56084               });
56085           }, 600);  // after initial reveal and curtain cut
56086
56087           context.on('enter.intro', function() {
56088               var ids = context.selectedIDs();
56089               if (ids.length === 1 && ids[0] === washingtonSegmentId) {
56090                   continueTo(multiSelect);
56091               }
56092           });
56093
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);
56101               }
56102           });
56103
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);
56108               nextStep();
56109           }
56110       }
56111
56112
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);
56120           }
56121
56122           var ids = context.selectedIDs();
56123           var hasWashington = ids.indexOf(washingtonSegmentId) !== -1;
56124           var hasTwelfth = ids.indexOf(twelfthAvenueId) !== -1;
56125
56126           if (hasWashington && hasTwelfth) {
56127               return continueTo(multiRightClick);
56128           } else if (!hasWashington && !hasTwelfth) {
56129               return continueTo(didSplit);
56130           }
56131
56132           context.map().zoom(18).centerEase(twelfthAvenue, 500);
56133
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);
56141                   box.width *= 3;
56142               } else {
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);
56147                   box.width /= 2;
56148               }
56149
56150               reveal(box,
56151                   t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
56152               );
56153
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);
56160                       box.width *= 3;
56161                   } else {
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);
56166                       box.width /= 2;
56167                   }
56168
56169                   reveal(box,
56170                       t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
56171                       { duration: 0 }
56172                   );
56173               });
56174
56175               context.on('enter.intro', function() {
56176                   continueTo(multiSelect);
56177               });
56178
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);
56186                   }
56187               });
56188           }, 600);
56189
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);
56194               nextStep();
56195           }
56196       }
56197
56198
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);
56206           }
56207
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'));
56211
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 });
56216           });
56217
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();
56225                           if (!node) return;
56226                           continueTo(multiDelete);
56227                   } else if (ids.length === 1 &&
56228                       ids.indexOf(washingtonSegmentId) !== -1) {
56229                       return continueTo(multiSelect);
56230                   } else {
56231                       return continueTo(didSplit);
56232                   }
56233               }, 300);  // after edit menu visible
56234           }, true);
56235
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);
56243               }
56244           });
56245
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);
56250               nextStep();
56251           }
56252       }
56253
56254
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);
56262           }
56263
56264           var node = selectMenuItem('delete').node();
56265           if (!node) return continueTo(multiRightClick);
56266
56267           var menuCoords = context.map().mouseCoordinates();
56268           revealEditMenu(menuCoords,
56269               t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') })
56270           );
56271
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') }),
56275                   { duration: 0 }
56276               );
56277           });
56278
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
56282               }
56283           });
56284
56285           context.history().on('change.intro', function() {
56286               if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
56287                   continueTo(retryDelete);         // changed something but roads still exist
56288               } else {
56289                   continueTo(play);
56290               }
56291           });
56292
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);
56297               nextStep();
56298           }
56299       }
56300
56301
56302       function retryDelete() {
56303           context.enter(modeBrowse(context));
56304
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); }
56310           });
56311
56312           function continueTo(nextStep) {
56313               nextStep();
56314           }
56315       }
56316
56317
56318       function play() {
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'); }
56325               }
56326           );
56327      }
56328
56329
56330       chapter.enter = function() {
56331           addLine();
56332       };
56333
56334
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);
56343       };
56344
56345
56346       chapter.restart = function() {
56347           chapter.exit();
56348           chapter.enter();
56349       };
56350
56351
56352       return utilRebind(chapter, dispatch$$1, 'on');
56353   }
56354
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'),
56362           timeouts = [],
56363           houseId = null,
56364           tankId = null;
56365
56366
56367       var chapter = {
56368           title: 'intro.buildings.title'
56369       };
56370
56371
56372       function timeout(f, t$$1) {
56373           timeouts.push(window.setTimeout(f, t$$1));
56374       }
56375
56376
56377       function eventCancel() {
56378           event.stopPropagation();
56379           event.preventDefault();
56380       }
56381
56382
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);
56387       }
56388
56389
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);
56394       }
56395
56396
56397       function revealEditMenu(loc, text, options) {
56398           var rect = context.surfaceRect();
56399           var point$$1 = context.curtainProjection(loc);
56400           var pad = 40;
56401           var width = 250 + (2 * pad);
56402           var height = 350;
56403           var startX = rect.left + point$$1[0];
56404           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
56405           var box = {
56406               left: left,
56407               top: point$$1[1] + rect.top - 60,
56408               width: width,
56409               height: height
56410           };
56411           reveal(box, text, options);
56412       }
56413
56414
56415       function addHouse() {
56416           context.enter(modeBrowse(context));
56417           context.history().reset('initial');
56418           houseId = null;
56419
56420           var msec = transitionTime(house, context.map().center());
56421           if (msec) { reveal(null, null, { duration: 0 }); }
56422           context.map().zoom(19).centerEase(house, msec);
56423
56424           timeout(function() {
56425               var tooltip = reveal('button.add-area',
56426                   t('intro.buildings.add_building', { button: icon('#iD-icon-area', 'pre-text') }));
56427
56428               tooltip.selectAll('.tooltip-inner')
56429                   .insert('svg', 'span')
56430                   .attr('class', 'tooltip-illustration')
56431                   .append('use')
56432                   .attr('xlink:href', '#iD-graphic-buildings');
56433
56434               context.on('enter.intro', function(mode) {
56435                   if (mode.id !== 'add-area') return;
56436                   continueTo(startHouse);
56437               });
56438           }, msec + 100);
56439
56440           function continueTo(nextStep) {
56441               context.on('enter.intro', null);
56442               nextStep();
56443           }
56444       }
56445
56446
56447       function startHouse() {
56448           if (context.mode().id !== 'add-area') {
56449               return continueTo(addHouse);
56450           }
56451
56452           houseId = null;
56453           context.map().zoomEase(20, 500);
56454
56455           timeout(function() {
56456               revealHouse(house, t('intro.buildings.start_building'));
56457
56458               context.map().on('move.intro drawn.intro', function() {
56459                   revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
56460               });
56461
56462               context.on('enter.intro', function(mode) {
56463                   if (mode.id !== 'draw-area') return chapter.restart();
56464                   continueTo(continueHouse);
56465               });
56466
56467           }, 550);  // after easing
56468
56469           function continueTo(nextStep) {
56470               context.map().on('move.intro drawn.intro', null);
56471               context.on('enter.intro', null);
56472               nextStep();
56473           }
56474       }
56475
56476
56477       function continueHouse() {
56478           if (context.mode().id !== 'draw-area') {
56479               return continueTo(addHouse);
56480           }
56481
56482           houseId = null;
56483
56484           revealHouse(house, t('intro.buildings.continue_building'));
56485
56486           context.map().on('move.intro drawn.intro', function() {
56487               revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
56488           });
56489
56490           context.on('enter.intro', function(mode) {
56491               if (mode.id === 'draw-area') {
56492                   return;
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); });
56498
56499                   if (isMostlySquare(points)) {
56500                       houseId = way.id;
56501                       return continueTo(chooseCategoryBuilding);
56502                   } else {
56503                       return continueTo(retryHouse);
56504                   }
56505
56506               } else {
56507                   return chapter.restart();
56508               }
56509           });
56510
56511           function continueTo(nextStep) {
56512               context.map().on('move.intro drawn.intro', null);
56513               context.on('enter.intro', null);
56514               nextStep();
56515           }
56516       }
56517
56518
56519       function retryHouse() {
56520           var onClick = function() { continueTo(addHouse); };
56521
56522           revealHouse(house, t('intro.buildings.retry_building'),
56523               { buttonText: t('intro.ok'), buttonCallback: onClick }
56524           );
56525
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 }
56529               );
56530           });
56531
56532           function continueTo(nextStep) {
56533               context.map().on('move.intro drawn.intro', null);
56534               nextStep();
56535           }
56536       }
56537
56538
56539       function chooseCategoryBuilding() {
56540           if (!houseId || !context.hasEntity(houseId)) {
56541               return addHouse();
56542           }
56543           var ids = context.selectedIDs();
56544           if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
56545               context.enter(modeSelect(context, [houseId]));
56546           }
56547
56548           // disallow scrolling
56549           select('.inspector-wrap').on('wheel.intro', eventCancel);
56550
56551           timeout(function() {
56552               // reset pane, in case user somehow happened to change it..
56553               select('.inspector-wrap .panewrap').style('right', '-100%');
56554
56555               var button = select('.preset-category-building .preset-list-button');
56556
56557               reveal(button.node(),
56558                   t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
56559               );
56560
56561               button.on('click.intro', function() {
56562                   button.on('click.intro', null);
56563                   continueTo(choosePresetHouse);
56564               });
56565
56566           }, 400);  // after preset list pane visible..
56567
56568
56569           context.on('enter.intro', function(mode) {
56570               if (!houseId || !context.hasEntity(houseId)) {
56571                   return continueTo(addHouse);
56572               }
56573               var ids = context.selectedIDs();
56574               if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
56575                   return continueTo(chooseCategoryBuilding);
56576               }
56577           });
56578
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);
56583               nextStep();
56584           }
56585       }
56586
56587
56588       function choosePresetHouse() {
56589           if (!houseId || !context.hasEntity(houseId)) {
56590               return addHouse();
56591           }
56592           var ids = context.selectedIDs();
56593           if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
56594               context.enter(modeSelect(context, [houseId]));
56595           }
56596
56597           // disallow scrolling
56598           select('.inspector-wrap').on('wheel.intro', eventCancel);
56599
56600           timeout(function() {
56601               // reset pane, in case user somehow happened to change it..
56602               select('.inspector-wrap .panewrap').style('right', '-100%');
56603
56604               var button = select('.preset-building-house .preset-list-button');
56605
56606               reveal(button.node(),
56607                   t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
56608                   { duration: 300 }
56609               );
56610
56611               button.on('click.intro', function() {
56612                   button.on('click.intro', null);
56613                   continueTo(closeEditorHouse);
56614               });
56615
56616
56617           }, 400);  // after preset list pane visible..
56618
56619           context.on('enter.intro', function(mode) {
56620               if (!houseId || !context.hasEntity(houseId)) {
56621                   return continueTo(addHouse);
56622               }
56623               var ids = context.selectedIDs();
56624               if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
56625                   return continueTo(chooseCategoryBuilding);
56626               }
56627           });
56628
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);
56633               nextStep();
56634           }
56635       }
56636
56637
56638       function closeEditorHouse() {
56639           if (!houseId || !context.hasEntity(houseId)) {
56640               return addHouse();
56641           }
56642           var ids = context.selectedIDs();
56643           if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
56644               context.enter(modeSelect(context, [houseId]));
56645           }
56646
56647           context.history().checkpoint('hasHouse');
56648
56649           context.on('exit.intro', function() {
56650               continueTo(rightClickHouse);
56651           });
56652
56653           timeout(function() {
56654               reveal('.entity-editor-pane',
56655                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
56656               );
56657           }, 500);
56658
56659           function continueTo(nextStep) {
56660               context.on('exit.intro', null);
56661               nextStep();
56662           }
56663       }
56664
56665
56666       function rightClickHouse() {
56667           if (!houseId) return chapter.restart();
56668
56669           context.enter(modeBrowse(context));
56670           context.history().reset('hasHouse');
56671           context.map().centerEase(house, 500);
56672
56673           timeout(function() {
56674               if (context.map().zoom() < 20) {
56675                   context.map().zoomEase(20, 500);
56676               }
56677           }, 520);
56678
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;
56683
56684               timeout(function() {
56685                   var node = selectMenuItem('orthogonalize').node();
56686                   if (!node) return;
56687                   continueTo(clickSquare);
56688               }, 300);  // after menu visible
56689           });
56690
56691           context.map().on('move.intro drawn.intro', function() {
56692               revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
56693           });
56694
56695           context.history().on('change.intro', function() {
56696               continueTo(rightClickHouse);
56697           });
56698
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);
56703               nextStep();
56704           }
56705       }
56706
56707
56708       function clickSquare() {
56709           if (!houseId) return chapter.restart();
56710           var entity = context.hasEntity(houseId);
56711           if (!entity) return continueTo(rightClickHouse);
56712
56713           var node = selectMenuItem('orthogonalize').node();
56714           if (!node) { return continueTo(rightClickHouse); }
56715
56716           var wasChanged = false;
56717           var menuCoords = context.map().mouseCoordinates();
56718
56719           revealEditMenu(menuCoords,
56720               t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') })
56721           );
56722
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);
56728               }
56729           });
56730
56731           context.map().on('move.intro drawn.intro', function() {
56732               var node = selectMenuItem('orthogonalize').node();
56733               if (!wasChanged && !node) { return continueTo(rightClickHouse); }
56734
56735               revealEditMenu(menuCoords,
56736                   t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') }),
56737                   { duration: 0 }
56738               );
56739           });
56740
56741           context.history().on('change.intro', function() {
56742               wasChanged = true;
56743               context.history().on('change.intro', null);
56744
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);
56749                   } else {
56750                       continueTo(retryClickSquare);
56751                   }
56752               }, 500);  // after transitioned actions
56753           });
56754
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);
56759               nextStep();
56760           }
56761       }
56762
56763
56764       function retryClickSquare() {
56765           context.enter(modeBrowse(context));
56766
56767           revealHouse(house, t('intro.buildings.retry_square'), {
56768               buttonText: t('intro.ok'),
56769               buttonCallback: function() { continueTo(rightClickHouse); }
56770           });
56771
56772           function continueTo(nextStep) {
56773               nextStep();
56774           }
56775       }
56776
56777
56778       function doneSquare() {
56779           context.history().checkpoint('doneSquare');
56780
56781           revealHouse(house, t('intro.buildings.done_square'), {
56782               buttonText: t('intro.ok'),
56783               buttonCallback: function() { continueTo(addTank); }
56784           });
56785
56786           function continueTo(nextStep) {
56787               nextStep();
56788           }
56789       }
56790
56791
56792       function addTank() {
56793           context.enter(modeBrowse(context));
56794           context.history().reset('doneSquare');
56795           tankId = null;
56796
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);
56800
56801           timeout(function() {
56802               reveal('button.add-area',
56803                   t('intro.buildings.add_tank', { button: icon('#iD-icon-area', 'pre-text') })
56804               );
56805
56806               context.on('enter.intro', function(mode) {
56807                   if (mode.id !== 'add-area') return;
56808                   continueTo(startTank);
56809               });
56810           }, msec + 100);
56811
56812           function continueTo(nextStep) {
56813               context.on('enter.intro', null);
56814               nextStep();
56815           }
56816       }
56817
56818
56819       function startTank() {
56820           if (context.mode().id !== 'add-area') {
56821               return continueTo(addTank);
56822           }
56823
56824           tankId = null;
56825
56826           timeout(function() {
56827               revealTank(tank, t('intro.buildings.start_tank'));
56828
56829               context.map().on('move.intro drawn.intro', function() {
56830                   revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
56831               });
56832
56833               context.on('enter.intro', function(mode) {
56834                   if (mode.id !== 'draw-area') return chapter.restart();
56835                   continueTo(continueTank);
56836               });
56837
56838           }, 550);  // after easing
56839
56840           function continueTo(nextStep) {
56841               context.map().on('move.intro drawn.intro', null);
56842               context.on('enter.intro', null);
56843               nextStep();
56844           }
56845       }
56846
56847
56848       function continueTank() {
56849           if (context.mode().id !== 'draw-area') {
56850               return continueTo(addTank);
56851           }
56852
56853           tankId = null;
56854
56855           revealTank(tank, t('intro.buildings.continue_tank'));
56856
56857           context.map().on('move.intro drawn.intro', function() {
56858               revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
56859           });
56860
56861           context.on('enter.intro', function(mode) {
56862               if (mode.id === 'draw-area') {
56863                   return;
56864               } else if (mode.id === 'select') {
56865                   tankId = context.selectedIDs()[0];
56866                   return continueTo(searchPresetTank);
56867               } else {
56868                   return continueTo(addTank);
56869               }
56870           });
56871
56872           function continueTo(nextStep) {
56873               context.map().on('move.intro drawn.intro', null);
56874               context.on('enter.intro', null);
56875               nextStep();
56876           }
56877       }
56878
56879
56880       function searchPresetTank() {
56881           if (!tankId || !context.hasEntity(tankId)) {
56882               return addTank();
56883           }
56884           var ids = context.selectedIDs();
56885           if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
56886               context.enter(modeSelect(context, [tankId]));
56887           }
56888
56889           // disallow scrolling
56890           select('.inspector-wrap').on('wheel.intro', eventCancel);
56891
56892           timeout(function() {
56893               // reset pane, in case user somehow happened to change it..
56894               select('.inspector-wrap .panewrap').style('right', '-100%');
56895
56896               select('.preset-search-input')
56897                   .on('keydown.intro', null)
56898                   .on('keyup.intro', checkPresetSearch);
56899
56900               reveal('.preset-search-input',
56901                   t('intro.buildings.search_tank', { preset: tankPreset.name() })
56902               );
56903           }, 400);  // after preset list pane visible..
56904
56905           context.on('enter.intro', function(mode) {
56906               if (!tankId || !context.hasEntity(tankId)) {
56907                   return continueTo(addTank);
56908               }
56909
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]));
56914
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);
56919
56920                   select('.preset-search-input')
56921                       .on('keydown.intro', null)
56922                       .on('keyup.intro', checkPresetSearch);
56923
56924                   reveal('.preset-search-input',
56925                       t('intro.buildings.search_tank', { preset: tankPreset.name() })
56926                   );
56927
56928                   context.history().on('change.intro', null);
56929               }
56930           });
56931
56932           function checkPresetSearch() {
56933               var first = select('.preset-list-item:first-child');
56934
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() }),
56938                       { duration: 300 }
56939                   );
56940
56941                   select('.preset-search-input')
56942                       .on('keydown.intro', eventCancel, true)
56943                       .on('keyup.intro', null);
56944
56945                   context.history().on('change.intro', function() {
56946                       continueTo(closeEditorTank);
56947                   });
56948               }
56949           }
56950
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);
56956               nextStep();
56957           }
56958       }
56959
56960
56961       function closeEditorTank() {
56962           if (!tankId || !context.hasEntity(tankId)) {
56963               return addTank();
56964           }
56965           var ids = context.selectedIDs();
56966           if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
56967               context.enter(modeSelect(context, [tankId]));
56968           }
56969
56970           context.history().checkpoint('hasTank');
56971
56972           context.on('exit.intro', function() {
56973               continueTo(rightClickTank);
56974           });
56975
56976           timeout(function() {
56977               reveal('.entity-editor-pane',
56978                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
56979               );
56980           }, 500);
56981
56982           function continueTo(nextStep) {
56983               context.on('exit.intro', null);
56984               nextStep();
56985           }
56986       }
56987
56988
56989       function rightClickTank() {
56990           if (!tankId) return continueTo(addTank);
56991
56992           context.enter(modeBrowse(context));
56993           context.history().reset('hasTank');
56994           context.map().centerEase(tank, 500);
56995
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;
57001
57002                   timeout(function() {
57003                       var node = selectMenuItem('circularize').node();
57004                       if (!node) return;
57005                       continueTo(clickCircle);
57006                   }, 300);  // after menu visible
57007               });
57008
57009               revealTank(tank, t('intro.buildings.rightclick_tank'));
57010
57011               context.map().on('move.intro drawn.intro', function() {
57012                   revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
57013               });
57014
57015               context.history().on('change.intro', function() {
57016                   continueTo(rightClickTank);
57017               });
57018
57019           }, 600);
57020
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);
57025               nextStep();
57026           }
57027       }
57028
57029
57030       function clickCircle() {
57031           if (!tankId) return chapter.restart();
57032           var entity = context.hasEntity(tankId);
57033           if (!entity) return continueTo(rightClickTank);
57034
57035           var node = selectMenuItem('circularize').node();
57036           if (!node) { return continueTo(rightClickTank); }
57037
57038           var wasChanged = false;
57039           var menuCoords = context.map().mouseCoordinates();
57040
57041           revealEditMenu(menuCoords,
57042               t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') })
57043           );
57044
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);
57050               }
57051           });
57052
57053           context.map().on('move.intro drawn.intro', function() {
57054               var node = selectMenuItem('circularize').node();
57055               if (!wasChanged && !node) { return continueTo(rightClickTank); }
57056
57057               revealEditMenu(menuCoords,
57058                   t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') }),
57059                   { duration: 0 }
57060               );
57061           });
57062
57063           context.history().on('change.intro', function() {
57064               wasChanged = true;
57065               context.history().on('change.intro', null);
57066
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')) {
57070                       continueTo(play);
57071                   } else {
57072                       continueTo(retryClickCircle);
57073                   }
57074               }, 500);  // after transitioned actions
57075           });
57076
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);
57081               nextStep();
57082           }
57083       }
57084
57085
57086       function retryClickCircle() {
57087           context.enter(modeBrowse(context));
57088
57089           revealTank(tank, t('intro.buildings.retry_circle'), {
57090               buttonText: t('intro.ok'),
57091               buttonCallback: function() { continueTo(rightClickTank); }
57092           });
57093
57094           function continueTo(nextStep) {
57095               nextStep();
57096           }
57097       }
57098
57099
57100       function play() {
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'); }
57107               }
57108           );
57109       }
57110
57111
57112       chapter.enter = function() {
57113           addHouse();
57114       };
57115
57116
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);
57125       };
57126
57127
57128       chapter.restart = function() {
57129           chapter.exit();
57130           chapter.enter();
57131       };
57132
57133
57134       return utilRebind(chapter, dispatch$$1, 'on');
57135   }
57136
57137   function uiModal(selection$$1, blocking) {
57138       var keybinding = d3keybinding('modal');
57139       var previous = selection$$1.select('div.modal');
57140       var animate = previous.empty();
57141
57142       previous.transition()
57143           .duration(200)
57144           .style('opacity', 0)
57145           .remove();
57146
57147       var shaded = selection$$1
57148           .append('div')
57149           .attr('class', 'shaded')
57150           .style('opacity', 0);
57151
57152       shaded.close = function() {
57153           shaded
57154               .transition()
57155               .duration(200)
57156               .style('opacity',0)
57157               .remove();
57158
57159           modal
57160               .transition()
57161               .duration(200)
57162               .style('top','0px');
57163
57164           keybinding.off();
57165       };
57166
57167
57168       var modal = shaded
57169           .append('div')
57170           .attr('class', 'modal fillL col6');
57171
57172       if (!blocking) {
57173           shaded.on('click.remove-modal', function() {
57174               if (event.target === this) {
57175                   shaded.close();
57176               }
57177           });
57178
57179           modal.append('button')
57180               .attr('class', 'close')
57181               .on('click', shaded.close)
57182               .call(svgIcon('#iD-icon-close'));
57183
57184           keybinding
57185               .on('⌫', shaded.close)
57186               .on('⎋', shaded.close);
57187
57188           select(document)
57189               .call(keybinding);
57190       }
57191
57192       modal
57193           .append('div')
57194           .attr('class', 'content');
57195
57196       if (animate) {
57197           shaded.transition().style('opacity', 1);
57198       } else {
57199           shaded.style('opacity', 1);
57200       }
57201
57202
57203       return shaded;
57204   }
57205
57206   function uiIntroStartEditing(context, reveal) {
57207       var dispatch$$1 = dispatch('done', 'startEditing');
57208       var modalSelection = select(null);
57209
57210
57211       var chapter = {
57212           title: 'intro.startediting.title'
57213       };
57214
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(); }
57220               }
57221           );
57222       }
57223
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(); }
57229               }
57230           );
57231       }
57232
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(); }
57239               }
57240           );
57241       }
57242
57243       function showStart() {
57244           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
57245
57246           modalSelection = uiModal(context.container());
57247
57248           modalSelection.select('.modal')
57249               .attr('class', 'modal-splash modal col6');
57250
57251           modalSelection.selectAll('.close').remove();
57252
57253           var startbutton = modalSelection.select('.content')
57254               .attr('class', 'fillL')
57255               .append('button')
57256                   .attr('class', 'modal-section huge-modal-button')
57257                   .on('click', function() {
57258                       modalSelection.remove();
57259                   });
57260
57261               startbutton
57262                   .append('svg')
57263                   .attr('class', 'illustration')
57264                   .append('use')
57265                   .attr('xlink:href', '#iD-logo-walkthrough');
57266
57267               startbutton
57268                   .append('h2')
57269                   .text(t('intro.startediting.start'));
57270
57271           dispatch$$1.call('startEditing');
57272       }
57273
57274
57275       chapter.enter = function() {
57276           showHelp();
57277       };
57278
57279
57280       chapter.exit = function() {
57281           modalSelection.remove();
57282           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
57283       };
57284
57285
57286       return utilRebind(chapter, dispatch$$1, 'on');
57287   }
57288
57289   var chapterUi = {
57290       welcome: uiIntroWelcome,
57291       navigation: uiIntroNavigation,
57292       point: uiIntroPoint,
57293       area: uiIntroArea,
57294       line: uiIntroLine,
57295       building: uiIntroBuilding,
57296       startEditing: uiIntroStartEditing
57297   };
57298
57299   var chapterFlow = [
57300       'welcome',
57301       'navigation',
57302       'point',
57303       'area',
57304       'line',
57305       'building',
57306       'startEditing'
57307   ];
57308
57309
57310   function uiIntro(context) {
57311       var INTRO_IMAGERY = 'EsriWorldImageryClarity';
57312       var introGraph = {};
57313       var _currChapter;
57314
57315       // create entities for intro graph and localize names
57316       for (var id in dataIntroGraph) {
57317           introGraph[id] = osmEntity$$1(localize(dataIntroGraph[id]));
57318       }
57319
57320
57321       function intro(selection$$1) {
57322           context.enter(modeBrowse(context));
57323
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;
57336
57337           // Block saving
57338           context.inIntro(true);
57339
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');
57345
57346           var imagery = context.background().findSource(INTRO_IMAGERY);
57347           if (imagery) {
57348               context.background().baseLayerSource(imagery);
57349           } else {
57350               context.background().bing();
57351           }
57352           overlays.forEach(function (d) {
57353               context.background().toggleOverlayLayer(d);
57354           });
57355
57356           // Mock geocoder
57357           services.geocoder.countryCode = function(location, callback) {
57358               callback(null, t('intro.graph.countrycode'));
57359           };
57360
57361           d3_selectAll('#map .layer-background').style('opacity', 1);
57362
57363           var curtain = uiCurtain();
57364           selection$$1.call(curtain);
57365
57366           // store that the user started the walkthrough..
57367           context.storage('walkthrough_started', 'yes');
57368
57369           // restore previous walkthrough progress..
57370           var storedProgress = context.storage('walkthrough_progress') || '';
57371           var progress = storedProgress.split(';').filter(Boolean);
57372
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
57377
57378                       buttons.filter(function(d) {
57379                           return d.title === s.title;
57380                       }).classed('finished', true);
57381
57382                       if (i < chapterFlow.length - 1) {
57383                           var next = chapterFlow[i + 1];
57384                           select('button.chapter-' + next)
57385                               .classed('next', true);
57386                       }
57387
57388                       // store walkthrough progress..
57389                       progress.push(chapter);
57390                       context.storage('walkthrough_progress', uniq(progress).join(';'));
57391                   });
57392               return s;
57393           });
57394
57395           chapters[chapters.length - 1].on('startEditing', function() {
57396               // store walkthrough progress..
57397               progress.push('startEditing');
57398               context.storage('walkthrough_progress', uniq(progress).join(';'));
57399
57400               // store if walkthrough is completed..
57401               var incomplete = difference(chapterFlow, progress);
57402               if (!incomplete.length) {
57403                   context.storage('walkthrough_completed', 'yes');
57404               }
57405
57406               curtain.remove();
57407               navwrap.remove();
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);
57418           });
57419
57420           var navwrap = selection$$1
57421               .append('div')
57422               .attr('class', 'intro-nav-wrap fillD');
57423
57424           navwrap
57425               .append('svg')
57426               .attr('class', 'intro-nav-wrap-logo')
57427               .append('use')
57428               .attr('xlink:href', '#iD-logo-walkthrough');
57429
57430           var buttonwrap = navwrap
57431               .append('div')
57432               .attr('class', 'joined')
57433               .selectAll('button.chapter');
57434
57435           var buttons = buttonwrap
57436               .data(chapters)
57437               .enter()
57438               .append('button')
57439               .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
57440               .on('click', enterChapter);
57441
57442           buttons
57443               .append('span')
57444               .text(function(d) { return t(d.title); });
57445
57446           buttons
57447               .append('span')
57448               .attr('class', 'status')
57449               .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
57450
57451           enterChapter(chapters[0]);
57452
57453
57454           function enterChapter(newChapter) {
57455               if (_currChapter) { _currChapter.exit(); }
57456               context.enter(modeBrowse(context));
57457
57458               _currChapter = newChapter;
57459               _currChapter.enter();
57460
57461               buttons
57462                   .classed('next', false)
57463                   .classed('active', function(d) {
57464                       return d.title === _currChapter.title;
57465                   });
57466           }
57467       }
57468
57469
57470       return intro;
57471   }
57472
57473   function uiTooltipHtml(text, key, heading) {
57474       var s = '';
57475
57476       if (heading) {
57477           s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
57478       }
57479       if (text) {
57480           s += '<div class="tooltip-text"><span>' + text + '</span></div>';
57481       }
57482       if (key) {
57483           s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
57484               '<span class="keyhint">' + key + '</span></div>';
57485       }
57486
57487       return s;
57488   }
57489
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'];
57495
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);
57501
57502
57503       function showsFeature(d) {
57504           return context.features().enabled(d);
57505       }
57506
57507
57508       function autoHiddenFeature(d) {
57509           return context.features().autoHidden(d);
57510       }
57511
57512
57513       function clickFeature(d) {
57514           context.features().toggle(d);
57515           update();
57516       }
57517
57518
57519       function showsFill(d) {
57520           return _fillSelected === d;
57521       }
57522
57523
57524       function setFill(d) {
57525           fills.forEach(function(opt) {
57526               context.surface().classed('fill-' + opt, Boolean(opt === d));
57527           });
57528
57529           _fillSelected = d;
57530           context.storage('area-fill', d);
57531           if (d !== 'wireframe') {
57532               context.storage('area-fill-toggle', d);
57533           }
57534           update();
57535       }
57536
57537
57538       function showsLayer(which) {
57539           var layer = layers.layer(which);
57540           if (layer) {
57541               return layer.enabled();
57542           }
57543           return false;
57544       }
57545
57546
57547       function setLayer(which, enabled) {
57548           var layer = layers.layer(which);
57549           if (layer) {
57550               layer.enabled(enabled);
57551               update();
57552           }
57553       }
57554
57555
57556       function toggleLayer(which) {
57557           setLayer(which, !showsLayer(which));
57558       }
57559
57560
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(); });
57565
57566           function layerSupported(d) {
57567               return d.layer && d.layer.supported();
57568           }
57569           function layerEnabled(d) {
57570               return layerSupported(d) && d.layer.enabled();
57571           }
57572
57573           var ul = selection$$1
57574               .selectAll('.layer-list-photos')
57575               .data([0]);
57576
57577           ul = ul.enter()
57578               .append('ul')
57579               .attr('class', 'layer-list layer-list-photos')
57580               .merge(ul);
57581
57582           var li = ul.selectAll('.list-item-photos')
57583               .data(data);
57584
57585           li.exit()
57586               .remove();
57587
57588           var liEnter = li.enter()
57589               .append('li')
57590               .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
57591
57592           var labelEnter = liEnter
57593               .append('label')
57594               .each(function(d) {
57595                   select(this)
57596                       .call(tooltip()
57597                           .title(t(d.id.replace('-', '_') + '.tooltip'))
57598                           .placement('top')
57599                       );
57600               });
57601
57602           labelEnter
57603               .append('input')
57604               .attr('type', 'checkbox')
57605               .on('change', function(d) { toggleLayer(d.id); });
57606
57607           labelEnter
57608               .append('span')
57609               .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
57610
57611
57612           // Update
57613           li = li
57614               .merge(liEnter);
57615
57616           li
57617               .classed('active', layerEnabled)
57618               .selectAll('input')
57619               .property('checked', layerEnabled);
57620       }
57621
57622
57623       function drawOsmItem(selection$$1) {
57624           var osm = layers.layer('osm'),
57625               showsOsm = osm.enabled();
57626
57627           var ul = selection$$1
57628               .selectAll('.layer-list-osm')
57629               .data(osm ? [0] : []);
57630
57631           // Exit
57632           ul.exit()
57633               .remove();
57634
57635           // Enter
57636           var ulEnter = ul.enter()
57637               .append('ul')
57638               .attr('class', 'layer-list layer-list-osm');
57639
57640           var liEnter = ulEnter
57641               .append('li')
57642               .attr('class', 'list-item-osm');
57643
57644           var labelEnter = liEnter
57645               .append('label')
57646               .call(tooltip()
57647                   .title(t('map_data.layers.osm.tooltip'))
57648                   .placement('bottom')
57649               );
57650
57651           labelEnter
57652               .append('input')
57653               .attr('type', 'checkbox')
57654               .on('change', function() { toggleLayer('osm'); });
57655
57656           labelEnter
57657               .append('span')
57658               .text(t('map_data.layers.osm.title'));
57659
57660           // Update
57661           ul = ul
57662               .merge(ulEnter);
57663
57664           ul.selectAll('.list-item-osm')
57665               .classed('active', showsOsm)
57666               .selectAll('input')
57667               .property('checked', showsOsm);
57668       }
57669
57670
57671       function drawGpxItem(selection$$1) {
57672           var gpx = layers.layer('gpx'),
57673               hasGpx = gpx && gpx.hasGpx(),
57674               showsGpx = hasGpx && gpx.enabled();
57675
57676           var ul = selection$$1
57677               .selectAll('.layer-list-gpx')
57678               .data(gpx ? [0] : []);
57679
57680           // Exit
57681           ul.exit()
57682               .remove();
57683
57684           // Enter
57685           var ulEnter = ul.enter()
57686               .append('ul')
57687               .attr('class', 'layer-list layer-list-gpx');
57688
57689           var liEnter = ulEnter
57690               .append('li')
57691               .attr('class', 'list-item-gpx');
57692
57693           liEnter
57694               .append('button')
57695               .attr('class', 'list-item-gpx-extent')
57696               .call(tooltip()
57697                   .title(t('gpx.zoom'))
57698                   .placement((textDirection === 'rtl') ? 'right' : 'left')
57699               )
57700               .on('click', function() {
57701                   event.preventDefault();
57702                   event.stopPropagation();
57703                   gpx.fitZoom();
57704               })
57705               .call(svgIcon('#iD-icon-search'));
57706
57707           liEnter
57708               .append('button')
57709               .attr('class', 'list-item-gpx-browse')
57710               .call(tooltip()
57711                   .title(t('gpx.browse'))
57712                   .placement((textDirection === 'rtl') ? 'right' : 'left')
57713               )
57714               .on('click', function() {
57715                   select(document.createElement('input'))
57716                       .attr('type', 'file')
57717                       .on('change', function() {
57718                           gpx.files(event.target.files);
57719                       })
57720                       .node().click();
57721               })
57722               .call(svgIcon('#iD-icon-geolocate'));
57723
57724           var labelEnter = liEnter
57725               .append('label')
57726               .call(tooltip()
57727                   .title(t('gpx.drag_drop'))
57728                   .placement('top')
57729               );
57730
57731           labelEnter
57732               .append('input')
57733               .attr('type', 'checkbox')
57734               .on('change', function() { toggleLayer('gpx'); });
57735
57736           labelEnter
57737               .append('span')
57738               .text(t('gpx.local_layer'));
57739
57740           // Update
57741           ul = ul
57742               .merge(ulEnter);
57743
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);
57751       }
57752
57753
57754       function drawListItems(selection$$1, data, type, name, change, active) {
57755           var items = selection$$1.selectAll('li')
57756               .data(data);
57757
57758           // Exit
57759           items.exit()
57760               .remove();
57761
57762           // Enter
57763           var enter = items.enter()
57764               .append('li')
57765               .attr('class', 'layer')
57766               .call(tooltip()
57767                   .html(true)
57768                   .title(function(d) {
57769                       var tip = t(name + '.' + d + '.tooltip'),
57770                           key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
57771
57772                       if (name === 'feature' && autoHiddenFeature(d)) {
57773                           var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
57774                           tip += '<div>' + msg + '</div>';
57775                       }
57776                       return uiTooltipHtml(tip, key);
57777                   })
57778                   .placement('top')
57779               );
57780
57781           var label = enter
57782               .append('label');
57783
57784           label
57785               .append('input')
57786               .attr('type', type)
57787               .attr('name', name)
57788               .on('change', change);
57789
57790           label
57791               .append('span')
57792               .text(function(d) { return t(name + '.' + d + '.description'); });
57793
57794           // Update
57795           items = items
57796               .merge(enter);
57797
57798           items
57799               .classed('active', active)
57800               .selectAll('input')
57801               .property('checked', active)
57802               .property('indeterminate', function(d) {
57803                   return (name === 'feature' && autoHiddenFeature(d));
57804               });
57805       }
57806
57807
57808       function renderDataLayers(selection$$1) {
57809           var container = selection$$1.selectAll('data-layer-container')
57810               .data([0]);
57811
57812           _dataLayerContainer = container.enter()
57813               .append('div')
57814               .attr('class', 'data-layer-container')
57815               .merge(container);
57816       }
57817
57818
57819       function renderFillList(selection$$1) {
57820           var container = selection$$1.selectAll('layer-fill-list')
57821               .data([0]);
57822
57823           _fillList = container.enter()
57824               .append('ul')
57825               .attr('class', 'layer-list layer-fill-list')
57826               .merge(container);
57827       }
57828
57829
57830       function renderFeatureList(selection$$1) {
57831           var container = selection$$1.selectAll('layer-feature-list')
57832               .data([0]);
57833
57834           _featureList = container.enter()
57835               .append('ul')
57836               .attr('class', 'layer-list layer-feature-list')
57837               .merge(container);
57838       }
57839
57840
57841       function update() {
57842           _dataLayerContainer
57843               .call(drawOsmItem)
57844               .call(drawPhotoItems)
57845               .call(drawGpxItem);
57846
57847           _fillList
57848               .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
57849
57850           _featureList
57851               .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
57852       }
57853
57854
57855       function toggleWireframe() {
57856           if (event) {
57857               event.preventDefault();
57858               event.stopPropagation();
57859           }
57860
57861           if (_fillSelected === 'wireframe') {
57862               _fillSelected = context.storage('area-fill-toggle') || 'partial';
57863           } else {
57864               _fillSelected = 'wireframe';
57865           }
57866
57867           setFill(_fillSelected);
57868           context.map().pan([0,0]);  // trigger a redraw
57869       }
57870
57871
57872       function mapData(selection$$1) {
57873
57874           function hidePane() {
57875               setVisible(false);
57876           }
57877
57878           function togglePane() {
57879               if (event) event.preventDefault();
57880               paneTooltip.hide(button);
57881               setVisible(!button.classed('active'));
57882           }
57883
57884           function setVisible(show) {
57885               if (show !== _shown) {
57886                   button.classed('active', show);
57887                   _shown = show;
57888
57889                   if (show) {
57890                       uiBackground.hidePane();
57891                       uiHelp.hidePane();
57892                       update();
57893
57894                       pane
57895                           .style('display', 'block')
57896                           .style('right', '-300px')
57897                           .transition()
57898                           .duration(200)
57899                           .style('right', '0px');
57900
57901                   } else {
57902                       pane
57903                           .style('display', 'block')
57904                           .style('right', '0px')
57905                           .transition()
57906                           .duration(200)
57907                           .style('right', '-300px')
57908                           .on('end', function() {
57909                               select(this).style('display', 'none');
57910                           });
57911                   }
57912               }
57913           }
57914
57915
57916           var pane = selection$$1
57917               .append('div')
57918               .attr('class', 'fillL map-pane col4 hide');
57919
57920           var paneTooltip = tooltip()
57921               .placement((textDirection === 'rtl') ? 'right' : 'left')
57922               .html(true)
57923               .title(uiTooltipHtml(t('map_data.description'), key));
57924
57925           var button = selection$$1
57926               .append('button')
57927               .attr('tabindex', -1)
57928               .on('click', togglePane)
57929               .call(svgIcon('#iD-icon-data', 'light'))
57930               .call(paneTooltip);
57931
57932
57933           var heading = pane
57934               .append('div')
57935               .attr('class', 'pane-heading');
57936
57937           heading
57938               .append('h2')
57939               .text(t('map_data.title'));
57940
57941           heading
57942               .append('button')
57943               .on('click', function() { uiMapData.hidePane(); })
57944               .call(svgIcon('#iD-icon-close'));
57945
57946
57947           var content = pane
57948               .append('div')
57949               .attr('class', 'pane-content');
57950
57951           // data layers
57952           content
57953               .append('div')
57954               .attr('class', 'map-data-data-layers')
57955               .call(uiDisclosure(context, 'data_layers', true)
57956                   .title(t('map_data.data_layers'))
57957                   .content(renderDataLayers)
57958               );
57959
57960           // area fills
57961           content
57962               .append('div')
57963               .attr('class', 'map-data-area-fills')
57964               .call(uiDisclosure(context, 'fill_area', false)
57965                   .title(t('map_data.fill_area'))
57966                   .content(renderFillList)
57967               );
57968
57969           // feature filters
57970           content
57971               .append('div')
57972               .attr('class', 'map-data-feature-filters')
57973               .call(uiDisclosure(context, 'map_features', false)
57974                   .title(t('map_data.map_features'))
57975                   .content(renderFeatureList)
57976               );
57977
57978
57979           // add listeners
57980           context.features()
57981               .on('change.map_data-update', update);
57982
57983           update();
57984           setFill(_fillSelected);
57985
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);
57990
57991           select(document)
57992               .call(keybinding);
57993
57994           uiMapData.hidePane = hidePane;
57995           uiMapData.togglePane = togglePane;
57996           uiMapData.setVisible = setVisible;
57997       }
57998
57999       return mapData;
58000   }
58001
58002   function uiShortcuts() {
58003       var detected = utilDetect();
58004       var activeTab = 0;
58005       var modalSelection;
58006       var savedSelection;
58007
58008
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;
58015                   }
58016               } else {
58017                   modalSelection = uiModal(savedSelection);
58018                   shortcutsModal(modalSelection);
58019               }
58020           });
58021
58022       select(document)
58023           .call(keybinding);
58024
58025
58026
58027       function shortcutsModal(modalSelection) {
58028           modalSelection.select('.modal')
58029               .classed('modal-shortcuts', true);
58030
58031           var shortcutsModal = modalSelection.select('.content');
58032
58033           shortcutsModal
58034               .append('div')
58035               .attr('class', 'modal-section')
58036               .append('h3')
58037               .text(t('shortcuts.title'));
58038
58039           shortcutsModal
58040               .call(render);
58041       }
58042
58043
58044       function render(selection$$1) {
58045           var wrapper = selection$$1
58046               .selectAll('.wrapper')
58047               .data([0]);
58048
58049           var wrapperEnter = wrapper
58050               .enter()
58051               .append('div')
58052               .attr('class', 'wrapper modal-section');
58053
58054           var tabsBar = wrapperEnter
58055               .append('div')
58056               .attr('class', 'tabs-bar');
58057
58058           var shortcutsList = wrapperEnter
58059               .append('div')
58060               .attr('class', 'shortcuts-list');
58061
58062           wrapper = wrapper.merge(wrapperEnter);
58063
58064           var tabs = tabsBar
58065               .selectAll('.tab')
58066               .data(dataShortcuts);
58067
58068           var tabsEnter = tabs
58069               .enter()
58070               .append('div')
58071               .attr('class', 'tab')
58072               .on('click', function (d, i) {
58073                   activeTab = i;
58074                   render(selection$$1);
58075               });
58076
58077           tabsEnter
58078               .append('span')
58079               .text(function (d) { return t(d.text); });
58080
58081           tabs = tabs
58082               .merge(tabsEnter);
58083
58084           // Update
58085           wrapper.selectAll('.tab')
58086               .classed('active', function (d, i) {
58087                   return i === activeTab;
58088               });
58089
58090
58091           var shortcuts = shortcutsList
58092               .selectAll('.shortcut-tab')
58093               .data(dataShortcuts);
58094
58095           var shortcutsEnter = shortcuts
58096               .enter()
58097               .append('div')
58098               .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
58099
58100           var columnsEnter = shortcutsEnter
58101               .selectAll('.shortcut-column')
58102               .data(function (d) { return d.columns; })
58103               .enter()
58104               .append('table')
58105               .attr('class', 'shortcut-column');
58106
58107           var rowsEnter = columnsEnter
58108               .selectAll('.shortcut-row')
58109               .data(function (d) { return d.rows; })
58110               .enter()
58111               .append('tr')
58112               .attr('class', 'shortcut-row');
58113
58114
58115           var sectionRows = rowsEnter
58116               .filter(function (d) { return !d.shortcuts; });
58117
58118           sectionRows
58119               .append('td');
58120
58121           sectionRows
58122               .append('td')
58123               .attr('class', 'shortcut-section')
58124               .append('h3')
58125               .text(function (d) { return t(d.text); });
58126
58127
58128           var shortcutRows = rowsEnter
58129               .filter(function (d) { return d.shortcuts; });
58130
58131           var shortcutKeys = shortcutRows
58132               .append('td')
58133               .attr('class', 'shortcut-keys');
58134
58135           var modifierKeys = shortcutKeys
58136               .filter(function (d) { return d.modifiers; });
58137
58138           modifierKeys
58139               .selectAll('kbd.modifier')
58140               .data(function (d) {
58141                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
58142                       return ['⌘'];
58143                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
58144                       return [];
58145                   } else {
58146                       return d.modifiers;
58147                   }
58148               })
58149               .enter()
58150               .each(function () {
58151                   var selection$$1 = select(this);
58152
58153                   selection$$1
58154                       .append('kbd')
58155                       .attr('class', 'modifier')
58156                       .text(function (d) { return uiCmd.display(d); });
58157
58158                   selection$$1
58159                       .append('span')
58160                       .text('+');
58161               });
58162
58163
58164           shortcutKeys
58165               .selectAll('kbd.shortcut')
58166               .data(function (d) {
58167                   var arr = d.shortcuts;
58168                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
58169                       arr = ['Y'];
58170                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
58171                       arr = ['F11'];
58172                   }
58173
58174                   return arr.map(function(s) {
58175                       return {
58176                           shortcut: s,
58177                           separator: d.separator
58178                       };
58179                   });
58180               })
58181               .enter()
58182               .each(function (d, i, nodes) {
58183                   var selection$$1 = select(this);
58184                   var click = d.shortcut.toLowerCase().match(/(.*).click/);
58185
58186                   if (click && click[1]) {
58187                       selection$$1
58188                           .call(svgIcon('#iD-walkthrough-mouse', 'mouseclick', click[1]));
58189                   } else {
58190                       selection$$1
58191                           .append('kbd')
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);
58196                           });
58197                   }
58198
58199                   if (i < nodes.length - 1) {
58200                       selection$$1
58201                           .append('span')
58202                           .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
58203                   }
58204               });
58205
58206
58207           shortcutKeys
58208               .filter(function(d) { return d.gesture; })
58209               .each(function () {
58210                   var selection$$1 = select(this);
58211
58212                   selection$$1
58213                       .append('span')
58214                       .text('+');
58215
58216                   selection$$1
58217                       .append('span')
58218                       .attr('class', 'gesture')
58219                       .text(function (d) { return t(d.gesture); });
58220               });
58221
58222
58223           shortcutRows
58224               .append('td')
58225               .attr('class', 'shortcut-desc')
58226               .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
58227
58228
58229           shortcuts = shortcuts
58230               .merge(shortcutsEnter);
58231
58232           // Update
58233           wrapper.selectAll('.shortcut-tab')
58234               .style('display', function (d, i) {
58235                   return i === activeTab ? 'flex' : 'none';
58236               });
58237       }
58238
58239
58240       return function(selection$$1, show) {
58241           savedSelection = selection$$1;
58242           if (show) {
58243               modalSelection = uiModal(selection$$1);
58244               shortcutsModal(modalSelection);
58245           }
58246       };
58247   }
58248
58249   function uiHelp(context) {
58250       var key = t('help.key');
58251
58252       var docKeys = [
58253           ['help', [
58254               'welcome',
58255               'open_data_h',
58256               'open_data',
58257               'before_start_h',
58258               'before_start',
58259               'open_source_h',
58260               'open_source',
58261               'open_source_help'
58262           ]],
58263           ['overview', [
58264               'navigation_h',
58265               'navigation_drag',
58266               'navigation_zoom',
58267               'features_h',
58268               'features',
58269               'nodes_ways'
58270           ]],
58271           ['editing', [
58272               'select_h',
58273               'select_left_click',
58274               'select_right_click',
58275               'multiselect_h',
58276               'multiselect_shift_click',
58277               'multiselect_lasso',
58278               'undo_redo_h',
58279               'undo_redo',
58280               'save_h',
58281               'save',
58282               'save_validation',
58283               'upload_h',
58284               'upload',
58285               'backups_h',
58286               'backups',
58287               'keyboard_h',
58288               'keyboard'
58289           ]],
58290           ['feature_editor', [
58291               'intro',
58292               'definitions',
58293               'type_h',
58294               'type',
58295               'type_picker',
58296               'fields_h',
58297               'fields_all_fields',
58298               'fields_example',
58299               'fields_add_field',
58300               'tags_h',
58301               'tags_all_tags',
58302               'tags_resources'
58303           ]],
58304           ['points', [
58305               'intro',
58306               'add_point_h',
58307               'add_point',
58308               'add_point_finish',
58309               'move_point_h',
58310               'move_point',
58311               'delete_point_h',
58312               'delete_point',
58313               'delete_point_command'
58314           ]],
58315           ['lines', [
58316               'intro',
58317               'add_line_h',
58318               'add_line',
58319               'add_line_draw',
58320               'add_line_finish',
58321               'modify_line_h',
58322               'modify_line_dragnode',
58323               'modify_line_addnode',
58324               'connect_line_h',
58325               'connect_line',
58326               'connect_line_display',
58327               'connect_line_drag',
58328               'connect_line_tag',
58329               'disconnect_line_h',
58330               'disconnect_line_command',
58331               'move_line_h',
58332               'move_line_command',
58333               'move_line_connected',
58334               'delete_line_h',
58335               'delete_line',
58336               'delete_line_command'
58337           ]],
58338           ['areas', [
58339               'intro',
58340               'point_or_area_h',
58341               'point_or_area',
58342               'add_area_h',
58343               'add_area_command',
58344               'add_area_draw',
58345               'add_area_finish',
58346               'square_area_h',
58347               'square_area_command',
58348               'modify_area_h',
58349               'modify_area_dragnode',
58350               'modify_area_addnode',
58351               'delete_area_h',
58352               'delete_area',
58353               'delete_area_command'
58354           ]],
58355           ['relations', [
58356               'intro',
58357               'edit_relation_h',
58358               'edit_relation',
58359               'edit_relation_add',
58360               'edit_relation_delete',
58361               'maintain_relation_h',
58362               'maintain_relation',
58363               'relation_types_h',
58364               'multipolygon_h',
58365               'multipolygon',
58366               'multipolygon_create',
58367               'multipolygon_merge',
58368               'turn_restriction_h',
58369               'turn_restriction',
58370               'turn_restriction_field',
58371               'turn_restriction_editing',
58372               'route_h',
58373               'route',
58374               'route_add',
58375               'boundary_h',
58376               'boundary',
58377               'boundary_add'
58378           ]],
58379           ['imagery', [
58380               'intro',
58381               'sources_h',
58382               'choosing',
58383               'sources',
58384               'offsets_h',
58385               'offset',
58386               'offset_change'
58387           ]],
58388           ['streetlevel', [
58389               'intro',
58390               'using_h',
58391               'using',
58392               'photos',
58393               'viewer'
58394           ]],
58395           ['gps', [
58396               'intro',
58397               'survey',
58398               'using_h',
58399               'using',
58400               'tracing',
58401               'upload'
58402           ]]
58403       ];
58404
58405       var headings = {
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,
58446       };
58447
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
58472       };
58473
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';
58482           }, '');
58483
58484           return {
58485               title: t(helpkey + '.title'),
58486               html: marked(text.trim())
58487           };
58488       });
58489
58490
58491       function help(selection$$1) {
58492
58493           function hidePane() {
58494               setVisible(false);
58495           }
58496
58497
58498           function togglePane() {
58499               if (event) event.preventDefault();
58500               tooltipBehavior.hide(button);
58501               setVisible(!button.classed('active'));
58502           }
58503
58504
58505           function setVisible(show) {
58506               if (show !== shown) {
58507                   button.classed('active', show);
58508                   shown = show;
58509
58510                   if (show) {
58511                       uiBackground.hidePane();
58512                       uiMapData.hidePane();
58513
58514                       pane.style('display', 'block')
58515                           .style('right', '-500px')
58516                           .transition()
58517                           .duration(200)
58518                           .style('right', '0px');
58519
58520                   } else {
58521                       pane.style('right', '0px')
58522                           .transition()
58523                           .duration(200)
58524                           .style('right', '-500px')
58525                           .on('end', function() {
58526                               select(this).style('display', 'none');
58527                           });
58528                   }
58529               }
58530           }
58531
58532
58533           function clickHelp(d, i) {
58534               var rtl = (textDirection === 'rtl');
58535               pane.property('scrollTop', 0);
58536               doctitle.html(d.title);
58537
58538               body.html(d.html);
58539               body.selectAll('a')
58540                   .attr('target', '_blank');
58541               menuItems.classed('selected', function(m) {
58542                   return m.title === d.title;
58543               });
58544
58545               nav.html('');
58546               if (rtl) {
58547                   nav.call(drawNext).call(drawPrevious);
58548               } else {
58549                   nav.call(drawPrevious).call(drawNext);
58550               }
58551
58552
58553               function drawNext(selection$$1) {
58554                   if (i < docs.length - 1) {
58555                       var nextLink = selection$$1
58556                           .append('a')
58557                           .attr('class', 'next')
58558                           .on('click', function() {
58559                               clickHelp(docs[i + 1], i + 1);
58560                           });
58561
58562                       nextLink
58563                           .append('span')
58564                           .text(docs[i + 1].title)
58565                           .call(svgIcon((rtl ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
58566                   }
58567               }
58568
58569
58570               function drawPrevious(selection$$1) {
58571                   if (i > 0) {
58572                       var prevLink = selection$$1
58573                           .append('a')
58574                           .attr('class', 'previous')
58575                           .on('click', function() {
58576                               clickHelp(docs[i - 1], i - 1);
58577                           });
58578
58579                       prevLink
58580                           .call(svgIcon((rtl ? '#iD-icon-forward' : '#iD-icon-backward'), 'inline'))
58581                           .append('span')
58582                           .text(docs[i - 1].title);
58583                   }
58584               }
58585           }
58586
58587
58588           function clickWalkthrough() {
58589               if (context.inIntro()) return;
58590               context.container().call(uiIntro(context));
58591               setVisible(false);
58592           }
58593
58594
58595           function clickShortcuts() {
58596               context.container().call(uiShortcuts(context), true);
58597           }
58598
58599
58600           var pane = selection$$1.append('div')
58601               .attr('class', 'help-wrap map-pane fillL col6 hide');
58602
58603           var tooltipBehavior = tooltip()
58604               .placement((textDirection === 'rtl') ? 'right' : 'left')
58605               .html(true)
58606               .title(uiTooltipHtml(t('help.title'), key));
58607
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);
58613
58614           var shown = false;
58615
58616
58617           var heading = pane
58618               .append('div')
58619               .attr('class', 'pane-heading');
58620
58621           var doctitle = heading
58622               .append('h2')
58623               .text(t('help.title'));
58624
58625           heading
58626               .append('button')
58627               .on('click', function() { uiHelp.hidePane(); })
58628               .call(svgIcon('#iD-icon-close'));
58629
58630
58631           var content = pane
58632               .append('div')
58633               .attr('class', 'pane-content');
58634
58635           var toc = content
58636               .append('ul')
58637               .attr('class', 'toc');
58638
58639           var menuItems = toc.selectAll('li')
58640               .data(docs)
58641               .enter()
58642               .append('li')
58643               .append('a')
58644               .html(function(d) { return d.title; })
58645               .on('click', clickHelp);
58646
58647           var shortcuts = toc
58648               .append('li')
58649               .attr('class', 'shortcuts')
58650               .call(tooltip()
58651                   .html(true)
58652                   .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
58653                   .placement('top')
58654               )
58655               .append('a')
58656               .on('click', clickShortcuts);
58657
58658           shortcuts
58659               .append('div')
58660               .text(t('shortcuts.title'));
58661
58662           var walkthrough = toc
58663               .append('li')
58664               .attr('class', 'walkthrough')
58665               .append('a')
58666               .on('click', clickWalkthrough);
58667
58668           walkthrough
58669               .append('svg')
58670               .attr('class', 'logo logo-walkthrough')
58671               .append('use')
58672               .attr('xlink:href', '#iD-logo-walkthrough');
58673
58674           walkthrough
58675               .append('div')
58676               .text(t('splash.walkthrough'));
58677
58678
58679           var helpContent = content
58680               .append('div')
58681               .attr('class', 'left-content');
58682
58683           var body = helpContent
58684               .append('div')
58685               .attr('class', 'body');
58686
58687           var nav = helpContent
58688               .append('div')
58689               .attr('class', 'nav');
58690
58691           clickHelp(docs[0], 0);
58692
58693           var keybinding = d3keybinding('help')
58694               .on(key, togglePane)
58695               .on([t('background.key'), t('map_data.key')], hidePane);
58696
58697           select(document)
58698               .call(keybinding);
58699
58700           uiHelp.hidePane = hidePane;
58701           uiHelp.togglePane = togglePane;
58702           uiHelp.setVisible = setVisible;
58703       }
58704
58705       return help;
58706   }
58707
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);
58715   }
58716
58717   function vintageRange(vintage) {
58718       var s;
58719       if (vintage.start || vintage.end) {
58720           s = (vintage.start || '?');
58721           if (vintage.start !== vintage.end) {
58722               s += ' - ' + (vintage.end || '?');
58723           }
58724       }
58725       return s;
58726   }
58727
58728
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;
58736
58737       source.scaleExtent = data.scaleExtent || [0, 22];
58738       source.overzoom = data.overzoom !== false;
58739
58740
58741       source.offset = function(_) {
58742           if (!arguments.length) return offset;
58743           offset = _;
58744           return source;
58745       };
58746
58747
58748       source.nudge = function(_, zoomlevel) {
58749           offset[0] += _[0] / Math.pow(2, zoomlevel);
58750           offset[1] += _[1] / Math.pow(2, zoomlevel);
58751           return source;
58752       };
58753
58754
58755       source.name = function() {
58756           var id_safe = source.id.replace('.', '<TX_DOT>');
58757           return t('imagery.' + id_safe + '.name', { default: name });
58758       };
58759
58760
58761       source.description = function() {
58762           var id_safe = source.id.replace('.', '<TX_DOT>');
58763           return t('imagery.' + id_safe + '.description', { default: description });
58764       };
58765
58766
58767       source.best = function() {
58768           return best;
58769       };
58770
58771
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;
58776       };
58777
58778
58779       source.imageryUsed = function() {
58780           return name || source.id;
58781       };
58782
58783
58784       source.template = function(_) {
58785           if (!arguments.length) return template;
58786           if (source.id === 'custom') template = _;
58787           return source;
58788       };
58789
58790
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;
58798                   };
58799
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)));
58803
58804                   switch (this.projection) {
58805                     case 'EPSG:4326': // todo: alternative codes of WGS 84?
58806                       return {
58807                         x: lon * 180 / Math.PI,
58808                         y: lat * 180 / Math.PI
58809                       };
58810                     default: // EPSG:3857 and synonyms
58811                       var mercCoords = mercatorRaw(lon, lat);
58812                       return {
58813                         x: 20037508.34 / Math.PI * mercCoords[0],
58814                         y: 20037508.34 / Math.PI * mercCoords[1]
58815                       };
58816                   }
58817               }).bind(this);
58818               var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
58819               var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
58820               return template
58821                   .replace('{width}', 256)
58822                   .replace('{height}', 256)
58823                   .replace('{proj}', this.projection)
58824                   .replace('{bbox}', minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y);
58825           }
58826           return template
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];
58835               })
58836               .replace('{u}', function() {
58837                   var u = '';
58838                   for (var zoom = coord[2]; zoom > 0; zoom--) {
58839                       var b = 0;
58840                       var mask = 1 << (zoom - 1);
58841                       if ((coord[0] & mask) !== 0) b++;
58842                       if ((coord[1] & mask) !== 0) b += 2;
58843                       u += b.toString();
58844                   }
58845                   return u;
58846               });
58847       };
58848
58849
58850       source.intersects = function(extent) {
58851           extent = extent.polygon();
58852           return !data.polygon || data.polygon.some(function(polygon) {
58853               return geoPolygonIntersectsPolygon(polygon, extent, true);
58854           });
58855       };
58856
58857
58858       source.validZoom = function(z) {
58859           return source.scaleExtent[0] <= z &&
58860               (source.overzoom || source.scaleExtent[1] > z);
58861       };
58862
58863
58864       source.isLocatorOverlay = function() {
58865           return source.id === 'mapbox_locator_overlay';
58866       };
58867
58868
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';
58873       };
58874
58875
58876       source.copyrightNotices = function() {};
58877
58878
58879       source.getMetadata = function(center, tileCoord, callback) {
58880           var vintage = {
58881               start: localeDateString(source.startDate),
58882               end: localeDateString(source.endDate)
58883           };
58884           vintage.range = vintageRange(vintage);
58885
58886           var metadata = { vintage: vintage };
58887           callback(null, metadata);
58888       };
58889
58890
58891       return source;
58892   }
58893
58894
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
58898
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';
58900
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}',
58905           cache = {},
58906           inflight = {},
58907           providers = [];
58908
58909       jsonpRequest(url, function(json) {
58910           providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
58911               return {
58912                   attribution: provider.attribution,
58913                   areas: provider.coverageAreas.map(function(area) {
58914                       return {
58915                           zoom: [area.zoomMin, area.zoomMax],
58916                           extent: geoExtent$$1([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
58917                       };
58918                   })
58919               };
58920           });
58921           dispatch.call('change');
58922       });
58923
58924
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;
58932               });
58933           }).map(function(provider) {
58934               return provider.attribution;
58935           }).join(', ');
58936       };
58937
58938
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}';
58945
58946           if (inflight[tileId]) return;
58947
58948           if (!cache[tileId]) {
58949               cache[tileId] = {};
58950           }
58951           if (cache[tileId] && cache[tileId].metadata) {
58952               return callback(null, cache[tileId].metadata);
58953           }
58954
58955           inflight[tileId] = true;
58956           jsonpRequest(url, function(result) {
58957               delete inflight[tileId];
58958
58959               var err = (!result && 'Unknown Error') || result.errorDetails;
58960               if (err) {
58961                   return callback(err);
58962               } else {
58963                   var vintage = {
58964                       start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
58965                       end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
58966                   };
58967                   vintage.range = vintageRange(vintage);
58968
58969                   var metadata = { vintage: vintage };
58970                   cache[tileId].metadata = metadata;
58971                   return callback(null, metadata);
58972               }
58973           });
58974       };
58975
58976
58977       bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
58978
58979
58980       return bing;
58981   };
58982
58983
58984
58985   rendererBackgroundSource.Esri = function(data) {
58986
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';
58991       }
58992
58993       var esri = rendererBackgroundSource(data),
58994           cache = {},
58995           inflight = {};
58996
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'),
59002               metadataLayer,
59003               vintage = {},
59004               metadata = {};
59005
59006           if (inflight[tileId]) return;
59007
59008           switch (true) {
59009               case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
59010                   metadataLayer = 4;
59011                   break;
59012               case zoom >= 19:
59013                   metadataLayer = 3;
59014                   break;
59015               case zoom >= 17:
59016                   metadataLayer = 2;
59017                   break;
59018               case zoom >= 13:
59019                   metadataLayer = 0;
59020                   break;
59021               default:
59022                   metadataLayer = 99;
59023           }
59024
59025           var url;
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/';
59031           }
59032
59033           url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json&callback={callback}';
59034
59035           if (!cache[tileId]) {
59036               cache[tileId] = {};
59037           }
59038           if (cache[tileId] && cache[tileId].metadata) {
59039               return callback(null, cache[tileId].metadata);
59040           }
59041
59042           // accurate metadata is only available >= 13
59043           if (metadataLayer === 99) {
59044               vintage = {
59045                   start: null,
59046                   end: null,
59047                   range: null
59048               };
59049               metadata = {
59050                   vintage: null,
59051                   source: unknown,
59052                   description: unknown,
59053                   resolution: unknown,
59054                   accuracy: unknown
59055               };
59056
59057               callback(null, metadata);
59058
59059           } else {
59060               inflight[tileId] = true;
59061               jsonpRequest(url, function(result) {
59062                   delete inflight[tileId];
59063
59064                   var err;
59065                   if (!result) {
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;
59071                   }
59072
59073                   if (err) {
59074                       return callback(err);
59075                   } else {
59076                       // pass through the discrete capture date from metadata
59077                       var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
59078                       vintage = {
59079                           start: captureDate,
59080                           end: captureDate,
59081                           range: captureDate
59082                       };
59083                       metadata = {
59084                           vintage: vintage,
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)
59089                       };
59090
59091                       // append units - meters
59092                       if (isFinite(metadata.resolution)) {
59093                           metadata.resolution += ' m';
59094                       }
59095                       if (isFinite(metadata.accuracy)) {
59096                           metadata.accuracy += ' m';
59097                       }
59098
59099                       cache[tileId].metadata = metadata;
59100                       return callback(null, metadata);
59101                   }
59102               });
59103           }
59104
59105
59106           function clean(val) {
59107               return String(val).trim() || unknown;
59108           }
59109       };
59110
59111       return esri;
59112   };
59113
59114
59115   rendererBackgroundSource.None = function() {
59116       var source = rendererBackgroundSource({ id: 'none', template: '' });
59117
59118
59119       source.name = function() {
59120           return t('background.none');
59121       };
59122
59123
59124       source.imageryUsed = function() {
59125           return 'None';
59126       };
59127
59128
59129       source.area = function() {
59130           return -1;  // sources in background pane are sorted by area
59131       };
59132
59133
59134       return source;
59135   };
59136
59137
59138   rendererBackgroundSource.Custom = function(template) {
59139       var source = rendererBackgroundSource({ id: 'custom', template: template });
59140
59141
59142       source.name = function() {
59143           return t('background.custom');
59144       };
59145
59146
59147       source.imageryUsed = function() {
59148           return 'Custom (' + source.template() + ')';
59149       };
59150
59151
59152       source.area = function() {
59153           return -2;  // sources in background pane are sorted by area
59154       };
59155
59156
59157       return source;
59158   };
59159
59160   function rendererTileLayer(context) {
59161       var tileSize = 256;
59162       var transformProp = utilPrefixCSSProperty('Transform');
59163       var geotile = d3geoTile();
59164
59165       var _projection;
59166       var _cache = {};
59167       var _tileOrigin;
59168       var _zoom;
59169       var _source;
59170
59171
59172       // blacklist overlay tiles around Null Island..
59173       function nearNullIsland(x, y, z) {
59174           if (z >= 7) {
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;
59180           }
59181           return false;
59182       }
59183
59184
59185       function tileSizeAtZoom(d, z) {
59186           var EPSILON = 0.002;
59187           return ((tileSize * Math.pow(2, z - d[2])) / tileSize) + EPSILON;
59188       }
59189
59190
59191       function atZoom(t$$1, distance) {
59192           var power = Math.pow(2, distance);
59193           return [
59194               Math.floor(t$$1[0] * power),
59195               Math.floor(t$$1[1] * power),
59196               t$$1[2] + distance
59197           ];
59198       }
59199
59200
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) {
59205                   return tile;
59206               }
59207           }
59208       }
59209
59210
59211       function uniqueBy(a, n) {
59212           var o = [];
59213           var seen = {};
59214           for (var i = 0; i < a.length; i++) {
59215               if (seen[a[i][n]] === undefined) {
59216                   o.push(a[i]);
59217                   seen[a[i][n]] = true;
59218               }
59219           }
59220           return o;
59221       }
59222
59223
59224       function addSource(d) {
59225           d.push(_source.url(d));
59226           return d;
59227       }
59228
59229
59230       // Update tiles based on current state of `projection`.
59231       function background(selection$$1) {
59232           _zoom = geoScaleToZoom(_projection.scale(), tileSize);
59233
59234           var pixelOffset;
59235           if (_source) {
59236               pixelOffset = [
59237                   _source.offset()[0] * Math.pow(2, _zoom),
59238                   _source.offset()[1] * Math.pow(2, _zoom)
59239               ];
59240           } else {
59241               pixelOffset = [0, 0];
59242           }
59243
59244           var translate = [
59245               _projection.translate()[0] + pixelOffset[0],
59246               _projection.translate()[1] + pixelOffset[1]
59247           ];
59248
59249           geotile
59250               .scale(_projection.scale() * 2 * Math.PI)
59251               .translate(translate);
59252
59253           _tileOrigin = [
59254               _projection.scale() * Math.PI - translate[0],
59255               _projection.scale() * Math.PI - translate[1]
59256           ];
59257
59258           render(selection$$1);
59259       }
59260
59261
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;
59267           var requests = [];
59268           var showDebug = context.getDebug('tile') && !_source.overlay;
59269
59270           if (_source.validZoom(_zoom)) {
59271               geotile().forEach(function(d) {
59272                   addSource(d);
59273                   if (d[3] === '') return;
59274                   if (typeof d[3] !== 'string') return; // Workaround for #2295
59275                   requests.push(d);
59276                   if (_cache[d[3]] === false && lookUp(d)) {
59277                       requests.push(addSource(lookUp(d)));
59278                   }
59279               });
59280
59281               requests = uniqueBy(requests, 3).filter(function(r) {
59282                   if (!!_source.overlay && nearNullIsland(r[0], r[1], r[2])) {
59283                       return false;
59284                   }
59285                   // don't re-request tiles which have failed in the past
59286                   return _cache[r[3]] !== false;
59287               });
59288           }
59289
59290
59291           function load(d) {
59292               _cache[d[3]] = true;
59293               select(this)
59294                   .on('error', null)
59295                   .on('load', null)
59296                   .classed('tile-loaded', true);
59297               render(selection$$1);
59298           }
59299
59300           function error(d) {
59301               _cache[d[3]] = false;
59302               select(this)
59303                   .on('error', null)
59304                   .on('load', null)
59305                   .remove();
59306               render(selection$$1);
59307           }
59308
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 + ')';
59316           }
59317
59318           function tileCenter(d) {
59319               var ts = tileSize * Math.pow(2, _zoom - d[2]);
59320               return [
59321                   ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
59322                   ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
59323               ];
59324           }
59325
59326           function debugTransform(d) {
59327               var coord = tileCenter(d);
59328               return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
59329           }
59330
59331
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]);
59337           var nearCenter;
59338
59339           requests.forEach(function(d) {
59340               var c = tileCenter(d);
59341               var dist = geoVecLength(c, mapCenter);
59342               if (dist < minDist) {
59343                   minDist = dist;
59344                   nearCenter = d;
59345               }
59346           });
59347
59348
59349           var image = selection$$1.selectAll('img')
59350               .data(requests, function(d) { return d[3]; });
59351
59352           image.exit()
59353               .style(transformProp, imageTransform)
59354               .classed('tile-removing', true)
59355               .classed('tile-center', false)
59356               .each(function() {
59357                   var tile = select(this);
59358                   window.setTimeout(function() {
59359                       if (tile.classed('tile-removing')) {
59360                           tile.remove();
59361                       }
59362                   }, 300);
59363               });
59364
59365           image.enter()
59366             .append('img')
59367               .attr('class', 'tile')
59368               .attr('src', function(d) { return d[3]; })
59369               .on('error', error)
59370               .on('load', load)
59371             .merge(image)
59372               .style(transformProp, imageTransform)
59373               .classed('tile-debug', showDebug)
59374               .classed('tile-removing', false)
59375               .classed('tile-center', function(d) { return d === nearCenter; });
59376
59377
59378
59379           var debug = selection$$1.selectAll('.tile-label-debug')
59380               .data(showDebug ? requests : [], function(d) { return d[3]; });
59381
59382           debug.exit()
59383               .remove();
59384
59385           if (showDebug) {
59386               var debugEnter = debug.enter()
59387                   .append('div')
59388                   .attr('class', 'tile-label-debug');
59389
59390               debugEnter
59391                   .append('div')
59392                   .attr('class', 'tile-label-debug-coord');
59393
59394               debugEnter
59395                   .append('div')
59396                   .attr('class', 'tile-label-debug-vintage');
59397
59398               debug = debug.merge(debugEnter);
59399
59400               debug
59401                   .style(transformProp, debugTransform);
59402
59403               debug
59404                   .selectAll('.tile-label-debug-coord')
59405                   .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
59406
59407               debug
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')
59415                           );
59416                       });
59417                   });
59418           }
59419
59420       }
59421
59422
59423       background.projection = function(_) {
59424           if (!arguments.length) return _projection;
59425           _projection = _;
59426           return background;
59427       };
59428
59429
59430       background.dimensions = function(_) {
59431           if (!arguments.length) return geotile.size();
59432           geotile.size(_);
59433           return background;
59434       };
59435
59436
59437       background.source = function(_) {
59438           if (!arguments.length) return _source;
59439           _source = _;
59440           _cache = {};
59441           geotile.scaleExtent(_source.scaleExtent);
59442           return background;
59443       };
59444
59445
59446       return background;
59447   }
59448
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;
59456       var _contrast = 1;
59457       var _saturation = 1;
59458       var _sharpness = 1;
59459
59460
59461       function background(selection$$1) {
59462
59463           var baseFilter = '';
59464           if (detected.cssfilters) {
59465               if (_brightness !== 1) {
59466                   baseFilter += 'brightness(' + _brightness + ')';
59467               }
59468               if (_contrast !== 1) {
59469                   baseFilter += 'contrast(' + _contrast + ')';
59470               }
59471               if (_saturation !== 1) {
59472                   baseFilter += 'saturate(' + _saturation + ')';
59473               }
59474               if (_sharpness < 1) {  // gaussian blur
59475                   var blur = interpolateNumber(0.5, 5)(1 - _sharpness);
59476                   baseFilter += 'blur(' + blur + 'px)';
59477               }
59478           }
59479
59480           var base = selection$$1.selectAll('.layer-background')
59481               .data([0]);
59482
59483           base = base.enter()
59484               .insert('div', '.layer-data')
59485               .attr('class', 'layer layer-background')
59486               .merge(base);
59487
59488           if (detected.cssfilters) {
59489               base.style('filter', baseFilter || null);
59490           } else {
59491               base.style('opacity', _brightness);
59492           }
59493
59494
59495           var imagery = base.selectAll('.layer-imagery')
59496               .data([0]);
59497
59498           imagery.enter()
59499               .append('div')
59500               .attr('class', 'layer layer-imagery')
59501               .merge(imagery)
59502               .call(baseLayer);
59503
59504
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)';
59510
59511               var contrast = _sharpness - 1;
59512               maskFilter += ' contrast(' + contrast + ')';
59513
59514               var brightness = interpolateNumber(1, 0.85)(_sharpness - 1);
59515               maskFilter += ' brightness(' + brightness + ')';
59516           }
59517
59518           var mask = base.selectAll('.layer-unsharp-mask')
59519               .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
59520
59521           mask.exit()
59522               .remove();
59523
59524           mask.enter()
59525               .append('div')
59526               .attr('class', 'layer layer-mask layer-unsharp-mask')
59527               .merge(mask)
59528               .call(baseLayer)
59529               .style('filter', maskFilter || null)
59530               .style('mix-blend-mode', mixBlendMode || null);
59531
59532
59533           var overlays = selection$$1.selectAll('.layer-overlay')
59534               .data(_overlayLayers, function(d) { return d.source().name(); });
59535
59536           overlays.exit()
59537               .remove();
59538
59539           overlays.enter()
59540               .insert('div', '.layer-data')
59541               .attr('class', 'layer layer-overlay')
59542               .merge(overlays)
59543               .each(function(layer) { select(this).call(layer); });
59544       }
59545
59546
59547       background.updateImagery = function() {
59548           if (context.inIntro()) return;
59549
59550           var b = background.baseLayerSource(),
59551               o = _overlayLayers
59552                   .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
59553                   .map(function (d) { return d.source().id; })
59554                   .join(','),
59555               meters = geoOffsetToMeters(b.offset()),
59556               epsilon = 0.01,
59557               x = +meters[0].toFixed(2),
59558               y = +meters[1].toFixed(2),
59559               q = utilStringQs(window.location.hash.substring(1));
59560
59561           var id = b.id;
59562           if (id === 'custom') {
59563               id = 'custom:' + b.template();
59564           }
59565
59566           if (id) {
59567               q.background = id;
59568           } else {
59569               delete q.background;
59570           }
59571
59572           if (o) {
59573               q.overlays = o;
59574           } else {
59575               delete q.overlays;
59576           }
59577
59578           if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
59579               q.offset = x + ',' + y;
59580           } else {
59581               delete q.offset;
59582           }
59583
59584           if (!window.mocha) {
59585               window.location.replace('#' + utilQsString(q, true));
59586           }
59587
59588           var imageryUsed = [b.imageryUsed()];
59589
59590           _overlayLayers
59591               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
59592               .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
59593
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');
59600           }
59601
59602           var streetside = context.layers().layer('streetside');
59603           if (streetside && streetside.enabled()) {
59604               imageryUsed.push('Bing Streetside');
59605           }
59606
59607           var mapillary_images = context.layers().layer('mapillary-images');
59608           if (mapillary_images && mapillary_images.enabled()) {
59609               imageryUsed.push('Mapillary Images');
59610           }
59611
59612           var mapillary_signs = context.layers().layer('mapillary-signs');
59613           if (mapillary_signs && mapillary_signs.enabled()) {
59614               imageryUsed.push('Mapillary Signs');
59615           }
59616
59617           var openstreetcam_images = context.layers().layer('openstreetcam-images');
59618           if (openstreetcam_images && openstreetcam_images.enabled()) {
59619               imageryUsed.push('OpenStreetCam Images');
59620           }
59621
59622           context.history().imageryUsed(imageryUsed);
59623       };
59624
59625
59626       background.sources = function(extent) {
59627           return _backgroundSources.filter(function(source) {
59628               return source.intersects(extent);
59629           });
59630       };
59631
59632
59633       background.dimensions = function(_) {
59634           if (!_) return;
59635           baseLayer.dimensions(_);
59636
59637           _overlayLayers.forEach(function(layer) {
59638               layer.dimensions(_);
59639           });
59640       };
59641
59642
59643       background.baseLayerSource = function(d) {
59644           if (!arguments.length) return baseLayer.source();
59645
59646           // test source against OSM imagery blacklists..
59647           var osm = context.connection();
59648           if (!osm) return background;
59649
59650           var blacklists = context.connection().imageryBlacklists();
59651
59652           var template = d.template(),
59653               fail = false,
59654               tested = 0,
59655               regex, i;
59656
59657           for (i = 0; i < blacklists.length; i++) {
59658               try {
59659                   regex = new RegExp(blacklists[i]);
59660                   fail = regex.test(template);
59661                   tested++;
59662                   if (fail) break;
59663               } catch (e) {
59664                   /* noop */
59665               }
59666           }
59667
59668           // ensure at least one test was run.
59669           if (!tested) {
59670               regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
59671               fail = regex.test(template);
59672           }
59673
59674           baseLayer.source(!fail ? d : background.findSource('none'));
59675           dispatch$$1.call('change');
59676           background.updateImagery();
59677           return background;
59678       };
59679
59680
59681       background.findSource = function(id) {
59682           return find$1(_backgroundSources, function(d) {
59683               return d.id && d.id === id;
59684           });
59685       };
59686
59687
59688       background.bing = function() {
59689           background.baseLayerSource(background.findSource('Bing'));
59690       };
59691
59692
59693       background.showsLayer = function(d) {
59694           return d.id === baseLayer.source().id ||
59695               _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
59696       };
59697
59698
59699       background.overlayLayerSources = function() {
59700           return _overlayLayers.map(function (l) { return l.source(); });
59701       };
59702
59703
59704       background.toggleOverlayLayer = function(d) {
59705           var layer;
59706
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();
59713                   return;
59714               }
59715           }
59716
59717           layer = rendererTileLayer(context)
59718               .source(d)
59719               .projection(context.projection)
59720               .dimensions(baseLayer.dimensions()
59721           );
59722
59723           _overlayLayers.push(layer);
59724           dispatch$$1.call('change');
59725           background.updateImagery();
59726       };
59727
59728
59729       background.nudge = function(d, zoom) {
59730           baseLayer.source().nudge(d, zoom);
59731           dispatch$$1.call('change');
59732           background.updateImagery();
59733           return background;
59734       };
59735
59736
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();
59742           return background;
59743       };
59744
59745
59746       background.brightness = function(d) {
59747           if (!arguments.length) return _brightness;
59748           _brightness = d;
59749           if (context.mode()) dispatch$$1.call('change');
59750           return background;
59751       };
59752
59753
59754       background.contrast = function(d) {
59755           if (!arguments.length) return _contrast;
59756           _contrast = d;
59757           if (context.mode()) dispatch$$1.call('change');
59758           return background;
59759       };
59760
59761
59762       background.saturation = function(d) {
59763           if (!arguments.length) return _saturation;
59764           _saturation = d;
59765           if (context.mode()) dispatch$$1.call('change');
59766           return background;
59767       };
59768
59769
59770       background.sharpness = function(d) {
59771           if (!arguments.length) return _sharpness;
59772           _sharpness = d;
59773           if (context.mode()) dispatch$$1.call('change');
59774           return background;
59775       };
59776
59777
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]]);
59784           }
59785
59786           var dataImagery = data.imagery || [],
59787               q = utilStringQs(window.location.hash.substring(1)),
59788               requested = q.background || q.layer,
59789               extent = parseMap(q.map),
59790               first,
59791               best;
59792
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);
59799               } else {
59800                   return rendererBackgroundSource(source);
59801               }
59802           });
59803
59804           first = _backgroundSources.length && _backgroundSources[0];
59805
59806           // Add 'None'
59807           _backgroundSources.unshift(rendererBackgroundSource.None());
59808
59809           // Add 'Custom'
59810           var template = context.storage('background-custom-template') || '';
59811           var custom = rendererBackgroundSource.Custom(template);
59812           _backgroundSources.unshift(custom);
59813
59814
59815           // Decide which background layer to display
59816           if (!requested && extent) {
59817               best = find$1(this.sources(extent), function(s) { return s.best(); });
59818           }
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);
59823           } else {
59824               background.baseLayerSource(
59825                   background.findSource(requested) ||
59826                   best ||
59827                   background.findSource(context.storage('background-last-used')) ||
59828                   background.findSource('Bing') ||
59829                   first ||
59830                   background.findSource('none')
59831               );
59832           }
59833
59834           var locator = find$1(_backgroundSources, function(d) {
59835               return d.overlay && d.default;
59836           });
59837
59838           if (locator) {
59839               background.toggleOverlayLayer(locator);
59840           }
59841
59842           var overlays = (q.overlays || '').split(',');
59843           overlays.forEach(function(overlay) {
59844               overlay = background.findSource(overlay);
59845               if (overlay) {
59846                   background.toggleOverlayLayer(overlay);
59847               }
59848           });
59849
59850           if (q.gpx) {
59851               var gpx = context.layers().layer('gpx');
59852               if (gpx) {
59853                   gpx.url(q.gpx);
59854               }
59855           }
59856
59857           if (q.offset) {
59858               var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
59859                   return !isNaN(n) && n;
59860               });
59861
59862               if (offset.length === 2) {
59863                   background.offset(geoMetersToOffset(offset));
59864               }
59865           }
59866       };
59867
59868
59869       return utilRebind(background, dispatch$$1, 'on');
59870   }
59871
59872   function rendererFeatures(context) {
59873       var traffic_roads = {
59874           'motorway': true,
59875           'motorway_link': true,
59876           'trunk': true,
59877           'trunk_link': true,
59878           'primary': true,
59879           'primary_link': true,
59880           'secondary': true,
59881           'secondary_link': true,
59882           'tertiary': true,
59883           'tertiary_link': true,
59884           'residential': true,
59885           'unclassified': true,
59886           'living_street': true
59887       };
59888
59889       var service_roads = {
59890           'service': true,
59891           'road': true,
59892           'track': true
59893       };
59894
59895       var paths = {
59896           'path': true,
59897           'footway': true,
59898           'cycleway': true,
59899           'bridleway': true,
59900           'steps': true,
59901           'pedestrian': true,
59902           'corridor': true
59903       };
59904
59905       var past_futures = {
59906           'proposed': true,
59907           'construction': true,
59908           'abandoned': true,
59909           'dismantled': true,
59910           'disused': true,
59911           'razed': true,
59912           'demolished': true,
59913           'obliterated': true
59914       };
59915
59916       var dispatch$$1 = dispatch('change', 'redraw'),
59917           _cullFactor = 1,
59918           _cache = {},
59919           _features = {},
59920           _stats = {},
59921           _keys = [],
59922           _hidden = [];
59923
59924
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(',');
59931               } else {
59932                   delete q.disable_features;
59933               }
59934               window.location.replace('#' + utilQsString(q, true));
59935               context.storage('disabled-features', disabled.join(','));
59936           }
59937           _hidden = features.hidden();
59938           dispatch$$1.call('change');
59939           dispatch$$1.call('redraw');
59940       }
59941
59942
59943       function defineFeature(k, filter, max) {
59944           var isEnabled = true;
59945
59946           _keys.push(k);
59947           _features[k] = {
59948               filter: filter,
59949               enabled: isEnabled,   // whether the user wants it enabled..
59950               count: 0,
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; }
59957           };
59958       }
59959
59960
59961       defineFeature('points', function isPoint(entity, resolver, geometry) {
59962           return geometry === 'point';
59963       }, 200);
59964
59965       defineFeature('traffic_roads', function isTrafficRoad(entity) {
59966           return traffic_roads[entity.tags.highway];
59967       });
59968
59969       defineFeature('service_roads', function isServiceRoad(entity) {
59970           return service_roads[entity.tags.highway];
59971       });
59972
59973       defineFeature('paths', function isPath(entity) {
59974           return paths[entity.tags.highway];
59975       });
59976
59977       defineFeature('buildings', function isBuilding(entity) {
59978           return (
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'
59985           );
59986       }, 250);
59987
59988       defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
59989           return geometry === 'area' &&
59990               !_features.buildings.filter(entity) &&
59991               !_features.water.filter(entity);
59992       });
59993
59994       defineFeature('boundaries', function isBoundary(entity) {
59995           return (
59996               !!entity.tags.boundary
59997           ) && !(
59998               traffic_roads[entity.tags.highway] ||
59999               service_roads[entity.tags.highway] ||
60000               paths[entity.tags.highway]
60001           );
60002       });
60003
60004       defineFeature('water', function isWater(entity) {
60005           return (
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'
60014           );
60015       });
60016
60017       defineFeature('rail', function isRail(entity) {
60018           return (
60019               !!entity.tags.railway ||
60020               entity.tags.landuse === 'railway'
60021           ) && !(
60022               traffic_roads[entity.tags.highway] ||
60023               service_roads[entity.tags.highway] ||
60024               paths[entity.tags.highway]
60025           );
60026       });
60027
60028       defineFeature('power', function isPower(entity) {
60029           return !!entity.tags.power;
60030       });
60031
60032       // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
60033       defineFeature('past_future', function isPastFuture(entity) {
60034           if (
60035               traffic_roads[entity.tags.highway] ||
60036               service_roads[entity.tags.highway] ||
60037               paths[entity.tags.highway]
60038           ) { return false; }
60039
60040           var strings = Object.keys(entity.tags);
60041
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; }
60045           }
60046           return false;
60047       });
60048
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');
60054       });
60055
60056
60057       function features() {}
60058
60059
60060       features.features = function() {
60061           return _features;
60062       };
60063
60064
60065       features.keys = function() {
60066           return _keys;
60067       };
60068
60069
60070       features.enabled = function(k) {
60071           if (!arguments.length) {
60072               return _keys.filter(function(k) { return _features[k].enabled; });
60073           }
60074           return _features[k] && _features[k].enabled;
60075       };
60076
60077
60078       features.disabled = function(k) {
60079           if (!arguments.length) {
60080               return _keys.filter(function(k) { return !_features[k].enabled; });
60081           }
60082           return _features[k] && !_features[k].enabled;
60083       };
60084
60085
60086       features.hidden = function(k) {
60087           if (!arguments.length) {
60088               return _keys.filter(function(k) { return _features[k].hidden(); });
60089           }
60090           return _features[k] && _features[k].hidden();
60091       };
60092
60093
60094       features.autoHidden = function(k) {
60095           if (!arguments.length) {
60096               return _keys.filter(function(k) { return _features[k].autoHidden(); });
60097           }
60098           return _features[k] && _features[k].autoHidden();
60099       };
60100
60101
60102       features.enable = function(k) {
60103           if (_features[k] && !_features[k].enabled) {
60104               _features[k].enable();
60105               update();
60106           }
60107       };
60108
60109
60110       features.disable = function(k) {
60111           if (_features[k] && _features[k].enabled) {
60112               _features[k].disable();
60113               update();
60114           }
60115       };
60116
60117
60118       features.toggle = function(k) {
60119           if (_features[k]) {
60120               (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
60121               update();
60122           }
60123       };
60124
60125
60126       features.resetStats = function() {
60127           for (var i = 0; i < _keys.length; i++) {
60128               _features[_keys[i]].count = 0;
60129           }
60130           dispatch$$1.call('change');
60131       };
60132
60133
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;
60139
60140           for (i = 0; i < _keys.length; i++) {
60141               _features[_keys[i]].count = 0;
60142           }
60143
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;
60147
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++;
60154                   }
60155               }
60156           }
60157
60158           currHidden = features.hidden();
60159           if (currHidden !== _hidden) {
60160               _hidden = currHidden;
60161               needsRedraw = true;
60162               dispatch$$1.call('change');
60163           }
60164
60165           return needsRedraw;
60166       };
60167
60168
60169       features.stats = function() {
60170           for (var i = 0; i < _keys.length; i++) {
60171               _stats[_keys[i]] = _features[_keys[i]].count;
60172           }
60173
60174           return _stats;
60175       };
60176
60177
60178       features.clear = function(d) {
60179           for (var i = 0; i < d.length; i++) {
60180               features.clearEntity(d[i]);
60181           }
60182       };
60183
60184
60185       features.clearEntity = function(entity) {
60186           delete _cache[osmEntity$$1.key(entity)];
60187       };
60188
60189
60190       features.reset = function() {
60191           _cache = {};
60192       };
60193
60194
60195       features.getMatches = function(entity, resolver, geometry) {
60196           if (geometry === 'vertex' || geometry === 'relation') return {};
60197
60198           var ent = osmEntity$$1.key(entity);
60199           if (!_cache[ent]) {
60200               _cache[ent] = {};
60201           }
60202
60203           if (!_cache[ent].matches) {
60204               var matches = {},
60205                   hasMatch = false;
60206
60207               for (var i = 0; i < _keys.length; i++) {
60208                   if (_keys[i] === 'others') {
60209                       if (hasMatch) continue;
60210
60211                       // Multipolygon members:
60212                       // If an entity...
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
60217                       //
60218                       // IMPORTANT:
60219                       // For this to work, getMatches must be called on relations before ways.
60220                       //
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);
60227                                   continue;
60228                               }
60229                           }
60230                       }
60231                   }
60232
60233                   if (_features[_keys[i]].filter(entity, resolver, geometry)) {
60234                       matches[_keys[i]] = hasMatch = true;
60235                   }
60236               }
60237               _cache[ent].matches = matches;
60238           }
60239
60240           return _cache[ent].matches;
60241       };
60242
60243
60244       features.getParents = function(entity, resolver, geometry) {
60245           if (geometry === 'point') return [];
60246
60247           var ent = osmEntity$$1.key(entity);
60248           if (!_cache[ent]) {
60249               _cache[ent] = {};
60250           }
60251
60252           if (!_cache[ent].parents) {
60253               var parents = [];
60254               if (geometry === 'vertex') {
60255                   parents = resolver.parentWays(entity);
60256               } else {   // 'line', 'area', 'relation'
60257                   parents = resolver.parentRelations(entity);
60258               }
60259               _cache[ent].parents = parents;
60260           }
60261           return _cache[ent].parents;
60262       };
60263
60264
60265       features.isHiddenFeature = function(entity, resolver, geometry) {
60266           if (!_hidden.length) return false;
60267           if (!entity.version) return false;
60268
60269           var matches = features.getMatches(entity, resolver, geometry);
60270
60271           for (var i = 0; i < _hidden.length; i++) {
60272               if (matches[_hidden[i]]) return true;
60273           }
60274           return false;
60275       };
60276
60277
60278       features.isHiddenChild = function(entity, resolver, geometry) {
60279           if (!_hidden.length) return false;
60280           if (!entity.version || geometry === 'point') return false;
60281
60282           var parents = features.getParents(entity, resolver, geometry);
60283           if (!parents.length) return false;
60284
60285           for (var i = 0; i < parents.length; i++) {
60286               if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
60287                   return false;
60288               }
60289           }
60290           return true;
60291       };
60292
60293
60294       features.hasHiddenConnections = function(entity, resolver) {
60295           if (!_hidden.length) return false;
60296           var childNodes, connections;
60297
60298           if (entity.type === 'midpoint') {
60299               childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
60300               connections = [];
60301           } else {
60302               childNodes = entity.nodes ? resolver.childNodes(entity) : [];
60303               connections = features.getParents(entity, resolver, entity.geometry(resolver));
60304           }
60305
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;
60309           }, connections);
60310
60311           return connections.length ? some(connections, function(e) {
60312               return features.isHidden(e, resolver, e.geometry(resolver));
60313           }) : false;
60314       };
60315
60316
60317       features.isHidden = function(entity, resolver, geometry) {
60318           if (!_hidden.length) return false;
60319           if (!entity.version) return false;
60320
60321           var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
60322           return fn(entity, resolver, geometry);
60323       };
60324
60325
60326       features.filter = function(d, resolver) {
60327           if (!_hidden.length) return d;
60328
60329           var result = [];
60330           for (var i = 0; i < d.length; i++) {
60331               var entity = d[i];
60332               if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
60333                   result.push(entity);
60334               }
60335           }
60336           return result;
60337       };
60338
60339
60340       features.init = function() {
60341           var storage = context.storage('disabled-features');
60342           if (storage) {
60343               var storageDisabled = storage.replace(/;/g, ',').split(',');
60344               storageDisabled.forEach(features.disable);
60345           }
60346
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);
60351           }
60352       };
60353
60354       return utilRebind(features, dispatch$$1, 'on');
60355   }
60356
60357   function utilBindOnce(target, type, listener, capture) {
60358       var typeOnce = type + '.once';
60359       function one() {
60360           target.on(typeOnce, null);
60361           listener.apply(this, arguments);
60362       }
60363       target.on(typeOnce, one, capture);
60364       return this;
60365   }
60366
60367   // constants
60368   var TAU$1 = 2 * Math.PI;
60369   var TILESIZE = 256;
60370   var kMin = geoZoomToScale(2, TILESIZE);
60371   var kMax = geoZoomToScale(24, TILESIZE);
60372
60373
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);
60385
60386       var _selection = select(null);
60387       var supersurface = select(null);
60388       var wrapper = select(null);
60389       var surface = select(null);
60390
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;
60397       var minzoom = 0;
60398       var mouse$$1;
60399       var mousemove;
60400
60401       var zoom$$1 = d3_zoom()
60402           .scaleExtent([kMin, kMax])
60403           .interpolate(interpolate)
60404           .filter(zoomEventFilter)
60405           .on('zoom', zoomPan);
60406
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 });
60421       // }
60422
60423       function cancelPendingRedraw() {
60424           scheduleRedraw.cancel();
60425           // isRedrawScheduled = false;
60426           // window.cancelIdleCallback(pendingRedrawCall);
60427       }
60428
60429
60430       function map(selection$$1) {
60431           _selection = selection$$1;
60432
60433           context
60434               .on('change.map', immediateRedraw);
60435
60436           var osm = context.connection();
60437           if (osm) {
60438               osm.on('change.map', immediateRedraw);
60439           }
60440
60441           context.history()
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;
60446
60447                   var followSelected = false;
60448                   if (Array.isArray(stack.selectedIDs)) {
60449                       followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
60450                       context.enter(
60451                           modeSelect(context, stack.selectedIDs).follow(followSelected)
60452                       );
60453                   }
60454                   if (!followSelected && stack.transform) {
60455                       map.transformEase(stack.transform);
60456                   }
60457               });
60458
60459           context.background()
60460               .on('change.map', immediateRedraw);
60461
60462           context.features()
60463               .on('redraw.map', immediateRedraw);
60464
60465           drawLayers
60466               .on('change.map', function() {
60467                   context.background().updateImagery();
60468                   immediateRedraw();
60469               });
60470
60471           selection$$1
60472               .on('dblclick.map', dblClick)
60473               .call(zoom$$1)
60474               .call(zoom$$1.transform, projection.transform());
60475
60476           supersurface = selection$$1.append('div')
60477               .attr('id', 'supersurface')
60478               .call(utilSetTransform, 0, 0);
60479
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
60483               .append('div')
60484               .attr('class', 'layer layer-data');
60485
60486           map.surface = surface = wrapper
60487               .call(drawLayers)
60488               .selectAll('.surface')
60489               .attr('id', 'surface');
60490
60491           surface
60492               .call(drawLabels.observe)
60493               .on('mousedown.zoom', function() {
60494                   if (event.button === 2) {
60495                       event.stopPropagation();
60496                   }
60497               }, true)
60498               .on('mouseup.zoom', function() {
60499                   if (resetTransform()) immediateRedraw();
60500               })
60501               .on('mousemove.map', function() {
60502                   mousemove = event;
60503               })
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 });
60510                   }
60511               })
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 });
60518                   }
60519               });
60520
60521           supersurface
60522               .call(context.background());
60523
60524           context.on('enter.map',  function() {
60525               if (map.editable() && !_transformed) {
60526
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);
60532                       if (entity) {
60533                           selectedAndParents[entity.id] = entity;
60534                           if (entity.type === 'node') {
60535                               graph.parentWays(entity).forEach(function(parent) {
60536                                   selectedAndParents[parent.id] = parent;
60537                               });
60538                           }
60539                       }
60540                   });
60541                   var data = values$1(selectedAndParents);
60542                   var filter = function(d) { return d.id in selectedAndParents; };
60543
60544                   data = context.features().filter(data, graph);
60545
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());
60551
60552                   dispatch$$1.call('drawn', this, { full: false });
60553
60554
60555                   // redraw everything else later
60556                   scheduleRedraw();
60557               }
60558           });
60559
60560           map.dimensions(utilGetDimensions(selection$$1));
60561       }
60562
60563
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') {
60576                       hasOrphan = true;
60577                       break;
60578                   }
60579               }
60580               if (hasOrphan) {
60581                   var event$$1 = window.CustomEvent;
60582                   if (event$$1) {
60583                       event$$1 = new event$$1('mouseup');
60584                   } else {
60585                       event$$1 = window.document.createEvent('Event');
60586                       event$$1.initEvent('mouseup', false, false);
60587                   }
60588                   // Event needs to be dispatched with an event.view property.
60589                   event$$1.view = window;
60590                   window.dispatchEvent(event$$1);
60591               }
60592           }
60593
60594           return event.button !== 2;   // ignore right clicks
60595       }
60596
60597
60598       function pxCenter() {
60599           return [dimensions[0] / 2, dimensions[1] / 2];
60600       }
60601
60602
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;
60609           var data;
60610           var filter;
60611
60612           if (difference) {
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);
60617
60618           } else {
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;
60623               }
60624
60625               if (extent) {
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); };
60629
60630               } else {
60631                   data = all;
60632                   fullRedraw = true;
60633                   filter = utilFunctor(true);
60634               }
60635           }
60636
60637           data = features.filter(data, graph);
60638
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());
60644           }
60645
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);
60653
60654           dispatch$$1.call('drawn', this, {full: true});
60655       }
60656
60657
60658       function editOff() {
60659           context.features().resetStats();
60660           surface.selectAll('.layer-osm *').remove();
60661
60662           var mode = context.mode();
60663           if (mode && mode.id !== 'save') {
60664               context.enter(modeBrowse(context));
60665           }
60666
60667           dispatch$$1.call('drawn', this, {full: true});
60668       }
60669
60670
60671       function dblClick() {
60672           if (!_dblClickEnabled) {
60673               event.preventDefault();
60674               event.stopImmediatePropagation();
60675           }
60676       }
60677
60678
60679       function zoomPan(manualEvent) {
60680           var event$$1 = (manualEvent || event);
60681           var source = event$$1.sourceEvent;
60682           var eventTransform = event$$1.transform;
60683
60684           if (_transformStart.x === eventTransform.x &&
60685               _transformStart.y === eventTransform.y &&
60686               _transformStart.k === eventTransform.k) {
60687               return;  // no change
60688           }
60689
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;
60700
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;
60707
60708               eventTransform = identity$7.translate(x2,y2).scale(k2);
60709               _selection.node().__zoom = eventTransform;
60710           }
60711
60712           if (geoScaleToZoom(eventTransform.k, TILESIZE) < minzoom) {
60713               surface.interrupt();
60714               uiFlash().text(t('cannot_zoom'))();
60715               setZoom(context.minEditableZoom(), true);
60716               scheduleRedraw();
60717               dispatch$$1.call('move', this, map);
60718               return;
60719           }
60720
60721           projection.transform(eventTransform);
60722
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;
60726
60727           if (context.inIntro()) {
60728               curtainProjection.transform({
60729                   x: eventTransform.x - tX,
60730                   y: eventTransform.y - tY,
60731                   k: eventTransform.k
60732               });
60733           }
60734
60735           if (source) mousemove = event$$1;
60736           _transformed = true;
60737           _transformLast = eventTransform;
60738           utilSetTransform(supersurface, tX, tY, scale);
60739           scheduleRedraw();
60740
60741           dispatch$$1.call('move', this, map);
60742       }
60743
60744
60745       function resetTransform() {
60746           if (!_transformed) return false;
60747
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());
60754           }
60755           return true;
60756       }
60757
60758
60759       function redraw(difference, extent) {
60760           if (surface.empty() || !_redrawEnabled) return;
60761
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;
60767           }
60768
60769           var zoom$$1 = map.zoom();
60770           var z = String(~~zoom$$1);
60771
60772           if (surface.attr('data-zoom') !== z) {
60773               surface.attr('data-zoom', z);
60774           }
60775
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])
60781               .clamp(true);
60782
60783           surface
60784               .classed('low-zoom', zoom$$1 <= lowzoom(lat));
60785
60786
60787           if (!difference) {
60788               supersurface.call(context.background());
60789           }
60790
60791           wrapper
60792               .call(drawLayers);
60793
60794           // OSM
60795           if (map.editable()) {
60796               context.loadTiles(projection, dimensions);
60797               drawVector(difference, extent);
60798           } else {
60799               editOff();
60800           }
60801
60802           _transformStart = projection.transform();
60803
60804           return map;
60805       }
60806
60807
60808
60809       var immediateRedraw = function(difference, extent) {
60810           if (!difference && !extent) cancelPendingRedraw();
60811           redraw(difference, extent);
60812       };
60813
60814
60815       map.mouse = function() {
60816           var event$$1 = mousemove || event;
60817           if (event$$1) {
60818               var s;
60819               while ((s = event$$1.sourceEvent)) { event$$1 = s; }
60820               return mouse$$1(event$$1);
60821           }
60822           return null;
60823       };
60824
60825
60826       // returns Lng/Lat
60827       map.mouseCoordinates = function() {
60828           var coord = map.mouse() || pxCenter();
60829           return projection.invert(coord);
60830       };
60831
60832
60833       map.dblclickEnable = function(_) {
60834           if (!arguments.length) return _dblClickEnabled;
60835           _dblClickEnabled = _;
60836           return map;
60837       };
60838
60839
60840       map.redrawEnable = function(_) {
60841           if (!arguments.length) return _redrawEnabled;
60842           _redrawEnabled = _;
60843           return map;
60844       };
60845
60846
60847       map.isTransformed = function() {
60848           return _transformed;
60849       };
60850
60851
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) {
60855               return false;
60856           }
60857
60858           if (duration) {
60859               _selection
60860                   .transition()
60861                   .duration(duration)
60862                   .on('start', function() { map.startEase(); })
60863                   .call(zoom$$1.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
60864           } else {
60865               projection.transform(t2);
60866               _transformStart = t2;
60867               _selection.call(zoom$$1.transform, _transformStart);
60868           }
60869       }
60870
60871
60872       function setZoom(z2, force, duration) {
60873           if (z2 === map.zoom() && !force) {
60874               return false;
60875           }
60876
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);
60881
60882           projection.scale(k2);
60883
60884           var t$$1 = projection.translate();
60885           l = locationPoint(l);
60886
60887           t$$1[0] += center[0] - l[0];
60888           t$$1[1] += center[1] - l[1];
60889
60890           if (duration) {
60891               projection.scale(k);  // reset scale
60892               _selection
60893                   .transition()
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));
60897           } else {
60898               projection.translate(t$$1);
60899               _transformStart = projection.transform();
60900               _selection.call(zoom$$1.transform, _transformStart);
60901           }
60902
60903           return true;
60904
60905
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]];
60910           }
60911
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];
60916           }
60917       }
60918
60919
60920       function setCenter(loc2, duration) {
60921           var c = map.center();
60922           if (loc2[0] === c[0] && loc2[1] === c[1]) {
60923               return false;
60924           }
60925
60926           var t$$1 = projection.translate();
60927           var k = projection.scale();
60928           var pxC = pxCenter();
60929           var ll = projection(loc2);
60930
60931           t$$1[0] = t$$1[0] - ll[0] + pxC[0];
60932           t$$1[1] = t$$1[1] - ll[1] + pxC[1];
60933
60934           if (duration) {
60935               _selection
60936                   .transition()
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));
60940           } else {
60941               projection.translate(t$$1);
60942               _transformStart = projection.transform();
60943               _selection.call(zoom$$1.transform, _transformStart);
60944           }
60945
60946           return true;
60947       }
60948
60949
60950       map.pan = function(delta, duration) {
60951           var t$$1 = projection.translate();
60952           var k = projection.scale();
60953
60954           t$$1[0] += delta[0];
60955           t$$1[1] += delta[1];
60956
60957           if (duration) {
60958               _selection
60959                   .transition()
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));
60963           } else {
60964               projection.translate(t$$1);
60965               _transformStart = projection.transform();
60966               _selection.call(zoom$$1.transform, _transformStart);
60967               dispatch$$1.call('move', this, map);
60968               immediateRedraw();
60969           }
60970
60971           return map;
60972       };
60973
60974
60975       map.dimensions = function(_) {
60976           if (!arguments.length) return dimensions;
60977           var center = map.center();
60978           dimensions = _;
60979           drawLayers.dimensions(dimensions);
60980           context.background().dimensions(dimensions);
60981           projection.clipExtent([[0, 0], dimensions]);
60982           mouse$$1 = utilFastMouse(supersurface.node());
60983           setCenter(center);
60984
60985           scheduleRedraw();
60986           return map;
60987       };
60988
60989
60990       function zoomIn(delta) {
60991           setZoom(~~map.zoom() + delta, true, 250);
60992       }
60993
60994       function zoomOut(delta) {
60995           setZoom(~~map.zoom() - delta, true, 250);
60996       }
60997
60998       map.zoomIn = function() { zoomIn(1); };
60999       map.zoomInFurther = function() { zoomIn(4); };
61000
61001       map.zoomOut = function() { zoomOut(1); };
61002       map.zoomOutFurther = function() { zoomOut(4); };
61003
61004
61005       map.center = function(loc2) {
61006           if (!arguments.length) {
61007               return projection.invert(pxCenter());
61008           }
61009
61010           if (setCenter(loc2)) {
61011               dispatch$$1.call('move', this, map);
61012           }
61013
61014           scheduleRedraw();
61015           return map;
61016       };
61017
61018
61019       map.zoom = function(z2) {
61020           if (!arguments.length) {
61021               return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
61022           }
61023
61024           if (z2 < minzoom) {
61025               surface.interrupt();
61026               uiFlash().text(t('cannot_zoom'))();
61027               z2 = context.minEditableZoom();
61028           }
61029
61030           if (setZoom(z2)) {
61031               dispatch$$1.call('move', this, map);
61032           }
61033
61034           scheduleRedraw();
61035           return map;
61036       };
61037
61038
61039       map.zoomTo = function(entity, zoomLimits) {
61040           var extent = entity.extent(context.graph());
61041           if (!isFinite(extent.area())) return;
61042
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]));
61046       };
61047
61048
61049       map.centerZoom = function(loc2, z2) {
61050           var centered = setCenter(loc2);
61051           var zoomed   = setZoom(z2);
61052
61053           if (centered || zoomed) {
61054               dispatch$$1.call('move', this, map);
61055           }
61056
61057           scheduleRedraw();
61058           return map;
61059       };
61060
61061
61062       map.centerEase = function(loc2, duration) {
61063           duration = duration || 250;
61064           setCenter(loc2, duration);
61065           return map;
61066       };
61067
61068
61069       map.zoomEase = function(z2, duration) {
61070           duration = duration || 250;
61071           setZoom(z2, false, duration);
61072           return map;
61073       };
61074
61075
61076       map.transformEase = function(t2, duration) {
61077           duration = duration || 250;
61078           setTransform(t2, duration, false);
61079           return map;
61080       };
61081
61082
61083       map.startEase = function() {
61084           utilBindOnce(surface, 'mousedown.ease', function() {
61085               map.cancelEase();
61086           });
61087           return map;
61088       };
61089
61090
61091       map.cancelEase = function() {
61092           _selection.interrupt();
61093           return map;
61094       };
61095
61096
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])
61102               );
61103           } else {
61104               var extent = geoExtent$$1(_);
61105               map.centerZoom(extent.center(), map.extentZoom(extent));
61106           }
61107       };
61108
61109
61110       map.trimmedExtent = function(_) {
61111           if (!arguments.length) {
61112               var headerY = 60;
61113               var footerY = 30;
61114               var pad = 10;
61115               return new geoExtent$$1(
61116                   projection.invert([pad, dimensions[1] - footerY - pad]),
61117                   projection.invert([dimensions[0] - pad, headerY + pad])
61118               );
61119           } else {
61120               var extent = geoExtent$$1(_);
61121               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
61122           }
61123       };
61124
61125
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]]);
61129
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);
61136
61137           return newZoom;
61138       }
61139
61140
61141       map.extentZoom = function(_) {
61142           return calcZoom(geoExtent$$1(_), dimensions);
61143       };
61144
61145
61146       map.trimmedExtentZoom = function(_) {
61147           var trimY = 120;
61148           var trimX = 40;
61149           var trimmed = [dimensions[0] - trimX, dimensions[1] - trimY];
61150           return calcZoom(geoExtent$$1(_), trimmed);
61151       };
61152
61153
61154       map.editable = function() {
61155           var osmLayer = surface.selectAll('.data-layer-osm');
61156           if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
61157
61158           return map.zoom() >= context.minEditableZoom();
61159       };
61160
61161
61162       map.minzoom = function(_) {
61163           if (!arguments.length) return minzoom;
61164           minzoom = _;
61165           return map;
61166       };
61167
61168
61169       map.layers = drawLayers;
61170
61171
61172       return utilRebind(map, dispatch$$1, 'on');
61173   }
61174
61175   function uiMapInMap(context) {
61176
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
61198           var timeoutId;
61199
61200
61201           function zoomStarted() {
61202               if (skipEvents) return;
61203               tStart = tCurr = projection$$1.transform();
61204               gesture = null;
61205           }
61206
61207
61208           function zoomed() {
61209               if (skipEvents) return;
61210
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);
61216
61217               if (!isZooming && !isPanning) {
61218                   return;  // no change
61219               }
61220
61221               // lock in either zooming or panning, don't allow both in minimap.
61222               if (!gesture) {
61223                   gesture = isZooming ? 'zoom' : 'pan';
61224               }
61225
61226               var tMini = projection$$1.transform();
61227               var tX, tY, scale;
61228
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;
61235               } else {
61236                   k = tMini.k;
61237                   scale = 1;
61238                   tX = x - tMini.x;
61239                   tY = y - tMini.y;
61240               }
61241
61242               utilSetTransform(tiles, tX, tY, scale);
61243               utilSetTransform(viewport, 0, 0, scale);
61244               isTransformed = true;
61245               tCurr = identity$7.translate(x, y).scale(k);
61246
61247               var zMain = geoScaleToZoom(context.projection.scale());
61248               var zMini = geoScaleToZoom(k);
61249
61250               zDiff = zMain - zMini;
61251
61252               queueRedraw();
61253           }
61254
61255
61256           function zoomEnded() {
61257               if (skipEvents) return;
61258               if (gesture !== 'pan') return;
61259
61260               updateProjection();
61261               gesture = null;
61262               var dMini = utilGetDimensions(wrap);
61263               var cMini = geoVecScale(dMini, 0.5);
61264               context.map().center(projection$$1.invert(cMini));   // recenter main map..
61265           }
61266
61267
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);
61276
61277               projection$$1
61278                   .translate([tMain.x, tMain.y])
61279                   .scale(kMini);
61280
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];
61285
61286               projection$$1
61287                   .translate([xMini, yMini])
61288                   .clipExtent([[0, 0], dMini]);
61289
61290               tCurr = projection$$1.transform();
61291
61292               if (isTransformed) {
61293                   utilSetTransform(tiles, 0, 0);
61294                   utilSetTransform(viewport, 0, 0);
61295                   isTransformed = false;
61296               }
61297
61298               zoom$$1
61299                   .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
61300
61301               skipEvents = true;
61302               wrap.call(zoom$$1.transform, tCurr);
61303               skipEvents = false;
61304           }
61305
61306
61307           function redraw() {
61308               clearTimeout(timeoutId);
61309               if (isHidden) return;
61310
61311               updateProjection();
61312
61313               var dMini = utilGetDimensions(wrap);
61314               var zMini = geoScaleToZoom(projection$$1.scale());
61315
61316               // setup tile container
61317               tiles = wrap
61318                   .selectAll('.map-in-map-tiles')
61319                   .data([0]);
61320
61321               tiles = tiles.enter()
61322                   .append('div')
61323                   .attr('class', 'map-in-map-tiles')
61324                   .merge(tiles);
61325
61326               // redraw background
61327               backgroundLayer
61328                   .source(context.background().baseLayerSource())
61329                   .projection(projection$$1)
61330                   .dimensions(dMini);
61331
61332               var background = tiles
61333                   .selectAll('.map-in-map-background')
61334                   .data([0]);
61335
61336               background.enter()
61337                   .append('div')
61338                   .attr('class', 'map-in-map-background')
61339                   .merge(background)
61340                   .call(backgroundLayer);
61341
61342
61343               // redraw overlay
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));
61353                   }
61354               }
61355
61356               var overlay = tiles
61357                   .selectAll('.map-in-map-overlay')
61358                   .data([0]);
61359
61360               overlay = overlay.enter()
61361                   .append('div')
61362                   .attr('class', 'map-in-map-overlay')
61363                   .merge(overlay);
61364
61365
61366               var overlays = overlay
61367                   .selectAll('div')
61368                   .data(activeOverlayLayers, function(d) { return d.source().name(); });
61369
61370               overlays.exit()
61371                   .remove();
61372
61373               overlays = overlays.enter()
61374                   .append('div')
61375                   .merge(overlays)
61376                   .each(function(layer) { select(this).call(layer); });
61377
61378
61379               var dataLayers = tiles
61380                   .selectAll('.map-in-map-data')
61381                   .data([0]);
61382
61383               dataLayers.exit()
61384                   .remove();
61385
61386               dataLayers = dataLayers.enter()
61387                   .append('svg')
61388                   .attr('class', 'map-in-map-data')
61389                   .merge(dataLayers)
61390                   .call(gpxLayer)
61391                   .call(debugLayer);
61392
61393
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()] };
61398
61399                   viewport = wrap.selectAll('.map-in-map-viewport')
61400                       .data([0]);
61401
61402                   viewport = viewport.enter()
61403                       .append('svg')
61404                       .attr('class', 'map-in-map-viewport')
61405                       .merge(viewport);
61406
61407
61408                   var path = viewport.selectAll('.map-in-map-bbox')
61409                       .data([bbox]);
61410
61411                   path.enter()
61412                       .append('path')
61413                       .attr('class', 'map-in-map-bbox')
61414                       .merge(path)
61415                       .attr('d', getPath)
61416                       .classed('thick', function(d) { return getPath.area(d) < 30; });
61417               }
61418           }
61419
61420
61421           function queueRedraw() {
61422               clearTimeout(timeoutId);
61423               timeoutId = setTimeout(function() { redraw(); }, 750);
61424           }
61425
61426
61427           function toggle() {
61428               if (event) event.preventDefault();
61429
61430               isHidden = !isHidden;
61431
61432               select('.minimap-toggle-item')
61433                   .classed('active', !isHidden)
61434                   .select('input')
61435                   .property('checked', !isHidden);
61436
61437               if (isHidden) {
61438                   wrap
61439                       .style('display', 'block')
61440                       .style('opacity', '1')
61441                       .transition()
61442                       .duration(200)
61443                       .style('opacity', '0')
61444                       .on('end', function() {
61445                           selection$$1.selectAll('.map-in-map')
61446                               .style('display', 'none');
61447                       });
61448               } else {
61449                   wrap
61450                       .style('display', 'block')
61451                       .style('opacity', '0')
61452                       .transition()
61453                       .duration(200)
61454                       .style('opacity', '1')
61455                       .on('end', function() {
61456                           redraw();
61457                       });
61458               }
61459           }
61460
61461
61462           uiMapInMap.toggle = toggle;
61463
61464           wrap = selection$$1.selectAll('.map-in-map')
61465               .data([0]);
61466
61467           wrap = wrap.enter()
61468               .append('div')
61469               .attr('class', 'map-in-map')
61470               .style('display', (isHidden ? 'none' : 'block'))
61471               .call(zoom$$1)
61472               .on('dblclick.zoom', null)
61473               .merge(wrap);
61474
61475           context.map()
61476               .on('drawn.map-in-map', function(drawn) {
61477                   if (drawn.full === true) {
61478                       redraw();
61479                   }
61480               });
61481
61482           redraw();
61483
61484           var keybinding = d3keybinding('map-in-map')
61485               .on(t('background.minimap.key'), toggle);
61486
61487           select(document)
61488               .call(keybinding);
61489       }
61490
61491       return map_in_map;
61492   }
61493
61494   function uiBackground(context) {
61495       var key = t('background.key');
61496
61497       var _customSource = context.background().findSource('custom');
61498       var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
61499       var _shown = false;
61500
61501       var _backgroundList = select(null);
61502       var _overlayList = select(null);
61503       var _displayOptionsContainer = select(null);
61504       var _offsetContainer = select(null);
61505
61506       var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
61507       var backgroundOffset = uiBackgroundOffset(context);
61508
61509
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'));
61517
61518               if (d === _previousBackground) {
61519                   item.call(tooltip()
61520                       .placement(placement)
61521                       .html(true)
61522                       .title(function() {
61523                           var tip = '<div>' + t('background.switch') + '</div>';
61524                           return uiTooltipHtml(tip, uiCmd('⌘' + key));
61525                       })
61526                   );
61527               } else if (description || isOverflowing) {
61528                   item.call(tooltip()
61529                       .placement(placement)
61530                       .title(description || d.name())
61531                   );
61532               } else {
61533                   item.call(tooltip().destroy);
61534               }
61535           });
61536       }
61537
61538
61539       function updateLayerSelections(selection$$1) {
61540           function active(d) {
61541               return context.background().showsLayer(d);
61542           }
61543
61544           selection$$1.selectAll('.layer')
61545               .classed('active', active)
61546               .classed('switch', function(d) { return d === _previousBackground; })
61547               .call(setTooltips)
61548               .selectAll('input')
61549               .property('checked', active);
61550       }
61551
61552
61553       function chooseBackground(d) {
61554           if (d.id === 'custom' && !d.template()) {
61555               return editCustom();
61556           }
61557
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();
61565       }
61566
61567
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
61574           );
61575
61576           if (template) {
61577               context.storage('background-custom-template', template);
61578               _customSource.template(template);
61579               chooseBackground(_customSource);
61580           } else {
61581               _backgroundList.call(updateLayerSelections);
61582           }
61583       }
61584
61585
61586       function chooseOverlay(d) {
61587           event.preventDefault();
61588           context.background().toggleOverlayLayer(d);
61589           _overlayList.call(updateLayerSelections);
61590           document.activeElement.blur();
61591       }
61592
61593
61594       function drawListItems(layerList, type, change, filter) {
61595           var sources = context.background()
61596               .sources(context.map().extent())
61597               .filter(filter);
61598
61599           var layerLinks = layerList.selectAll('li.layer')
61600               .data(sources, function(d) { return d.name(); });
61601
61602           layerLinks.exit()
61603               .remove();
61604
61605           var enter = layerLinks.enter()
61606               .append('li')
61607               .attr('class', 'layer')
61608               .classed('layer-custom', function(d) { return d.id === 'custom'; })
61609               .classed('best', function(d) { return d.best(); });
61610
61611           enter.filter(function(d) { return d.id === 'custom'; })
61612               .append('button')
61613               .attr('class', 'layer-browse')
61614               .call(tooltip()
61615                   .title(t('background.custom_button'))
61616                   .placement((textDirection === 'rtl') ? 'right' : 'left')
61617               )
61618               .on('click', editCustom)
61619               .call(svgIcon('#iD-icon-edit'));
61620
61621           enter.filter(function(d) { return d.best(); })
61622               .append('div')
61623               .attr('class', 'best')
61624               .call(tooltip()
61625                   .title(t('background.best_imagery'))
61626                   .placement((textDirection === 'rtl') ? 'right' : 'left')
61627               )
61628               .append('span')
61629               .html('&#9733;');
61630
61631           var label = enter
61632               .append('label');
61633
61634           label
61635               .append('input')
61636               .attr('type', type)
61637               .attr('name', 'layers')
61638               .on('change', change);
61639
61640           label
61641               .append('span')
61642               .text(function(d) { return d.name(); });
61643
61644
61645           layerList.selectAll('li.layer')
61646               .sort(sortSources)
61647               .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
61648
61649           layerList
61650               .call(updateLayerSelections);
61651
61652
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;
61657           }
61658       }
61659
61660
61661       function renderBackgroundList(selection$$1) {
61662
61663           // the background list
61664           var container = selection$$1.selectAll('.layer-background-list')
61665               .data([0]);
61666
61667           _backgroundList = container.enter()
61668               .append('ul')
61669               .attr('class', 'layer-list layer-background-list')
61670               .attr('dir', 'auto')
61671               .merge(container);
61672
61673
61674           // add minimap toggle below list
61675           var minimapEnter = selection$$1.selectAll('.minimap-toggle-list')
61676               .data([0])
61677               .enter()
61678               .append('ul')
61679               .attr('class', 'layer-list minimap-toggle-list')
61680               .append('li')
61681               .attr('class', 'layer minimap-toggle-item');
61682
61683           var minimapLabelEnter = minimapEnter
61684               .append('label')
61685               .call(tooltip()
61686                   .html(true)
61687                   .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
61688                   .placement('top')
61689               );
61690
61691           minimapLabelEnter
61692               .append('input')
61693               .attr('type', 'checkbox')
61694               .on('change', function() {
61695                   event.preventDefault();
61696                   uiMapInMap.toggle();
61697               });
61698
61699           minimapLabelEnter
61700               .append('span')
61701               .text(t('background.minimap.description'));
61702
61703
61704           // "Info / Report a Problem" link
61705           selection$$1.selectAll('.imagery-faq')
61706               .data([0])
61707               .enter()
61708               .append('div')
61709               .attr('class', 'imagery-faq')
61710               .append('a')
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')
61715               .append('span')
61716               .text(t('background.imagery_source_faq'));
61717       }
61718
61719
61720       function renderOverlayList(selection$$1) {
61721           var container = selection$$1.selectAll('.layer-overlay-list')
61722               .data([0]);
61723
61724           _overlayList = container.enter()
61725               .append('ul')
61726               .attr('class', 'layer-list layer-overlay-list')
61727               .attr('dir', 'auto')
61728               .merge(container);
61729       }
61730
61731
61732       function update() {
61733           _backgroundList
61734               .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
61735
61736           _overlayList
61737               .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
61738
61739           _displayOptionsContainer
61740               .call(backgroundDisplayOptions);
61741
61742           _offsetContainer
61743               .call(backgroundOffset);
61744       }
61745
61746
61747       function quickSwitch() {
61748           if (event) {
61749               event.stopImmediatePropagation();
61750               event.preventDefault();
61751           }
61752           if (_previousBackground) {
61753               chooseBackground(_previousBackground);
61754           }
61755       }
61756
61757
61758       function background(selection$$1) {
61759
61760           function hidePane() {
61761               setVisible(false);
61762           }
61763
61764           function togglePane() {
61765               if (event) event.preventDefault();
61766               paneTooltip.hide(button);
61767               setVisible(!button.classed('active'));
61768           }
61769
61770           function setVisible(show) {
61771               if (show !== _shown) {
61772                   button.classed('active', show);
61773                   _shown = show;
61774
61775                   if (show) {
61776                       uiMapData.hidePane();
61777                       uiHelp.hidePane();
61778                       update();
61779
61780                       pane
61781                           .style('display', 'block')
61782                           .style('right', '-300px')
61783                           .transition()
61784                           .duration(200)
61785                           .style('right', '0px');
61786
61787                   } else {
61788                       pane
61789                           .style('display', 'block')
61790                           .style('right', '0px')
61791                           .transition()
61792                           .duration(200)
61793                           .style('right', '-300px')
61794                           .on('end', function() {
61795                               select(this).style('display', 'none');
61796                           });
61797                   }
61798               }
61799           }
61800
61801
61802           var pane = selection$$1
61803               .append('div')
61804               .attr('class', 'fillL map-pane col4 hide');
61805
61806           var paneTooltip = tooltip()
61807               .placement((textDirection === 'rtl') ? 'right' : 'left')
61808               .html(true)
61809               .title(uiTooltipHtml(t('background.description'), key));
61810
61811           var button = selection$$1
61812               .append('button')
61813               .attr('tabindex', -1)
61814               .on('click', togglePane)
61815               .call(svgIcon('#iD-icon-layers', 'light'))
61816               .call(paneTooltip);
61817
61818
61819           var heading = pane
61820               .append('div')
61821               .attr('class', 'pane-heading');
61822
61823           heading
61824               .append('h2')
61825               .text(t('background.title'));
61826
61827           heading
61828               .append('button')
61829               .on('click', function() { uiBackground.hidePane(); })
61830               .call(svgIcon('#iD-icon-close'));
61831
61832
61833           var content = pane
61834               .append('div')
61835               .attr('class', 'pane-content');
61836
61837           // background list
61838           content
61839               .append('div')
61840               .attr('class', 'background-background-list-container')
61841               .call(uiDisclosure(context, 'background_list', true)
61842                   .title(t('background.backgrounds'))
61843                   .content(renderBackgroundList)
61844               );
61845
61846           // overlay list
61847           content
61848               .append('div')
61849               .attr('class', 'background-overlay-list-container')
61850               .call(uiDisclosure(context, 'overlay_list', true)
61851                   .title(t('background.overlays'))
61852                   .content(renderOverlayList)
61853               );
61854
61855           // display options
61856           _displayOptionsContainer = content
61857               .append('div')
61858               .attr('class', 'background-display-options');
61859
61860           // offset controls
61861           _offsetContainer = content
61862               .append('div')
61863               .attr('class', 'background-offset');
61864
61865
61866           // add listeners
61867           context.map()
61868               .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
61869
61870           context.background()
61871               .on('change.background-update', update);
61872
61873
61874           update();
61875
61876           var keybinding = d3keybinding('background')
61877               .on(key, togglePane)
61878               .on(uiCmd('⌘' + key), quickSwitch)
61879               .on([t('map_data.key'), t('help.key')], hidePane);
61880
61881           select(document)
61882               .call(keybinding);
61883
61884           uiBackground.hidePane = hidePane;
61885           uiBackground.togglePane = togglePane;
61886           uiBackground.setVisible = setVisible;
61887       }
61888
61889       return background;
61890   }
61891
61892   function uiContributors(context) {
61893       var osm = context.connection(),
61894           debouncedUpdate = debounce(function() { update(); }, 1000),
61895           limit = 4,
61896           hidden = false,
61897           wrap = select(null);
61898
61899
61900       function update() {
61901           if (!osm) return;
61902
61903           var users = {},
61904               entities = context.intersects(context.map().extent());
61905
61906           entities.forEach(function(entity) {
61907               if (entity && entity.user) users[entity.user] = true;
61908           });
61909
61910           var u = Object.keys(users),
61911               subset = u.slice(0, u.length > limit ? limit - 1 : limit);
61912
61913           wrap.html('')
61914               .call(svgIcon('#iD-icon-nearby', 'pre-text light'));
61915
61916           var userList = select(document.createElement('span'));
61917
61918           userList.selectAll()
61919               .data(subset)
61920               .enter()
61921               .append('a')
61922               .attr('class', 'user-link')
61923               .attr('href', function(d) { return osm.userURL(d); })
61924               .attr('target', '_blank')
61925               .attr('tabindex', -1)
61926               .text(String);
61927
61928           if (u.length > limit) {
61929               var count = select(document.createElement('span'));
61930
61931               count.append('a')
61932                   .attr('target', '_blank')
61933                   .attr('tabindex', -1)
61934                   .attr('href', function() {
61935                       return osm.changesetsURL(context.map().center(), context.map().zoom());
61936                   })
61937                   .text(u.length - limit + 1);
61938
61939               wrap.append('span')
61940                   .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
61941
61942           } else {
61943               wrap.append('span')
61944                   .html(t('contributors.list', { users: userList.html() }));
61945           }
61946
61947           if (!u.length) {
61948               hidden = true;
61949               wrap
61950                   .transition()
61951                   .style('opacity', 0);
61952
61953           } else if (hidden) {
61954               wrap
61955                   .transition()
61956                   .style('opacity', 1);
61957           }
61958       }
61959
61960
61961       return function(selection$$1) {
61962           if (!osm) return;
61963           wrap = selection$$1;
61964           update();
61965
61966           osm.on('loaded.contributors', debouncedUpdate);
61967           context.map().on('move.contributors', debouncedUpdate);
61968       };
61969   }
61970
61971   function uiFeatureInfo(context) {
61972       function update(selection$$1) {
61973           var features = context.features(),
61974               stats = features.stats(),
61975               count = 0,
61976               hiddenList = compact(map$3(features.hidden(), function(k) {
61977                   if (stats[k]) {
61978                       count += stats[k];
61979                       return String(stats[k]) + ' ' + t('feature.' + k + '.description');
61980                   }
61981               }));
61982
61983           selection$$1.html('');
61984
61985           if (hiddenList.length) {
61986               var tooltipBehavior = tooltip()
61987                   .placement('top')
61988                   .html(true)
61989                   .title(function() {
61990                       return uiTooltipHtml(hiddenList.join('<br/>'));
61991                   });
61992
61993               var warning = selection$$1.append('a')
61994                   .attr('href', '#')
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();
62002                   });
62003           }
62004
62005           selection$$1
62006               .classed('hide', !hiddenList.length);
62007       }
62008
62009
62010       return function(selection$$1) {
62011           update(selection$$1);
62012
62013           context.features().on('change.feature_info', function() {
62014               update(selection$$1);
62015           });
62016       };
62017   }
62018
62019   function uiFullScreen(context) {
62020       var element = context.container().node(),
62021           keybinding = d3keybinding('full-screen');
62022           // button;
62023
62024
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;
62034           }
62035       }
62036
62037
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;
62047           }
62048       }
62049
62050
62051       function isFullScreen() {
62052           return document.fullscreenElement ||
62053               document.mozFullScreenElement ||
62054               document.webkitFullscreenElement ||
62055               document.msFullscreenElement;
62056       }
62057
62058
62059       function isSupported() {
62060           return !!getFullScreenFn();
62061       }
62062
62063
62064       function fullScreen() {
62065           event.preventDefault();
62066           if (!isFullScreen()) {
62067               // button.classed('active', true);
62068               getFullScreenFn().apply(element);
62069           } else {
62070               // button.classed('active', false);
62071               getExitFullScreenFn().apply(document);
62072           }
62073       }
62074
62075
62076       return function() { // selection) {
62077           if (!isSupported())
62078               return;
62079
62080           // button = selection.append('button')
62081           //     .attr('title', t('full_screen'))
62082           //     .attr('tabindex', -1)
62083           //     .on('click', fullScreen)
62084           //     .call(tooltip);
62085
62086           // button.append('span')
62087           //     .attr('class', 'icon full-screen');
62088
62089           var detected = utilDetect();
62090           var keys = detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11'];
62091           keybinding.on(keys, fullScreen);
62092
62093           select(document)
62094               .call(keybinding);
62095       };
62096   }
62097
62098   function uiLoading(context) {
62099       var _modalSelection = select(null);
62100       var _message = '';
62101       var _blocking = false;
62102
62103
62104       var loading = function(selection$$1) {
62105           _modalSelection = uiModal(selection$$1, _blocking);
62106
62107           var loadertext = _modalSelection.select('.content')
62108               .classed('loading-modal', true)
62109               .append('div')
62110               .attr('class', 'modal-section fillL');
62111
62112           loadertext
62113               .append('img')
62114               .attr('class', 'loader')
62115               .attr('src', context.imagePath('loader-white.gif'));
62116
62117           loadertext
62118               .append('h3')
62119               .text(_message);
62120
62121           _modalSelection.select('button.close')
62122               .attr('class', 'hide');
62123
62124           return loading;
62125       };
62126
62127
62128       loading.message = function(_) {
62129           if (!arguments.length) return _message;
62130           _message = _;
62131           return loading;
62132       };
62133
62134
62135       loading.blocking = function(_) {
62136           if (!arguments.length) return _blocking;
62137           _blocking = _;
62138           return loading;
62139       };
62140
62141
62142       loading.close = function() {
62143           _modalSelection.remove();
62144       };
62145
62146
62147       return loading;
62148   }
62149
62150   function uiGeolocate(context) {
62151       var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ },
62152           locating = uiLoading(context).message(t('geolocate.locating')).blocking(true),
62153           timeoutId;
62154
62155
62156       function click() {
62157           if (context.inIntro()) return;
62158           context.enter(modeBrowse(context));
62159           context.container().call(locating);
62160           navigator.geolocation.getCurrentPosition(success, error, geoOptions);
62161
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 */ );
62165       }
62166
62167
62168       function success(position) {
62169           var map = context.map(),
62170               extent = geoExtent$$1([position.coords.longitude, position.coords.latitude])
62171                   .padByMeters(position.coords.accuracy);
62172
62173           map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
62174           finish();
62175       }
62176
62177
62178       function error() {
62179           finish();
62180       }
62181
62182
62183       function finish() {
62184           locating.close();  // unblock ui
62185           if (timeoutId) { clearTimeout(timeoutId); }
62186           timeoutId = undefined;
62187       }
62188
62189
62190       return function(selection) {
62191           if (!navigator.geolocation) return;
62192
62193           selection
62194               .append('button')
62195               .attr('tabindex', -1)
62196               .attr('title', t('geolocate.title'))
62197               .on('click', click)
62198               .call(svgIcon('#iD-icon-geolocate', 'light'))
62199               .call(tooltip()
62200                   .placement((textDirection === 'rtl') ? 'right' : 'left'));
62201       };
62202   }
62203
62204   function uiPanelBackground(context) {
62205       var background = context.background();
62206       var currSourceName = null;
62207       var metadata = {};
62208       var metadataKeys = [
62209           'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
62210       ];
62211
62212       var debouncedRedraw = debounce(redraw, 250);
62213
62214       function redraw(selection$$1) {
62215           var source = background.baseLayerSource(),
62216               isDG = (source.id.match(/^DigitalGlobe/i) !== null);
62217
62218           if (currSourceName !== source.name()) {
62219               currSourceName = source.name();
62220               metadata = {};
62221           }
62222
62223           selection$$1.html('');
62224
62225           var list = selection$$1
62226               .append('ul')
62227               .attr('class', 'background-info');
62228
62229           list
62230               .append('li')
62231               .text(currSourceName);
62232
62233           metadataKeys.forEach(function(k) {
62234               // DigitalGlobe vintage is available in raster layers for now.
62235               if (isDG && k === 'vintage') return;
62236
62237               list
62238                   .append('li')
62239                   .attr('class', 'background-info-list-' + k)
62240                   .classed('hide', !metadata[k])
62241                   .text(t('info_panels.background.' + k) + ':')
62242                   .append('span')
62243                   .attr('class', 'background-info-span-' + k)
62244                   .text(metadata[k]);
62245           });
62246
62247           debouncedGetMetadata(selection$$1);
62248
62249           var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
62250
62251           selection$$1
62252               .append('a')
62253               .text(t('info_panels.background.' + toggleTiles))
62254               .attr('href', '#')
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);
62260               });
62261
62262           if (isDG) {
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';
62267               selection$$1
62268                   .append('a')
62269                   .text(t('info_panels.background.' + toggleVintage))
62270                   .attr('href', '#')
62271                   .attr('class', 'button button-toggle-vintage')
62272                   .on('click', function() {
62273                       event.preventDefault();
62274                       context.background().toggleOverlayLayer(sourceVintage);
62275                       selection$$1.call(redraw);
62276                   });
62277           }
62278
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);
62286                   }
62287               }
62288           });
62289       }
62290
62291
62292       var debouncedGetMetadata = debounce(getMetadata, 250);
62293
62294       function getMetadata(selection$$1) {
62295           var tile = select('.layer-background img.tile-center');   // tile near viewport center
62296           if (tile.empty()) return;
62297
62298           var sourceName = currSourceName,
62299               d = tile.datum(),
62300               zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
62301               center = context.map().center();
62302
62303           // update zoom
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);
62309
62310           if (!d || !d.length >= 3) return;
62311
62312           background.baseLayerSource().getMetadata(center, d, function(err, result) {
62313               if (err || currSourceName !== sourceName) return;
62314
62315               // update vintage
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);
62322
62323               // update other metdata
62324               without(metadataKeys, 'zoom', 'vintage')
62325                   .forEach(function(k) {
62326                       var val = result[k];
62327                       metadata[k] = val;
62328                       selection$$1.selectAll('.background-info-list-' + k)
62329                           .classed('hide', !val)
62330                           .selectAll('.background-info-span-' + k)
62331                           .text(val);
62332                   });
62333           });
62334       }
62335
62336
62337       var panel = function(selection$$1) {
62338           selection$$1.call(redraw);
62339
62340           context.map()
62341               .on('drawn.info-background', function() {
62342                   selection$$1.call(debouncedRedraw);
62343               })
62344               .on('move.info-background', function() {
62345                   selection$$1.call(debouncedGetMetadata);
62346               });
62347
62348       };
62349
62350       panel.off = function() {
62351           context.map()
62352               .on('drawn.info-background', null)
62353               .on('move.info-background', null);
62354       };
62355
62356       panel.id = 'background';
62357       panel.title = t('info_panels.background.title');
62358       panel.key = t('info_panels.background.key');
62359
62360
62361       return panel;
62362   }
62363
62364   function uiPanelHistory(context) {
62365       var osm;
62366
62367       function displayTimestamp(entity) {
62368           if (!entity.timestamp) return t('info_panels.history.unknown');
62369           var detected = utilDetect();
62370           var options = {
62371               day: 'numeric', month: 'short', year: 'numeric',
62372               hour: 'numeric', minute: 'numeric', second: 'numeric'
62373           };
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);
62377       }
62378
62379
62380       function displayUser(selection, entity) {
62381           if (!entity.user) {
62382               selection
62383                   .append('span')
62384                   .text(t('info_panels.history.unknown'));
62385               return;
62386           }
62387
62388           selection
62389               .append('span')
62390               .attr('class', 'user-name')
62391               .text(entity.user);
62392
62393           var links = selection
62394               .append('div')
62395               .attr('class', 'links');
62396
62397           if (osm) {
62398               links
62399                   .append('a')
62400                   .attr('class', 'user-osm-link')
62401                   .attr('href', osm.userURL(entity.user))
62402                   .attr('target', '_blank')
62403                   .attr('tabindex', -1)
62404                   .text('OSM');
62405           }
62406
62407           links
62408               .append('a')
62409               .attr('class', 'user-hdyc-link')
62410               .attr('href', 'https://hdyc.neis-one.org/?' + entity.user)
62411               .attr('target', '_blank')
62412               .attr('tabindex', -1)
62413               .text('HDYC');
62414       }
62415
62416
62417       function displayChangeset(selection, entity) {
62418           if (!entity.changeset) {
62419               selection
62420                   .append('span')
62421                   .text(t('info_panels.history.unknown'));
62422               return;
62423           }
62424
62425           selection
62426               .append('span')
62427               .attr('class', 'changeset-id')
62428               .text(entity.changeset);
62429
62430           var links = selection
62431               .append('div')
62432               .attr('class', 'links');
62433
62434           if (osm) {
62435               links
62436                   .append('a')
62437                   .attr('class', 'changeset-osm-link')
62438                   .attr('href', osm.changesetURL(entity.changeset))
62439                   .attr('target', '_blank')
62440                   .attr('tabindex', -1)
62441                   .text('OSM');
62442           }
62443
62444           links
62445               .append('a')
62446               .attr('class', 'changeset-osmcha-link')
62447               .attr('href', 'https://osmcha.mapbox.com/changesets/' + entity.changeset)
62448               .attr('target', '_blank')
62449               .attr('tabindex', -1)
62450               .text('OSMCha');
62451       }
62452
62453
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;
62457
62458           osm = context.connection();
62459
62460           selection.html('');
62461
62462           selection
62463               .append('h4')
62464               .attr('class', 'history-heading')
62465               .text(singular || t('info_panels.history.selected', { n: selected.length }));
62466
62467           if (!singular) return;
62468
62469           var entity = context.entity(singular);
62470
62471           if (!entity.version) {
62472               selection
62473                   .append('div')
62474                   .text(t('info_panels.history.no_history'));
62475               return;
62476           }
62477
62478           var list = selection
62479               .append('ul');
62480
62481           list
62482               .append('li')
62483               .text(t('info_panels.history.version') + ':')
62484               .append('span')
62485               .text(entity.version);
62486
62487           list
62488               .append('li')
62489               .text(t('info_panels.history.last_edit') + ':')
62490               .append('span')
62491               .text(displayTimestamp(entity));
62492
62493           list
62494               .append('li')
62495               .text(t('info_panels.history.edited_by') + ':')
62496               .call(displayUser, entity);
62497
62498           list
62499               .append('li')
62500               .text(t('info_panels.history.changeset') + ':')
62501               .call(displayChangeset, entity);
62502
62503           if (osm) {
62504               selection
62505                   .append('a')
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'))
62511                   .append('span')
62512                   .text(t('info_panels.history.link_text'));
62513           }
62514       }
62515
62516
62517       var panel = function(selection) {
62518           selection.call(redraw);
62519
62520           context.map()
62521               .on('drawn.info-history', function() {
62522                   selection.call(redraw);
62523               });
62524       };
62525
62526       panel.off = function() {
62527           context.map()
62528               .on('drawn.info-history', null);
62529       };
62530
62531       panel.id = 'history';
62532       panel.title = t('info_panels.history.title');
62533       panel.key = t('info_panels.history.key');
62534
62535
62536       return panel;
62537   }
62538
62539   var OSM_PRECISION = 7;
62540   var locale$2 = utilDetect().locale;
62541
62542   /**
62543    * Returns a localized representation of the given length measurement.
62544    *
62545    * @param {Number} m area in meters
62546    * @param {Boolean} isImperial true for U.S. customary units; false for metric
62547    */
62548   function displayLength(m, isImperial) {
62549       var d = m * (isImperial ? 3.28084 : 1);
62550       var unit;
62551
62552       if (isImperial) {
62553           if (d >= 5280) {
62554               d /= 5280;
62555               unit = 'miles';
62556           } else {
62557               unit = 'feet';
62558           }
62559       } else {
62560           if (d >= 1000) {
62561               d /= 1000;
62562               unit = 'kilometers';
62563           } else {
62564               unit = 'meters';
62565           }
62566       }
62567
62568       return t('units.' + unit, {
62569           quantity: d.toLocaleString(locale$2, {
62570               maximumSignificantDigits: 4
62571           })
62572       });
62573   }
62574
62575   /**
62576    * Returns a localized representation of the given area measurement.
62577    *
62578    * @param {Number} m2 area in square meters
62579    * @param {Boolean} isImperial true for U.S. customary units; false for metric
62580    */
62581   function displayArea(m2, isImperial) {
62582       var d = m2 * (isImperial ? 10.7639111056 : 1);
62583       var d1, d2, area;
62584       var unit1 = '';
62585       var unit2 = '';
62586
62587       if (isImperial) {
62588           if (d >= 6969600) { // > 0.25mi² show mi²
62589               d1 = d / 27878400;
62590               unit1 = 'square_miles';
62591           } else {
62592               d1 = d;
62593               unit1 = 'square_feet';
62594           }
62595
62596           if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
62597               d2 = d / 43560;
62598               unit2 = 'acres';
62599           }
62600
62601       } else {
62602           if (d >= 250000) { // > 0.25km² show km²
62603               d1 = d / 1000000;
62604               unit1 = 'square_kilometers';
62605           } else {
62606               d1 = d;
62607               unit1 = 'square_meters';
62608           }
62609
62610           if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
62611               d2 = d / 10000;
62612               unit2 = 'hectares';
62613           }
62614       }
62615
62616       area = t('units.' + unit1, {
62617           quantity: d1.toLocaleString(locale$2, {
62618               maximumSignificantDigits: 4
62619           })
62620       });
62621
62622       if (d2) {
62623           return t('units.area_pair', {
62624               area1: area,
62625               area2: t('units.' + unit2, {
62626                   quantity: d2.toLocaleString(locale$2, {
62627                       maximumSignificantDigits: 2
62628                   })
62629               })
62630           });
62631       } else {
62632           return area;
62633       }
62634   }
62635
62636   function wrap(x, min, max) {
62637       var d = max - min;
62638       return ((x - min) % d + d) % d + min;
62639   }
62640
62641   function clamp(x, min, max) {
62642       return Math.max(min, Math.min(x, max));
62643   }
62644
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)
62650       });
62651       var displayCoordinate;
62652
62653       if (Math.floor(sec) > 0) {
62654           displayCoordinate = displayDegrees +
62655               t('units.arcminutes', {
62656                   quantity: Math.floor(min).toLocaleString(locale$2)
62657               }) +
62658               t('units.arcseconds', {
62659                   quantity: Math.round(sec).toLocaleString(locale$2)
62660               });
62661       } else if (Math.floor(min) > 0) {
62662           displayCoordinate = displayDegrees +
62663               t('units.arcminutes', {
62664                   quantity: Math.round(min).toLocaleString(locale$2)
62665               });
62666       } else {
62667           displayCoordinate = t('units.arcdegrees', {
62668               quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
62669           });
62670       }
62671
62672       if (deg === 0) {
62673           return displayCoordinate;
62674       } else {
62675           return t('units.coordinate', {
62676               coordinate: displayCoordinate,
62677               direction: t('units.' + (deg > 0 ? pos : neg))
62678           });
62679       }
62680   }
62681
62682   /**
62683    * Returns given coordinate pair in degree-minute-second format.
62684    *
62685    * @param {Array<Number>} coord longitude and latitude
62686    */
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')
62691       });
62692   }
62693
62694   /**
62695    * Returns the given coordinate pair in decimal format.
62696    * note: unlocalized to avoid comma ambiguity - see #4765
62697    *
62698    * @param {Array<Number>} coord longitude and latitude
62699    */
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)
62704       });
62705   }
62706
62707   function uiPanelLocation(context) {
62708       var currLocation = '';
62709
62710
62711       function redraw(selection) {
62712           selection.html('');
62713
62714           var list = selection
62715               .append('ul');
62716
62717           // Mouse coordinates
62718           var coord = context.map().mouseCoordinates();
62719           if (coord.some(isNaN)) {
62720               coord = context.map().center();
62721           }
62722
62723           list
62724               .append('li')
62725               .text(dmsCoordinatePair(coord))
62726               .append('li')
62727               .text(decimalCoordinatePair(coord));
62728
62729           // Location Info
62730           selection
62731               .append('div')
62732               .attr('class', 'location-info')
62733               .text(currLocation || ' ');
62734
62735           debouncedGetLocation(selection, coord);
62736       }
62737
62738
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);
62745           } else {
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);
62750               });
62751           }
62752       }
62753
62754
62755       var panel = function(selection) {
62756           selection.call(redraw);
62757
62758           context.surface()
62759               .on('mousemove.info-location', function() {
62760                   selection.call(redraw);
62761               });
62762       };
62763
62764       panel.off = function() {
62765           context.surface()
62766               .on('mousemove.info-location', null);
62767       };
62768
62769       panel.id = 'location';
62770       panel.title = t('info_panels.location.title');
62771       panel.key = t('info_panels.location.key');
62772
62773
62774       return panel;
62775   }
62776
62777   function uiPanelMeasurement(context) {
62778       var locale = utilDetect().locale,
62779           isImperial = (locale.toLowerCase() === 'en-us');
62780
62781
62782       function radiansToMeters(r) {
62783           // using WGS84 authalic radius (6371007.1809 m)
62784           return r * 6371007.1809;
62785       }
62786
62787       function steradiansToSqmeters(r) {
62788           // http://gis.stackexchange.com/a/124857/40446
62789           return r / (4 * Math.PI) * 510065621724000;
62790       }
62791
62792
62793       function toLineString(feature) {
62794           if (feature.type === 'LineString') return feature;
62795
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];
62801           }
62802
62803           return result;
62804       }
62805
62806       function nodeCount(feature) {
62807         if (feature.type === 'LineString') return feature.coordinates.length;
62808
62809         if (feature.type === 'Polygon') {
62810             return feature.coordinates[0].length - 1;
62811         }
62812       }
62813
62814
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();
62820           var entity;
62821
62822           selection$$1.html('');
62823
62824           selection$$1
62825               .append('h4')
62826               .attr('class', 'measurement-heading')
62827               .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
62828
62829           if (!selected.length) return;
62830
62831           var center;
62832           for (var i = 0; i < selected.length; i++) {
62833               entity = context.entity(selected[i]);
62834               extent._extend(entity.extent(resolver));
62835           }
62836           center = extent.center();
62837
62838
62839           var list = selection$$1
62840               .append('ul');
62841           var coordItem;
62842
62843           // multiple features, just display extent center..
62844           if (!singular) {
62845               coordItem = list
62846                   .append('li')
62847                   .text(t('info_panels.measurement.center') + ':');
62848               coordItem.append('span')
62849                   .text(dmsCoordinatePair(center));
62850               coordItem.append('span')
62851                   .text(decimalCoordinatePair(center));
62852               return;
62853           }
62854
62855           // single feature, display details..
62856           if (!entity) return;
62857           var geometry = entity.geometry(resolver);
62858
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);
62865
62866               list
62867                   .append('li')
62868                   .text(t('info_panels.measurement.geometry') + ':')
62869                   .append('span')
62870                   .text(
62871                       closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
62872                   );
62873
62874               if (entity.type !== 'relation') {
62875                   list
62876                       .append('li')
62877                       .text(t('info_panels.measurement.node_count') + ':')
62878                       .append('span')
62879                       .text(nodeCount(feature).toLocaleString(locale));
62880               }
62881
62882               if (closed) {
62883                   var area = steradiansToSqmeters(entity.area(resolver));
62884                   list
62885                       .append('li')
62886                       .text(t('info_panels.measurement.area') + ':')
62887                       .append('span')
62888                       .text(displayArea(area, isImperial));
62889               }
62890
62891
62892               list
62893                   .append('li')
62894                   .text(lengthLabel + ':')
62895                   .append('span')
62896                   .text(displayLength(length, isImperial));
62897
62898               coordItem = list
62899                   .append('li')
62900                   .text(t('info_panels.measurement.centroid') + ':');
62901               coordItem.append('span')
62902                   .text(dmsCoordinatePair(centroid));
62903               coordItem.append('span')
62904                   .text(decimalCoordinatePair(centroid));
62905
62906               var toggle  = isImperial ? 'imperial' : 'metric';
62907
62908               selection$$1
62909                   .append('a')
62910                   .text(t('info_panels.measurement.' + toggle))
62911                   .attr('href', '#')
62912                   .attr('class', 'button button-toggle-units')
62913                   .on('click', function() {
62914                       event.preventDefault();
62915                       isImperial = !isImperial;
62916                       selection$$1.call(redraw);
62917                   });
62918
62919           } else {
62920               var centerLabel = t('info_panels.measurement.' + (entity.type === 'node' ? 'location' : 'center'));
62921
62922               list
62923                   .append('li')
62924                   .text(t('info_panels.measurement.geometry') + ':')
62925                   .append('span')
62926                   .text(t('geometry.' + geometry));
62927
62928               coordItem = list
62929                   .append('li')
62930                   .text(centerLabel + ':');
62931               coordItem.append('span')
62932                   .text(dmsCoordinatePair(center));
62933               coordItem.append('span')
62934                   .text(decimalCoordinatePair(center));
62935           }
62936       }
62937
62938
62939       var panel = function(selection$$1) {
62940           selection$$1.call(redraw);
62941
62942           context.map()
62943               .on('drawn.info-measurement', function() {
62944                   selection$$1.call(redraw);
62945               });
62946       };
62947
62948       panel.off = function() {
62949           context.map()
62950               .on('drawn.info-measurement', null);
62951       };
62952
62953       panel.id = 'measurement';
62954       panel.title = t('info_panels.measurement.title');
62955       panel.key = t('info_panels.measurement.key');
62956
62957
62958       return panel;
62959   }
62960
62961   var uiInfoPanels = {
62962       background: uiPanelBackground,
62963       history: uiPanelHistory,
62964       location: uiPanelLocation,
62965       measurement: uiPanelMeasurement,
62966   };
62967
62968   function uiInfo(context) {
62969       var ids = Object.keys(uiInfoPanels),
62970           wasActive = ['measurement'],
62971           panels = {},
62972           active = {};
62973
62974       // create panels
62975       ids.forEach(function(k) {
62976           if (!panels[k]) {
62977               panels[k] = uiInfoPanels[k](context);
62978               active[k] = false;
62979           }
62980       });
62981
62982
62983       function info(selection$$1) {
62984
62985           function redraw() {
62986               var activeids = ids.filter(function(k) { return active[k]; }).sort();
62987
62988               var containers = infoPanels.selectAll('.panel-container')
62989                   .data(activeids, function(k) { return k; });
62990
62991               containers.exit()
62992                   .style('opacity', 1)
62993                   .transition()
62994                   .duration(200)
62995                   .style('opacity', 0)
62996                   .on('end', function(d) {
62997                       select(this)
62998                           .call(panels[d].off)
62999                           .remove();
63000                   });
63001
63002               var enter = containers.enter()
63003                   .append('div')
63004                   .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
63005
63006               enter
63007                   .style('opacity', 0)
63008                   .transition()
63009                   .duration(200)
63010                   .style('opacity', 1);
63011
63012               var title = enter
63013                   .append('div')
63014                   .attr('class', 'panel-title fillD2');
63015
63016               title
63017                   .append('h3')
63018                   .text(function(d) { return panels[d].title; });
63019
63020               title
63021                   .append('button')
63022                   .attr('class', 'close')
63023                   .on('click', function (d) { toggle(d); })
63024                   .call(svgIcon('#iD-icon-close'));
63025
63026               enter
63027                   .append('div')
63028                   .attr('class', function(d) { return 'panel-content panel-content-' + d; });
63029
63030
63031               // redraw the panels
63032               infoPanels.selectAll('.panel-content')
63033                   .each(function(d) {
63034                       select(this).call(panels[d]);
63035                   });
63036           }
63037
63038
63039           function toggle(which) {
63040               if (event) {
63041                   event.stopImmediatePropagation();
63042                   event.preventDefault();
63043               }
63044
63045               var activeids = ids.filter(function(k) { return active[k]; });
63046
63047               if (which) {  // toggle one
63048                   active[which] = !active[which];
63049                   if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
63050                       wasActive = [which];
63051                   }
63052               } else {      // toggle all
63053                   if (activeids.length) {
63054                       wasActive = activeids;
63055                       activeids.forEach(function(k) { active[k] = false; });
63056                   } else {
63057                       wasActive.forEach(function(k) { active[k] = true; });
63058                   }
63059               }
63060
63061               redraw();
63062           }
63063
63064
63065           var infoPanels = selection$$1.selectAll('.info-panels')
63066               .data([0]);
63067
63068           infoPanels = infoPanels.enter()
63069               .append('div')
63070               .attr('class', 'info-panels')
63071               .merge(infoPanels);
63072
63073           redraw();
63074
63075           var keybinding = d3keybinding('info')
63076               .on(uiCmd('⌘' + t('info_panels.key')), toggle);
63077
63078           ids.forEach(function(k) {
63079               var key = t('info_panels.' + k + '.key', { default: null });
63080               if (!key) return;
63081               keybinding
63082                   .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
63083           });
63084
63085           select(document)
63086               .call(keybinding);
63087       }
63088
63089       return info;
63090   }
63091
63092   function uiModes(context) {
63093       var modes = [
63094           modeAddPoint$$1(context),
63095           modeAddLine$$1(context),
63096           modeAddArea$$1(context)
63097       ];
63098
63099
63100       function editable() {
63101           var mode = context.mode();
63102           return context.editable() && mode && mode.id !== 'save';
63103       }
63104
63105
63106       return function(selection$$1) {
63107           var buttons = selection$$1.selectAll('button.add-button')
63108               .data(modes);
63109
63110           buttons = buttons.enter()
63111               .append('button')
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;
63118
63119                   if (mode.id === currMode) {
63120                       context.enter(modeBrowse(context));
63121                   } else {
63122                       context.enter(mode);
63123                   }
63124               })
63125               .call(tooltip()
63126                   .placement('bottom')
63127                   .html(true)
63128                   .title(function(mode) {
63129                       return uiTooltipHtml(mode.description, mode.key);
63130                   })
63131               );
63132
63133           buttons
63134               .each(function(d) {
63135                   select(this)
63136                       .call(svgIcon('#iD-icon-' + d.button, 'pre-text'));
63137               });
63138
63139           buttons
63140               .append('span')
63141               .attr('class', 'label')
63142               .text(function(mode) { return mode.title; });
63143
63144           context
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);
63150               });
63151
63152           context
63153               .on('exit.editor', function(exited) {
63154                   context.container()
63155                       .classed('mode-' + exited.id, false);
63156               });
63157
63158           var keybinding = d3keybinding('mode-buttons');
63159
63160           modes.forEach(function(mode) {
63161               keybinding.on(mode.key, function() {
63162                   if (editable()) {
63163                       if (mode.id === context.mode().id) {
63164                           context.enter(modeBrowse(context));
63165                       } else {
63166                           context.enter(mode);
63167                       }
63168                   }
63169               });
63170           });
63171
63172           select(document)
63173               .call(keybinding);
63174
63175
63176           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
63177
63178           context.map()
63179               .on('move.modes', debouncedUpdate)
63180               .on('drawn.modes', debouncedUpdate);
63181
63182           context
63183               .on('enter.modes', update);
63184
63185
63186
63187           function update() {
63188               selection$$1.selectAll('button.add-button')
63189                   .property('disabled', !editable());
63190           }
63191       };
63192   }
63193
63194   function uiNotice(context) {
63195
63196       return function(selection$$1) {
63197           var div = selection$$1
63198               .append('div')
63199               .attr('class', 'notice');
63200
63201           var button = div
63202               .append('button')
63203               .attr('class', 'zoom-to notice fillD')
63204               .on('click', function() {
63205                   context.map().zoomEase(context.minEditableZoom());
63206               })
63207               .on('wheel', function() {   // let wheel events pass through #4482
63208                   var e2 = new WheelEvent(event.type, event);
63209                   context.surface().node().dispatchEvent(e2);
63210               });
63211
63212           button
63213               .call(svgIcon('#iD-icon-plus', 'pre-text'))
63214               .append('span')
63215               .attr('class', 'label')
63216               .text(t('zoom_in_edit'));
63217
63218
63219           function disableTooHigh() {
63220               var canEdit = context.map().zoom() >= context.minEditableZoom();
63221               div.style('display', canEdit ? 'none' : 'block');
63222           }
63223
63224           context.map()
63225               .on('move.notice', debounce(disableTooHigh, 500));
63226
63227           disableTooHigh();
63228       };
63229   }
63230
63231   function uiRestore(context) {
63232
63233       return function(selection) {
63234           if (!context.history().lock() || !context.history().restorableChanges())
63235               return;
63236
63237           var modalSelection = uiModal(selection, true);
63238
63239           modalSelection.select('.modal')
63240               .attr('class', 'modal fillL col6');
63241
63242           var introModal = modalSelection.select('.content');
63243
63244           introModal
63245               .attr('class','cf');
63246
63247           introModal
63248               .append('div')
63249               .attr('class', 'modal-section')
63250               .append('h3')
63251               .text(t('restore.heading'));
63252
63253           introModal
63254               .append('div')
63255               .attr('class','modal-section')
63256               .append('p')
63257               .text(t('restore.description'));
63258
63259           var buttonWrap = introModal
63260               .append('div')
63261               .attr('class', 'modal-actions cf');
63262
63263           var restore = buttonWrap
63264               .append('button')
63265               .attr('class', 'restore col6')
63266               .on('click', function() {
63267                   context.history().restore();
63268                   modalSelection.remove();
63269               });
63270
63271           restore
63272               .append('svg')
63273               .attr('class', 'logo logo-restore')
63274               .append('use')
63275               .attr('xlink:href', '#iD-logo-restore');
63276
63277           restore
63278               .append('div')
63279               .text(t('restore.restore'));
63280
63281           var reset = buttonWrap
63282               .append('button')
63283               .attr('class', 'reset col6')
63284               .on('click', function() {
63285                   context.history().clearSaved();
63286                   modalSelection.remove();
63287               });
63288
63289           reset
63290               .append('svg')
63291               .attr('class', 'logo logo-reset')
63292               .append('use')
63293               .attr('xlink:href', '#iD-logo-reset');
63294
63295           reset
63296               .append('div')
63297               .text(t('restore.reset'));
63298
63299           restore.node().focus();
63300       };
63301   }
63302
63303   function uiSave(context) {
63304       var history = context.history();
63305       var key = uiCmd('⌘S');
63306
63307
63308       function saving() {
63309           var mode = context.mode();
63310           return mode && mode.id === 'save';
63311       }
63312
63313
63314       function save() {
63315           event.preventDefault();
63316           if (!context.inIntro() && !saving() && history.hasChanges()) {
63317               context.enter(modeSave$$1(context));
63318           }
63319       }
63320
63321
63322       function getBackground(numChanges) {
63323           var step;
63324           if (numChanges === 0) {
63325               return null;
63326           } else if (numChanges <= 50) {
63327               step = numChanges / 50;
63328               return interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
63329           } else {
63330               step = Math.min((numChanges - 50) / 50, 1.0);
63331               return interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
63332           }
63333       }
63334
63335
63336       return function(selection$$1) {
63337           var numChanges = 0;
63338
63339           function updateCount() {
63340               var _ = history.difference().summary().length;
63341               if (_ === numChanges) return;
63342               numChanges = _;
63343
63344               tooltipBehavior
63345                   .title(uiTooltipHtml(
63346                       t(numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
63347                   );
63348
63349               var background = getBackground(numChanges);
63350
63351               button
63352                   .classed('disabled', numChanges === 0)
63353                   .classed('has-count', numChanges > 0)
63354                   .style('background', background);
63355
63356               button.select('span.count')
63357                   .text(numChanges)
63358                   .style('background', background)
63359                   .style('border-color', background);
63360           }
63361
63362
63363           var tooltipBehavior = tooltip()
63364               .placement('bottom')
63365               .html(true)
63366               .title(uiTooltipHtml(t('save.no_changes'), key));
63367
63368           var button = selection$$1
63369               .append('button')
63370               .attr('class', 'save col12 disabled')
63371               .attr('tabindex', -1)
63372               .on('click', save)
63373               .call(tooltipBehavior);
63374
63375           button
63376               .call(svgIcon('#iD-icon-save', 'pre-text'))
63377               .append('span')
63378               .attr('class', 'label')
63379               .text(t('save.title'));
63380
63381           button
63382               .append('span')
63383               .attr('class', 'count')
63384               .text('0');
63385
63386           updateCount();
63387
63388
63389           var keybinding = d3keybinding('uiSave')
63390               .on(key, save, true);
63391
63392           select(document)
63393               .call(keybinding);
63394
63395           context.history()
63396               .on('change.save', updateCount);
63397
63398           context
63399               .on('enter.save', function() {
63400                   button.property('disabled', saving());
63401                   if (saving()) button.call(tooltipBehavior.hide);
63402               });
63403       };
63404   }
63405
63406   function uiScale(context) {
63407       var projection = context.projection,
63408           isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
63409           maxLength = 180,
63410           tickHeight = 8;
63411
63412
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;
63419
63420           if (isImperial) {
63421               buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
63422           } else {
63423               buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
63424           }
63425
63426           // determine a user-friendly endpoint for the scale
63427           for (i = 0; i < buckets.length; i++) {
63428               val = buckets[i];
63429               if (dist >= val) {
63430                   scale.dist = Math.floor(dist / val) * val;
63431                   break;
63432               } else {
63433                   scale.dist = +dist.toFixed(2);
63434               }
63435           }
63436
63437           dLon = geoMetersToLon(scale.dist / conversion, lat);
63438           scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
63439
63440           scale.text = displayLength(scale.dist / conversion, isImperial);
63441
63442           return scale;
63443       }
63444
63445
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);
63452
63453           selection.select('#scale-path')
63454               .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
63455
63456           selection.select('#scale-textgroup')
63457               .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
63458
63459           selection.select('#scale-text')
63460               .text(scale.text);
63461       }
63462
63463
63464       return function(selection) {
63465           function switchUnits() {
63466               isImperial = !isImperial;
63467               selection.call(update);
63468           }
63469
63470           var scalegroup = selection.append('svg')
63471               .attr('id', 'scale')
63472               .on('click', switchUnits)
63473               .append('g')
63474               .attr('transform', 'translate(10,11)');
63475
63476           scalegroup
63477               .append('path')
63478               .attr('id', 'scale-path');
63479
63480           scalegroup
63481               .append('g')
63482               .attr('id', 'scale-textgroup')
63483               .append('text')
63484               .attr('id', 'scale-text');
63485
63486           selection.call(update);
63487
63488           context.map().on('move.scale', function() {
63489               update(selection);
63490           });
63491       };
63492   }
63493
63494   var pair_1 = pair$1;
63495
63496   function search(x, dims, r) {
63497     if (!dims) dims = 'NSEW';
63498     if (typeof x !== 'string') return { val: null, regex: r };
63499
63500     r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
63501
63502     var m = r.exec(x);
63503     if (!m) return { val: null, regex: r };
63504
63505     var dim = m[1] || m[5];
63506     if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
63507
63508     return {
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),
63513       regex: r,
63514       raw: m[0],
63515       dim: dim
63516     };
63517   }
63518
63519   function pair$1(x, dims) {
63520     x = x.trim();
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;
63527     if (one.dim) {
63528       return swapdim(one.val, two.val, one.dim);
63529     } else {
63530       return [one.val, two.val];
63531     }
63532   }
63533
63534   function swapdim(a, b, dim) {
63535     if (dim === 'N' || dim === 'S') return [a, b];
63536     if (dim === 'W' || dim === 'E') return [b, a];
63537   }
63538
63539   function uiFeatureList(context) {
63540       var keybinding = d3keybinding('uiFeatureList');
63541       var _geocodeResults;
63542
63543
63544       function featureList(selection$$1) {
63545           var header = selection$$1
63546               .append('div')
63547               .attr('class', 'header fillL cf');
63548
63549           header
63550               .append('h3')
63551               .text(t('inspector.feature_list'));
63552
63553           var searchWrap = selection$$1
63554               .append('div')
63555               .attr('class', 'search-header');
63556
63557           var search = searchWrap
63558               .append('input')
63559               .attr('placeholder', t('inspector.search'))
63560               .attr('type', 'search')
63561               .call(utilNoAuto)
63562               .on('keypress', keypress)
63563               .on('keydown', keydown)
63564               .on('input', inputevent);
63565
63566           searchWrap
63567               .call(svgIcon('#iD-icon-search', 'pre-text'));
63568
63569           var listWrap = selection$$1
63570               .append('div')
63571               .attr('class', 'inspector-body');
63572
63573           var list = listWrap
63574               .append('div')
63575               .attr('class', 'feature-list cf');
63576
63577           context
63578               .on('exit.feature-list', clearSearch);
63579           context.map()
63580               .on('drawn.feature-list', mapDrawn);
63581
63582           keybinding
63583               .on(uiCmd('⌘F'), focusSearch);
63584
63585           select(document)
63586               .call(keybinding);
63587
63588
63589           function focusSearch() {
63590               var mode = context.mode() && context.mode().id;
63591               if (mode !== 'browse') return;
63592
63593               event.preventDefault();
63594               search.node().focus();
63595           }
63596
63597
63598           function keydown() {
63599               if (event.keyCode === 27) {  // escape
63600                   search.node().blur();
63601               }
63602           }
63603
63604
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());
63610               }
63611           }
63612
63613
63614           function inputevent() {
63615               _geocodeResults = undefined;
63616               drawList();
63617           }
63618
63619
63620           function clearSearch() {
63621               search.property('value', '');
63622               drawList();
63623           }
63624
63625
63626           function mapDrawn(e) {
63627               if (e.full) {
63628                   drawList();
63629               }
63630           }
63631
63632
63633           function features() {
63634               var entities = {};
63635               var result = [];
63636               var graph = context.graph();
63637               var q = search.property('value').toLowerCase();
63638
63639               if (!q) return result;
63640
63641               var idMatch = q.match(/^([nwr])([0-9]+)$/);
63642
63643               if (idMatch) {
63644                   result.push({
63645                       id: idMatch[0],
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'),
63648                       name: idMatch[2]
63649                   });
63650               }
63651
63652               var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
63653
63654               if (locationMatch) {
63655                   var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
63656                   result.push({
63657                       id: -1,
63658                       geometry: 'point',
63659                       type: t('inspector.location'),
63660                       name: dmsCoordinatePair([loc[1], loc[0]]),
63661                       location: loc
63662                   });
63663               }
63664
63665               function addEntity(entity) {
63666                   if (entity.id in entities || result.length > 200)
63667                       return;
63668
63669                   entities[entity.id] = true;
63670
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);
63675
63676                       result.push({
63677                           id: entity.id,
63678                           entity: entity,
63679                           geometry: context.geometry(entity.id),
63680                           type: type,
63681                           name: name
63682                       });
63683                   }
63684
63685                   graph.parentRelations(entity).forEach(function(parent) {
63686                       addEntity(parent);
63687                   });
63688               }
63689
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); }
63695               }
63696
63697               (_geocodeResults || []).forEach(function(d) {
63698                   if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
63699
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);
63703                       var tags = {};
63704                       tags[d.class] = d.type;
63705
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
63709                       }
63710
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);
63715
63716                       result.push({
63717                           id: tempEntity.id,
63718                           geometry: tempEntity.geometry(tempGraph),
63719                           type: type,
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])])
63724                       });
63725                   }
63726               });
63727
63728               return result;
63729           }
63730
63731
63732           function drawList() {
63733               var value = search.property('value');
63734               var results = features();
63735
63736               list.classed('filtered', value.length);
63737
63738               var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
63739
63740               var resultsIndicator = list.selectAll('.no-results-item')
63741                   .data([0])
63742                   .enter()
63743                   .append('button')
63744                   .property('disabled', true)
63745                   .attr('class', 'no-results-item')
63746                   .call(svgIcon('#iD-icon-alert', 'pre-text'));
63747
63748               resultsIndicator.append('span')
63749                   .attr('class', 'entity-name');
63750
63751               list.selectAll('.no-results-item .entity-name')
63752                   .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
63753
63754               if (services.geocoder) {
63755                 list.selectAll('.geocode-item')
63756                     .data([0])
63757                     .enter()
63758                     .append('button')
63759                     .attr('class', 'geocode-item')
63760                     .on('click', geocoderSearch)
63761                     .append('div')
63762                     .attr('class', 'label')
63763                     .append('span')
63764                     .attr('class', 'entity-name')
63765                     .text(t('geocoder.search'));
63766               }
63767
63768               list.selectAll('.no-results-item')
63769                   .style('display', (value.length && !results.length) ? 'block' : 'none');
63770
63771               list.selectAll('.geocode-item')
63772                   .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
63773
63774               list.selectAll('.feature-list-item')
63775                   .data([-1])
63776                   .remove();
63777
63778               var items = list.selectAll('.feature-list-item')
63779                   .data(results, function(d) { return d.id; });
63780
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);
63787
63788               var label = enter
63789                   .append('div')
63790                   .attr('class', 'label');
63791
63792               label
63793                   .each(function(d) {
63794                       select(this)
63795                           .call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
63796                   });
63797
63798               label
63799                   .append('span')
63800                   .attr('class', 'entity-type')
63801                   .text(function(d) { return d.type; });
63802
63803               label
63804                   .append('span')
63805                   .attr('class', 'entity-name')
63806                   .text(function(d) { return d.name; });
63807
63808               enter
63809                   .style('opacity', 0)
63810                   .transition()
63811                   .style('opacity', 1);
63812
63813               items.order();
63814
63815               items.exit()
63816                   .remove();
63817           }
63818
63819
63820           function mouseover(d) {
63821               if (d.id === -1) return;
63822
63823               context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
63824                   .classed('hover', true);
63825           }
63826
63827
63828           function mouseout() {
63829               context.surface().selectAll('.hover')
63830                   .classed('hover', false);
63831           }
63832
63833
63834           function click(d) {
63835               event.preventDefault();
63836               if (d.location) {
63837                   context.map().centerZoom([d.location[1], d.location[0]], 19);
63838               }
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);
63846                   }
63847                   context.enter(modeSelect(context, [d.entity.id]));
63848               } else {
63849                   context.zoomToEntity(d.id);
63850               }
63851           }
63852
63853
63854           function geocoderSearch() {
63855               services.geocoder.search(search.property('value'), function (err, resp) {
63856                   _geocodeResults = resp || [];
63857                   drawList();
63858               });
63859           }
63860       }
63861
63862
63863       return featureList;
63864   }
63865
63866   function uiPresetIcon() {
63867       var preset, geometry;
63868
63869
63870       function presetIcon(selection$$1) {
63871           selection$$1.each(render);
63872       }
63873
63874
63875       function getIcon(p, geom) {
63876           if (p.icon)
63877               return p.icon;
63878           else if (geom === 'line')
63879               return 'iD-other-line';
63880           else if (geom === 'vertex')
63881               return p.isFallback() ? '' : 'temaki-vertex';
63882           else
63883               return 'maki-marker-stroked';
63884       }
63885
63886
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');
63897
63898
63899           function tag_classes(p) {
63900               var s = '';
63901               for (var i in p.tags) {
63902                   s += ' tag-' + i;
63903                   if (p.tags[i] !== '*') {
63904                       s += ' tag-' + i + '-' + p.tags[i];
63905                   }
63906               }
63907               return s;
63908           }
63909
63910
63911           var fill = selection$$1.selectAll('.preset-icon-fill')
63912               .data([0]);
63913
63914           fill = fill.enter()
63915               .append('div')
63916               .merge(fill);
63917
63918           fill
63919               .attr('class', function() {
63920                   return 'preset-icon-fill preset-icon-fill-' + geom + tag_classes(p);
63921               });
63922
63923
63924           var areaFrame = selection$$1.selectAll('.preset-icon-frame')
63925               .data((geom === 'area') ? [0] : []);
63926
63927           areaFrame.exit()
63928               .remove();
63929
63930           areaFrame = areaFrame.enter()
63931               .append('div')
63932               .attr('class', 'preset-icon-frame')
63933               .call(svgIcon('#iD-preset-icon-frame'));
63934
63935
63936           var icon = selection$$1.selectAll('.preset-icon')
63937               .data([0]);
63938
63939           icon = icon.enter()
63940               .append('div')
63941               .attr('class', 'preset-icon')
63942               .call(svgIcon(''))
63943               .merge(icon);
63944
63945           icon
63946               .attr('class', 'preset-icon preset-icon-' +
63947                   (isPOI ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
63948               );
63949
63950           icon.selectAll('svg')
63951               .attr('class', function() {
63952                   return 'icon ' + picon + (isPOI ? '' : tag_classes(p));
63953               });
63954
63955           icon.selectAll('use')
63956               .attr('href', '#' + picon + (isMaki ? '-15' : ''));
63957       }
63958
63959
63960       presetIcon.preset = function(_) {
63961           if (!arguments.length) return preset;
63962           preset = utilFunctor(_);
63963           return presetIcon;
63964       };
63965
63966
63967       presetIcon.geometry = function(_) {
63968           if (!arguments.length) return geometry;
63969           geometry = utilFunctor(_);
63970           return presetIcon;
63971       };
63972
63973       return presetIcon;
63974   }
63975
63976   function d3combobox() {
63977       var dispatch$$1 = dispatch('accept');
63978       var _container = select(document.body);
63979       var _data = [];
63980       var _suggestions = [];
63981       var _minItems = 2;
63982       var _caseSensitive = false;
63983
63984       var _fetcher = function(val, cb) {
63985           cb(_data.filter(function(d) {
63986               return d.value
63987                   .toString()
63988                   .toLowerCase()
63989                   .indexOf(val.toLowerCase()) !== -1;
63990           }));
63991       };
63992
63993       var combobox = function(input, attachTo) {
63994           var idx = -1;
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() : '';
64000
64001           input
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)
64008               .each(function() {
64009                   var parent = this.parentNode;
64010                   var sibling = this.nextSibling;
64011
64012                   var caret = select(parent).selectAll('.combobox-caret')
64013                       .filter(function(d) { return d === input.node(); })
64014                       .data([input.node()]);
64015
64016                   caret = caret.enter()
64017                       .insert('div', function() { return sibling; })
64018                       .attr('class', 'combobox-caret')
64019                       .merge(caret);
64020
64021                   caret
64022                       .on('mousedown', function () {
64023                           // prevent the form element from blurring. it blurs
64024                           // on mousedown
64025                           event.stopPropagation();
64026                           event.preventDefault();
64027                           if (!shown) {
64028                               input.node().focus();
64029                               fetch('', render);
64030                           } else {
64031                               hide();
64032                           }
64033                       });
64034               });
64035
64036           function focus() {
64037               fetch(value(), render);
64038           }
64039
64040           function blur() {
64041               window.setTimeout(hide, 150);
64042           }
64043
64044           function show() {
64045               if (!shown) {
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();
64056                       });
64057
64058                   select('body')
64059                       .on('scroll.combobox', render, true);
64060
64061                   shown = true;
64062               }
64063           }
64064
64065           function hide() {
64066               if (shown) {
64067                   idx = -1;
64068                   wrapper.remove();
64069
64070                   select('body')
64071                       .on('scroll.combobox', null);
64072
64073                   shown = false;
64074               }
64075           }
64076
64077           function keydown() {
64078              switch (event.keyCode) {
64079                  // backspace, delete
64080                  case 8:
64081                  case 46:
64082                      input.on('input.typeahead', function() {
64083                          idx = -1;
64084                          render();
64085                          var start = input.property('selectionStart');
64086                          input.node().setSelectionRange(start, start);
64087                          input.on('input.typeahead', change);
64088                      });
64089                      break;
64090                  // tab
64091                  case 9:
64092                      wrapper.selectAll('a.selected').each(function (d) {
64093                          dispatch$$1.call('accept', this, d);
64094                      });
64095                      hide();
64096                      break;
64097                  // return
64098                  case 13:
64099                      event.preventDefault();
64100                      break;
64101                  // up arrow
64102                  case 38:
64103                      if (tagName === 'textarea' && !shown) return;
64104                      nav(-1);
64105                      event.preventDefault();
64106                      break;
64107                  // down arrow
64108                  case 40:
64109                      if (tagName === 'textarea' && !shown) return;
64110                      nav(+1);
64111                      event.preventDefault();
64112                      break;
64113              }
64114              event.stopPropagation();
64115           }
64116
64117           function keyup() {
64118               switch (event.keyCode) {
64119                   // escape
64120                   case 27:
64121                       hide();
64122                       break;
64123                   // return
64124                   case 13:
64125                       wrapper.selectAll('a.selected').each(function (d) {
64126                          dispatch$$1.call('accept', this, d);
64127                       });
64128                       hide();
64129                       break;
64130               }
64131           }
64132
64133           function change() {
64134               fetch(value(), function() {
64135                   if (input.property('selectionEnd') === input.property('value').length) {
64136                       autocomplete();
64137                   }
64138                   render();
64139               });
64140           }
64141
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);
64146               render();
64147               ensureVisible();
64148           }
64149
64150           function value() {
64151               var value = input.property('value');
64152               var start = input.property('selectionStart');
64153               var end = input.property('selectionEnd');
64154
64155               if (start && end) {
64156                   value = value.substring(0, start);
64157               }
64158
64159               return value;
64160           }
64161
64162           function fetch(v, cb) {
64163               _fetcher.call(input, v, function(_) {
64164                   _suggestions = _;
64165                   cb();
64166               });
64167           }
64168
64169           function autocomplete() {
64170               var v = _caseSensitive ? value() : value().toLowerCase();
64171               idx = -1;
64172               if (!v) return;
64173
64174               // Don't autocomplete if user is typing a number - #4935
64175               if (!isNaN(parseFloat(v)) && isFinite(v)) return;
64176
64177               var best = -1;
64178               var suggestion, compare;
64179
64180               for (var i = 0; i < _suggestions.length; i++) {
64181                   suggestion = _suggestions[i].value;
64182                   compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
64183
64184                   // if search string matches suggestion exactly, pick it..
64185                   if (compare === v) {
64186                       best = i;
64187                       break;
64188
64189                   // otherwise lock in the first result that starts with the search string..
64190                   } else if (best === -1 && compare.indexOf(v) === 0) {
64191                       best = i;
64192                   }
64193               }
64194
64195               if (best !== -1) {
64196                   idx = best;
64197                   suggestion = _suggestions[best].value;
64198                   input.property('value', suggestion);
64199                   input.node().setSelectionRange(v.length, suggestion.length);
64200               }
64201           }
64202
64203           function render() {
64204               if (_suggestions.length >= _minItems && document.activeElement === input.node()) {
64205                   show();
64206               } else {
64207                   hide();
64208                   return;
64209               }
64210
64211               var options = wrapper
64212                   .selectAll('a.combobox-option')
64213                   .data(_suggestions, function(d) { return d.value; });
64214
64215               options.exit()
64216                   .remove();
64217
64218               options.enter()
64219                   .append('a')
64220                   .attr('class', 'combobox-option')
64221                   .text(function(d) { return d.value; })
64222                   .merge(options)
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)
64227                   .order();
64228
64229
64230               var node = attachTo ? attachTo.node() : input.node();
64231               var rect = node.getBoundingClientRect();
64232
64233               wrapper
64234                   .style('left', (rect.left + 5) + 'px')
64235                   .style('width', (rect.width - 10) + 'px')
64236                   .style('top', rect.height + rect.top + 'px');
64237           }
64238
64239           function select$$1(d, i) {
64240               idx = i;
64241               render();
64242           }
64243
64244           function ensureVisible() {
64245               var node = wrapper.selectAll('a.selected').node();
64246               if (node) node.scrollIntoView();
64247           }
64248
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);
64254               hide();
64255           }
64256       };
64257
64258       combobox.fetcher = function(_) {
64259           if (!arguments.length) return _fetcher;
64260           _fetcher = _;
64261           return combobox;
64262       };
64263
64264       combobox.data = function(_) {
64265           if (!arguments.length) return _data;
64266           _data = _;
64267           return combobox;
64268       };
64269
64270       combobox.minItems = function(_) {
64271           if (!arguments.length) return _minItems;
64272           _minItems = _;
64273           return combobox;
64274       };
64275
64276       combobox.caseSensitive = function(_) {
64277           if (!arguments.length) return _caseSensitive;
64278           _caseSensitive = _;
64279           return combobox;
64280       };
64281
64282       combobox.container = function(_) {
64283           if (!arguments.length) return _container;
64284           _container = _;
64285           return combobox;
64286       };
64287
64288       return utilRebind(combobox, dispatch$$1, 'on');
64289   }
64290
64291
64292   d3combobox.off = function(input) {
64293       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)
64299           .each(function() {
64300               select(this.parentNode).selectAll('.combobox-caret')
64301                   .filter(function(d) { return d === input.node(); })
64302                   .on('mousedown', null);
64303           });
64304
64305       select('body')
64306           .on('scroll.combobox', null);
64307   };
64308
64309   function uiRawMemberEditor(context) {
64310       var taginfo = services.taginfo,
64311           _entityID;
64312
64313
64314       function selectMember(d) {
64315           event.preventDefault();
64316           context.enter(modeSelect(context, [d.id]));
64317       }
64318
64319
64320       function changeRole(d) {
64321           var role = select(this).property('value');
64322           var member = { id: d.id, type: d.type, role: role };
64323           context.perform(
64324               actionChangeMember(d.relation.id, member, d.index),
64325               t('operations.change_role.annotation')
64326           );
64327       }
64328
64329
64330       function deleteMember(d) {
64331           context.perform(
64332               actionDeleteMember(d.relation.id, d.index),
64333               t('operations.delete_member.annotation')
64334           );
64335
64336           if (!context.hasEntity(d.relation.id)) {
64337               context.enter(modeBrowse(context));
64338           }
64339       }
64340
64341
64342       function rawMemberEditor(selection$$1) {
64343           var entity = context.entity(_entityID),
64344               memberships = [];
64345
64346           entity.members.slice(0, 1000).forEach(function(member, index) {
64347               memberships.push({
64348                   index: index,
64349                   id: member.id,
64350                   type: member.type,
64351                   role: member.role,
64352                   relation: entity,
64353                   member: context.hasEntity(member.id)
64354               });
64355           });
64356
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 + ')')
64360               .expanded(true)
64361               .updatePreference(false)
64362               .on('toggled', function(expanded) {
64363                   if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
64364               })
64365               .content(content)
64366           );
64367
64368
64369           function content(wrap) {
64370               var list = wrap.selectAll('.member-list')
64371                   .data([0]);
64372
64373               list = list.enter()
64374                   .append('ul')
64375                   .attr('class', 'member-list')
64376                   .merge(list);
64377
64378
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');
64383                   });
64384
64385               items.exit()
64386                   .each(unbind)
64387                   .remove();
64388
64389               var enter = items.enter()
64390                   .append('li')
64391                   .attr('class', 'member-row form-field')
64392                   .classed('member-incomplete', function(d) { return !d.member; });
64393
64394               enter
64395                   .each(function(d) {
64396                       if (d.member) {
64397                           var label = select(this).append('label')
64398                               .attr('class', 'form-label')
64399                               .append('a')
64400                               .attr('href', '#')
64401                               .on('click', selectMember);
64402
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);
64408                               });
64409
64410                           label.append('span')
64411                               .attr('class', 'member-entity-name')
64412                               .text(function(d) { return utilDisplayName(d.member); });
64413
64414                       } else {
64415                           select(this).append('label')
64416                               .attr('class', 'form-label')
64417                               .text(t('inspector.incomplete', { id: d.id }));
64418                       }
64419                   });
64420
64421               enter
64422                   .append('input')
64423                   .attr('class', 'member-role')
64424                   .property('type', 'text')
64425                   .attr('maxlength', 255)
64426                   .attr('placeholder', t('inspector.role'))
64427                   .call(utilNoAuto)
64428                   .property('value', function(d) { return d.role; })
64429                   .on('change', changeRole);
64430
64431               enter
64432                   .append('button')
64433                   .attr('tabindex', -1)
64434                   .attr('class', 'remove button-input-action member-delete minor')
64435                   .on('click', deleteMember)
64436                   .call(svgIcon('#iD-operation-delete'));
64437
64438               if (taginfo) {
64439                   enter.each(bindTypeahead);
64440               }
64441
64442
64443               function bindTypeahead(d) {
64444                   var row = select(this),
64445                       role = row.selectAll('input.member-role');
64446
64447                   function sort(value, data) {
64448                       var sameletter = [],
64449                           other = [];
64450                       for (var i = 0; i < data.length; i++) {
64451                           if (data[i].value.substring(0, value.length) === value) {
64452                               sameletter.push(data[i]);
64453                           } else {
64454                               other.push(data[i]);
64455                           }
64456                       }
64457                       return sameletter.concat(other);
64458                   }
64459
64460                   role.call(d3combobox()
64461                       .container(context.container())
64462                       .fetcher(function(role, callback) {
64463                           var rtype = entity.tags.type;
64464                           taginfo.roles({
64465                               debounce: true,
64466                               rtype: rtype || '',
64467                               geometry: context.geometry(d.member.id),
64468                               query: role
64469                           }, function(err, data) {
64470                               if (!err) callback(sort(role, data));
64471                           });
64472                       }));
64473               }
64474
64475
64476               function unbind() {
64477                   var row = select(this);
64478
64479                   row.selectAll('input.member-role')
64480                       .call(d3combobox.off);
64481               }
64482           }
64483       }
64484
64485
64486       rawMemberEditor.entityID = function(_) {
64487           if (!arguments.length) return _entityID;
64488           _entityID = _;
64489           return rawMemberEditor;
64490       };
64491
64492
64493       return rawMemberEditor;
64494   }
64495
64496   function uiRawMembershipEditor(context) {
64497       var taginfo = services.taginfo,
64498           _entityID,
64499           _showBlank;
64500
64501
64502       function selectRelation(d) {
64503           event.preventDefault();
64504           context.enter(modeSelect(context, [d.relation.id]));
64505       }
64506
64507
64508       function changeRole(d) {
64509           var role = select(this).property('value');
64510           context.perform(
64511               actionChangeMember(d.relation.id, assignIn({}, d.member, { role: role }), d.index),
64512               t('operations.change_role.annotation')
64513           );
64514       }
64515
64516
64517       function addMembership(d, role) {
64518           _showBlank = false;
64519
64520           var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
64521
64522           if (d.relation) {
64523               context.perform(
64524                   actionAddMember(d.relation.id, member),
64525                   t('operations.add_member.annotation')
64526               );
64527
64528           } else {
64529               var relation = osmRelation();
64530               context.perform(
64531                   actionAddEntity(relation),
64532                   actionAddMember(relation.id, member),
64533                   t('operations.add.annotation.relation')
64534               );
64535
64536               context.enter(modeSelect(context, [relation.id]));
64537           }
64538       }
64539
64540
64541       function deleteMembership(d) {
64542           context.perform(
64543               actionDeleteMember(d.relation.id, d.index),
64544               t('operations.delete_member.annotation')
64545           );
64546       }
64547
64548
64549       function relations(q) {
64550           var newRelation = { relation: null, value: t('inspector.new_relation') };
64551           var result = [];
64552           var graph = context.graph();
64553
64554           context.intersects(context.extent()).forEach(function(entity) {
64555               if (entity.type !== 'relation' || entity.id === _entityID)
64556                   return;
64557
64558               var matched = context.presets().match(entity, graph),
64559                   presetName = (matched && matched.name()) || t('inspector.relation'),
64560                   entityName = utilDisplayName(entity) || '';
64561
64562               var value = presetName + ' ' + entityName;
64563               if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1)
64564                   return;
64565
64566               result.push({ relation: entity, value: value });
64567           });
64568
64569           result.sort(function(a, b) {
64570               return osmRelation.creationOrder(a.relation, b.relation);
64571           });
64572
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; }
64577           );
64578
64579           dupeGroups.forEach(function(group) {
64580               group.forEach(function(obj) {
64581                   obj.value += ' ' + obj.relation.id;
64582               });
64583           });
64584
64585           forEach(result, function(obj) {
64586               obj.title = obj.value;
64587           });
64588
64589           result.unshift(newRelation);
64590           return result;
64591       }
64592
64593
64594       function rawMembershipEditor(selection$$1) {
64595           var entity = context.entity(_entityID),
64596               parents = context.graph().parentRelations(entity),
64597               memberships = [];
64598
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 });
64603                   }
64604               });
64605           });
64606
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 + ')')
64610               .expanded(true)
64611               .updatePreference(false)
64612               .on('toggled', function(expanded) {
64613                   if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
64614               })
64615               .content(content)
64616           );
64617
64618
64619           function content(wrap) {
64620               var list = wrap.selectAll('.member-list')
64621                   .data([0]);
64622
64623               list = list.enter()
64624                   .append('ul')
64625                   .attr('class', 'member-list')
64626                   .merge(list);
64627
64628
64629               var items = list.selectAll('li.member-row-normal')
64630                   .data(memberships, function(d) {
64631                       return osmEntity$$1.key(d.relation) + ',' + d.index;
64632                   });
64633
64634               items.exit()
64635                   .each(unbind)
64636                   .remove();
64637
64638               var enter = items.enter()
64639                   .append('li')
64640                   .attr('class', 'member-row member-row-normal form-field');
64641
64642               var label = enter
64643                   .append('label')
64644                   .attr('class', 'form-label')
64645                   .append('a')
64646                   .attr('href', '#')
64647                   .on('click', selectRelation);
64648
64649               label
64650                   .append('span')
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');
64655                   });
64656
64657               label
64658                   .append('span')
64659                   .attr('class', 'member-entity-name')
64660                   .text(function(d) { return utilDisplayName(d.relation); });
64661
64662               enter
64663                   .append('input')
64664                   .attr('class', 'member-role')
64665                   .property('type', 'text')
64666                   .attr('maxlength', 255)
64667                   .attr('placeholder', t('inspector.role'))
64668                   .call(utilNoAuto)
64669                   .property('value', function(d) { return d.member.role; })
64670                   .on('change', changeRole);
64671
64672               enter
64673                   .append('button')
64674                   .attr('tabindex', -1)
64675                   .attr('class', 'remove button-input-action member-delete minor')
64676                   .on('click', deleteMembership)
64677                   .call(svgIcon('#iD-operation-delete'));
64678
64679               if (taginfo) {
64680                   enter.each(bindTypeahead);
64681               }
64682
64683
64684               var newrow = list.selectAll('.member-row-new')
64685                   .data(_showBlank ? [0] : []);
64686
64687               newrow.exit()
64688                   .remove();
64689
64690               enter = newrow.enter()
64691                   .append('li')
64692                   .attr('class', 'member-row member-row-new form-field');
64693
64694               enter
64695                   .append('input')
64696                   .attr('type', 'text')
64697                   .attr('class', 'member-entity-input')
64698                   .call(utilNoAuto);
64699
64700               enter
64701                   .append('input')
64702                   .attr('class', 'member-role')
64703                   .property('type', 'text')
64704                   .attr('maxlength', 255)
64705                   .attr('placeholder', t('inspector.role'))
64706                   .call(utilNoAuto)
64707                   .on('change', changeRole);
64708
64709               enter
64710                   .append('button')
64711                   .attr('tabindex', -1)
64712                   .attr('class', 'remove button-input-action member-delete minor')
64713                   .on('click', deleteMembership)
64714                   .call(svgIcon('#iD-operation-delete'));
64715
64716               newrow = newrow
64717                   .merge(enter);
64718
64719               newrow.selectAll('.member-entity-input')
64720                   .call(d3combobox()
64721                       .container(context.container())
64722                       .minItems(1)
64723                       .fetcher(function(value, callback) { callback(relations(value)); })
64724                       .on('accept', onAccept)
64725                   );
64726
64727
64728               var addrel = wrap.selectAll('.add-relation')
64729                   .data([0]);
64730
64731               addrel = addrel.enter()
64732                   .append('button')
64733                   .attr('class', 'add-relation')
64734                   .merge(addrel);
64735
64736               addrel
64737                   .call(svgIcon('#iD-icon-plus', 'light'))
64738                   .on('click', function() {
64739                       _showBlank = true;
64740                       content(wrap);
64741                       list.selectAll('.member-entity-input').node().focus();
64742                   });
64743
64744
64745               function onAccept(d) {
64746                   var role = list.selectAll('.member-row-new .member-role').property('value');
64747                   addMembership(d, role);
64748               }
64749
64750
64751               function bindTypeahead(d) {
64752                   var row = select(this),
64753                       role = row.selectAll('input.member-role');
64754
64755                   function sort(value, data) {
64756                       var sameletter = [],
64757                           other = [];
64758                       for (var i = 0; i < data.length; i++) {
64759                           if (data[i].value.substring(0, value.length) === value) {
64760                               sameletter.push(data[i]);
64761                           } else {
64762                               other.push(data[i]);
64763                           }
64764                       }
64765                       return sameletter.concat(other);
64766                   }
64767
64768                   role.call(d3combobox()
64769                       .container(context.container())
64770                       .fetcher(function(role, callback) {
64771                           var rtype = d.relation.tags.type;
64772                           taginfo.roles({
64773                               debounce: true,
64774                               rtype: rtype || '',
64775                               geometry: context.geometry(_entityID),
64776                               query: role
64777                           }, function(err, data) {
64778                               if (!err) callback(sort(role, data));
64779                           });
64780                       }));
64781               }
64782
64783
64784               function unbind() {
64785                   var row = select(this);
64786
64787                   row.selectAll('input.member-role')
64788                       .call(d3combobox.off);
64789               }
64790           }
64791       }
64792
64793
64794       rawMembershipEditor.entityID = function(_) {
64795           if (!arguments.length) return _entityID;
64796           _entityID = _;
64797           return rawMembershipEditor;
64798       };
64799
64800
64801       return rawMembershipEditor;
64802   }
64803
64804   function uiTagReference(tag) {
64805       var taginfo = services.taginfo;
64806       var tagReference = {};
64807
64808       var _button = select(null);
64809       var _body = select(null);
64810       var _loaded;
64811       var _showing;
64812
64813
64814       function findLocal(data) {
64815           var locale = utilDetect().locale.toLowerCase();
64816           var localized;
64817
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;
64821               });
64822               if (localized) return localized;
64823           }
64824
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;
64831               });
64832               if (localized) return localized;
64833           }
64834
64835           // finally fall back to english
64836           return find$1(data, function(d) {
64837               return d.lang.toLowerCase() === 'en';
64838           });
64839       }
64840
64841
64842       function load(param) {
64843           if (!taginfo) return;
64844
64845           _button
64846               .classed('tag-reference-loading', true);
64847
64848           taginfo.docs(param, function show(err, data) {
64849               var docs;
64850               if (!err && data) {
64851                   docs = findLocal(data);
64852               }
64853
64854               _body.html('');
64855
64856               if (!docs || !docs.title) {
64857                   if (param.hasOwnProperty('value')) {
64858                       load(omit(param, 'value'));   // retry with key only
64859                   } else {
64860                       _body
64861                           .append('p')
64862                           .attr('class', 'tag-reference-description')
64863                           .text(t('inspector.no_documentation_key'));
64864                       done();
64865                   }
64866                   return;
64867               }
64868
64869               if (docs.image && docs.image.thumb_url_prefix) {
64870                   _body
64871                       .append('img')
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(); });
64876               } else {
64877                   done();
64878               }
64879
64880               _body
64881                   .append('p')
64882                   .attr('class', 'tag-reference-description')
64883                   .text(docs.description || t('inspector.documentation_redirect'));
64884
64885               _body
64886                   .append('a')
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'))
64892                   .append('span')
64893                   .text(t('inspector.reference'));
64894
64895               // Add link to info about "good changeset comments" - #2923
64896               if (param.key === 'comment') {
64897                   _body
64898                       .append('a')
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'))
64904                       .append('span')
64905                       .text(t('commit.about_changeset_comments'));
64906               }
64907           });
64908       }
64909
64910
64911       function done() {
64912           _loaded = true;
64913
64914           _button
64915               .classed('tag-reference-loading', false);
64916
64917           _body
64918               .classed('expanded', true)
64919               .transition()
64920               .duration(200)
64921               .style('max-height', '200px')
64922               .style('opacity', '1');
64923
64924           _showing = true;
64925       }
64926
64927
64928       function hide() {
64929           _body
64930               .transition()
64931               .duration(200)
64932               .style('max-height', '0px')
64933               .style('opacity', '0')
64934               .on('end', function () {
64935                   _body.classed('expanded', false);
64936               });
64937
64938           _showing = false;
64939       }
64940
64941
64942       tagReference.button = function(selection$$1) {
64943           _button = selection$$1.selectAll('.tag-reference-button')
64944               .data([0]);
64945
64946           _button = _button.enter()
64947               .append('button')
64948               .attr('class', 'tag-reference-button')
64949               .attr('title', t('icons.information'))
64950               .attr('tabindex', -1)
64951               .call(svgIcon('#iD-icon-inspect'))
64952               .merge(_button);
64953
64954           _button
64955               .on('click', function () {
64956                   event.stopPropagation();
64957                   event.preventDefault();
64958                   if (_showing) {
64959                       hide();
64960                   } else if (_loaded) {
64961                       done();
64962                   } else {
64963                       load(tag);
64964                   }
64965               });
64966       };
64967
64968
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; });
64973
64974           _body.exit()
64975               .remove();
64976
64977           _body = _body.enter()
64978               .append('div')
64979               .attr('class', 'tag-reference-body cf')
64980               .style('max-height', '0')
64981               .style('opacity', '0')
64982               .merge(_body);
64983
64984           if (_showing === false) {
64985               hide();
64986           }
64987       };
64988
64989
64990       tagReference.showing = function(_) {
64991           if (!arguments.length) return _showing;
64992           _showing = _;
64993           return tagReference;
64994       };
64995
64996
64997       return tagReference;
64998   }
64999
65000   function uiRawTagEditor(context) {
65001       var taginfo = services.taginfo,
65002           dispatch$$1 = dispatch('change'),
65003           _readOnlyTags = [],
65004           _showBlank = false,
65005           _updatePreference = true,
65006           _expanded = false,
65007           _newRow,
65008           _state,
65009           _preset,
65010           _tags,
65011           _entityID;
65012
65013
65014       function rawTagEditor(selection$$1) {
65015           var count = Object.keys(_tags).filter(function(d) { return d; }).length;
65016
65017           var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
65018               .title(t('inspector.all_tags') + ' (' + count + ')')
65019               .on('toggled', toggled)
65020               .updatePreference(_updatePreference)
65021               .content(content);
65022
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);
65027           }
65028
65029           selection$$1.call(disclosure);
65030
65031           function toggled(expanded) {
65032               _expanded = expanded;
65033               if (expanded) {
65034                   selection$$1.node().parentNode.scrollTop += 200;
65035               }
65036           }
65037       }
65038
65039
65040       function content(wrap) {
65041           var entries = map$3(_tags, function(v, k) {
65042               return { key: k, value: v };
65043           });
65044
65045           if (!entries.length || _showBlank) {
65046               _showBlank = false;
65047               entries.push({key: '', value: ''});
65048               _newRow = '';
65049           }
65050
65051           var list = wrap.selectAll('.tag-list')
65052               .data([0]);
65053
65054           list = list.enter()
65055               .append('ul')
65056               .attr('class', 'tag-list')
65057               .merge(list);
65058
65059           var newTag = wrap.selectAll('.add-tag')
65060               .data([0]);
65061
65062           newTag.enter()
65063               .append('button')
65064               .attr('class', 'add-tag')
65065               .on('click', addTag)
65066               .call(svgIcon('#iD-icon-plus', 'light'));
65067
65068
65069           var items = list.selectAll('.tag-row')
65070               .data(entries, function(d) { return d.key; });
65071
65072           items.exit()
65073               .each(unbind)
65074               .remove();
65075
65076           // Enter
65077
65078           var enter = items.enter()
65079               .append('li')
65080               .attr('class', 'tag-row cf')
65081               .classed('readonly', isReadOnly);
65082
65083           enter
65084               .append('div')
65085               .attr('class', 'key-wrap')
65086               .append('input')
65087               .property('type', 'text')
65088               .attr('class', 'key')
65089               .attr('maxlength', 255)
65090               .call(utilNoAuto)
65091               .on('blur', keyChange)
65092               .on('change', keyChange);
65093
65094           enter
65095               .append('div')
65096               .attr('class', 'input-wrap-position')
65097               .append('input')
65098               .property('type', 'text')
65099               .attr('class', 'value')
65100               .attr('maxlength', 255)
65101               .call(utilNoAuto)
65102               .on('blur', valueChange)
65103               .on('change', valueChange)
65104               .on('keydown.push-more', pushMore);
65105
65106           enter
65107               .append('button')
65108               .attr('tabindex', -1)
65109               .attr('class', 'remove minor')
65110               .call(svgIcon('#iD-operation-delete'));
65111
65112
65113           // Update
65114
65115           items = items
65116               .merge(enter)
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);
65121               });
65122
65123           items
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
65128
65129                   if (_entityID && taginfo) {
65130                       bindTypeahead(key, value);
65131                   }
65132
65133                   var isRelation = (_entityID && context.entity(_entityID).type === 'relation'),
65134                       reference;
65135
65136                   if (isRelation && tag.key === 'type') {
65137                       reference = uiTagReference({ rtype: tag.value }, context);
65138                   } else {
65139                       reference = uiTagReference({ key: tag.key, value: tag.value }, context);
65140                   }
65141
65142                   if (_state === 'hover') {
65143                       reference.showing(false);
65144                   }
65145
65146                   row
65147                       .call(reference.button)
65148                       .call(reference.body);
65149               });
65150
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);
65155
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);
65160
65161           items.selectAll('button.remove')
65162               .on('click', removeTag);
65163
65164
65165
65166           function isReadOnly(d) {
65167               for (var i = 0; i < _readOnlyTags.length; i++) {
65168                   if (d.key.match(_readOnlyTags[i]) !== null) {
65169                       return true;
65170                   }
65171               }
65172               return false;
65173           }
65174
65175
65176           function pushMore() {
65177               if (event.keyCode === 9 && !event.shiftKey &&
65178                   list.selectAll('li:last-child input.value').node() === this) {
65179                   addTag();
65180               }
65181           }
65182
65183
65184           function bindTypeahead(key, value) {
65185               if (isReadOnly(key.datum())) return;
65186
65187               var geometry = context.geometry(_entityID);
65188
65189               key.call(d3combobox()
65190                   .container(context.container())
65191                   .fetcher(function(value, callback) {
65192                       taginfo.keys({
65193                           debounce: true,
65194                           geometry: geometry,
65195                           query: value
65196                       }, function(err, data) {
65197                           if (!err) callback(sort(value, data));
65198                       });
65199                   }));
65200
65201               value.call(d3combobox()
65202                   .container(context.container())
65203                   .fetcher(function(value, callback) {
65204                       taginfo.values({
65205                           debounce: true,
65206                           key: utilGetSetValue(key),
65207                           geometry: geometry,
65208                           query: value
65209                       }, function(err, data) {
65210                           if (!err) callback(sort(value, data));
65211                       });
65212                   }));
65213
65214
65215               function sort(value, data) {
65216                   var sameletter = [],
65217                       other = [];
65218                   for (var i = 0; i < data.length; i++) {
65219                       if (data[i].value.substring(0, value.length) === value) {
65220                           sameletter.push(data[i]);
65221                       } else {
65222                           other.push(data[i]);
65223                       }
65224                   }
65225                   return sameletter.concat(other);
65226               }
65227           }
65228
65229
65230           function unbind() {
65231               var row = select(this);
65232
65233               row.selectAll('input.key')
65234                   .call(d3combobox.off);
65235
65236               row.selectAll('input.value')
65237                   .call(d3combobox.off);
65238           }
65239
65240
65241           function keyChange(d) {
65242               var kOld = d.key,
65243                   kNew = this.value.trim(),
65244                   tag = {};
65245
65246
65247               if (isReadOnly({ key: kNew })) {
65248                   this.value = kOld;
65249                   return;
65250               }
65251
65252               if (kNew && kNew !== kOld) {
65253                   var match = kNew.match(/^(.*?)(?:_(\d+))?$/),
65254                       base = match[1],
65255                       suffix = +(match[2] || 1);
65256                   while (_tags[kNew]) {  // rename key if already in use
65257                       kNew = base + '_' + suffix++;
65258                   }
65259
65260                   if (includes(kNew, '=')) {
65261                       var splitStr = kNew.split('=').map(function(str) { return str.trim(); }),
65262                           key = splitStr[0],
65263                           value = splitStr[1];
65264
65265                       kNew = key;
65266                       d.value = value;
65267                   }
65268               }
65269               tag[kOld] = undefined;
65270               tag[kNew] = d.value;
65271
65272               d.key = kNew; // Maintain DOM identity through the subsequent update.
65273
65274               if (_newRow === kOld) {  // see if this row is still a new row
65275                   _newRow = ((d.value === '' || kNew === '') ? kNew : undefined);
65276               }
65277
65278               this.value = kNew;
65279               dispatch$$1.call('change', this, tag);
65280           }
65281
65282
65283           function valueChange(d) {
65284               if (isReadOnly(d)) return;
65285               var tag = {};
65286               tag[d.key] = this.value;
65287
65288               if (_newRow === d.key && d.key !== '' && d.value !== '') {   // not a new row anymore
65289                   _newRow = undefined;
65290               }
65291
65292               dispatch$$1.call('change', this, tag);
65293           }
65294
65295
65296           function removeTag(d) {
65297               if (isReadOnly(d)) return;
65298               var tag = {};
65299               tag[d.key] = undefined;
65300               dispatch$$1.call('change', this, tag);
65301               select(this.parentNode).remove();
65302           }
65303
65304
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() {
65310                   _showBlank = true;
65311                   content(wrap);
65312                   list.selectAll('li:last-child input.key').node().focus();
65313               }, 1);
65314           }
65315       }
65316
65317
65318       rawTagEditor.state = function(_) {
65319           if (!arguments.length) return _state;
65320           _state = _;
65321           return rawTagEditor;
65322       };
65323
65324
65325       rawTagEditor.preset = function(_) {
65326           if (!arguments.length) return _preset;
65327           _preset = _;
65328           if (_preset.isFallback()) {
65329               _expanded = true;
65330               _updatePreference = false;
65331           } else {
65332               _expanded = undefined;
65333               _updatePreference = true;
65334           }
65335           return rawTagEditor;
65336       };
65337
65338
65339       rawTagEditor.tags = function(_) {
65340           if (!arguments.length) return _tags;
65341           _tags = _;
65342           return rawTagEditor;
65343       };
65344
65345
65346       rawTagEditor.entityID = function(_) {
65347           if (!arguments.length) return _entityID;
65348           _entityID = _;
65349           return rawTagEditor;
65350       };
65351
65352
65353       rawTagEditor.expanded = function(_) {
65354           if (!arguments.length) return _expanded;
65355           _expanded = _;
65356           _updatePreference = false;
65357           return rawTagEditor;
65358       };
65359
65360
65361       rawTagEditor.readOnlyTags = function(_) {
65362           if (!arguments.length) return _readOnlyTags;
65363           _readOnlyTags = _;
65364           return rawTagEditor;
65365       };
65366
65367
65368       return utilRebind(rawTagEditor, dispatch$$1, 'on');
65369   }
65370
65371   // This currently only works with the 'restrictions' field
65372   // It borrows some code from uiHelp
65373
65374   function uiFieldHelp(context, fieldName) {
65375       var fieldHelp = {};
65376       var _inspector = select(null);
65377       var _wrap = select(null);
65378       var _body = select(null);
65379
65380       var fieldHelpKeys = {
65381           restrictions: [
65382               ['about',[
65383                   'about',
65384                   'from_via_to',
65385                   'maxdist',
65386                   'maxvia'
65387               ]],
65388               ['inspecting',[
65389                   'about',
65390                   'from_shadow',
65391                   'allow_shadow',
65392                   'restrict_shadow',
65393                   'only_shadow',
65394                   'restricted',
65395                   'only'
65396               ]],
65397               ['modifying',[
65398                   'about',
65399                   'indicators',
65400                   'allow_turn',
65401                   'restrict_turn',
65402                   'only_turn'
65403               ]],
65404               ['tips',[
65405                   'simple',
65406                   'simple_example',
65407                   'indirect',
65408                   'indirect_example',
65409                   'indirect_noedit'
65410               ]]
65411           ]
65412       };
65413
65414       var fieldHelpHeadings = {};
65415
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')
65426       };
65427
65428
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';
65437           }, '');
65438
65439           return {
65440               key: helpkey,
65441               title: t(helpkey + '.title'),
65442               html: marked(text.trim())
65443           };
65444       });
65445
65446
65447       function show() {
65448           updatePosition();
65449
65450           _body
65451               .classed('hide', false)
65452               .style('opacity', '0')
65453               .transition()
65454               .duration(200)
65455               .style('opacity', '1');
65456       }
65457
65458
65459       function hide() {
65460           _body
65461               .classed('hide', true)
65462               .transition()
65463               .duration(200)
65464               .style('opacity', '0')
65465               .on('end', function () {
65466                   _body.classed('hide', true);
65467               });
65468       }
65469
65470
65471       function clickHelp(index) {
65472           var d = docs[index];
65473           var tkeys = fieldHelpKeys[fieldName][index][1];
65474
65475           _body.selectAll('.field-help-nav-item')
65476               .classed('active', function(d, i) { return i === index; });
65477
65478           var content = _body.selectAll('.field-help-content')
65479               .html(d.html);
65480
65481           // class the paragraphs so we can find and style them
65482           content.selectAll('p')
65483               .attr('class', function(d, i) { return tkeys[i]; });
65484
65485           // insert special content for certain help sections
65486           if (d.key === 'help.field.restrictions.inspecting') {
65487               content
65488                   .insert('img', 'p.from_shadow')
65489                   .attr('class', 'field-help-image cf')
65490                   .attr('src', context.imagePath('tr_inspect.gif'));
65491
65492           } else if (d.key === 'help.field.restrictions.modifying') {
65493               content
65494                   .insert('img', 'p.allow_turn')
65495                   .attr('class', 'field-help-image cf')
65496                   .attr('src', context.imagePath('tr_modify.gif'));
65497           }
65498       }
65499
65500
65501       fieldHelp.button = function(selection$$1) {
65502           if (_body.empty()) return;
65503
65504           var button = selection$$1.selectAll('.field-help-button')
65505               .data([0]);
65506
65507           // enter/update
65508           button.enter()
65509               .append('button')
65510               .attr('class', 'field-help-button')
65511               .attr('tabindex', -1)
65512               .call(svgIcon('#iD-icon-help'))
65513               .merge(button)
65514               .on('click', function () {
65515                   event.stopPropagation();
65516                   event.preventDefault();
65517                   if (_body.classed('hide')) {
65518                       show();
65519                   } else {
65520                       hide();
65521                   }
65522               });
65523       };
65524
65525
65526       function updatePosition() {
65527           var wrap = _wrap.node();
65528           var inspector = _inspector.node();
65529           var wRect = wrap.getBoundingClientRect();
65530           var iRect = inspector.getBoundingClientRect();
65531
65532           _body
65533               .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
65534       }
65535
65536
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;
65541
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;
65545
65546           _body = _inspector.selectAll('.field-help-body')
65547               .data([0]);
65548
65549           var enter = _body.enter()
65550               .append('div')
65551               .attr('class', 'field-help-body hide');   // initially hidden
65552
65553           var titleEnter = enter
65554               .append('div')
65555               .attr('class', 'field-help-title cf');
65556
65557           titleEnter
65558               .append('h2')
65559               .attr('class', 'fl')
65560               .text(t('help.field.' + fieldName + '.title'));
65561
65562           titleEnter
65563               .append('button')
65564               .attr('class', 'fr close')
65565               .on('click', function() {
65566                   event.stopPropagation();
65567                   event.preventDefault();
65568                   hide();
65569               })
65570               .call(svgIcon('#iD-icon-close'));
65571
65572           var navEnter = enter
65573               .append('div')
65574               .attr('class', 'field-help-nav cf');
65575
65576           var titles = docs.map(function(d) { return d.title; });
65577           navEnter.selectAll('.field-help-nav-item')
65578               .data(titles)
65579               .enter()
65580               .append('div')
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();
65586                   clickHelp(i);
65587               });
65588
65589           enter
65590               .append('div')
65591               .attr('class', 'field-help-content');
65592
65593           _body = _body
65594               .merge(enter);
65595
65596           clickHelp(0);
65597       };
65598
65599
65600       return fieldHelp;
65601   }
65602
65603   function uiFieldCheck(field, context) {
65604       var dispatch$$1 = dispatch('change');
65605       var options = field.strings && field.strings.options;
65606       var values = [];
65607       var texts = [];
65608
65609       var input = select(null);
65610       var text = select(null);
65611       var label = select(null);
65612       var reverser = select(null);
65613
65614       var _impliedYes;
65615       var _entityID;
65616       var _value;
65617
65618
65619       if (options) {
65620           for (var k in options) {
65621               values.push(k === 'undefined' ? undefined : k);
65622               texts.push(field.t('options.' + k, { 'default': options[k] }));
65623           }
65624       } else {
65625           values = [undefined, 'yes'];
65626           texts = [t('inspector.unknown'), t('inspector.check.yes')];
65627           if (field.type !== 'defaultCheck') {
65628               values.push('no');
65629               texts.push(t('inspector.check.no'));
65630           }
65631       }
65632
65633
65634       // Checks tags to see whether an undefined value is "Assumed to be Yes"
65635       function checkImpliedYes() {
65636           _impliedYes = (field.id === 'oneway_yes');
65637
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');
65646                       break;
65647                   }
65648               }
65649           }
65650       }
65651
65652
65653       function reverserHidden() {
65654           if (!select('div.inspector-hover').empty()) return true;
65655           return !(_value === 'yes' || (_impliedYes && !_value));
65656       }
65657
65658
65659       function reverserSetText(selection$$1) {
65660           var entity = context.hasEntity(_entityID);
65661           if (reverserHidden() || !entity) return selection$$1;
65662
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';
65667
65668           selection$$1.selectAll('.reverser-span')
65669               .text(t('inspector.check.reverser'))
65670               .call(svgIcon(icon, 'inline'));
65671
65672           return selection$$1;
65673       }
65674
65675
65676       var check = function(selection$$1) {
65677           checkImpliedYes();
65678           selection$$1.classed('checkselect', 'true');
65679
65680           label = selection$$1.selectAll('.preset-input-wrap')
65681               .data([0]);
65682
65683           var enter = label.enter()
65684               .append('label')
65685               .attr('class', 'preset-input-wrap');
65686
65687           enter
65688               .append('input')
65689               .property('indeterminate', field.type !== 'defaultCheck')
65690               .attr('type', 'checkbox')
65691               .attr('id', 'preset-input-' + field.safeid);
65692
65693           enter
65694               .append('span')
65695               .text(texts[0])
65696               .attr('class', 'value');
65697
65698           if (field.type === 'onewayCheck') {
65699               enter
65700                   .append('a')
65701                   .attr('id', 'preset-input-' + field.safeid + '-reverser')
65702                   .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
65703                   .attr('href', '#')
65704                   .append('span')
65705                   .attr('class', 'reverser-span');
65706           }
65707
65708           label = label.merge(enter);
65709           input = label.selectAll('input');
65710           text = label.selectAll('span.value');
65711
65712           input
65713               .on('click', function() {
65714                   event.stopPropagation();
65715                   var t$$1 = {};
65716                   t$$1[field.key] = values[(values.indexOf(_value) + 1) % values.length];
65717
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];
65722                   }
65723
65724                   dispatch$$1.call('change', this, t$$1);
65725               });
65726
65727           if (field.type === 'onewayCheck') {
65728               reverser = label.selectAll('.reverser');
65729
65730               reverser
65731                   .call(reverserSetText)
65732                   .on('click', function() {
65733                       event.preventDefault();
65734                       event.stopPropagation();
65735                       context.perform(
65736                           actionReverse(_entityID),
65737                           t('operations.reverse.annotation')
65738                       );
65739                       select(this)
65740                           .call(reverserSetText);
65741                   });
65742           }
65743       };
65744
65745
65746       check.entity = function(_) {
65747           if (!arguments.length) return context.hasEntity(_entityID);
65748           _entityID = _.id;
65749           return check;
65750       };
65751
65752
65753       check.tags = function(tags) {
65754
65755           function isChecked(val) {
65756               return val !== 'no' && val !== '' && val !== undefined && val !== null;
65757           }
65758
65759           function textFor(val) {
65760               if (val === '') val = undefined;
65761               var index = values.indexOf(val);
65762               return (index !== -1 ? texts[index] : ('"' + val + '"'));
65763           }
65764
65765           checkImpliedYes();
65766           _value = tags[field.key] && tags[field.key].toLowerCase();
65767
65768           if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
65769               _value = 'yes';
65770           }
65771
65772           input
65773               .property('indeterminate', field.type !== 'defaultCheck' && !_value)
65774               .property('checked', isChecked(_value));
65775
65776           text
65777               .text(textFor(_value));
65778
65779           label
65780               .classed('set', !!_value);
65781
65782           if (field.type === 'onewayCheck') {
65783               reverser
65784                   .classed('hide', reverserHidden())
65785                   .call(reverserSetText);
65786           }
65787       };
65788
65789
65790       check.focus = function() {
65791           input.node().focus();
65792       };
65793
65794       return utilRebind(check, dispatch$$1, 'on');
65795   }
65796
65797   /** Used for built-in method references. */
65798   var arrayProto$1 = Array.prototype;
65799
65800   /** Built-in value references. */
65801   var splice$1 = arrayProto$1.splice;
65802
65803   /**
65804    * The base implementation of `_.pullAt` without support for individual
65805    * indexes or capturing the removed elements.
65806    *
65807    * @private
65808    * @param {Array} array The array to modify.
65809    * @param {number[]} indexes The indexes of elements to remove.
65810    * @returns {Array} Returns `array`.
65811    */
65812   function basePullAt(array, indexes) {
65813     var length = array ? indexes.length : 0,
65814         lastIndex = length - 1;
65815
65816     while (length--) {
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);
65822         } else {
65823           baseUnset(array, index);
65824         }
65825       }
65826     }
65827     return array;
65828   }
65829
65830   /**
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).
65834    *
65835    * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
65836    * to pull elements from an array by value.
65837    *
65838    * @static
65839    * @memberOf _
65840    * @since 2.0.0
65841    * @category Array
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.
65845    * @example
65846    *
65847    * var array = [1, 2, 3, 4];
65848    * var evens = _.remove(array, function(n) {
65849    *   return n % 2 == 0;
65850    * });
65851    *
65852    * console.log(array);
65853    * // => [1, 3]
65854    *
65855    * console.log(evens);
65856    * // => [2, 4]
65857    */
65858   function remove$8(array, predicate) {
65859     var result = [];
65860     if (!(array && array.length)) {
65861       return result;
65862     }
65863     var index = -1,
65864         indexes = [],
65865         length = array.length;
65866
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);
65873       }
65874     }
65875     basePullAt(array, indexes);
65876     return result;
65877   }
65878
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),
65894           comboData = [],
65895           multiData = [],
65896           container,
65897           input,
65898           entity,
65899           country;
65900
65901       // ensure multiCombo field.key ends with a ':'
65902       if (isMulti && field.key.match(/:$/) === null) {
65903           field.key += ':';
65904       }
65905
65906
65907       function snake(s) {
65908           return s.replace(/\s+/g, '_');
65909       }
65910
65911       function unsnake(s) {
65912           return s.replace(/_+/g, ' ');
65913       }
65914
65915       function clean(s) {
65916           return s.split(';')
65917               .map(function(s) { return s.trim(); })
65918               .join(';');
65919       }
65920
65921
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 || '');
65926
65927           if (optstrings) {
65928               var match = find$1(comboData, function(o) {
65929                   return o.key && clean(o.value) === dval;
65930               });
65931               if (match) {
65932                   return match.key;
65933               }
65934           }
65935
65936           if (field.type === 'typeCombo' && !dval) {
65937               return 'yes';
65938           }
65939
65940           return (snake_case ? snake(dval) : dval) || undefined;
65941       }
65942
65943
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) {
65947           tval = tval || '';
65948
65949           if (optstrings) {
65950               var match = find$1(comboData, function(o) { return o.key === tval && o.value; });
65951               if (match) {
65952                   return match.value;
65953               }
65954           }
65955
65956           if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
65957               return '';
65958           }
65959
65960           return snake_case ? unsnake(tval) : tval;
65961       }
65962
65963
65964       function objectDifference(a, b) {
65965           return reject(a, function(d1) {
65966               return some(b, function(d2) { return d1.value === d2.value; });
65967           });
65968       }
65969
65970
65971       function initCombo(selection$$1, attachTo) {
65972           if (optstrings) {
65973               selection$$1.attr('readonly', 'readonly');
65974               selection$$1.call(combobox, attachTo);
65975               setStaticValues(setPlaceholder);
65976
65977           } else if (optarray) {
65978               selection$$1.call(combobox, attachTo);
65979               setStaticValues(setPlaceholder);
65980
65981           } else if (taginfo) {
65982               selection$$1.call(combobox.fetcher(setTaginfoValues), attachTo);
65983               setTaginfoValues('', setPlaceholder);
65984           }
65985       }
65986
65987
65988       function setStaticValues(callback) {
65989           if (!(optstrings || optarray)) return;
65990
65991           if (optstrings) {
65992               comboData = Object.keys(optstrings).map(function(k) {
65993                   var v = field.t('options.' + k, { 'default': optstrings[k] });
65994                   return {
65995                       key: k,
65996                       value: v,
65997                       title: v
65998                   };
65999               });
66000
66001           } else if (optarray) {
66002               comboData = optarray.map(function(k) {
66003                   var v = snake_case ? unsnake(k) : k;
66004                   return {
66005                       key: k,
66006                       value: v,
66007                       title: v
66008                   };
66009               });
66010           }
66011
66012           combobox.data(objectDifference(comboData, multiData));
66013           if (callback) callback(comboData);
66014       }
66015
66016
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 + ':';
66023           }
66024
66025           var params = {
66026               debounce: (q !== ''),
66027               key: field.key,
66028               query: query
66029           };
66030
66031           if (entity) {
66032               params.geometry = context.geometry(entity.id);
66033           }
66034
66035           taginfo[fn](params, function(err, data) {
66036               if (err) return;
66037               if (hasCountryPrefix) {
66038                   data = filter(data, function(d) {
66039                       return d.value.toLowerCase().indexOf(country + ':') === 0;
66040                   });
66041               }
66042
66043               comboData = map$3(data, function(d) {
66044                   var k = d.value;
66045                   if (isMulti) k = k.replace(field.key, '');
66046                   var v = snake_case ? unsnake(k) : k;
66047                   return {
66048                       key: k,
66049                       value: v,
66050                       title: isMulti ? v : d.title
66051                   };
66052               });
66053
66054               comboData = objectDifference(comboData, multiData);
66055               if (callback) callback(comboData);
66056           });
66057       }
66058
66059
66060       function setPlaceholder(d) {
66061           var ph;
66062
66063           if (isMulti || isSemi) {
66064               ph = field.placeholder() || t('inspector.add');
66065           } else {
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(', ');
66069           }
66070
66071           if (ph.match(/(…|\.\.\.)$/) === null) {
66072               ph += '…';
66073           }
66074
66075           container.selectAll('input')
66076               .attr('placeholder', ph);
66077       }
66078
66079
66080       function change() {
66081           var val = tagValue(utilGetSetValue(input)),
66082               t$$1 = {};
66083
66084           if (isMulti || isSemi) {
66085               if (!val) return;
66086               container.classed('active', false);
66087               utilGetSetValue(input, '');
66088               if (isMulti) {
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; });
66093                   arr.push(val);
66094                   t$$1[field.key] = compact(uniq(arr)).join(';');
66095               }
66096               window.setTimeout(function() { input.node().focus(); }, 10);
66097
66098           } else {
66099               t$$1[field.key] = val;
66100           }
66101
66102           dispatch$$1.call('change', this, t$$1);
66103       }
66104
66105
66106       function removeMultikey(d) {
66107           event.stopPropagation();
66108           var t$$1 = {};
66109           if (isMulti) {
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;
66116           }
66117           dispatch$$1.call('change', this, t$$1);
66118       }
66119
66120
66121       function combo(selection$$1) {
66122           if (isMulti || isSemi) {
66123               container = selection$$1.selectAll('ul').data([0]);
66124
66125               container = container.enter()
66126                   .append('ul')
66127                   .attr('class', 'form-field-multicombo')
66128                   .on('click', function() {
66129                       window.setTimeout(function() { input.node().focus(); }, 10);
66130                   })
66131                   .merge(container);
66132
66133           } else {
66134               container = selection$$1;
66135           }
66136
66137           input = container.selectAll('input')
66138               .data([0]);
66139
66140           input = input.enter()
66141               .append('input')
66142               .attr('type', 'text')
66143               .attr('id', 'preset-input-' + field.safeid)
66144               .call(utilNoAuto)
66145               .call(initCombo, selection$$1)
66146               .merge(input);
66147
66148           if (isNetwork && nominatim && entity) {
66149               var center = entity.extent(context.graph()).center();
66150               nominatim.countryCode(center, function (err, code) {
66151                   country = code;
66152               });
66153           }
66154
66155           input
66156               .on('change', change)
66157               .on('blur', change);
66158
66159           if (isMulti || isSemi) {
66160               combobox
66161                   .on('accept', function() {
66162                       input.node().blur();
66163                       input.node().focus();
66164                   });
66165
66166               input
66167                   .on('focus', function() { container.classed('active', true); });
66168           }
66169       }
66170
66171
66172       combo.tags = function(tags) {
66173           if (isMulti || isSemi) {
66174               multiData = [];
66175
66176               if (isMulti) {
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;
66180
66181                       var suffix = key.substring(field.key.length);
66182                       multiData.push({
66183                           key: key,
66184                           value: displayValue(suffix)
66185                       });
66186                   });
66187
66188                   // Set keys for form-field modified (needed for undo and reset buttons)..
66189                   field.keys = map$3(multiData, 'key');
66190
66191               } else if (isSemi) {
66192                   var arr = compact(uniq((tags[field.key] || '').split(';')));
66193                   multiData = arr.map(function(key) {
66194                       return {
66195                           key: key,
66196                           value: displayValue(key)
66197                       };
66198                   });
66199               }
66200
66201               // Exclude existing multikeys from combo options..
66202               var available = objectDifference(comboData, multiData);
66203               combobox.data(available);
66204
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);
66209
66210
66211               // Render chips
66212               var chips = container.selectAll('.chips')
66213                   .data(multiData);
66214
66215               chips.exit()
66216                   .remove();
66217
66218               var enter = chips.enter()
66219                   .insert('li', 'input')
66220                   .attr('class', 'chips');
66221
66222               enter.append('span');
66223               enter.append('a');
66224
66225               chips = chips.merge(enter);
66226
66227               chips.select('span')
66228                   .text(function(d) { return d.value; });
66229
66230               chips.select('a')
66231                   .on('click', removeMultikey)
66232                   .attr('class', 'remove')
66233                   .text('×');
66234
66235           } else {
66236               utilGetSetValue(input, displayValue(tags[field.key]));
66237           }
66238       };
66239
66240
66241       combo.focus = function() {
66242           input.node().focus();
66243       };
66244
66245
66246       combo.entity = function(_) {
66247           if (!arguments.length) return entity;
66248           entity = _;
66249           return combo;
66250       };
66251
66252
66253       return utilRebind(combo, dispatch$$1, 'on');
66254   }
66255
66256   function uiFieldText(field, context) {
66257       var dispatch$$1 = dispatch('change');
66258       var nominatim = services.geocoder;
66259       var input;
66260       var entity;
66261
66262
66263       function i(selection$$1) {
66264           var fieldId = 'preset-input-' + field.safeid;
66265
66266           input = selection$$1.selectAll('input')
66267               .data([0]);
66268
66269           input = input.enter()
66270               .append('input')
66271               .attr('type', field.type)
66272               .attr('id', fieldId)
66273               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
66274               .call(utilNoAuto)
66275               .merge(input);
66276
66277           input
66278               .on('input', change(true))
66279               .on('blur', change())
66280               .on('change', change());
66281
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]);
66288               });
66289
66290           } else if (field.type === 'number') {
66291               var rtl = (textDirection === 'rtl');
66292
66293               input.attr('type', 'text');
66294
66295               var spinControl = selection$$1.selectAll('.spin-control')
66296                   .data([0]);
66297
66298               var enter = spinControl.enter()
66299                   .append('div')
66300                   .attr('class', 'spin-control');
66301
66302               enter
66303                   .append('button')
66304                   .datum(rtl ? 1 : -1)
66305                   .attr('class', rtl ? 'increment' : 'decrement')
66306                   .attr('tabindex', -1);
66307
66308               enter
66309                   .append('button')
66310                   .datum(rtl ? -1 : 1)
66311                   .attr('class', rtl ? 'decrement' : 'increment')
66312                   .attr('tabindex', -1);
66313
66314               spinControl = spinControl
66315                   .merge(enter);
66316
66317               spinControl.selectAll('button')
66318                   .on('click', function(d) {
66319                       event.preventDefault();
66320                       input.node().value = parsed(input.node().value) + d;
66321                       change()();
66322                   });
66323           }
66324       }
66325
66326
66327       // parse as a number
66328       function parsed(val) {
66329           return parseInt(val || 0, 10) || 0;
66330       }
66331
66332       // clamp number to min/max
66333       function clamped(num) {
66334           if (field.minValue !== undefined) {
66335               num = Math.max(num, field.minValue);
66336           }
66337           if (field.maxValue !== undefined) {
66338               num = Math.min(num, field.maxValue);
66339           }
66340           return num;
66341       }
66342
66343
66344       function change(onInput) {
66345           return function() {
66346               var t$$1 = {};
66347               var val = utilGetSetValue(input).trim() || undefined;
66348
66349               if (!onInput) {
66350                   if (field.type === 'number' && val !== undefined) {
66351                       val = clamped(parsed(val)) + '';
66352                   }
66353                   utilGetSetValue(input, val || '');
66354               }
66355               t$$1[field.key] = val;
66356               dispatch$$1.call('change', this, t$$1, onInput);
66357           };
66358       }
66359
66360
66361       i.entity = function(_) {
66362           if (!arguments.length) return entity;
66363           entity = _;
66364           return i;
66365       };
66366
66367
66368       i.tags = function(tags) {
66369           utilGetSetValue(input, tags[field.key] || '');
66370       };
66371
66372
66373       i.focus = function() {
66374           var node = input.node();
66375           if (node) node.focus();
66376       };
66377
66378       return utilRebind(i, dispatch$$1, 'on');
66379   }
66380
66381   function uiFieldAccess(field, context) {
66382       var dispatch$$1 = dispatch('change'),
66383           items;
66384
66385       function access(selection$$1) {
66386           var wrap = selection$$1.selectAll('.preset-input-wrap')
66387               .data([0]);
66388
66389           wrap = wrap.enter()
66390               .append('div')
66391               .attr('class', 'cf preset-input-wrap')
66392               .append('ul')
66393               .merge(wrap);
66394
66395           var list = wrap.selectAll('ul')
66396               .data([0]);
66397
66398           list = list.enter()
66399               .append('ul')
66400               .merge(list);
66401
66402
66403           items = list.selectAll('li')
66404               .data(field.keys);
66405
66406           // Enter
66407           var enter = items.enter()
66408               .append('li')
66409               .attr('class', function(d) { return 'cf preset-access-' + d; });
66410
66411           enter
66412               .append('span')
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); });
66416
66417           enter
66418               .append('div')
66419               .attr('class', 'col6 preset-input-access-wrap')
66420               .append('input')
66421               .attr('type', 'text')
66422               .attr('class', 'preset-input-access')
66423               .attr('id', function(d) { return 'preset-input-access-' + d; })
66424               .call(utilNoAuto)
66425               .each(function(d) {
66426                   select(this)
66427                       .call(d3combobox()
66428                           .container(context.container())
66429                           .data(access.options(d))
66430                       );
66431               });
66432
66433
66434           // Update
66435           items = items.merge(enter);
66436
66437           wrap.selectAll('.preset-input-access')
66438               .on('change', change)
66439               .on('blur', change);
66440       }
66441
66442
66443       function change(d) {
66444           var tag = {};
66445           tag[d] = utilGetSetValue(select(this)) || undefined;
66446           dispatch$$1.call('change', this, tag);
66447       }
66448
66449
66450       access.options = function(type) {
66451           var options = ['no', 'permissive', 'private', 'destination'];
66452
66453           if (type !== 'access') {
66454               options.unshift('yes');
66455               options.push('designated');
66456
66457               if (type === 'bicycle') {
66458                   options.push('dismount');
66459               }
66460           }
66461
66462           return options.map(function(option) {
66463               return {
66464                   title: field.t('options.' + option + '.description'),
66465                   value: option
66466               };
66467           });
66468       };
66469
66470
66471       var placeholders = {
66472           footway: {
66473               foot: 'designated',
66474               motor_vehicle: 'no'
66475           },
66476           steps: {
66477               foot: 'yes',
66478               motor_vehicle: 'no',
66479               bicycle: 'no',
66480               horse: 'no'
66481           },
66482           pedestrian: {
66483               foot: 'yes',
66484               motor_vehicle: 'no'
66485           },
66486           cycleway: {
66487               motor_vehicle: 'no',
66488               bicycle: 'designated'
66489           },
66490           bridleway: {
66491               motor_vehicle: 'no',
66492               horse: 'designated'
66493           },
66494           path: {
66495               foot: 'yes',
66496               motor_vehicle: 'no',
66497               bicycle: 'yes',
66498               horse: 'yes'
66499           },
66500           motorway: {
66501               foot: 'no',
66502               motor_vehicle: 'yes',
66503               bicycle: 'no',
66504               horse: 'no'
66505           },
66506           trunk: {
66507               motor_vehicle: 'yes'
66508           },
66509           primary: {
66510               foot: 'yes',
66511               motor_vehicle: 'yes',
66512               bicycle: 'yes',
66513               horse: 'yes'
66514           },
66515           secondary: {
66516               foot: 'yes',
66517               motor_vehicle: 'yes',
66518               bicycle: 'yes',
66519               horse: 'yes'
66520           },
66521           tertiary: {
66522               foot: 'yes',
66523               motor_vehicle: 'yes',
66524               bicycle: 'yes',
66525               horse: 'yes'
66526           },
66527           residential: {
66528               foot: 'yes',
66529               motor_vehicle: 'yes',
66530               bicycle: 'yes',
66531               horse: 'yes'
66532           },
66533           unclassified: {
66534               foot: 'yes',
66535               motor_vehicle: 'yes',
66536               bicycle: 'yes',
66537               horse: 'yes'
66538           },
66539           service: {
66540               foot: 'yes',
66541               motor_vehicle: 'yes',
66542               bicycle: 'yes',
66543               horse: 'yes'
66544           },
66545           motorway_link: {
66546               foot: 'no',
66547               motor_vehicle: 'yes',
66548               bicycle: 'no',
66549               horse: 'no'
66550           },
66551           trunk_link: {
66552               motor_vehicle: 'yes'
66553           },
66554           primary_link: {
66555               foot: 'yes',
66556               motor_vehicle: 'yes',
66557               bicycle: 'yes',
66558               horse: 'yes'
66559           },
66560           secondary_link: {
66561               foot: 'yes',
66562               motor_vehicle: 'yes',
66563               bicycle: 'yes',
66564               horse: 'yes'
66565           },
66566           tertiary_link: {
66567               foot: 'yes',
66568               motor_vehicle: 'yes',
66569               bicycle: 'yes',
66570               horse: 'yes'
66571           }
66572       };
66573
66574
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();
66580               });
66581
66582           items.selectAll('#preset-input-access-access')
66583               .attr('placeholder', 'yes');
66584
66585           forEach(placeholders[tags.highway], function(v, k) {
66586               items.selectAll('#preset-input-access-' + k)
66587                   .attr('placeholder', function() { return (tags.access || v); });
66588           });
66589       };
66590
66591
66592       access.focus = function() {
66593           items.selectAll('.preset-input-access')
66594               .node().focus();
66595       };
66596
66597
66598       return utilRebind(access, dispatch$$1, 'on');
66599   }
66600
66601   function uiFieldAddress(field, context) {
66602       var dispatch$$1 = dispatch('init', 'change'),
66603           nominatim = services.geocoder,
66604           wrap = select(null),
66605           isInitialized = false,
66606           entity;
66607
66608       function getNearStreets() {
66609           var extent = entity.extent(context.graph()),
66610               l = extent.center(),
66611               box = geoExtent$$1(l).padByMeters(200);
66612
66613           var streets = context.intersects(box)
66614               .filter(isAddressable)
66615               .map(function(d) {
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);
66620                   return {
66621                       title: d.tags.name,
66622                       value: d.tags.name,
66623                       dist: choice.distance
66624                   };
66625               })
66626               .sort(function(a, b) {
66627                   return a.dist - b.dist;
66628               });
66629
66630           return uniqBy(streets, 'value');
66631
66632           function isAddressable(d) {
66633               return d.tags.highway && d.tags.name && d.type === 'way';
66634           }
66635       }
66636
66637
66638       function getNearCities() {
66639           var extent = entity.extent(context.graph()),
66640               l = extent.center(),
66641               box = geoExtent$$1(l).padByMeters(200);
66642
66643           var cities = context.intersects(box)
66644               .filter(isAddressable)
66645               .map(function(d) {
66646                   return {
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)
66650                   };
66651               })
66652               .sort(function(a, b) {
66653                   return a.dist - b.dist;
66654               });
66655
66656           return uniqBy(cities, 'value');
66657
66658
66659           function isAddressable(d) {
66660               if (d.tags.name) {
66661                   if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative')
66662                       return true;
66663                   if (d.tags.border_type === 'city')
66664                       return true;
66665                   if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village')
66666                       return true;
66667               }
66668
66669               if (d.tags['addr:city'])
66670                   return true;
66671
66672               return false;
66673           }
66674       }
66675
66676       function getNearValues(key) {
66677           var extent = entity.extent(context.graph()),
66678               l = extent.center(),
66679               box = geoExtent$$1(l).padByMeters(200);
66680
66681           var results = context.intersects(box)
66682               .filter(function hasTag(d) {
66683                   return d.tags[key];
66684               })
66685               .map(function(d) {
66686                   return {
66687                       title: d.tags[key],
66688                       value: d.tags[key],
66689                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
66690                   };
66691               })
66692               .sort(function(a, b) {
66693                   return a.dist - b.dist;
66694               });
66695
66696           return uniqBy(results, 'value');
66697       }
66698
66699
66700       function initCallback(err, countryCode) {
66701           if (err) return;
66702
66703           var addressFormat = find$1(dataAddressFormats, function (a) {
66704               return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
66705           }) || dataAddressFormats[0];
66706
66707           var widths = addressFormat.widths || {
66708               housenumber: 1/3, street: 2/3,
66709               city: 2/3, state: 1/4, postcode: 1/3
66710           };
66711
66712           function row(r) {
66713               // Normalize widths.
66714               var total = reduce(r, function(sum, field) {
66715                   return sum + (widths[field] || 0.5);
66716               }, 0);
66717
66718               return r.map(function (field) {
66719                   return {
66720                       id: field,
66721                       width: (widths[field] || 0.5) / total
66722                   };
66723               });
66724           }
66725
66726           wrap.selectAll('div.addr-row')
66727               .data(addressFormat.format)
66728               .enter()
66729               .append('div')
66730               .attr('class', 'addr-row')
66731               .selectAll('input')
66732               .data(row)
66733               .enter()
66734               .append('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);
66740               })
66741               .attr('class', function (d) { return 'addr-' + d.id; })
66742               .call(utilNoAuto)
66743               .style('width', function (d) { return d.width * 100 + '%'; });
66744
66745           // Update
66746
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'
66752           ];
66753
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
66758                       : getNearValues;
66759
66760               wrap.selectAll('input.addr-' + tag)
66761                   .call(d3combobox()
66762                       .container(context.container())
66763                       .minItems(1)
66764                       .fetcher(function(value, callback) {
66765                           callback(nearValues('addr:' + tag));
66766                       })
66767                   );
66768           });
66769
66770           wrap.selectAll('input')
66771               .on('blur', change())
66772               .on('change', change());
66773
66774           wrap.selectAll('input:not(.combobox-input)')
66775               .on('input', change(true));
66776
66777           dispatch$$1.call('init');
66778           isInitialized = true;
66779       }
66780
66781
66782       function address(selection$$1) {
66783           isInitialized = false;
66784
66785           wrap = selection$$1.selectAll('.preset-input-wrap')
66786               .data([0]);
66787
66788           wrap = wrap.enter()
66789               .append('div')
66790               .attr('class', 'preset-input-wrap')
66791               .merge(wrap);
66792
66793           if (nominatim && entity) {
66794               var center = entity.extent(context.graph()).center();
66795               nominatim.countryCode(center, initCallback);
66796           }
66797       }
66798
66799
66800       function change(onInput) {
66801           return function() {
66802               var tags = {};
66803
66804               wrap.selectAll('input')
66805                   .each(function (field) {
66806                       tags['addr:' + field.id] = this.value || undefined;
66807                   });
66808
66809               dispatch$$1.call('change', this, tags, onInput);
66810           };
66811       }
66812
66813
66814       function updateTags(tags) {
66815           utilGetSetValue(wrap.selectAll('input'), function (field) {
66816               return tags['addr:' + field.id] || '';
66817           });
66818       }
66819
66820
66821       address.entity = function(_) {
66822           if (!arguments.length) return entity;
66823           entity = _;
66824           return address;
66825       };
66826
66827
66828       address.tags = function(tags) {
66829           if (isInitialized) {
66830               updateTags(tags);
66831           } else {
66832               dispatch$$1.on('init', function () {
66833                   dispatch$$1.on('init', null);
66834                   updateTags(tags);
66835               });
66836           }
66837       };
66838
66839
66840       address.focus = function() {
66841           var node = wrap.selectAll('input').node();
66842           if (node) node.focus();
66843       };
66844
66845
66846       return utilRebind(address, dispatch$$1, 'on');
66847   }
66848
66849   function uiFieldCycleway(field, context) {
66850       var dispatch$$1 = dispatch('change'),
66851           items = select(null);
66852
66853
66854       function cycleway(selection$$1) {
66855
66856           function stripcolon(s) {
66857               return s.replace(':', '');
66858           }
66859
66860
66861           var wrap = selection$$1.selectAll('.preset-input-wrap')
66862               .data([0]);
66863
66864           wrap = wrap.enter()
66865               .append('div')
66866               .attr('class', 'cf preset-input-wrap')
66867               .merge(wrap);
66868
66869
66870           var div = wrap.selectAll('ul')
66871               .data([0]);
66872
66873           div = div.enter()
66874               .append('ul')
66875               .merge(div);
66876
66877
66878           items = div.selectAll('li')
66879               .data(field.keys);
66880
66881           var enter = items.enter()
66882               .append('li')
66883               .attr('class', function(d) { return 'cf preset-cycleway-' + stripcolon(d); });
66884
66885           enter
66886               .append('span')
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); });
66890
66891           enter
66892               .append('div')
66893               .attr('class', 'col6 preset-input-cycleway-wrap')
66894               .append('input')
66895               .attr('type', 'text')
66896               .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
66897               .call(utilNoAuto)
66898               .each(function(d) {
66899                   select(this)
66900                       .call(d3combobox()
66901                           .container(context.container())
66902                           .data(cycleway.options(d))
66903                       );
66904               });
66905
66906
66907           // Update
66908           wrap.selectAll('.preset-input-cycleway')
66909               .on('change', change)
66910               .on('blur', change);
66911       }
66912
66913
66914       function change() {
66915           var left = utilGetSetValue(select('.preset-input-cyclewayleft')),
66916               right = utilGetSetValue(select('.preset-input-cyclewayright')),
66917               tag = {};
66918
66919           if (left === 'none' || left === '') { left = undefined; }
66920           if (right === 'none' || right === '') { right = undefined; }
66921
66922           // Always set both left and right as changing one can affect the other
66923           tag = {
66924               cycleway: undefined,
66925               'cycleway:left': left,
66926               'cycleway:right': right
66927           };
66928
66929           // If the left and right tags match, use the cycleway tag to tag both
66930           // sides the same way
66931           if (left === right) {
66932               tag = {
66933                   cycleway: left,
66934                   'cycleway:left': undefined,
66935                   'cycleway:right': undefined
66936               };
66937           }
66938
66939           dispatch$$1.call('change', this, tag);
66940       }
66941
66942
66943       cycleway.options = function() {
66944           return keys$1(field.strings.options).map(function(option) {
66945               return {
66946                   title: field.t('options.' + option + '.description'),
66947                   value: option
66948               };
66949           });
66950       };
66951
66952
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;
66958                   }
66959                   return tags[d] || '';
66960               })
66961               .attr('placeholder', field.placeholder());
66962       };
66963
66964
66965       cycleway.focus = function() {
66966           items.selectAll('.preset-input-cycleway')
66967               .node().focus();
66968       };
66969
66970
66971       return utilRebind(cycleway, dispatch$$1, 'on');
66972   }
66973
66974   function uiFieldLanes(field, context) {
66975       var dispatch$$1 = dispatch('change'),
66976           LANE_WIDTH = 40,
66977           LANE_HEIGHT = 200,
66978           wayID,
66979           lanesData;
66980
66981       function lanes(selection$$1) {
66982           lanesData = context.entity(wayID).lanes();
66983
66984           if (!select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
66985               selection$$1.call(lanes.off);
66986               return;
66987           }
66988
66989           var wrap = selection$$1.selectAll('.preset-input-wrap')
66990               .data([0]);
66991
66992           wrap = wrap.enter()
66993               .append('div')
66994               .attr('class', 'preset-input-wrap')
66995               .merge(wrap);
66996
66997           var surface =  wrap.selectAll('.surface')
66998               .data([0]);
66999
67000           var d = utilGetDimensions(wrap);
67001           var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
67002
67003           surface = surface.enter()
67004               .append('svg')
67005               .attr('width', d[0])
67006               .attr('height', 300)
67007               .attr('class', 'surface')
67008               .merge(surface);
67009
67010
67011           var lanesSelection = surface.selectAll('.lanes')
67012               .data([0]);
67013
67014           lanesSelection = lanesSelection.enter()
67015               .append('g')
67016               .attr('class', 'lanes')
67017               .merge(lanesSelection);
67018
67019           lanesSelection
67020               .attr('transform', function () {
67021                   return 'translate(' + (freeSpace / 2) + ', 0)';
67022               });
67023
67024
67025           var lane = lanesSelection.selectAll('.lane')
67026              .data(lanesData.lanes);
67027
67028           lane.exit()
67029               .remove();
67030
67031           var enter = lane.enter()
67032               .append('g')
67033               .attr('class', 'lane');
67034
67035           enter
67036               .append('g')
67037               .append('rect')
67038               .attr('y', 50)
67039               .attr('width', LANE_WIDTH)
67040               .attr('height', LANE_HEIGHT);
67041
67042           enter
67043               .append('g')
67044               .attr('class', 'forward')
67045               .append('text')
67046               .attr('y', 40)
67047               .attr('x', 14)
67048               .text('▲');
67049
67050           enter
67051               .append('g')
67052               .attr('class', 'bothways')
67053               .append('text')
67054               .attr('y', 40)
67055               .attr('x', 14)
67056               .text('▲▼');
67057
67058           enter
67059               .append('g')
67060               .attr('class', 'backward')
67061               .append('text')
67062               .attr('y', 40)
67063               .attr('x', 14)
67064               .text('▼');
67065
67066
67067           lane = lane
67068               .merge(enter);
67069
67070           lane
67071               .attr('transform', function(d) {
67072                   return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
67073               });
67074
67075           lane.select('.forward')
67076               .style('visibility', function(d) {
67077                   return d.direction === 'forward' ? 'visible' : 'hidden';
67078               });
67079
67080           lane.select('.bothways')
67081               .style('visibility', function(d) {
67082                   return d.direction === 'bothways' ? 'visible' : 'hidden';
67083               });
67084
67085           lane.select('.backward')
67086               .style('visibility', function(d) {
67087                   return d.direction === 'backward' ? 'visible' : 'hidden';
67088               });
67089       }
67090
67091
67092       lanes.entity = function(_) {
67093           if (!wayID || wayID !== _.id) {
67094               wayID = _.id;
67095           }
67096       };
67097
67098       lanes.tags = function() {};
67099       lanes.focus = function() {};
67100       lanes.off = function() {};
67101
67102       return utilRebind(lanes, dispatch$$1, 'on');
67103   }
67104
67105   function uiFieldLocalized(field, context) {
67106       var dispatch$$1 = dispatch('change', 'input'),
67107           wikipedia = services.wikipedia,
67108           input = select(null),
67109           localizedInputs = select(null),
67110           wikiTitles,
67111           entity;
67112
67113
67114       function localized(selection$$1) {
67115           input = selection$$1.selectAll('.localized-main')
67116               .data([0]);
67117
67118           input = input.enter()
67119               .append('input')
67120               .attr('type', 'text')
67121               .attr('id', 'preset-input-' + field.safeid)
67122               .attr('class', 'localized-main')
67123               .attr('placeholder', field.placeholder())
67124               .call(utilNoAuto)
67125               .merge(input);
67126
67127           if (field.id === 'name') {
67128               var preset = context.presets().match(entity, context.graph());
67129               input
67130                   .call(d3combobox()
67131                       .container(context.container())
67132                       .fetcher(utilSuggestNames(preset, dataSuggestions))
67133                   );
67134           }
67135
67136           input
67137               .on('input', change(true))
67138               .on('blur', change())
67139               .on('change', change());
67140
67141
67142           var translateButton = selection$$1.selectAll('.localized-add')
67143               .data([0]);
67144
67145           translateButton = translateButton.enter()
67146               .append('button')
67147               .attr('class', 'button-input-action localized-add minor')
67148               .attr('tabindex', -1)
67149               .call(svgIcon('#iD-icon-plus'))
67150               .call(tooltip()
67151                   .title(t('translate.translate'))
67152                   .placement('left'))
67153               .merge(translateButton);
67154
67155           translateButton
67156               .on('click', addNew);
67157
67158
67159           localizedInputs = selection$$1.selectAll('.localized-wrap')
67160               .data([0]);
67161
67162           localizedInputs = localizedInputs.enter().append('div')
67163               .attr('class', 'localized-wrap')
67164               .merge(localizedInputs);
67165       }
67166
67167
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) {
67175               defaultLang = '';
67176           }
67177           data$$1.push({ lang: defaultLang, value: '' });
67178           localizedInputs.call(render, data$$1);
67179       }
67180
67181
67182       function change(onInput) {
67183           return function() {
67184               var t$$1 = {};
67185               t$$1[field.key] = utilGetSetValue(select(this)) || undefined;
67186               dispatch$$1.call('change', this, t$$1, onInput);
67187           };
67188       }
67189
67190
67191       function key(lang) {
67192           return field.key + ':' + lang;
67193       }
67194
67195
67196       function changeLang(d) {
67197           var lang = utilGetSetValue(select(this)),
67198               t$$1 = {},
67199               language = find$1(wikipedia$2, function(d) {
67200                   return d[0].toLowerCase() === lang.toLowerCase() ||
67201                       d[1].toLowerCase() === lang.toLowerCase();
67202               });
67203
67204           if (language) lang = language[2];
67205
67206           if (d.lang && d.lang !== lang) {
67207               t$$1[key(d.lang)] = undefined;
67208           }
67209
67210           var value = utilGetSetValue(select(this.parentNode)
67211               .selectAll('.localized-value'));
67212
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];
67217           }
67218
67219           d.lang = lang;
67220           dispatch$$1.call('change', this, t$$1);
67221       }
67222
67223
67224       function changeValue(d) {
67225           if (!d.lang) return;
67226           var t$$1 = {};
67227           t$$1[key(d.lang)] = utilGetSetValue(select(this)) || undefined;
67228           dispatch$$1.call('change', this, t$$1);
67229       }
67230
67231
67232       function fetcher(value, cb) {
67233           var v = value.toLowerCase();
67234
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] };
67241           }));
67242       }
67243
67244
67245       function render(selection$$1, data$$1) {
67246           var wraps = selection$$1.selectAll('div.entry').
67247               data(data$$1, function(d) { return d.lang; });
67248
67249           wraps.exit()
67250               .transition()
67251               .duration(200)
67252               .style('max-height','0px')
67253               .style('opacity', '0')
67254               .style('top','-10px')
67255               .remove();
67256
67257           var innerWrap = wraps.enter()
67258               .insert('div', ':first-child');
67259
67260           innerWrap.attr('class', 'entry')
67261               .each(function() {
67262                   var wrap = select(this);
67263                   var langcombo = d3combobox()
67264                       .container(context.container())
67265                       .fetcher(fetcher)
67266                       .minItems(0);
67267
67268                   var label = wrap
67269                       .append('label')
67270                       .attr('class','form-label')
67271                       .text(t('translate.localized_translation_label'))
67272                       .attr('for','localized-lang');
67273
67274                   label
67275                       .append('button')
67276                       .attr('class', 'minor remove')
67277                       .on('click', function(d){
67278                           event.preventDefault();
67279                           var t$$1 = {};
67280                           t$$1[key(d.lang)] = undefined;
67281                           dispatch$$1.call('change', this, t$$1);
67282                           select(this.parentNode.parentNode)
67283                               .style('top','0')
67284                               .style('max-height','240px')
67285                               .transition()
67286                               .style('opacity', '0')
67287                               .style('max-height','0px')
67288                               .remove();
67289                       })
67290                       .call(svgIcon('#iD-operation-delete'));
67291
67292                   wrap
67293                       .append('input')
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)
67299                       .call(langcombo);
67300
67301                   wrap
67302                       .append('input')
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');
67308               });
67309
67310           innerWrap
67311               .style('margin-top', '0px')
67312               .style('max-height', '0px')
67313               .style('opacity', '0')
67314               .transition()
67315               .duration(200)
67316               .style('margin-top', '10px')
67317               .style('max-height', '240px')
67318               .style('opacity', '1')
67319               .on('end', function() {
67320                   select(this)
67321                       .style('max-height', '')
67322                       .style('overflow', 'visible');
67323               });
67324
67325
67326           var entry = selection$$1.selectAll('.entry');
67327
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;
67331               });
67332
67333           utilGetSetValue(entry.select('.localized-value'),
67334               function(d) { return d.value; });
67335       }
67336
67337
67338       localized.tags = function(tags) {
67339           // Fetch translations from wikipedia
67340           if (tags.wikipedia && !wikiTitles) {
67341               wikiTitles = {};
67342               var wm = tags.wikipedia.match(/([^:]+):(.+)/);
67343               if (wm && wm[0] && wm[1]) {
67344                   wikipedia.translations(wm[1], wm[2], function(d) {
67345                       wikiTitles = d;
67346                   });
67347               }
67348           }
67349
67350           utilGetSetValue(input, tags[field.key] || '');
67351
67352           var postfixed = [], k, m;
67353           for (k in tags) {
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] });
67357               }
67358           }
67359
67360           localizedInputs.call(render, postfixed.reverse());
67361       };
67362
67363
67364       localized.focus = function() {
67365           input.node().focus();
67366       };
67367
67368
67369       localized.entity = function(_) {
67370           if (!arguments.length) return entity;
67371           entity = _;
67372           return localized;
67373       };
67374
67375       return utilRebind(localized, dispatch$$1, 'on');
67376   }
67377
67378   function uiFieldMaxspeed(field, context) {
67379       var dispatch$$1 = dispatch('change'),
67380           entity,
67381           isImperial,
67382           unitInput = select(null),
67383           input = select(null),
67384           combobox;
67385
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];
67388
67389
67390       function maxspeed(selection$$1) {
67391           combobox = d3combobox()
67392               .container(context.container());
67393
67394           var unitCombobox = d3combobox()
67395               .container(context.container())
67396               .data(['km/h', 'mph'].map(comboValues));
67397
67398           input = selection$$1.selectAll('#preset-input-' + field.safeid)
67399               .data([0]);
67400
67401           input = input.enter()
67402               .append('input')
67403               .attr('type', 'text')
67404               .attr('id', 'preset-input-' + field.safeid)
67405               .attr('placeholder', field.placeholder())
67406               .call(utilNoAuto)
67407               .call(combobox)
67408               .merge(input);
67409
67410           input
67411               .on('change', change)
67412               .on('blur', change);
67413
67414           var childNodes = context.graph().childNodes(context.entity(entity.id)),
67415               loc = childNodes[~~(childNodes.length/2)].loc;
67416
67417           isImperial = some(dataImperial.features, function(f) {
67418               return some(f.geometry.coordinates, function(d) {
67419                   return geoPointInPolygon(loc, d);
67420               });
67421           });
67422
67423           unitInput = selection$$1.selectAll('input.maxspeed-unit')
67424               .data([0]);
67425
67426           unitInput = unitInput.enter()
67427               .append('input')
67428               .attr('type', 'text')
67429               .attr('class', 'maxspeed-unit')
67430               .call(unitCombobox)
67431               .merge(unitInput);
67432
67433           unitInput
67434               .on('blur', changeUnits)
67435               .on('change', changeUnits);
67436
67437
67438           function changeUnits() {
67439               isImperial = utilGetSetValue(unitInput) === 'mph';
67440               utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
67441               setSuggestions();
67442               change();
67443           }
67444       }
67445
67446
67447       function setSuggestions() {
67448           combobox.data((isImperial ? imperialValues : metricValues).map(comboValues));
67449           utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
67450       }
67451
67452
67453       function comboValues(d) {
67454           return {
67455               value: d.toString(),
67456               title: d.toString()
67457           };
67458       }
67459
67460
67461       function change() {
67462           var tag = {},
67463               value = utilGetSetValue(input);
67464
67465           if (!value) {
67466               tag[field.key] = undefined;
67467           } else if (isNaN(value) || !isImperial) {
67468               tag[field.key] = value;
67469           } else {
67470               tag[field.key] = value + ' mph';
67471           }
67472
67473           dispatch$$1.call('change', this, tag);
67474       }
67475
67476
67477       maxspeed.tags = function(tags) {
67478           var value = tags[field.key];
67479
67480           if (value && value.indexOf('mph') >= 0) {
67481               value = parseInt(value, 10);
67482               isImperial = true;
67483           } else if (value) {
67484               isImperial = false;
67485           }
67486
67487           setSuggestions();
67488           utilGetSetValue(input, value || '');
67489       };
67490
67491
67492       maxspeed.focus = function() {
67493           input.node().focus();
67494       };
67495
67496
67497       maxspeed.entity = function(_) {
67498           entity = _;
67499       };
67500
67501
67502       return utilRebind(maxspeed, dispatch$$1, 'on');
67503   }
67504
67505   /**
67506    * This function is like `baseIndexOf` except that it accepts a comparator.
67507    *
67508    * @private
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`.
67514    */
67515   function baseIndexOfWith(array, value, fromIndex, comparator) {
67516     var index = fromIndex - 1,
67517         length = array.length;
67518
67519     while (++index < length) {
67520       if (comparator(array[index], value)) {
67521         return index;
67522       }
67523     }
67524     return -1;
67525   }
67526
67527   /** Used for built-in method references. */
67528   var arrayProto$2 = Array.prototype;
67529
67530   /** Built-in value references. */
67531   var splice$2 = arrayProto$2.splice;
67532
67533   /**
67534    * The base implementation of `_.pullAllBy` without support for iteratee
67535    * shorthands.
67536    *
67537    * @private
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`.
67543    */
67544   function basePullAll(array, values, iteratee, comparator) {
67545     var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
67546         index = -1,
67547         length = values.length,
67548         seen = array;
67549
67550     if (array === values) {
67551       values = copyArray(values);
67552     }
67553     if (iteratee) {
67554       seen = arrayMap(array, baseUnary(iteratee));
67555     }
67556     while (++index < length) {
67557       var fromIndex = 0,
67558           value = values[index],
67559           computed = iteratee ? iteratee(value) : value;
67560
67561       while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
67562         if (seen !== array) {
67563           splice$2.call(seen, fromIndex, 1);
67564         }
67565         splice$2.call(array, fromIndex, 1);
67566       }
67567     }
67568     return array;
67569   }
67570
67571   /**
67572    * This method is like `_.pull` except that it accepts an array of values to remove.
67573    *
67574    * **Note:** Unlike `_.difference`, this method mutates `array`.
67575    *
67576    * @static
67577    * @memberOf _
67578    * @since 4.0.0
67579    * @category Array
67580    * @param {Array} array The array to modify.
67581    * @param {Array} values The values to remove.
67582    * @returns {Array} Returns `array`.
67583    * @example
67584    *
67585    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
67586    *
67587    * _.pullAll(array, ['a', 'c']);
67588    * console.log(array);
67589    * // => ['b', 'b']
67590    */
67591   function pullAll(array, values) {
67592     return (array && array.length && values && values.length)
67593       ? basePullAll(array, values)
67594       : array;
67595   }
67596
67597   /**
67598    * Removes all given values from `array` using
67599    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
67600    * for equality comparisons.
67601    *
67602    * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
67603    * to remove elements from an array by predicate.
67604    *
67605    * @static
67606    * @memberOf _
67607    * @since 2.0.0
67608    * @category Array
67609    * @param {Array} array The array to modify.
67610    * @param {...*} [values] The values to remove.
67611    * @returns {Array} Returns `array`.
67612    * @example
67613    *
67614    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
67615    *
67616    * _.pull(array, 'a', 'c');
67617    * console.log(array);
67618    * // => ['b', 'b']
67619    */
67620   var pull = baseRest(pullAll);
67621
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),
67629           typeField,
67630           layerField,
67631           oldType = {},
67632           entity;
67633
67634
67635       function selectedKey() {
67636           var node = wrap.selectAll('.toggle-list label.active input');
67637           return !node.empty() && node.datum();
67638       }
67639
67640
67641       function radio(selection$$1) {
67642           selection$$1.classed('preset-radio', true);
67643
67644           wrap = selection$$1.selectAll('.preset-input-wrap')
67645               .data([0]);
67646
67647           var enter = wrap.enter()
67648               .append('div')
67649               .attr('class', 'preset-input-wrap toggle-list');
67650
67651           enter
67652               .append('span')
67653               .attr('class', 'placeholder');
67654
67655           wrap = wrap
67656               .merge(enter);
67657
67658
67659           placeholder = wrap.selectAll('.placeholder');
67660
67661           labels = wrap.selectAll('label')
67662               .data(radioData);
67663
67664           enter = labels.enter()
67665               .append('label');
67666
67667           enter
67668               .append('input')
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);
67673
67674           enter
67675               .append('span')
67676               .text(function(d) { return field.t('options.' + d, { 'default': d }); });
67677
67678           labels = labels
67679               .merge(enter);
67680
67681           radios = labels.selectAll('input')
67682               .on('change', changeRadio);
67683
67684       }
67685
67686
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');
67692
67693
67694           var extrasWrap = selection$$1.selectAll('.structure-extras-wrap')
67695               .data(selected ? [0] : []);
67696
67697           extrasWrap.exit()
67698               .remove();
67699
67700           extrasWrap = extrasWrap.enter()
67701               .append('div')
67702               .attr('class', 'structure-extras-wrap')
67703               .merge(extrasWrap);
67704
67705           var list = extrasWrap.selectAll('ul')
67706               .data([0]);
67707
67708           list = list.enter()
67709               .append('ul')
67710               .merge(list);
67711
67712
67713           // Type
67714           if (type) {
67715               if (!typeField || typeField.id !== selected) {
67716                   typeField = uiField(context, type, entity, { wrap: false })
67717                       .on('change', changeType);
67718               }
67719               typeField.tags(tags);
67720           } else {
67721               typeField = null;
67722           }
67723
67724           var typeItem = list.selectAll('.structure-type-item')
67725               .data(typeField ? [typeField] : [], function(d) { return d.id; });
67726
67727           // Exit
67728           typeItem.exit()
67729               .remove();
67730
67731           // Enter
67732           var typeEnter = typeItem.enter()
67733               .insert('li', ':first-child')
67734               .attr('class', 'cf structure-type-item');
67735
67736           typeEnter
67737               .append('span')
67738               .attr('class', 'col6 label structure-label-type')
67739               .attr('for', 'preset-input-' + selected)
67740               .text(t('inspector.radio.structure.type'));
67741
67742           typeEnter
67743               .append('div')
67744               .attr('class', 'col6 structure-input-type-wrap');
67745
67746           // Update
67747           typeItem = typeItem
67748               .merge(typeEnter);
67749
67750           if (typeField) {
67751               typeItem.selectAll('.structure-input-type-wrap')
67752                   .call(typeField.render);
67753           }
67754
67755
67756           // Layer
67757           if (layer && showLayer) {
67758               if (!layerField) {
67759                   layerField = uiField(context, layer, entity, { wrap: false })
67760                       .on('change', changeLayer);
67761               }
67762               layerField.tags(tags);
67763               field.keys = union(field.keys, ['layer']);
67764           } else {
67765               layerField = null;
67766               pull(field.keys, 'layer');
67767           }
67768
67769           var layerItem = list.selectAll('.structure-layer-item')
67770               .data(layerField ? [layerField] : []);
67771
67772           // Exit
67773           layerItem.exit()
67774               .remove();
67775
67776           // Enter
67777           var layerEnter = layerItem.enter()
67778               .append('li')
67779               .attr('class', 'cf structure-layer-item');
67780
67781           layerEnter
67782               .append('span')
67783               .attr('class', 'col6 label structure-label-layer')
67784               .attr('for', 'preset-input-layer')
67785               .text(t('inspector.radio.structure.layer'));
67786
67787           layerEnter
67788               .append('div')
67789               .attr('class', 'col6 structure-input-layer-wrap');
67790
67791           // Update
67792           layerItem = layerItem
67793               .merge(layerEnter);
67794
67795           if (layerField) {
67796               layerItem.selectAll('.structure-input-layer-wrap')
67797                   .call(layerField.render);
67798           }
67799       }
67800
67801
67802       function changeType(t$$1, onInput) {
67803           var key = selectedKey();
67804           if (!key) return;
67805
67806           var val = t$$1[key];
67807           if (val !== 'no') {
67808               oldType[key] = val;
67809           }
67810
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;
67817               }
67818               // add layer if it should be set
67819               if (t$$1.layer === undefined) {
67820                   if (key === 'bridge' && val !== 'no') {
67821                       t$$1.layer = '1';
67822                   }
67823                   if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
67824                       t$$1.layer = '-1';
67825                   }
67826               }
67827            }
67828
67829           dispatch$$1.call('change', this, t$$1, onInput);
67830       }
67831
67832
67833       function changeLayer(t$$1, onInput) {
67834           if (t$$1.layer === '0') {
67835               t$$1.layer = undefined;
67836           }
67837           dispatch$$1.call('change', this, t$$1, onInput);
67838       }
67839
67840
67841       function changeRadio() {
67842           var t$$1 = {},
67843               activeKey;
67844
67845           if (field.key) {
67846               t$$1[field.key] = undefined;
67847           }
67848
67849           radios.each(function(d) {
67850               var active = select(this).property('checked');
67851               if (active) activeKey = d;
67852
67853               if (field.key) {
67854                   if (active) t$$1[field.key] = d;
67855               } else {
67856                   var val = oldType[activeKey] || 'yes';
67857                   t$$1[d] = active ? val : undefined;
67858               }
67859           });
67860
67861           if (field.type === 'structureRadio') {
67862               if (activeKey === 'bridge') {
67863                   t$$1.layer = '1';
67864               } else if (activeKey === 'tunnel' && t$$1.tunnel !== 'building_passage') {
67865                   t$$1.layer = '-1';
67866               } else {
67867                   t$$1.layer = undefined;
67868               }
67869           }
67870
67871           dispatch$$1.call('change', this, t$$1);
67872       }
67873
67874
67875       radio.tags = function(tags) {
67876           function checked(d) {
67877               if (field.key) {
67878                   return tags[field.key] === d;
67879               } else {
67880                   return !!(tags[d] && tags[d].toLowerCase() !== 'no');
67881               }
67882           }
67883
67884           labels.classed('active', checked);
67885           radios.property('checked', checked);
67886
67887           var selection$$1 = radios.filter(function() { return this.checked; });
67888
67889           if (selection$$1.empty()) {
67890               placeholder.text(t('inspector.none'));
67891           } else {
67892               placeholder.text(selection$$1.attr('value'));
67893               oldType[selection$$1.datum()] = tags[selection$$1.datum()];
67894           }
67895
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';
67901               }
67902
67903               wrap.call(structureExtras, tags);
67904           }
67905       };
67906
67907
67908       radio.focus = function() {
67909           radios.node().focus();
67910       };
67911
67912
67913       radio.entity = function(_) {
67914           if (!arguments.length) return entity;
67915           entity = _;
67916           oldType = {};
67917           return radio;
67918       };
67919
67920
67921       return utilRebind(radio, dispatch$$1, 'on');
67922   }
67923
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');
67929
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
67935       var _oldTurns;
67936       var _graph;
67937       var _vertexID;
67938       var _intersection;
67939       var _fromWayID;
67940
67941
67942       function restrictions(selection$$1) {
67943           _parent = selection$$1;
67944
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);
67949           }
67950
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.
67954           var isOK = (
67955               _intersection &&
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
67962           );
67963
67964           // Also hide in the case where
67965           select(selection$$1.node().parentNode).classed('hide', !isOK);
67966
67967           // if form field is hidden or has detached from dom, clean up.
67968           if (!isOK ||
67969               !select('.inspector-wrap.inspector-hidden').empty() ||
67970               !selection$$1.node().parentNode ||
67971               !selection$$1.node().parentNode.parentNode) {
67972               selection$$1.call(restrictions.off);
67973               return;
67974           }
67975
67976
67977           var wrap = selection$$1.selectAll('.preset-input-wrap')
67978               .data([0]);
67979
67980           wrap = wrap.enter()
67981               .append('div')
67982               .attr('class', 'preset-input-wrap')
67983               .merge(wrap);
67984
67985           var container = wrap.selectAll('.restriction-container')
67986               .data([0]);
67987
67988           // enter
67989           var containerEnter = container.enter()
67990               .append('div')
67991               .attr('class', 'restriction-container');
67992
67993           containerEnter
67994               .append('div')
67995               .attr('class', 'restriction-help');
67996
67997           // update
67998           _container = containerEnter
67999               .merge(container)
68000               .call(renderViewer);
68001
68002           var controls = wrap.selectAll('.restriction-controls')
68003               .data([0]);
68004
68005           // enter/update
68006           controls.enter()
68007               .append('div')
68008               .attr('class', 'restriction-controls-container')
68009               .append('div')
68010               .attr('class', 'restriction-controls')
68011               .merge(controls)
68012               .call(renderControls);
68013       }
68014
68015
68016       function renderControls(selection$$1) {
68017           var distControl = selection$$1.selectAll('.restriction-distance')
68018               .data([0]);
68019
68020           distControl.exit()
68021               .remove();
68022
68023           var distControlEnter = distControl.enter()
68024               .append('div')
68025               .attr('class', 'restriction-control restriction-distance');
68026
68027           distControlEnter
68028               .append('span')
68029               .attr('class', 'restriction-control-label restriction-distance-label')
68030               .text(t('restriction.controls.distance') + ':');
68031
68032           distControlEnter
68033               .append('input')
68034               .attr('class', 'restriction-distance-input')
68035               .attr('type', 'range')
68036               .attr('min', '20')
68037               .attr('max', '50')
68038               .attr('step', '5');
68039
68040           distControlEnter
68041               .append('span')
68042               .attr('class', 'restriction-distance-text');
68043
68044           // update
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);
68054               });
68055
68056           selection$$1.selectAll('.restriction-distance-text')
68057               .text(displayMaxDistance(_maxDistance));
68058
68059
68060           var viaControl = selection$$1.selectAll('.restriction-via-way')
68061               .data([0]);
68062
68063           viaControl.exit()
68064               .remove();
68065
68066           var viaControlEnter = viaControl.enter()
68067               .append('div')
68068               .attr('class', 'restriction-control restriction-via-way');
68069
68070           viaControlEnter
68071               .append('span')
68072               .attr('class', 'restriction-control-label restriction-via-way-label')
68073               .text(t('restriction.controls.via') + ':');
68074
68075           viaControlEnter
68076               .append('input')
68077               .attr('class', 'restriction-via-way-input')
68078               .attr('type', 'range')
68079               .attr('min', '0')
68080               .attr('max', '2')
68081               .attr('step', '1');
68082
68083           viaControlEnter
68084               .append('span')
68085               .attr('class', 'restriction-via-way-text');
68086
68087           // update
68088           selection$$1.selectAll('.restriction-via-way-input')
68089               .property('value', _maxViaWay)
68090               .on('input', function() {
68091                   var val = select(this).property('value');
68092                   _maxViaWay = +val;
68093                   _container.selectAll('.layer-osm .layer-turns *').remove();
68094                   context.storage('turn-restriction-via-way', _maxViaWay);
68095                   _parent.call(restrictions);
68096               });
68097
68098           selection$$1.selectAll('.restriction-via-way-text')
68099               .text(displayMaxVia(_maxViaWay));
68100       }
68101
68102
68103       function renderViewer(selection$$1) {
68104           if (!_intersection) return;
68105
68106           var vgraph = _intersection.graph;
68107           var filter = utilFunctor(true);
68108           var projection = geoRawMercator();
68109
68110           var d = utilGetDimensions(selection$$1);
68111           var c = geoVecScale(d, 0.5);
68112           var z = 22;
68113
68114           projection.scale(geoZoomToScale(z));
68115
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());
68120           }
68121
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));
68133           }
68134
68135           var padTop = 35;   // reserve top space for hint text
68136           var extentCenter = projection(extent.center());
68137           extentCenter[1] = extentCenter[1] - padTop;
68138
68139           projection
68140               .translate(geoVecSubtract(c, extentCenter))
68141               .clipExtent([[0, 0], d]);
68142
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);
68147
68148           var firstTime = selection$$1.selectAll('.surface').empty();
68149
68150           selection$$1
68151               .call(drawLayers);
68152
68153           var surface = selection$$1.selectAll('.surface')
68154               .classed('tr', true);
68155
68156           if (firstTime) {
68157               _initialized = true;
68158
68159               surface
68160                   .call(breathe);
68161
68162               select(window)
68163                   .on('resize.restrictions', function() {
68164                       utilSetDimensions(_container, null);
68165                       redraw();
68166                   });
68167           }
68168
68169
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)) {
68173               _fromWayID = null;
68174               _oldTurns = null;
68175           }
68176
68177           surface
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));
68182
68183           surface
68184               .on('click.restrictions', click)
68185               .on('mouseover.restrictions', mouseover);
68186
68187           surface
68188               .selectAll('.selected')
68189               .classed('selected', false);
68190
68191           surface
68192               .selectAll('.related')
68193               .classed('related', false);
68194
68195           if (_fromWayID) {
68196               var way = vgraph.entity(_fromWayID);
68197               surface
68198                   .selectAll('.' + _fromWayID)
68199                   .classed('selected', true)
68200                   .classed('related', true);
68201           }
68202
68203           updateHints(null);
68204
68205
68206           function click() {
68207               surface
68208                   .call(breathe.off)
68209                   .call(breathe);
68210
68211               var datum = event.target.__data__;
68212               var entity = datum && datum.properties && datum.properties.entity;
68213               if (entity) {
68214                   datum = entity;
68215               }
68216
68217               if (datum instanceof osmWay && (datum.__from || datum.__via)) {
68218                   _fromWayID = datum.id;
68219                   _oldTurns = null;
68220                   redraw();
68221
68222               } else if (datum instanceof osmTurn) {
68223                   var actions, extraActions, turns, i;
68224                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
68225
68226                   if (datum.restrictionID && !datum.direct) {
68227                       return;
68228
68229                   } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
68230                       var seen = {};
68231                       var datumOnly = cloneDeep(datum);
68232                       datumOnly.only = true;
68233                       restrictionType = restrictionType.replace(/^no/, 'only');
68234
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);
68238                       extraActions = [];
68239                       _oldTurns = [];
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)
68243
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));
68249                           }
68250                       }
68251
68252                       actions = _intersection.actions.concat(extraActions, [
68253                           actionRestrictTurn(datumOnly, restrictionType),
68254                           t('operations.restriction.annotation.create')
68255                       ]);
68256
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 || [];
68262                       extraActions = [];
68263                       for (i = 0; i < turns.length; i++) {
68264                           if (turns[i].key !== datum.key) {
68265                               extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
68266                           }
68267                       }
68268                       _oldTurns = null;
68269
68270                       actions = _intersection.actions.concat(extraActions, [
68271                           actionUnrestrictTurn(datum),
68272                           t('operations.restriction.annotation.delete')
68273                       ]);
68274
68275                   } else {    // Allowed -> NO
68276                       actions = _intersection.actions.concat([
68277                           actionRestrictTurn(datum, restrictionType),
68278                           t('operations.restriction.annotation.create')
68279                       ]);
68280                   }
68281
68282                   context.perform.apply(context, actions);
68283
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);
68289
68290               } else {
68291                   _fromWayID = null;
68292                   _oldTurns = null;
68293                   redraw();
68294               }
68295           }
68296
68297
68298           function mouseover() {
68299               var datum = event.target.__data__;
68300               updateHints(datum);
68301           }
68302
68303
68304           function redraw() {
68305               if (context.hasEntity(_vertexID)) {
68306                   _container.call(renderViewer);
68307               }
68308           }
68309
68310
68311           function highlightPathsFrom(wayID) {
68312               surface.selectAll('.related')
68313                   .classed('related', false)
68314                   .classed('allow', false)
68315                   .classed('restrict', false)
68316                   .classed('only', false);
68317
68318               surface.selectAll('.' + wayID)
68319                   .classed('related', true);
68320
68321               if (wayID) {
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'));
68327
68328                       if (turn.only || turns.length === 1) {
68329                           if (turn.via.ways) {
68330                               ids = ids.concat(turn.via.ways);
68331                           }
68332                       } else if (turn.to.way === wayID) {
68333                           continue;
68334                       }
68335
68336                       surface.selectAll(utilEntitySelector(ids))
68337                           .classed('related', true)
68338                           .classed('allow', (klass === 'allow'))
68339                           .classed('restrict', (klass === 'restrict'))
68340                           .classed('only', (klass === 'only'));
68341                   }
68342               }
68343           }
68344
68345
68346           function updateHints(datum) {
68347               var help = _container.selectAll('.restriction-help').html('');
68348
68349               var placeholders = {};
68350               ['from', 'via', 'to'].forEach(function(k) {
68351                   placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
68352               });
68353
68354               var entity = datum && datum.properties && datum.properties.entity;
68355               if (entity) {
68356                   datum = entity;
68357               }
68358
68359               if (_fromWayID) {
68360                   way = vgraph.entity(_fromWayID);
68361                   surface
68362                       .selectAll('.' + _fromWayID)
68363                       .classed('selected', true)
68364                       .classed('related', true);
68365               }
68366
68367               // Hovering a way
68368               if (datum instanceof osmWay && datum.__from) {
68369                   way = datum;
68370
68371                   highlightPathsFrom(_fromWayID ? null : way.id);
68372                   surface.selectAll('.' + way.id)
68373                       .classed('related', true);
68374
68375                   var clickSelect = (!_fromWayID || _fromWayID !== way.id);
68376                   help
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)
68381                       }));
68382
68383
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;
68390
68391                   if (datum.no) {
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) {
68396                       klass = 'only';
68397                       turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
68398                       nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
68399                   } else {
68400                       klass = 'allow';
68401                       turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
68402                       nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
68403                   }
68404
68405                   help
68406                       .append('div')      // "NO Right Turn (indirect)"
68407                       .attr('class', 'qualifier ' + klass)
68408                       .text(turnText);
68409
68410                   help
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)
68417                       }));
68418
68419                   if (datum.via.ways && datum.via.ways.length) {
68420                       var names = [];
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
68425                               names.push(curr);
68426                       }
68427
68428                       help
68429                           .append('div')      // "VIA {viaNames}"
68430                           .html(t('restriction.help.via_names', {
68431                               via: placeholders.via,
68432                               viaNames: names.join(', ')
68433                           }));
68434                   }
68435
68436                   if (!indirect) {
68437                       help
68438                           .append('div')      // Click for "No Right Turn"
68439                           .text(t('restriction.help.toggle', { turn: nextText.trim() }));
68440                   }
68441
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'));
68449
68450
68451               // Hovering empty surface
68452               } else {
68453                   highlightPathsFrom(null);
68454                   if (_fromWayID) {
68455                       help
68456                           .append('div')      // "FROM {fromName}"
68457                           .html(t('restriction.help.from_name', {
68458                               from: placeholders.from,
68459                               fromName: displayName(_fromWayID, vgraph)
68460                           }));
68461
68462                   } else {
68463                       help
68464                           .append('div')      // "Click to select a FROM segment."
68465                           .html(t('restriction.help.select_from', {
68466                               from: placeholders.from
68467                           }));
68468                   }
68469               }
68470           }
68471       }
68472
68473
68474       function displayMaxDistance(maxDist) {
68475           var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
68476           var opts;
68477
68478           if (isImperial) {
68479               var distToFeet = {   // imprecise conversion for prettier display
68480                   20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
68481               }[maxDist];
68482               opts = { distance: t('units.feet', { quantity: distToFeet }) };
68483           } else {
68484               opts = { distance: t('units.meters', { quantity: maxDist }) };
68485           }
68486
68487           return t('restriction.controls.distance_up_to', opts);
68488       }
68489
68490
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');
68495       }
68496
68497
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;
68504       }
68505
68506
68507       restrictions.entity = function(_) {
68508           _intersection = null;
68509           _fromWayID = null;
68510           _oldTurns = null;
68511           _vertexID = _.id;
68512       };
68513
68514
68515       restrictions.tags = function() {};
68516       restrictions.focus = function() {};
68517
68518
68519       restrictions.off = function(selection$$1) {
68520           if (!_initialized) return;
68521
68522           selection$$1.selectAll('.surface')
68523               .call(breathe.off)
68524               .on('click.restrictions', null)
68525               .on('mouseover.restrictions', null);
68526
68527           select(window)
68528               .on('resize.restrictions', null);
68529       };
68530
68531
68532       return utilRebind(restrictions, dispatch$$1, 'on');
68533   }
68534
68535   function uiFieldTextarea(field) {
68536       var dispatch$$1 = dispatch('change'),
68537           input = select(null);
68538
68539
68540       function textarea(selection$$1) {
68541           input = selection$$1.selectAll('textarea')
68542               .data([0]);
68543
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)
68549               .call(utilNoAuto)
68550               .on('input', change(true))
68551               .on('blur', change())
68552               .on('change', change())
68553               .merge(input);
68554       }
68555
68556
68557       function change(onInput) {
68558           return function() {
68559               var t$$1 = {};
68560               t$$1[field.key] = utilGetSetValue(input) || undefined;
68561               dispatch$$1.call('change', this, t$$1, onInput);
68562           };
68563       }
68564
68565
68566       textarea.tags = function(tags) {
68567           utilGetSetValue(input, tags[field.key] || '');
68568       };
68569
68570
68571       textarea.focus = function() {
68572           input.node().focus();
68573       };
68574
68575
68576       return utilRebind(textarea, dispatch$$1, 'on');
68577   }
68578
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),
68586           wikiURL = '',
68587           entity;
68588
68589
68590       function wiki(selection$$1) {
68591           var langcombo = d3combobox()
68592               .container(context.container())
68593               .fetcher(function(value, cb) {
68594                   var v = value.toLowerCase();
68595
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] };
68602                   }));
68603               });
68604
68605           var titlecombo = d3combobox()
68606               .container(context.container())
68607               .fetcher(function(value, cb) {
68608                   if (!value) {
68609                       value = context.entity(entity.id).tags.name || '';
68610                   }
68611
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 };
68616                       }));
68617                   });
68618               });
68619
68620
68621           lang = selection$$1.selectAll('input.wiki-lang')
68622               .data([0]);
68623
68624           lang = lang.enter()
68625               .append('input')
68626               .attr('type', 'text')
68627               .attr('class', 'wiki-lang')
68628               .attr('placeholder', t('translate.localized_translation_language'))
68629               .call(utilNoAuto)
68630               .merge(lang);
68631
68632           utilGetSetValue(lang, language()[1]);
68633
68634           lang
68635               .call(langcombo)
68636               .on('blur', changeLang)
68637               .on('change', changeLang);
68638
68639
68640           title = selection$$1.selectAll('input.wiki-title')
68641               .data([0]);
68642
68643           title = title.enter()
68644               .append('input')
68645               .attr('type', 'text')
68646               .attr('class', 'wiki-title')
68647               .attr('id', 'preset-input-' + field.safeid)
68648               .call(utilNoAuto)
68649               .merge(title);
68650
68651           title
68652               .call(titlecombo)
68653               .on('blur', blur)
68654               .on('change', change);
68655
68656
68657           link = selection$$1.selectAll('.wiki-link')
68658               .data([0]);
68659
68660           link = link.enter()
68661               .append('button')
68662               .attr('class', 'button-input-action wiki-link minor')
68663               .attr('tabindex', -1)
68664               .call(svgIcon('#iD-icon-out-link'))
68665               .merge(link);
68666
68667           link
68668               .on('click', function() {
68669                   event.preventDefault();
68670                   if (wikiURL) window.open(wikiURL, '_blank');
68671               });
68672       }
68673
68674
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 ||
68683                   d[2] === value;
68684           }) || localeLanguage || ['English', 'English', 'en'];
68685       }
68686
68687
68688       function changeLang() {
68689           utilGetSetValue(lang, language()[1]);
68690           change(true);
68691       }
68692
68693
68694       function blur() {
68695           change(true);
68696       }
68697
68698
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]; }),
68703               syncTags = {};
68704
68705           if (l) {
68706               // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
68707               value = decodeURIComponent(m[2]).replace(/_/g, ' ');
68708               if (m[3]) {
68709                   var anchor;
68710                   try {
68711                       // Best-effort `anchordecode:` implementation
68712                       anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
68713                   } catch (e) {
68714                       anchor = decodeURIComponent(m[3]);
68715                   }
68716                   value += '#' + anchor.replace(/_/g, ' ');
68717               }
68718               value = value.slice(0, 1).toUpperCase() + value.slice(1);
68719               utilGetSetValue(lang, l[1]);
68720               utilGetSetValue(title, value);
68721           }
68722
68723           if (value) {
68724               syncTags.wikipedia = language()[2] + ':' + value;
68725           } else {
68726               syncTags.wikipedia = undefined;
68727               syncTags.wikidata = undefined;
68728           }
68729
68730           dispatch$$1.call('change', this, syncTags);
68731
68732
68733           if (skipWikidata || !value || !language()[2]) return;
68734
68735           // attempt asynchronous update of wikidata tag..
68736           var initGraph = context.graph(),
68737               initEntityId = entity.id;
68738
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;
68742
68743               if (!data$$1 || !Object.keys(data$$1).length) return;
68744
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);
68748
68749               currTags.wikidata = value;
68750
68751               // Coalesce the update of wikidata tag into the previous tag change
68752               context.overwrite(
68753                   actionChangeTags(initEntityId, currTags),
68754                   context.history().undoAnnotation()
68755               );
68756
68757               // do not dispatch.call('change') here, because entity_editor
68758               // changeTags() is not intended to be called asynchronously
68759           });
68760       }
68761
68762
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];
68768
68769           // value in correct format
68770           if (l) {
68771               utilGetSetValue(lang, l[1]);
68772               utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
68773               if (anchor) {
68774                   try {
68775                       // Best-effort `anchorencode:` implementation
68776                       anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
68777                   } catch (e) {
68778                       anchor = anchor.replace(/ /g, '_');
68779                   }
68780               }
68781               wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
68782                   m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
68783
68784           // unrecognized value format
68785           } else {
68786               utilGetSetValue(title, value);
68787               if (value && value !== '') {
68788                   utilGetSetValue(lang, '');
68789                   wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
68790               } else {
68791                   wikiURL = '';
68792               }
68793           }
68794       };
68795
68796
68797       wiki.entity = function(_) {
68798           if (!arguments.length) return entity;
68799           entity = _;
68800           return wiki;
68801       };
68802
68803
68804       wiki.focus = function() {
68805           title.node().focus();
68806       };
68807
68808
68809       return utilRebind(wiki, dispatch$$1, 'on');
68810   }
68811
68812   var uiFields = {
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,
68831       tel: uiFieldText,
68832       text: uiFieldText,
68833       textarea: uiFieldTextarea,
68834       typeCombo: uiFieldCombo,
68835       url: uiFieldText,
68836       wikipedia: uiFieldWikipedia
68837   };
68838
68839   function uiField(context, presetField, entity, options) {
68840       options = assignIn({
68841           show: true,
68842           wrap: true,
68843           remove: true,
68844           revert: true,
68845           info: true
68846       }, options);
68847
68848       var dispatch$$1 = dispatch('change');
68849       var field = clone(presetField);
68850       var _show = options.show;
68851       var _state = '';
68852       var _tags = {};
68853
68854
68855       field.impl = uiFields[field.type](field, context)
68856           .on('change', function(t$$1, onInput) {
68857               dispatch$$1.call('change', field, t$$1, onInput);
68858           });
68859
68860       if (entity && field.impl.entity) {
68861           field.impl.entity(entity);
68862       }
68863
68864       field.keys = field.keys || [field.key];
68865
68866
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];
68872           });
68873       }
68874
68875
68876       function isPresent() {
68877           return some(field.keys, function(key) {
68878               return _tags[key];
68879           });
68880       }
68881
68882
68883       function revert(d) {
68884           event.stopPropagation();
68885           event.preventDefault();
68886           if (!entity) return false;
68887
68888           var original = context.graph().base().entities[entity.id];
68889           var t$$1 = {};
68890           d.keys.forEach(function(key) {
68891               t$$1[key] = original ? original.tags[key] : undefined;
68892           });
68893
68894           dispatch$$1.call('change', d, t$$1);
68895       }
68896
68897
68898       function remove(d) {
68899           event.stopPropagation();
68900           event.preventDefault();
68901
68902           var t$$1 = {};
68903           d.keys.forEach(function(key) {
68904               t$$1[key] = undefined;
68905           });
68906
68907           dispatch$$1.call('change', d, t$$1);
68908       }
68909
68910
68911       field.render = function(selection$$1) {
68912           var container = selection$$1.selectAll('.form-field')
68913               .data([field]);
68914
68915           // Enter
68916           var enter = container.enter()
68917               .append('div')
68918               .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
68919               .classed('nowrap', !options.wrap);
68920
68921           if (options.wrap) {
68922               var label = enter
68923                   .append('label')
68924                   .attr('class', 'form-label')
68925                   .attr('for', function(d) { return 'preset-input-' + d.safeid; })
68926                   .text(function(d) { return d.label(); });
68927
68928               var wrap = label
68929                   .append('div')
68930                   .attr('class', 'form-label-button-wrap');
68931
68932               if (options.remove) {
68933                   wrap
68934                       .append('button')
68935                       .attr('class', 'remove-icon')
68936                       .attr('title', t('icons.remove'))
68937                       .attr('tabindex', -1)
68938                       .call(svgIcon('#iD-operation-delete'));
68939               }
68940
68941               if (options.revert) {
68942                   wrap
68943                       .append('button')
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'));
68948               }
68949           }
68950
68951
68952           // Update
68953           container = container
68954               .merge(enter);
68955
68956           container.selectAll('.form-label-button-wrap .remove-icon')
68957               .on('click', remove);
68958
68959           container.selectAll('.form-label-button-wrap .modified-icon')
68960               .on('click', revert);
68961
68962           container
68963               .classed('modified', isModified())
68964               .classed('present', isPresent())
68965               .each(function(d) {
68966                   var reference, help;
68967
68968                   // instantiate field help
68969                   if (options.wrap && field.type === 'restrictions') {
68970                       help = uiFieldHelp(context, 'restrictions');
68971                   }
68972
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(/:$/, '');
68978                       }
68979
68980                       reference = uiTagReference(d.reference || { key: referenceKey }, context);
68981                       if (_state === 'hover') {
68982                           reference.showing(false);
68983                       }
68984                   }
68985
68986                   select(this)
68987                       .call(d.impl);
68988
68989                   // add field help components
68990                   if (help) {
68991                       select(this)
68992                           .call(help.body)
68993                           .select('.form-label-button-wrap')
68994                           .call(help.button);
68995                   }
68996
68997                   // add tag reference components
68998                   if (reference) {
68999                       select(this)
69000                           .call(reference.body)
69001                           .select('.form-label-button-wrap')
69002                           .call(reference.button);
69003                   }
69004
69005                   d.impl.tags(_tags);
69006               });
69007       };
69008
69009
69010       field.state = function(_) {
69011           if (!arguments.length) return _state;
69012           _state = _;
69013           return field;
69014       };
69015
69016
69017       field.tags = function(_) {
69018           if (!arguments.length) return _tags;
69019           _tags = _;
69020           return field;
69021       };
69022
69023
69024       field.show = function() {
69025           _show = true;
69026           if (field.default && field.key && _tags[field.key] !== field.default) {
69027               var t$$1 = {};
69028               t$$1[field.key] = field.default;
69029               dispatch$$1.call('change', this, t$$1);
69030           }
69031       };
69032
69033
69034       field.isShown = function() {
69035           return _show || some(field.keys, function(key) { return !!_tags[key]; });
69036       };
69037
69038
69039       field.focus = function() {
69040           field.impl.focus();
69041       };
69042
69043
69044       return utilRebind(field, dispatch$$1, 'on');
69045   }
69046
69047   function uiFormFields(context) {
69048       var fieldsArr;
69049
69050
69051       function formFields(selection$$1, klass) {
69052           render(selection$$1, klass);
69053       }
69054
69055
69056       function render(selection$$1, klass) {
69057
69058           var shown = fieldsArr.filter(function(field) { return field.isShown(); }),
69059               notShown = fieldsArr.filter(function(field) { return !field.isShown(); });
69060
69061           var container = selection$$1.selectAll('.form-fields-container')
69062               .data([0]);
69063
69064           container = container.enter()
69065               .append('div')
69066               .attr('class', 'form-fields-container ' + (klass || ''))
69067               .merge(container);
69068
69069
69070           var fields = container.selectAll('.wrap-form-field')
69071               .data(shown, function(d) { return d.id; });
69072
69073           fields.exit()
69074               .remove();
69075
69076           // Enter
69077           var enter = fields.enter()
69078               .append('div')
69079               .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
69080
69081           // Update
69082           fields = fields
69083               .merge(enter);
69084
69085           fields
69086               .order()
69087               .each(function(d) {
69088                   select(this)
69089                       .call(d.render);
69090               });
69091
69092
69093           notShown = notShown.map(function(field) {
69094               return {
69095                   title: field.label(),
69096                   value: field.label(),
69097                   field: field
69098               };
69099           });
69100
69101
69102           var more = selection$$1.selectAll('.more-fields')
69103               .data((notShown.length > 0) ? [0] : []);
69104
69105           more.exit()
69106               .remove();
69107
69108           more = more.enter()
69109               .append('div')
69110               .attr('class', 'more-fields')
69111               .append('label')
69112               .text(t('inspector.add_fields'))
69113               .merge(more);
69114
69115
69116           var input = more.selectAll('.value')
69117               .data([0]);
69118
69119           input.exit()
69120               .remove();
69121
69122           input = input.enter()
69123               .append('input')
69124               .attr('class', 'value')
69125               .attr('type', 'text')
69126               .call(utilNoAuto)
69127               .merge(input);
69128
69129           input
69130               .call(utilGetSetValue, '')
69131               .attr('placeholder', function() {
69132                   var placeholder = [];
69133                   for (var field in notShown) {
69134                       placeholder.push(notShown[field].title);
69135                   }
69136                   return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
69137               })
69138               .call(d3combobox()
69139                   .container(context.container())
69140                   .data(notShown)
69141                   .minItems(1)
69142                   .on('accept', function (d) {
69143                       var field = d.field;
69144                       field.show();
69145                       render(selection$$1);
69146                       if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
69147                           field.focus();
69148                       }
69149                   })
69150               );
69151       }
69152
69153
69154       formFields.fieldsArr = function(_) {
69155           if (!arguments.length) return fieldsArr;
69156           fieldsArr = _;
69157           return formFields;
69158       };
69159
69160
69161       return formFields;
69162   }
69163
69164   function uiPresetEditor(context) {
69165       var dispatch$$1 = dispatch('change'),
69166           formFields = uiFormFields(context),
69167           state,
69168           fieldsArr,
69169           preset,
69170           tags,
69171           entityId;
69172
69173
69174       function presetEditor(selection$$1) {
69175           selection$$1.call(uiDisclosure(context, 'preset_fields', true)
69176               .title(t('inspector.all_fields'))
69177               .content(render)
69178           );
69179       }
69180
69181
69182       function render(selection$$1) {
69183           if (!fieldsArr) {
69184               var entity = context.entity(entityId),
69185                   geometry = context.geometry(entityId),
69186                   presets = context.presets();
69187
69188               fieldsArr = [];
69189
69190               preset.fields.forEach(function(field) {
69191                   if (field.matchGeometry(geometry)) {
69192                       fieldsArr.push(
69193                           uiField(context, field, entity)
69194                       );
69195                   }
69196               });
69197
69198               if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
69199                   fieldsArr.push(
69200                       uiField(context, presets.field('restrictions'), entity)
69201                   );
69202               }
69203
69204               presets.universal().forEach(function(field) {
69205                   if (preset.fields.indexOf(field) === -1) {
69206                       fieldsArr.push(
69207                           uiField(context, field, entity, { show: false })
69208                       );
69209                   }
69210               });
69211
69212               fieldsArr.forEach(function(field) {
69213                   field
69214                       .on('change', function(t$$1, onInput) {
69215                           dispatch$$1.call('change', field, t$$1, onInput);
69216                       });
69217               });
69218           }
69219
69220           fieldsArr.forEach(function(field) {
69221               field
69222                   .state(state)
69223                   .tags(tags);
69224           });
69225
69226
69227           selection$$1
69228               .call(formFields.fieldsArr(fieldsArr), 'inspector-inner fillL3');
69229
69230
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));
69236                   }
69237               });
69238       }
69239
69240
69241       presetEditor.preset = function(_) {
69242           if (!arguments.length) return preset;
69243           if (preset && preset.id === _.id) return presetEditor;
69244           preset = _;
69245           fieldsArr = null;
69246           return presetEditor;
69247       };
69248
69249
69250       presetEditor.state = function(_) {
69251           if (!arguments.length) return state;
69252           state = _;
69253           return presetEditor;
69254       };
69255
69256
69257       presetEditor.tags = function(_) {
69258           if (!arguments.length) return tags;
69259           tags = _;
69260           // Don't reset fieldsArr here.
69261           return presetEditor;
69262       };
69263
69264
69265       presetEditor.entityID = function(_) {
69266           if (!arguments.length) return entityId;
69267           if (entityId === _) return presetEditor;
69268           entityId = _;
69269           fieldsArr = null;
69270           return presetEditor;
69271       };
69272
69273
69274       return utilRebind(presetEditor, dispatch$$1, 'on');
69275   }
69276
69277   function uiEntityEditor(context) {
69278       var dispatch$$1 = dispatch('choose');
69279       var _state = 'select';
69280       var _coalesceChanges = false;
69281       var _modified = false;
69282       var _base;
69283       var _entityID;
69284       var _activePreset;
69285       var _tagReference;
69286
69287       var presetEditor = uiPresetEditor(context)
69288           .on('change', changeTags);
69289       var rawTagEditor = uiRawTagEditor(context)
69290           .on('change', changeTags);
69291
69292
69293       function entityEditor(selection$$1) {
69294           var entity = context.entity(_entityID);
69295           var tags = clone(entity.tags);
69296
69297           // Header
69298           var header = selection$$1.selectAll('.header')
69299               .data([0]);
69300
69301           // Enter
69302           var enter = header.enter()
69303               .append('div')
69304               .attr('class', 'header fillL cf');
69305
69306           enter
69307               .append('button')
69308               .attr('class', 'fl preset-reset preset-choose')
69309               .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward'));
69310
69311           enter
69312               .append('button')
69313               .attr('class', 'fr preset-close')
69314               .on('click', function() { context.enter(modeBrowse(context)); })
69315               .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
69316
69317           enter
69318               .append('h3')
69319               .text(t('inspector.edit'));
69320
69321           // Update
69322           header = header
69323               .merge(enter);
69324
69325           header.selectAll('.preset-reset')
69326               .on('click', function() {
69327                   dispatch$$1.call('choose', this, _activePreset);
69328               });
69329
69330
69331           // Body
69332           var body = selection$$1.selectAll('.inspector-body')
69333               .data([0]);
69334
69335           // Enter
69336           enter = body.enter()
69337               .append('div')
69338               .attr('class', 'inspector-body');
69339
69340           enter
69341               .append('div')
69342               .attr('class', 'preset-list-item inspector-inner')
69343               .append('div')
69344               .attr('class', 'preset-list-button-wrap')
69345               .append('button')
69346               .attr('class', 'preset-list-button preset-reset')
69347               .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
69348               .append('div')
69349               .attr('class', 'label');
69350
69351           enter
69352               .append('div')
69353               .attr('class', 'inspector-border preset-editor');
69354
69355           enter
69356               .append('div')
69357               .attr('class', 'inspector-border raw-tag-editor inspector-inner');
69358
69359           enter
69360               .append('div')
69361               .attr('class', 'inspector-border raw-member-editor inspector-inner');
69362
69363           enter
69364               .append('div')
69365               .attr('class', 'raw-membership-editor inspector-inner');
69366
69367           enter
69368               .append('input')
69369               .attr('type', 'text')
69370               .attr('class', 'key-trap');
69371
69372
69373           // Update
69374           body = body
69375               .merge(enter);
69376
69377           if (_tagReference) {
69378               body.selectAll('.preset-list-button-wrap')
69379                   .call(_tagReference.button);
69380
69381               body.selectAll('.preset-list-item')
69382                   .call(_tagReference.body);
69383           }
69384
69385           body.selectAll('.preset-reset')
69386               .on('click', function() {
69387                   dispatch$$1.call('choose', this, _activePreset);
69388               });
69389
69390           body.select('.preset-list-item button')
69391               .call(uiPresetIcon()
69392                   .geometry(context.geometry(_entityID))
69393                   .preset(_activePreset)
69394               );
69395
69396           body.select('.preset-list-item .label')
69397               .text(_activePreset.name());
69398
69399           body.select('.preset-editor')
69400               .call(presetEditor
69401                   .preset(_activePreset)
69402                   .entityID(_entityID)
69403                   .tags(tags)
69404                   .state(_state)
69405               );
69406
69407           body.select('.raw-tag-editor')
69408               .call(rawTagEditor
69409                   .preset(_activePreset)
69410                   .entityID(_entityID)
69411                   .tags(tags)
69412                   .state(_state)
69413               );
69414
69415           if (entity.type === 'relation') {
69416               body.select('.raw-member-editor')
69417                   .style('display', 'block')
69418                   .call(uiRawMemberEditor(context)
69419                       .entityID(_entityID)
69420                   );
69421           } else {
69422               body.select('.raw-member-editor')
69423                   .style('display', 'none');
69424           }
69425
69426           body.select('.raw-membership-editor')
69427               .call(uiRawMembershipEditor(context)
69428                   .entityID(_entityID)
69429               );
69430
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();
69438                   }
69439               });
69440
69441           context.history()
69442               .on('change.entity-editor', historyChanged);
69443
69444
69445           function historyChanged() {
69446               if (_state === 'hide') return;
69447
69448               var entity = context.hasEntity(_entityID);
69449               var graph = context.graph();
69450               if (!entity) return;
69451
69452               var match = context.presets().match(entity, graph);
69453               var activePreset = entityEditor.preset();
69454               var weakPreset = activePreset && isEmpty(activePreset.addTags);
69455
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);
69460               }
69461               entityEditor.modified(_base !== graph);
69462               entityEditor(selection$$1);
69463           }
69464       }
69465
69466
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);
69473
69474           for (var k in changed) {
69475               if (!k) continue;
69476               var v = changed[k];
69477               if (v !== undefined || tags.hasOwnProperty(k)) {
69478                   tags[k] = v;
69479               }
69480           }
69481
69482           if (!onInput) {
69483               tags = utilCleanTags(tags);
69484           }
69485
69486           if (!isEqual(entity.tags, tags)) {
69487               if (_coalesceChanges) {
69488                   context.overwrite(actionChangeTags(_entityID, tags), annotation);
69489               } else {
69490                   context.perform(actionChangeTags(_entityID, tags), annotation);
69491                   _coalesceChanges = !!onInput;
69492               }
69493           }
69494       }
69495
69496
69497       entityEditor.modified = function(_) {
69498           if (!arguments.length) return _modified;
69499           _modified = _;
69500           d3_selectAll('button.preset-close use')
69501               .attr('xlink:href', (_modified ? '#iD-icon-apply' : '#iD-icon-close'));
69502           return entityEditor;
69503       };
69504
69505
69506       entityEditor.state = function(_) {
69507           if (!arguments.length) return _state;
69508           _state = _;
69509           return entityEditor;
69510       };
69511
69512
69513       entityEditor.entityID = function(_) {
69514           if (!arguments.length) return _entityID;
69515           _entityID = _;
69516           _base = context.graph();
69517           _coalesceChanges = false;
69518
69519           var presetMatch = context.presets().match(context.entity(_entityID), _base);
69520
69521           return entityEditor
69522               .preset(presetMatch)
69523               .modified(false);
69524       };
69525
69526
69527       entityEditor.preset = function(_) {
69528           if (!arguments.length) return _activePreset;
69529           if (_ !== _activePreset) {
69530               _activePreset = _;
69531               _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)), context)
69532                   .showing(false);
69533           }
69534           return entityEditor;
69535       };
69536
69537
69538       return utilRebind(entityEditor, dispatch$$1, 'on');
69539   }
69540
69541   function uiPresetList(context) {
69542       var dispatch$$1 = dispatch('choose'),
69543           id,
69544           currentPreset,
69545           autofocus = false;
69546
69547
69548       function presetList(selection$$1) {
69549           var entity = context.entity(id),
69550               geometry = context.geometry(id);
69551
69552           // Treat entities on addr:interpolation lines as points, not vertices (#3241)
69553           if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
69554               geometry = 'point';
69555           }
69556
69557           var presets = context.presets().matchGeometry(geometry);
69558
69559           selection$$1.html('');
69560
69561           var messagewrap = selection$$1
69562               .append('div')
69563               .attr('class', 'header fillL cf');
69564
69565           var message = messagewrap
69566               .append('h3')
69567               .text(t('inspector.choose'));
69568
69569           if (context.entity(id).isUsed(context.graph())) {
69570               messagewrap
69571                   .append('button')
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'));
69575           } else {
69576               messagewrap
69577                   .append('button')
69578                   .attr('class', 'close')
69579                   .on('click', function() {
69580                       context.enter(modeBrowse(context));
69581                   })
69582                   .call(svgIcon('#iD-icon-close'));
69583           }
69584
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();
69598                   context.undo();
69599               } else if (!event.ctrlKey && !event.metaKey) {
69600                   select(this).on('keydown', null);
69601               }
69602           }
69603
69604           function keypress() {
69605               // enter
69606               var value = search.property('value');
69607               if (event.keyCode === 13 && value.length) {
69608                   list.selectAll('.preset-list-item:first-child').datum().choose();
69609               }
69610           }
69611
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,
69619                       search: value
69620                   }));
69621                   list.call(drawList, results);
69622               } else {
69623                   list.call(drawList, context.presets().defaults(geometry, 36));
69624                   message.text(t('inspector.choose'));
69625               }
69626           }
69627
69628           var searchWrap = selection$$1
69629               .append('div')
69630               .attr('class', 'search-header');
69631
69632           var search = searchWrap
69633               .append('input')
69634               .attr('class', 'preset-search-input')
69635               .attr('placeholder', t('inspector.search'))
69636               .attr('type', 'search')
69637               .call(utilNoAuto)
69638               .on('keydown', keydown)
69639               .on('keypress', keypress)
69640               .on('input', inputevent);
69641
69642           searchWrap
69643               .call(svgIcon('#iD-icon-search', 'pre-text'));
69644
69645           if (autofocus) {
69646               search.node().focus();
69647           }
69648
69649           var listWrap = selection$$1
69650               .append('div')
69651               .attr('class', 'inspector-body');
69652
69653           var list = listWrap
69654               .append('div')
69655               .attr('class', 'preset-list fillL cf')
69656               .call(drawList, context.presets().defaults(geometry, 36));
69657       }
69658
69659
69660       function drawList(list, presets) {
69661           var collection = presets.collection.map(function(preset) {
69662               return preset.members ? CategoryItem(preset) : PresetItem(preset);
69663           });
69664
69665           var items = list.selectAll('.preset-list-item')
69666               .data(collection, function(d) { return d.preset.id; });
69667
69668           items.order();
69669
69670           items.exit()
69671               .remove();
69672
69673           items.enter()
69674               .append('div')
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)
69679               .transition()
69680               .style('opacity', 1);
69681       }
69682
69683
69684       function CategoryItem(preset) {
69685           var box, sublist, shown = false;
69686
69687           function item(selection$$1) {
69688               var wrap = selection$$1.append('div')
69689                   .attr('class', 'preset-list-button-wrap category col12');
69690
69691               var button = wrap
69692                   .append('button')
69693                   .attr('class', 'preset-list-button')
69694                   .classed('expanded', false)
69695                   .call(uiPresetIcon()
69696                       .geometry(context.geometry(id))
69697                       .preset(preset))
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';
69702                       select(this)
69703                           .classed('expanded', !isExpanded);
69704                       select(this).selectAll('div.label svg.icon use')
69705                           .attr('href', iconName);
69706                       item.choose();
69707                   });
69708
69709               var label = button
69710                   .append('div')
69711                   .attr('class', 'label');
69712
69713               label
69714                   .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'))
69715                   .append('span')
69716                   .html(function() { return preset.name() + '&hellip;'; });
69717
69718               box = selection$$1.append('div')
69719                   .attr('class', 'subgrid col12')
69720                   .style('max-height', '0px')
69721                   .style('opacity', 0);
69722
69723               box.append('div')
69724                   .attr('class', 'arrow');
69725
69726               sublist = box.append('div')
69727                   .attr('class', 'preset-list fillL3 cf fl');
69728           }
69729
69730
69731           item.choose = function() {
69732               if (!box || !sublist) return;
69733
69734               if (shown) {
69735                   shown = false;
69736                   box.transition()
69737                       .duration(200)
69738                       .style('opacity', '0')
69739                       .style('max-height', '0px')
69740                       .style('padding-bottom', '0px');
69741               } else {
69742                   shown = true;
69743                   sublist.call(drawList, preset.members);
69744                   box.transition()
69745                       .duration(200)
69746                       .style('opacity', '1')
69747                       .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
69748                       .style('padding-bottom', '20px');
69749               }
69750           };
69751
69752           item.preset = preset;
69753
69754           return item;
69755       }
69756
69757
69758       function PresetItem(preset) {
69759           function item(selection$$1) {
69760               var wrap = selection$$1.append('div')
69761                   .attr('class', 'preset-list-button-wrap col12');
69762
69763               wrap.append('button')
69764                   .attr('class', 'preset-list-button')
69765                   .call(uiPresetIcon()
69766                       .geometry(context.geometry(id))
69767                       .preset(preset))
69768                   .on('click', item.choose)
69769                   .append('div')
69770                   .attr('class', 'label')
69771                   .text(preset.name());
69772
69773               wrap.call(item.reference.button);
69774               selection$$1.call(item.reference.body);
69775           }
69776
69777           item.choose = function() {
69778               context.presets().choose(preset);
69779
69780               context.perform(
69781                   actionChangePreset(id, currentPreset, preset),
69782                   t('operations.change_tags.annotation')
69783               );
69784
69785               dispatch$$1.call('choose', this, preset);
69786           };
69787
69788           item.help = function() {
69789               event.stopPropagation();
69790               item.reference.toggle();
69791           };
69792
69793           item.preset = preset;
69794           item.reference = uiTagReference(preset.reference(context.geometry(id)), context);
69795
69796           return item;
69797       }
69798
69799
69800       presetList.autofocus = function(_) {
69801           if (!arguments.length) return autofocus;
69802           autofocus = _;
69803           return presetList;
69804       };
69805
69806
69807       presetList.entityID = function(_) {
69808           if (!arguments.length) return id;
69809           id = _;
69810           presetList.preset(context.presets().match(context.entity(id), context.graph()));
69811           return presetList;
69812       };
69813
69814
69815       presetList.preset = function(_) {
69816           if (!arguments.length) return currentPreset;
69817           currentPreset = _;
69818           return presetList;
69819       };
69820
69821
69822       return utilRebind(presetList, dispatch$$1, 'on');
69823   }
69824
69825   function uiViewOnOSM(context) {
69826       var id;
69827
69828       function viewOnOSM(selection) {
69829           var entity = context.entity(id);
69830
69831           selection.style('display', entity.isNew() ? 'none' : null);
69832
69833           var link = selection.selectAll('.view-on-osm')
69834               .data([0]);
69835
69836           var enter = link.enter()
69837               .append('a')
69838               .attr('class', 'view-on-osm')
69839               .attr('target', '_blank')
69840               .call(svgIcon('#iD-icon-out-link', 'inline'));
69841
69842           enter
69843               .append('span')
69844               .text(t('inspector.view_on_osm'));
69845
69846           link
69847               .merge(enter)
69848               .attr('href', context.connection().entityURL(entity));
69849       }
69850
69851
69852       viewOnOSM.entityID = function(_) {
69853           if (!arguments.length) return id;
69854           id = _;
69855           return viewOnOSM;
69856       };
69857
69858       return viewOnOSM;
69859   }
69860
69861   function uiInspector(context) {
69862       var presetList = uiPresetList(context);
69863       var entityEditor = uiEntityEditor(context);
69864       var _state = 'select';
69865       var _entityID;
69866       var _newFeature = false;
69867
69868
69869       function inspector(selection$$1) {
69870           presetList
69871               .entityID(_entityID)
69872               .autofocus(_newFeature)
69873               .on('choose', setPreset);
69874
69875           entityEditor
69876               .state(_state)
69877               .entityID(_entityID)
69878               .on('choose', showList);
69879
69880           var wrap = selection$$1.selectAll('.panewrap')
69881               .data([0]);
69882
69883           var enter = wrap.enter()
69884               .append('div')
69885               .attr('class', 'panewrap');
69886
69887           enter
69888               .append('div')
69889               .attr('class', 'preset-list-pane pane');
69890
69891           enter
69892               .append('div')
69893               .attr('class', 'entity-editor-pane pane');
69894
69895           wrap = wrap.merge(enter);
69896           var presetPane = wrap.selectAll('.preset-list-pane');
69897           var editorPane = wrap.selectAll('.entity-editor-pane');
69898
69899           var graph = context.graph(),
69900               entity = context.entity(_entityID),
69901               showEditor = _state === 'hover' ||
69902                   entity.isUsed(graph) ||
69903                   entity.isHighwayIntersection(graph);
69904
69905           if (showEditor) {
69906               wrap.style('right', '0%');
69907               editorPane.call(entityEditor);
69908           } else {
69909               wrap.style('right', '-100%');
69910               presetPane.call(presetList);
69911           }
69912
69913           var footer = selection$$1.selectAll('.footer')
69914               .data([0]);
69915
69916           footer = footer.enter()
69917               .append('div')
69918               .attr('class', 'footer')
69919               .merge(footer);
69920
69921           footer
69922               .call(uiViewOnOSM(context).entityID(_entityID));
69923
69924
69925           function showList(preset) {
69926               wrap.transition()
69927                   .styleTween('right', function() { return interpolate('0%', '-100%'); });
69928
69929               presetPane
69930                   .call(presetList.preset(preset).autofocus(true));
69931           }
69932
69933
69934           function setPreset(preset) {
69935               wrap.transition()
69936                   .styleTween('right', function() { return interpolate('-100%', '0%'); });
69937
69938               editorPane
69939                   .call(entityEditor.preset(preset));
69940           }
69941       }
69942
69943
69944       inspector.state = function(_) {
69945           if (!arguments.length) return _state;
69946           _state = _;
69947           entityEditor.state(_state);
69948
69949           // remove any old field help overlay that might have gotten attached to the inspector
69950           d3_selectAll('.field-help-body').remove();
69951
69952           return inspector;
69953       };
69954
69955
69956       inspector.entityID = function(_) {
69957           if (!arguments.length) return _entityID;
69958           _entityID = _;
69959           return inspector;
69960       };
69961
69962
69963       inspector.newFeature = function(_) {
69964           if (!arguments.length) return _newFeature;
69965           _newFeature = _;
69966           return inspector;
69967       };
69968
69969
69970       return inspector;
69971   }
69972
69973   function uiSidebar(context) {
69974       var inspector = uiInspector(context),
69975           current;
69976
69977
69978       function sidebar(selection) {
69979           var featureListWrap = selection
69980               .append('div')
69981               .attr('class', 'feature-list-pane')
69982               .call(uiFeatureList(context));
69983
69984
69985           var inspectorWrap = selection
69986               .append('div')
69987               .attr('class', 'inspector-hidden inspector-wrap fr');
69988
69989
69990           function hover(id) {
69991               if (!current && context.hasEntity(id)) {
69992                   featureListWrap
69993                       .classed('inspector-hidden', true);
69994
69995                   inspectorWrap
69996                       .classed('inspector-hidden', false)
69997                       .classed('inspector-hover', true);
69998
69999                   if (inspector.entityID() !== id || inspector.state() !== 'hover') {
70000                       inspector
70001                           .state('hover')
70002                           .entityID(id);
70003
70004                       inspectorWrap
70005                           .call(inspector);
70006                   }
70007
70008               } else if (!current) {
70009                   featureListWrap
70010                       .classed('inspector-hidden', false);
70011                   inspectorWrap
70012                       .classed('inspector-hidden', true);
70013                   inspector
70014                       .state('hide');
70015               }
70016           }
70017
70018
70019           sidebar.hover = throttle(hover, 200);
70020
70021
70022           sidebar.select = function(id, newFeature) {
70023               if (!current && id) {
70024                   featureListWrap
70025                       .classed('inspector-hidden', true);
70026
70027                   inspectorWrap
70028                       .classed('inspector-hidden', false)
70029                       .classed('inspector-hover', false);
70030
70031                   if (inspector.entityID() !== id || inspector.state() !== 'select') {
70032                       inspector
70033                           .state('select')
70034                           .entityID(id)
70035                           .newFeature(newFeature);
70036
70037                       inspectorWrap
70038                           .call(inspector);
70039                   }
70040
70041               } else if (!current) {
70042                   featureListWrap
70043                       .classed('inspector-hidden', false);
70044                   inspectorWrap
70045                       .classed('inspector-hidden', true);
70046                   inspector
70047                       .state('hide');
70048               }
70049           };
70050
70051
70052           sidebar.show = function(component) {
70053               featureListWrap
70054                   .classed('inspector-hidden', true);
70055               inspectorWrap
70056                   .classed('inspector-hidden', true);
70057
70058               if (current) current.remove();
70059               current = selection
70060                   .append('div')
70061                   .attr('class', 'sidebar-component')
70062                   .call(component);
70063           };
70064
70065
70066           sidebar.hide = function() {
70067               featureListWrap
70068                   .classed('inspector-hidden', false);
70069               inspectorWrap
70070                   .classed('inspector-hidden', true);
70071
70072               if (current) current.remove();
70073               current = null;
70074           };
70075       }
70076
70077
70078       sidebar.hover = function() {};
70079       sidebar.hover.cancel = function() {};
70080       sidebar.select = function() {};
70081       sidebar.show = function() {};
70082       sidebar.hide = function() {};
70083
70084       return sidebar;
70085   }
70086
70087   function uiSpinner(context) {
70088       var osm = context.connection();
70089
70090
70091       return function(selection) {
70092           var img = selection
70093               .append('img')
70094               .attr('src', context.imagePath('loader-black.gif'))
70095               .style('opacity', 0);
70096
70097           if (osm) {
70098               osm
70099                   .on('loading.spinner', function() {
70100                       img.transition()
70101                           .style('opacity', 1);
70102                   })
70103                   .on('loaded.spinner', function() {
70104                       img.transition()
70105                           .style('opacity', 0);
70106                   });
70107           }
70108       };
70109   }
70110
70111   function uiSplash(context) {
70112
70113       return function(selection) {
70114           if (context.storage('sawSplash'))
70115                return;
70116
70117           context.storage('sawSplash', true);
70118
70119           var modalSelection = uiModal(selection);
70120
70121           modalSelection.select('.modal')
70122               .attr('class', 'modal-splash modal col6');
70123
70124           var introModal = modalSelection.select('.content')
70125               .append('div')
70126               .attr('class', 'fillL');
70127
70128           introModal
70129               .append('div')
70130               .attr('class','modal-section cf')
70131               .append('h3').text(t('splash.welcome'));
70132
70133           introModal
70134               .append('div')
70135               .attr('class','modal-section')
70136               .append('p')
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>'
70141               }));
70142
70143           var buttonWrap = introModal
70144               .append('div')
70145               .attr('class', 'modal-actions cf');
70146
70147           var walkthrough = buttonWrap
70148               .append('button')
70149               .attr('class', 'walkthrough col6')
70150               .on('click', function() {
70151                   context.container().call(uiIntro(context));
70152                   modalSelection.close();
70153               });
70154
70155           walkthrough
70156               .append('svg')
70157               .attr('class', 'logo logo-walkthrough')
70158               .append('use')
70159               .attr('xlink:href', '#iD-logo-walkthrough');
70160
70161           walkthrough
70162               .append('div')
70163               .text(t('splash.walkthrough'));
70164
70165           var startEditing = buttonWrap
70166               .append('button')
70167               .attr('class', 'start-editing col6')
70168               .on('click', modalSelection.close);
70169
70170           startEditing
70171               .append('svg')
70172               .attr('class', 'logo logo-features')
70173               .append('use')
70174               .attr('xlink:href', '#iD-logo-features');
70175
70176           startEditing
70177               .append('div')
70178               .text(t('splash.start'));
70179
70180
70181           modalSelection.select('button.close')
70182               .attr('class','hide');
70183
70184       };
70185   }
70186
70187   function uiStatus(context) {
70188       var osm = context.connection();
70189
70190
70191       return function(selection$$1) {
70192           if (!osm) return;
70193
70194           function update() {
70195               osm.status(function(err, apiStatus) {
70196                   selection$$1.html('');
70197
70198                   if (err) {
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)
70202                           return;
70203
70204                       } else if (apiStatus === 'rateLimited') {
70205                           selection$$1
70206                               .text(t('status.rateLimit'))
70207                               .append('a')
70208                               .attr('class', 'api-status-login')
70209                               .attr('target', '_blank')
70210                               .call(svgIcon('#iD-icon-out-link', 'inline'))
70211                               .append('span')
70212                               .text(t('login'))
70213                               .on('click.login', function() {
70214                                   event.preventDefault();
70215                                   osm.authenticate();
70216                               });
70217                       } else {
70218                           // eslint-disable-next-line no-warning-comments
70219                           // TODO: nice messages for different error types
70220                           selection$$1.text(t('status.error'));
70221                       }
70222
70223                   } else if (apiStatus === 'readonly') {
70224                       selection$$1.text(t('status.readonly'));
70225                   } else if (apiStatus === 'offline') {
70226                       selection$$1.text(t('status.offline'));
70227                   }
70228
70229                   selection$$1.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
70230               });
70231           }
70232
70233           osm.on('change', function() { update(selection$$1); });
70234
70235           window.setInterval(update, 90000);
70236           update(selection$$1);
70237       };
70238   }
70239
70240   function uiUndoRedo(context) {
70241       var commands = [{
70242           id: 'undo',
70243           cmd: uiCmd('⌘Z'),
70244           action: function() { if (editable()) context.undo(); },
70245           annotation: function() { return context.history().undoAnnotation(); }
70246       }, {
70247           id: 'redo',
70248           cmd: uiCmd('⌘⇧Z'),
70249           action: function() { if (editable()) context.redo(); },
70250           annotation: function() { return context.history().redoAnnotation(); }
70251       }];
70252
70253
70254       function editable() {
70255           var mode = context.mode();
70256           return context.editable() && mode && mode.id !== 'save';
70257       }
70258
70259
70260       return function(selection$$1) {
70261           var tooltipBehavior = tooltip()
70262               .placement('bottom')
70263               .html(true)
70264               .title(function (d) {
70265                   return uiTooltipHtml(d.annotation() ?
70266                       t(d.id + '.tooltip', {action: d.annotation()}) :
70267                       t(d.id + '.nothing'), d.cmd);
70268               });
70269
70270           var buttons = selection$$1.selectAll('button')
70271               .data(commands)
70272               .enter()
70273               .append('button')
70274               .attr('class', function(d) { return 'col6 disabled ' + d.id + '-button'; })
70275               .on('click', function(d) { return d.action(); })
70276               .call(tooltipBehavior);
70277
70278           buttons.each(function(d) {
70279               var iconName = d.id;
70280               if (textDirection === 'rtl') {
70281                   if (iconName === 'undo') {
70282                       iconName = 'redo';
70283                   } else if (iconName === 'redo') {
70284                       iconName = 'undo';
70285                   }
70286               }
70287               select(this)
70288                   .call(svgIcon('#iD-icon-' + iconName));
70289           });
70290
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(); });
70294
70295           select(document)
70296               .call(keybinding);
70297
70298
70299           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
70300
70301           context.map()
70302               .on('move.undo_redo', debouncedUpdate)
70303               .on('drawn.undo_redo', debouncedUpdate);
70304
70305           context.history()
70306               .on('change.undo_redo', update);
70307
70308           context
70309               .on('enter.undo_redo', update);
70310
70311
70312           function update() {
70313               buttons
70314                   .property('disabled', !editable())
70315                   .classed('disabled', function(d) { return !d.annotation(); })
70316                   .each(function() {
70317                       var selection$$1 = select(this);
70318                       if (selection$$1.property('tooltipVisible')) {
70319                           selection$$1.call(tooltipBehavior.show);
70320                       }
70321                   });
70322           }
70323       };
70324   }
70325
70326   // these are module variables so they are preserved through a ui.restart()
70327   var sawVersion = null,
70328       isNewVersion = false,
70329       isNewUser = false;
70330
70331
70332   function uiVersion(context) {
70333
70334       var currVersion = context.version,
70335           matchedVersion = currVersion.match(/\d\.\d\.\d.*/);
70336
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;
70342       }
70343
70344       return function(selection) {
70345           selection
70346               .append('a')
70347               .attr('target', '_blank')
70348               .attr('tabindex', -1)
70349               .attr('href', 'https://github.com/openstreetmap/iD')
70350               .text(currVersion);
70351
70352           // only show new version indicator to users that have used iD before
70353           if (isNewVersion && !isNewUser) {
70354               selection
70355                   .append('div')
70356                   .attr('class', 'badge')
70357                   .append('a')
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'))
70362                   .call(tooltip()
70363                       .title(t('version.whats_new', { version: currVersion }))
70364                       .placement('top')
70365                   );
70366           }
70367       };
70368   }
70369
70370   function uiZoom(context) {
70371       var zooms = [{
70372           id: 'zoom-in',
70373           icon: 'plus',
70374           title: t('zoom.in'),
70375           action: context.zoomIn,
70376           key: '+'
70377       }, {
70378           id: 'zoom-out',
70379           icon: 'minus',
70380           title: t('zoom.out'),
70381           action: context.zoomOut,
70382           key: '-'
70383       }];
70384
70385
70386       function zoomIn() {
70387           event.preventDefault();
70388           context.zoomIn();
70389       }
70390
70391
70392       function zoomOut() {
70393           event.preventDefault();
70394           context.zoomOut();
70395       }
70396
70397
70398       function zoomInFurther() {
70399           event.preventDefault();
70400           context.zoomInFurther();
70401       }
70402
70403
70404       function zoomOutFurther() {
70405           event.preventDefault();
70406           context.zoomOutFurther();
70407       }
70408
70409
70410       return function(selection$$1) {
70411           var button = selection$$1.selectAll('button')
70412               .data(zooms)
70413               .enter()
70414               .append('button')
70415               .attr('tabindex', -1)
70416               .attr('class', function(d) { return d.id; })
70417               .on('click.editor', function(d) { d.action(); })
70418               .call(tooltip()
70419                   .placement((textDirection === 'rtl') ? 'right' : 'left')
70420                   .html(true)
70421                   .title(function(d) {
70422                       return uiTooltipHtml(d.title, d.key);
70423                   })
70424               );
70425
70426           button.each(function(d) {
70427               select(this)
70428                   .call(svgIcon('#iD-icon-' + d.icon, 'light'));
70429           });
70430
70431           var keybinding = d3keybinding('zoom');
70432
70433           ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
70434               keybinding.on([key], zoomIn);
70435               keybinding.on([uiCmd('⌘' + key)], zoomInFurther);
70436           });
70437
70438           ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
70439               keybinding.on([key], zoomOut);
70440               keybinding.on([uiCmd('⌘' + key)], zoomOutFurther);
70441           });
70442
70443           select(document)
70444               .call(keybinding);
70445       };
70446   }
70447
70448   function uiInit(context) {
70449       var uiInitCounter = 0;
70450
70451
70452       function render(container) {
70453           container
70454               .attr('dir', textDirection);
70455
70456           var map = context.map();
70457
70458           var hash = behaviorHash(context);
70459           hash();
70460
70461           if (!hash.hadHash) {
70462               map.centerZoom([0, 0], 2);
70463           }
70464
70465           container
70466               .append('svg')
70467               .attr('id', 'defs')
70468               .call(svgDefs(context));
70469
70470           container
70471               .append('div')
70472               .attr('id', 'sidebar')
70473               .attr('class', 'col4')
70474               .call(ui.sidebar);
70475
70476           var content = container
70477               .append('div')
70478               .attr('id', 'content')
70479               .attr('class', 'active');
70480
70481           var bar = content
70482               .append('div')
70483               .attr('id', 'bar')
70484               .attr('class', 'fillD');
70485
70486           content
70487               .append('div')
70488               .attr('id', 'map')
70489               .attr('dir', 'ltr')
70490               .call(map);
70491
70492           content
70493               .call(uiMapInMap(context))
70494               .call(uiInfo(context))
70495               .call(uiNotice(context));
70496
70497           bar
70498               .append('div')
70499               .attr('class', 'spacer col4');
70500
70501           var limiter = bar.append('div')
70502               .attr('class', 'limiter');
70503
70504           limiter
70505               .append('div')
70506               .attr('class', 'button-wrap joined col3')
70507               .call(uiModes(context), limiter);
70508
70509           limiter
70510               .append('div')
70511               .attr('class', 'button-wrap joined col1')
70512               .call(uiUndoRedo(context));
70513
70514           limiter
70515               .append('div')
70516               .attr('class', 'button-wrap col1')
70517               .call(uiSave(context));
70518
70519           bar
70520               .append('div')
70521               .attr('class', 'full-screen')
70522               .call(uiFullScreen(context));
70523
70524           bar
70525               .append('div')
70526               .attr('class', 'spinner')
70527               .call(uiSpinner(context));
70528
70529
70530           var controls = bar
70531               .append('div')
70532               .attr('class', 'map-controls');
70533
70534           controls
70535               .append('div')
70536               .attr('class', 'map-control zoombuttons')
70537               .call(uiZoom(context));
70538
70539           controls
70540               .append('div')
70541               .attr('class', 'map-control geolocate-control')
70542               .call(uiGeolocate(context));
70543
70544           controls
70545               .append('div')
70546               .attr('class', 'map-control background-control')
70547               .call(uiBackground(context));
70548
70549           controls
70550               .append('div')
70551               .attr('class', 'map-control map-data-control')
70552               .call(uiMapData(context));
70553
70554           controls
70555               .append('div')
70556               .attr('class', 'map-control help-control')
70557               .call(uiHelp(context));
70558
70559
70560           var about = content
70561               .append('div')
70562               .attr('id', 'about');
70563
70564           about
70565               .append('div')
70566               .attr('id', 'attrib')
70567               .attr('dir', 'ltr')
70568               .call(uiAttribution(context));
70569
70570           about
70571               .append('div')
70572               .attr('class', 'api-status')
70573               .call(uiStatus(context));
70574
70575
70576           var footer = about
70577               .append('div')
70578               .attr('id', 'footer')
70579               .attr('class', 'fillD');
70580
70581           footer
70582               .append('div')
70583               .attr('id', 'flash-wrap')
70584               .attr('class', 'footer-hide');
70585
70586           var footerWrap = footer
70587               .append('div')
70588               .attr('id', 'footer-wrap')
70589               .attr('class', 'footer-show');
70590
70591           footerWrap
70592               .append('div')
70593               .attr('id', 'scale-block')
70594               .call(uiScale(context));
70595
70596           var aboutList = footerWrap
70597               .append('div')
70598               .attr('id', 'info-block')
70599               .append('ul')
70600               .attr('id', 'about-list');
70601
70602           if (!context.embed()) {
70603               aboutList
70604                   .call(uiAccount(context));
70605           }
70606
70607           aboutList
70608               .append('li')
70609               .attr('class', 'version')
70610               .call(uiVersion(context));
70611
70612           var issueLinks = aboutList
70613               .append('li');
70614
70615           issueLinks
70616               .append('a')
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'));
70622
70623           issueLinks
70624               .append('a')
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'));
70630
70631           aboutList
70632               .append('li')
70633               .attr('class', 'feature-warning')
70634               .attr('tabindex', -1)
70635               .call(uiFeatureInfo(context));
70636
70637           aboutList
70638               .append('li')
70639               .attr('class', 'user-list')
70640               .attr('tabindex', -1)
70641               .call(uiContributors(context));
70642
70643
70644           var photoviewer = content
70645               .append('div')
70646               .attr('id', 'photoviewer')
70647               .classed('al', true)       // 'al'=left,  'ar'=right
70648               .classed('hide', true);
70649
70650           photoviewer
70651               .append('button')
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(); }
70657               })
70658               .append('div')
70659               .call(svgIcon('#iD-icon-close'));
70660
70661
70662           window.onbeforeunload = function() {
70663               return context.save();
70664           };
70665
70666           window.onunload = function() {
70667               context.history().unlock();
70668           };
70669
70670           var mapDimensions = map.dimensions();
70671
70672
70673           function onResize() {
70674               mapDimensions = utilGetDimensions(content, true);
70675               map.dimensions(mapDimensions);
70676           }
70677
70678           select(window)
70679               .on('resize.editor', onResize);
70680
70681           onResize();
70682
70683           function pan(d) {
70684               return function() {
70685                   event.preventDefault();
70686                   context.pan(d, 100);
70687               };
70688           }
70689
70690
70691           // pan amount
70692           var pa = 80;
70693
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]]));
70704
70705           select(document)
70706               .call(keybinding);
70707
70708           context.enter(modeBrowse(context));
70709
70710           if (!uiInitCounter++) {
70711               if (!hash.startWalkthrough) {
70712                   context.container()
70713                       .call(uiSplash(context))
70714                       .call(uiRestore(context));
70715               }
70716
70717               context.container()
70718                   .call(uiShortcuts(context));
70719           }
70720
70721           var osm = context.connection(),
70722               auth = uiLoading(context).message(t('loading_auth')).blocking(true);
70723
70724           if (osm && auth) {
70725               osm
70726                   .on('authLoading.ui', function() {
70727                       context.container()
70728                           .call(auth);
70729                   })
70730                   .on('authDone.ui', function() {
70731                       auth.close();
70732                   });
70733           }
70734
70735           uiInitCounter++;
70736
70737           if (hash.startWalkthrough) {
70738               hash.startWalkthrough = false;
70739               context.container().call(uiIntro(context));
70740           }
70741       }
70742
70743
70744       var renderCallback;
70745
70746       function ui(node, callback) {
70747           renderCallback = callback;
70748           var container = select(node);
70749           context.container(container);
70750           context.loadLocale(function(err) {
70751               if (!err) {
70752                   render(container);
70753               }
70754               if (callback) {
70755                   callback(err);
70756               }
70757           });
70758       }
70759
70760
70761       ui.restart = function(arg) {
70762           context.locale(arg);
70763           context.loadLocale(function(err) {
70764               if (!err) {
70765                   context.container().selectAll('*').remove();
70766                   render(context.container());
70767                   if (renderCallback) renderCallback();
70768               }
70769           });
70770       };
70771
70772
70773       ui.sidebar = uiSidebar(context);
70774
70775       return ui;
70776   }
70777
70778   function uiChangesetEditor(context) {
70779       var dispatch$$1 = dispatch('change');
70780       var formFields = uiFormFields(context);
70781       var _fieldsArr;
70782       var _tags;
70783       var _changesetID;
70784
70785
70786       function changesetEditor(selection) {
70787           render(selection);
70788       }
70789
70790
70791       function render(selection) {
70792           var initial = false;
70793
70794           if (!_fieldsArr) {
70795               initial = true;
70796               var presets = context.presets();
70797
70798               _fieldsArr = [
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 }),
70802               ];
70803
70804               _fieldsArr.forEach(function(field) {
70805                   field
70806                       .on('change', function(t$$1, onInput) {
70807                           dispatch$$1.call('change', field, t$$1, onInput);
70808                       });
70809               });
70810           }
70811
70812           _fieldsArr.forEach(function(field) {
70813               field
70814                   .tags(_tags);
70815           });
70816
70817
70818           selection
70819               .call(formFields.fieldsArr(_fieldsArr));
70820
70821
70822           if (initial) {
70823               var commentField = selection.select('#preset-input-comment');
70824               var commentNode = commentField.node();
70825
70826               if (commentNode) {
70827                   commentNode.focus();
70828                   commentNode.select();
70829               }
70830
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');
70834
70835               var osm = context.connection();
70836               if (osm) {
70837                   osm.userChangesets(function (err, changesets) {
70838                       if (err) return;
70839
70840                       var comments = changesets.map(function(changeset) {
70841                           return {
70842                               title: changeset.tags.comment,
70843                               value: changeset.tags.comment
70844                           };
70845                       });
70846
70847                       commentField
70848                           .call(d3combobox()
70849                               .container(context.container())
70850                               .caseSensitive(true)
70851                               .data(uniqBy(comments, 'title'))
70852                           );
70853                   });
70854               }
70855           }
70856
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] : []);
70861
70862           commentWarning.exit()
70863               .transition()
70864               .duration(200)
70865               .style('opacity', 0)
70866               .remove();
70867
70868           var commentEnter = commentWarning.enter()
70869               .insert('div', '.tag-reference-body')
70870               .attr('class', 'field-warning comment-warning')
70871               .style('opacity', 0);
70872
70873           commentEnter
70874               .append('a')
70875               .attr('target', '_blank')
70876               .attr('tabindex', -1)
70877               .call(svgIcon('#iD-icon-alert', 'inline'))
70878               .attr('href', t('commit.google_warning_link'))
70879               .append('span')
70880               .text(t('commit.google_warning'));
70881
70882           commentEnter
70883               .transition()
70884               .duration(200)
70885               .style('opacity', 1);
70886       }
70887
70888
70889       changesetEditor.tags = function(_) {
70890           if (!arguments.length) return _tags;
70891           _tags = _;
70892           // Don't reset _fieldsArr here.
70893           return changesetEditor;
70894       };
70895
70896
70897       changesetEditor.changesetID = function(_) {
70898           if (!arguments.length) return _changesetID;
70899           if (_changesetID === _) return changesetEditor;
70900           _changesetID = _;
70901           _fieldsArr = null;
70902           return changesetEditor;
70903       };
70904
70905
70906       return utilRebind(changesetEditor, dispatch$$1, 'on');
70907   }
70908
70909   /**
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:
70914    * (value).
70915    *
70916    * @static
70917    * @memberOf _
70918    * @since 4.0.0
70919    * @category Array
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.
70923    * @example
70924    *
70925    * _.unionBy([2.1], [1.2, 2.3], Math.floor);
70926    * // => [2.1, 1.2]
70927    *
70928    * // The `_.property` iteratee shorthand.
70929    * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
70930    * // => [{ 'x': 1 }, { 'x': 2 }]
70931    */
70932   var unionBy = baseRest(function(arrays) {
70933     var iteratee = last(arrays);
70934     if (isArrayLikeObject(iteratee)) {
70935       iteratee = undefined;
70936     }
70937     return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
70938   });
70939
70940   function uiCommitChanges(context) {
70941       var detected = utilDetect();
70942       var _entityID;
70943
70944
70945       function commitChanges(selection$$1) {
70946           var history = context.history();
70947           var summary = history.difference().summary();
70948
70949           var container = selection$$1.selectAll('.modal-section.commit-section')
70950               .data([0]);
70951
70952           var containerEnter = container.enter()
70953               .append('div')
70954               .attr('class', 'commit-section modal-section fillL2');
70955
70956           containerEnter
70957               .append('h3')
70958               .text(t('commit.changes', { count: summary.length }));
70959
70960           containerEnter
70961               .append('ul')
70962               .attr('class', 'changeset-list');
70963
70964           container = containerEnter
70965               .merge(container);
70966
70967
70968           var items = container.select('ul').selectAll('li')
70969               .data(summary);
70970
70971           var itemsEnter = items.enter()
70972               .append('li')
70973               .attr('class', 'change-item');
70974
70975           itemsEnter
70976               .each(function(d) {
70977                   select(this)
70978                       .call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
70979               });
70980
70981           itemsEnter
70982               .append('span')
70983               .attr('class', 'change-type')
70984               .text(function(d) { return t('commit.' + d.changeType) + ' '; });
70985
70986           itemsEnter
70987               .append('strong')
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);
70992               });
70993
70994           itemsEnter
70995               .append('span')
70996               .attr('class', 'entity-name')
70997               .text(function(d) {
70998                   var name = utilDisplayName(d.entity) || '',
70999                       string = '';
71000                   if (name !== '') {
71001                       string += ':';
71002                   }
71003                   return string += ' ' + name;
71004               });
71005
71006           itemsEnter
71007               .style('opacity', 0)
71008               .transition()
71009               .style('opacity', 1);
71010
71011           items = itemsEnter
71012               .merge(items);
71013
71014           items
71015               .on('mouseover', mouseover)
71016               .on('mouseout', mouseout)
71017               .on('click', click);
71018
71019
71020           // Download changeset link
71021           var changeset = new osmChangeset().update({ id: undefined });
71022           var changes = history.changes(actionDiscardTags(history.difference()));
71023
71024           delete changeset.id;  // Export without chnageset_id
71025
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';
71029
71030           var linkEnter = container.selectAll('.download-changes')
71031               .data([0])
71032               .enter()
71033               .append('a')
71034               .attr('class', 'download-changes');
71035
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);
71040
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);
71046                   });
71047           }
71048
71049           linkEnter
71050               .call(svgIcon('#iD-icon-load', 'inline'))
71051               .append('span')
71052               .text(t('commit.download_changes'));
71053
71054
71055           function mouseover(d) {
71056               if (d.entity) {
71057                   context.surface().selectAll(
71058                       utilEntityOrMemberSelector([d.entity.id], context.graph())
71059                   ).classed('hover', true);
71060               }
71061           }
71062
71063
71064           function mouseout() {
71065               context.surface().selectAll('.hover')
71066                   .classed('hover', false);
71067           }
71068
71069
71070           function click(change) {
71071               if (change.changeType === 'deleted') {
71072                   _entityID = null;
71073               } else {
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);
71079               }
71080           }
71081       }
71082
71083
71084       commitChanges.entityID = function(_) {
71085           if (!arguments.length) return _entityID;
71086           _entityID = _;
71087           return commitChanges;
71088       };
71089
71090
71091       return commitChanges;
71092   }
71093
71094   function uiCommitWarnings(context) {
71095
71096       function commitWarnings(selection) {
71097
71098           var changes = context.history().changes();
71099           var warnings = context.history().validate(changes);
71100
71101           var container = selection.selectAll('.warning-section')
71102               .data(warnings.length ? [0] : []);
71103
71104           container.exit()
71105               .remove();
71106
71107           var containerEnter = container.enter()
71108               .append('div')
71109               .attr('class', 'modal-section warning-section fillL2');
71110
71111           containerEnter
71112               .append('h3')
71113               .text(t('commit.warnings'));
71114
71115           containerEnter
71116               .append('ul')
71117               .attr('class', 'changeset-list');
71118
71119           container = containerEnter
71120               .merge(container);
71121
71122
71123           var items = container.select('ul').selectAll('li')
71124               .data(warnings);
71125
71126           items.exit()
71127               .remove();
71128
71129           var itemsEnter = items.enter()
71130               .append('li')
71131               .attr('class', 'warning-item');
71132
71133           itemsEnter
71134               .call(svgIcon('#iD-icon-alert', 'pre-text'));
71135
71136           itemsEnter
71137               .append('strong')
71138               .text(function(d) { return d.message; });
71139
71140           itemsEnter.filter(function(d) { return d.tooltip; })
71141               .call(tooltip()
71142                   .title(function(d) { return d.tooltip; })
71143                   .placement('top')
71144               );
71145
71146           items = itemsEnter
71147               .merge(items);
71148
71149           items
71150               .on('mouseover', mouseover)
71151               .on('mouseout', mouseout)
71152               .on('click', warningClick);
71153
71154
71155           function mouseover(d) {
71156               if (d.entity) {
71157                   context.surface().selectAll(
71158                       utilEntityOrMemberSelector([d.entity.id], context.graph())
71159                   ).classed('hover', true);
71160               }
71161           }
71162
71163
71164           function mouseout() {
71165               context.surface().selectAll('.hover')
71166                   .classed('hover', false);
71167           }
71168
71169
71170           function warningClick(d) {
71171               if (d.entity) {
71172                   context.map().zoomTo(d.entity);
71173                   context.enter(modeSelect(context, [d.entity.id]));
71174               }
71175           }
71176
71177       }
71178
71179
71180       return commitWarnings;
71181   }
71182
71183   var _changeset$1;
71184   var readOnlyTags = [
71185       /^changesets_count$/,
71186       /^created_by$/,
71187       /^ideditor:/,
71188       /^imagery_used$/,
71189       /^host$/,
71190       /^locale$/
71191   ];
71192
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;
71196
71197
71198   function uiCommit(context) {
71199       var dispatch$$1 = dispatch('cancel', 'save');
71200       var _userDetails;
71201       var _selection;
71202
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);
71209
71210
71211       function commit(selection$$1) {
71212           _selection = selection$$1;
71213
71214           var osm = context.connection();
71215           if (!osm) return;
71216
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);
71225           }
71226
71227           var tags;
71228           if (!_changeset$1) {
71229               var detected = utilDetect();
71230               tags = {
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)
71235               };
71236
71237               // call findHashtags initially - this will remove stored
71238               // hashtags if any hashtags are found in the comment - #4304
71239               findHashtags(tags, true);
71240
71241               var hashtags = context.storage('hashtags');
71242               if (hashtags) {
71243                   tags.hashtags = hashtags;
71244               }
71245
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);
71253               }
71254
71255               _changeset$1 = new osmChangeset({ tags: tags });
71256           }
71257
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 });
71261
71262           var header = selection$$1.selectAll('.header')
71263               .data([0]);
71264
71265           header.enter()
71266               .append('div')
71267               .attr('class', 'header fillL')
71268               .append('h3')
71269               .text(t('commit.title'));
71270
71271           var body = selection$$1.selectAll('.body')
71272               .data([0]);
71273
71274           body = body.enter()
71275               .append('div')
71276               .attr('class', 'body')
71277               .merge(body);
71278
71279
71280           // Changeset Section
71281           var changesetSection = body.selectAll('.changeset-editor')
71282               .data([0]);
71283
71284           changesetSection = changesetSection.enter()
71285               .append('div')
71286               .attr('class', 'modal-section changeset-editor')
71287               .merge(changesetSection);
71288
71289           changesetSection
71290               .call(changesetEditor
71291                   .changesetID(_changeset$1.id)
71292                   .tags(tags)
71293               );
71294
71295
71296           // Warnings
71297           body.call(commitWarnings);
71298
71299
71300           // Upload Explanation
71301           var saveSection = body.selectAll('.save-section')
71302               .data([0]);
71303
71304           saveSection = saveSection.enter()
71305               .append('div')
71306               .attr('class','modal-section save-section fillL cf')
71307               .merge(saveSection);
71308
71309           var prose = saveSection.selectAll('.commit-info')
71310               .data([0]);
71311
71312           prose = prose.enter()
71313               .append('p')
71314               .attr('class', 'commit-info')
71315               .text(t('commit.upload_explanation'))
71316               .merge(prose);
71317
71318           osm.userDetails(function(err, user) {
71319               if (err) return;
71320
71321               var userLink = select(document.createElement('div'));
71322
71323               _userDetails = user;
71324
71325               if (user.image_url) {
71326                   userLink
71327                       .append('img')
71328                       .attr('src', user.image_url)
71329                       .attr('class', 'icon pre-text user-icon');
71330               }
71331
71332               userLink
71333                   .append('a')
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');
71339
71340               prose
71341                   .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
71342           });
71343
71344
71345           // Request Review
71346           var requestReview = saveSection.selectAll('.request-review')
71347               .data([0]);
71348
71349           // Enter
71350           var requestReviewEnter = requestReview.enter()
71351               .append('div')
71352               .attr('class', 'request-review');
71353
71354           var labelEnter = requestReviewEnter
71355               .append('label')
71356               .attr('for', 'commit-input-request-review');
71357
71358           labelEnter
71359               .append('input')
71360               .attr('type', 'checkbox')
71361               .attr('id', 'commit-input-request-review');
71362
71363           labelEnter
71364               .append('span')
71365               .text(t('commit.request_review'));
71366
71367           // Update
71368           requestReview = requestReview
71369               .merge(requestReviewEnter);
71370
71371           var requestReviewInput = requestReview.selectAll('input')
71372               .property('checked', isReviewRequested(_changeset$1.tags))
71373               .on('change', toggleRequestReview);
71374
71375
71376           // Buttons
71377           var buttonSection = saveSection.selectAll('.buttons')
71378               .data([0]);
71379
71380           // enter
71381           var buttonEnter = buttonSection.enter()
71382               .append('div')
71383               .attr('class', 'buttons fillL cf');
71384
71385           buttonEnter
71386               .append('button')
71387               .attr('class', 'secondary-action col5 button cancel-button')
71388               .append('span')
71389               .attr('class', 'label')
71390               .text(t('commit.cancel'));
71391
71392           buttonEnter
71393               .append('button')
71394               .attr('class', 'action col5 button save-button')
71395               .append('span')
71396               .attr('class', 'label')
71397               .text(t('commit.save'));
71398
71399           // update
71400           buttonSection = buttonSection
71401               .merge(buttonEnter);
71402
71403           buttonSection.selectAll('.cancel-button')
71404               .on('click.cancel', function() {
71405                   var selectedID = commitChanges.entityID();
71406                   dispatch$$1.call('cancel', this, selectedID);
71407               });
71408
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;
71413               })
71414               .on('click.save', function() {
71415                   this.blur();    // avoid keeping focus on the button - #4641
71416                   dispatch$$1.call('save', this, _changeset$1);
71417               });
71418
71419
71420           // Raw Tag Editor
71421           var tagSection = body.selectAll('.tag-section.raw-tag-editor')
71422               .data([0]);
71423
71424           tagSection = tagSection.enter()
71425               .append('div')
71426               .attr('class', 'modal-section tag-section raw-tag-editor')
71427               .merge(tagSection);
71428
71429           var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
71430           tagSection
71431               .call(rawTagEditor
71432                   .expanded(expanded)
71433                   .readOnlyTags(readOnlyTags)
71434                   .tags(clone(_changeset$1.tags))
71435               );
71436
71437
71438           // Change summary
71439           body.call(commitChanges);
71440
71441
71442           function toggleRequestReview() {
71443               var rr = requestReviewInput.property('checked');
71444               updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
71445
71446               var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
71447               tagSection
71448                   .call(rawTagEditor
71449                       .expanded(expanded)
71450                       .readOnlyTags(readOnlyTags)
71451                       .tags(clone(_changeset$1.tags))
71452                   );
71453           }
71454       }
71455
71456
71457       function changeTags(changed, onInput) {
71458           if (changed.hasOwnProperty('comment')) {
71459               if (changed.comment === undefined) {
71460                   changed.comment = '';
71461               }
71462               if (!onInput) {
71463                   context.storage('comment', changed.comment);
71464                   context.storage('commentDate', Date.now());
71465               }
71466           }
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());
71473               }
71474           }
71475
71476           updateChangeset(changed, onInput);
71477
71478           if (_selection) {
71479               _selection.call(commit);
71480           }
71481       }
71482
71483
71484       function findHashtags(tags, commentOnly) {
71485           var inComment = commentTags();
71486           var inHashTags = hashTags();
71487
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
71491           }
71492           return unionBy(inComment, inHashTags, function (s) {
71493               return s.toLowerCase();
71494           });
71495
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);
71501           }
71502
71503           // Extract and clean hashtags from `hashtags`
71504           function hashTags() {
71505               var t$$1 = tags.hashtags || '';
71506               return t$$1
71507                   .split(/[,;\s]+/)
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
71513           }
71514       }
71515
71516
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');
71522       }
71523
71524
71525       function updateChangeset(changed, onInput) {
71526           var tags = clone(_changeset$1.tags);
71527
71528           forEach(changed, function(v, k) {
71529               k = k.trim().substr(0, 255);
71530               if (readOnlyTags.indexOf(k) !== -1) return;
71531
71532               if (k !== '' && v !== undefined) {
71533                   if (onInput) {
71534                       tags[k] = v;
71535                   } else {
71536                       tags[k] = v.trim().substr(0, 255);
71537                   }
71538               } else {
71539                   delete tags[k];
71540               }
71541           });
71542
71543           if (!onInput) {
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);
71547               if (arr.length) {
71548                   tags.hashtags = arr.join(';').substr(0, 255);
71549                   context.storage('hashtags', tags.hashtags);
71550               } else {
71551                   delete tags.hashtags;
71552                   context.storage('hashtags', null);
71553               }
71554           }
71555
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);
71560
71561               // first 100 edits - new user
71562               if (changesetsCount <= 100) {
71563                   var s;
71564                   s = context.storage('walkthrough_completed');
71565                   if (s) {
71566                       tags['ideditor:walkthrough_completed'] = s;
71567                   }
71568
71569                   s = context.storage('walkthrough_progress');
71570                   if (s) {
71571                       tags['ideditor:walkthrough_progress'] = s;
71572                   }
71573
71574                   s = context.storage('walkthrough_started');
71575                   if (s) {
71576                       tags['ideditor:walkthrough_started'] = s;
71577                   }
71578               }
71579           } else {
71580               delete tags.changesets_count;
71581           }
71582
71583           if (!isEqual(_changeset$1.tags, tags)) {
71584               _changeset$1 = _changeset$1.update({ tags: tags });
71585           }
71586       }
71587
71588
71589       commit.reset = function() {
71590           _changeset$1 = null;
71591       };
71592
71593
71594       return utilRebind(commit, dispatch$$1, 'on');
71595   }
71596
71597   function uiConfirm(selection) {
71598       var modalSelection = uiModal(selection);
71599
71600       modalSelection.select('.modal')
71601           .classed('modal-alert', true);
71602
71603       var section = modalSelection.select('.content');
71604
71605       section.append('div')
71606           .attr('class', 'modal-section header');
71607
71608       section.append('div')
71609           .attr('class', 'modal-section message-text');
71610
71611       var buttons = section.append('div')
71612           .attr('class', 'modal-section buttons cf');
71613
71614
71615       modalSelection.okButton = function() {
71616           buttons
71617               .append('button')
71618               .attr('class', 'action col4')
71619               .on('click.confirm', function() {
71620                   modalSelection.remove();
71621               })
71622               .text(t('confirm.okay'))
71623               .node()
71624               .focus();
71625
71626           return modalSelection;
71627       };
71628
71629
71630       return modalSelection;
71631   }
71632
71633   function uiConflicts(context) {
71634       var dispatch$$1 = dispatch('cancel', 'save');
71635       var keybinding = d3keybinding('conflicts');
71636       var _origChanges;
71637       var _conflictList;
71638
71639
71640       function keybindingOn() {
71641           select(document)
71642               .call(keybinding.on('⎋', cancel, true));
71643       }
71644
71645       function keybindingOff() {
71646           select(document)
71647               .call(keybinding.off);
71648       }
71649
71650       function tryAgain() {
71651           keybindingOff();
71652           dispatch$$1.call('save');
71653       }
71654
71655       function cancel() {
71656           keybindingOff();
71657           dispatch$$1.call('cancel');
71658       }
71659
71660
71661       function conflicts(selection$$1) {
71662           keybindingOn();
71663
71664           var headerEnter = selection$$1.selectAll('.header')
71665               .data([0])
71666               .enter()
71667               .append('div')
71668               .attr('class', 'header fillL');
71669
71670           headerEnter
71671               .append('button')
71672               .attr('class', 'fr')
71673               .on('click', cancel)
71674               .call(svgIcon('#iD-icon-close'));
71675
71676           headerEnter
71677               .append('h3')
71678               .text(t('save.conflict.header'));
71679
71680           var bodyEnter = selection$$1.selectAll('.body')
71681               .data([0])
71682               .enter()
71683               .append('div')
71684               .attr('class', 'body fillL');
71685
71686           var conflictsHelpEnter = bodyEnter
71687               .append('div')
71688               .attr('class', 'conflicts-help')
71689               .text(t('save.conflict.help'));
71690
71691
71692           // Download changes link
71693           var detected = utilDetect();
71694           var changeset = new osmChangeset();
71695
71696           delete changeset.id;  // Export without changeset_id
71697
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';
71701
71702           var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
71703               .append('a')
71704               .attr('class', 'download-changes');
71705
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);
71710
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);
71716                   });
71717           }
71718
71719           linkEnter
71720               .call(svgIcon('#iD-icon-load', 'inline'))
71721               .append('span')
71722               .text(t('save.conflict.download_changes'));
71723
71724
71725           bodyEnter
71726               .append('div')
71727               .attr('class', 'conflict-container fillL3')
71728               .call(showConflict, 0);
71729
71730           bodyEnter
71731               .append('div')
71732               .attr('class', 'conflicts-done')
71733               .attr('opacity', 0)
71734               .style('display', 'none')
71735               .text(t('save.conflict.done'));
71736
71737           var buttonsEnter = bodyEnter
71738               .append('div')
71739               .attr('class','buttons col12 joined conflicts-buttons');
71740
71741           buttonsEnter
71742               .append('button')
71743               .attr('disabled', _conflictList.length > 1)
71744               .attr('class', 'action conflicts-button col6')
71745               .text(t('save.title'))
71746               .on('click.try_again', tryAgain);
71747
71748           buttonsEnter
71749               .append('button')
71750               .attr('class', 'secondary-action conflicts-button col6')
71751               .text(t('confirm.cancel'))
71752               .on('click.cancel', cancel);
71753       }
71754
71755
71756       function showConflict(selection$$1, index) {
71757           index = utilWrap(index, _conflictList.length);
71758
71759           var parent = select(selection$$1.node().parentNode);
71760
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);
71766
71767                   parent.select('.conflicts-done')
71768                       .transition()
71769                       .attr('opacity', 1)
71770                       .style('display', 'block');
71771               }, 250);
71772           }
71773
71774           var conflict = selection$$1
71775               .selectAll('.conflict')
71776               .data([_conflictList[index]]);
71777
71778           conflict.exit()
71779               .remove();
71780
71781           var conflictEnter = conflict.enter()
71782               .append('div')
71783               .attr('class', 'conflict');
71784
71785           conflictEnter
71786               .append('h4')
71787               .attr('class', 'conflict-count')
71788               .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
71789
71790           conflictEnter
71791               .append('a')
71792               .attr('class', 'conflict-description')
71793               .attr('href', '#')
71794               .text(function(d) { return d.name; })
71795               .on('click', function(d) {
71796                   event.preventDefault();
71797                   zoomToEntity(d.id);
71798               });
71799
71800           var details = conflictEnter
71801               .append('div')
71802               .attr('class', 'conflict-detail-container');
71803
71804           details
71805               .append('ul')
71806               .attr('class', 'conflict-detail-list')
71807               .selectAll('li')
71808               .data(function(d) { return d.details || []; })
71809               .enter()
71810               .append('li')
71811               .attr('class', 'conflict-detail-item')
71812               .html(function(d) { return d; });
71813
71814           details
71815               .append('div')
71816               .attr('class', 'conflict-choices')
71817               .call(addChoices);
71818
71819           details
71820               .append('div')
71821               .attr('class', 'conflict-nav-buttons joined cf')
71822               .selectAll('button')
71823               .data(['previous', 'next'])
71824               .enter()
71825               .append('button')
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;
71831               })
71832               .on('click', function(d, i) {
71833                   event.preventDefault();
71834
71835                   var container = parent.selectAll('.conflict-container');
71836                   var sign = (i === 0 ? -1 : 1);
71837
71838                   container
71839                       .selectAll('.conflict')
71840                       .remove();
71841
71842                   container
71843                       .call(showConflict, index + sign);
71844               });
71845
71846       }
71847
71848
71849       function addChoices(selection$$1) {
71850           var choices = selection$$1
71851               .append('ul')
71852               .attr('class', 'layer-list')
71853               .selectAll('li')
71854               .data(function(d) { return d.choices || []; });
71855
71856           // enter
71857           var choicesEnter = choices.enter()
71858               .append('li')
71859               .attr('class', 'layer');
71860
71861           var labelEnter = choicesEnter
71862               .append('label');
71863
71864           labelEnter
71865               .append('input')
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;
71871                   choose(ul, d);
71872               });
71873
71874           labelEnter
71875               .append('span')
71876               .text(function(d) { return d.text; });
71877
71878           // update
71879           choicesEnter
71880               .merge(choices)
71881               .each(function(d, i) {
71882                   var ul = this.parentNode;
71883                   if (ul.__data__.chosen === i) {
71884                       choose(ul, d);
71885                   }
71886               });
71887       }
71888
71889
71890       function choose(ul, datum) {
71891           if (event) event.preventDefault();
71892
71893           select(ul)
71894               .selectAll('li')
71895               .classed('active', function(d) { return d === datum; })
71896               .selectAll('input')
71897               .property('checked', function(d) { return d === datum; });
71898
71899           var extent = geoExtent$$1();
71900           var entity;
71901
71902           entity = context.graph().hasEntity(datum.id);
71903           if (entity) extent._extend(entity.extent(context.graph()));
71904
71905           datum.action();
71906
71907           entity = context.graph().hasEntity(datum.id);
71908           if (entity) extent._extend(entity.extent(context.graph()));
71909
71910           zoomToEntity(datum.id, extent);
71911       }
71912
71913
71914       function zoomToEntity(id, extent) {
71915           context.surface().selectAll('.hover')
71916               .classed('hover', false);
71917
71918           var entity = context.graph().hasEntity(id);
71919           if (entity) {
71920               if (extent) {
71921                   context.map().trimmedExtent(extent);
71922               } else {
71923                   context.map().zoomTo(entity);
71924               }
71925               context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
71926                   .classed('hover', true);
71927           }
71928       }
71929
71930
71931       // The conflict list should be an array of objects like:
71932       // {
71933       //     id: id,
71934       //     name: entityName(local),
71935       //     details: merge.conflicts(),
71936       //     chosen: 1,
71937       //     choices: [
71938       //         choice(id, keepMine, forceLocal),
71939       //         choice(id, keepTheirs, forceRemote)
71940       //     ]
71941       // }
71942       conflicts.conflictList = function(_) {
71943           if (!arguments.length) return _conflictList;
71944           _conflictList = _;
71945           return conflicts;
71946       };
71947
71948
71949       conflicts.origChanges = function(_) {
71950           if (!arguments.length) return _origChanges;
71951           _origChanges = _;
71952           return conflicts;
71953       };
71954
71955
71956       return utilRebind(conflicts, dispatch$$1, 'on');
71957   }
71958
71959   function uiEditMenu(context, operations) {
71960       var menu;
71961       var center = [0, 0];
71962       var offset = [0, 0];
71963       var tooltip;
71964
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
71977
71978
71979       var editMenu = function (selection$$1) {
71980           if (!operations.length) return;
71981
71982           selection$$1.node().parentNode.focus();
71983
71984           var isRTL = textDirection === 'rtl';
71985           var viewport = context.surfaceRect();
71986
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
71989               isRTL = true;
71990           } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
71991               // menu is going right-to-left and near left viewport edge, go right instead
71992               isRTL = false;
71993           }
71994
71995           offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
71996
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);
72000           }
72001
72002           var origin = [ center[0] + offset[0], center[1] + offset[1] ];
72003
72004           menu = selection$$1
72005               .append('g')
72006               .attr('class', 'edit-menu')
72007               .attr('transform', 'translate(' + origin + ')')
72008               .attr('opacity', 0);
72009
72010           menu
72011               .transition()
72012               .attr('opacity', 1);
72013
72014           menu
72015               .append('rect')
72016               .attr('class', 'edit-menu-background')
72017               .attr('x', 4)
72018               .attr('rx', 4)
72019               .attr('ry', 4)
72020               .attr('width', menuWidth)
72021               .attr('height', menuHeight)
72022               .attr('stroke-linecap', 'round');
72023
72024
72025           var button = menu.selectAll('.edit-menu-item')
72026               .data(operations)
72027               .enter()
72028               .append('g')
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([
72033                       0,
72034                       m + i * buttonHeight
72035                   ]).join(',') + ')';
72036               });
72037
72038           button
72039               .append('rect')
72040               .attr('x', 4)
72041               .attr('width', buttonWidth)
72042               .attr('height', buttonHeight)
72043               .on('click', click)
72044               .on('mousedown', mousedown)
72045               .on('mouseover', mouseover)
72046               .on('mouseout', mouseout);
72047
72048           button
72049               .append('use')
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; });
72054
72055           tooltip = select(document.body)
72056               .append('div')
72057               .attr('class', 'tooltip-inner edit-menu-tooltip');
72058
72059
72060           function click(operation) {
72061               event.stopPropagation();
72062               if (operation.disabled()) return;
72063               operation();
72064               editMenu.close();
72065           }
72066
72067           function mousedown() {
72068               event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
72069           }
72070
72071           function mouseover(d, i) {
72072               var tipX, tipY;
72073
72074               if (!isRTL) {
72075                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
72076               } else {
72077                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
72078               }
72079
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;
72086               }
72087
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;
72092               }
72093
72094               tooltip
72095                   .style('left', tipX + 'px')
72096                   .style('top', tipY + 'px')
72097                   .style('display', 'block')
72098                   .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
72099           }
72100
72101           function mouseout() {
72102               tooltip.style('display', 'none');
72103           }
72104       };
72105
72106
72107       editMenu.close = function () {
72108           if (menu) {
72109               menu
72110                   .style('pointer-events', 'none')
72111                   .transition()
72112                   .attr('opacity', 0)
72113                   .remove();
72114           }
72115
72116           if (tooltip) {
72117               tooltip.remove();
72118           }
72119       };
72120
72121
72122       editMenu.center = function (_) {
72123           if (!arguments.length) return center;
72124           center = _;
72125           return editMenu;
72126       };
72127
72128
72129       return editMenu;
72130   }
72131
72132   var _flashTimer;
72133
72134
72135   function uiFlash() {
72136       var _duration = 2000;
72137       var _iconName = '#iD-icon-no';
72138       var _iconClass = 'disabled';
72139       var _text = '';
72140       var _textClass;
72141
72142
72143       function flash() {
72144           if (_flashTimer) {
72145               _flashTimer.stop();
72146           }
72147
72148           select('#footer-wrap')
72149               .attr('class', 'footer-hide');
72150           select('#flash-wrap')
72151               .attr('class', 'footer-show');
72152
72153           var content = select('#flash-wrap').selectAll('.flash-content')
72154               .data([0]);
72155
72156           // Enter
72157           var contentEnter = content.enter()
72158               .append('div')
72159               .attr('class', 'flash-content');
72160
72161           var iconEnter = contentEnter
72162               .append('svg')
72163               .attr('class', 'flash-icon')
72164               .append('g')
72165               .attr('transform', 'translate(10,10)');
72166
72167           iconEnter
72168               .append('circle')
72169               .attr('r', 9);
72170
72171           iconEnter
72172               .append('use')
72173               .attr('transform', 'translate(-7,-7)')
72174               .attr('width', '14')
72175               .attr('height', '14');
72176
72177           contentEnter
72178               .append('div')
72179               .attr('class', 'flash-text');
72180
72181
72182           // Update
72183           content = content
72184               .merge(contentEnter);
72185
72186           content
72187               .selectAll('.flash-icon')
72188               .attr('class', 'flash-icon ' + (_iconClass || ''));
72189
72190           content
72191               .selectAll('.flash-icon use')
72192               .attr('xlink:href', _iconName);
72193
72194           content
72195               .selectAll('.flash-text')
72196               .attr('class', 'flash-text ' + (_textClass || ''))
72197               .text(_text);
72198
72199
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');
72206           }, _duration);
72207
72208           return content;
72209       }
72210
72211
72212       flash.duration = function(_) {
72213           if (!arguments.length) return _duration;
72214           _duration = _;
72215           return flash;
72216       };
72217
72218       flash.text = function(_) {
72219           if (!arguments.length) return _text;
72220           _text = _;
72221           return flash;
72222       };
72223
72224       flash.textClass = function(_) {
72225           if (!arguments.length) return _textClass;
72226           _textClass = _;
72227           return flash;
72228       };
72229
72230       flash.iconName = function(_) {
72231           if (!arguments.length) return _iconName;
72232           _iconName = _;
72233           return flash;
72234       };
72235
72236       flash.iconClass = function(_) {
72237           if (!arguments.length) return _iconClass;
72238           _iconClass = _;
72239           return flash;
72240       };
72241
72242       return flash;
72243   }
72244
72245   function uiLasso(context) {
72246       var group, polygon;
72247
72248       lasso.coordinates = [];
72249
72250       function lasso(selection$$1) {
72251           context.container()
72252               .classed('lasso', true);
72253
72254           group = selection$$1
72255               .append('g')
72256               .attr('class', 'lasso hide');
72257
72258           polygon = group
72259               .append('path')
72260               .attr('class', 'lasso-path');
72261
72262           group
72263               .call(uiToggle(true));
72264       }
72265
72266
72267       function draw() {
72268           if (polygon) {
72269               polygon.data([lasso.coordinates])
72270                   .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
72271           }
72272       }
72273
72274
72275       lasso.extent = function () {
72276           return lasso.coordinates.reduce(function(extent, point$$1) {
72277               return extent.extend(geoExtent$$1(point$$1));
72278           }, geoExtent$$1());
72279       };
72280
72281
72282       lasso.p = function(_) {
72283           if (!arguments.length) return lasso;
72284           lasso.coordinates.push(_);
72285           draw();
72286           return lasso;
72287       };
72288
72289
72290       lasso.close = function() {
72291           if (group) {
72292               group.call(uiToggle(false, function() {
72293                   select(this).remove();
72294               }));
72295           }
72296           context.container().classed('lasso', false);
72297       };
72298
72299
72300       return lasso;
72301   }
72302
72303   function uiRadialMenu(context, operations) {
72304       var menu;
72305       var center = [0, 0];
72306       var tooltip;
72307
72308
72309       var radialMenu = function(selection$$1) {
72310           if (!operations.length) return;
72311
72312           selection$$1.node().parentNode.focus();
72313
72314           function click(operation) {
72315               event.stopPropagation();
72316               if (operation.disabled()) return;
72317               operation();
72318               radialMenu.close();
72319           }
72320
72321           menu = selection$$1
72322               .append('g')
72323               .attr('class', 'radial-menu')
72324               .attr('transform', 'translate(' + center + ')')
72325               .attr('opacity', 0);
72326
72327           menu
72328               .transition()
72329               .attr('opacity', 1);
72330
72331           var r = 50;
72332           var a = Math.PI / 4;
72333           var a0 = -Math.PI / 4;
72334           var a1 = a0 + (operations.length - 1) * a;
72335
72336           menu
72337               .append('path')
72338               .attr('class', 'radial-menu-background')
72339               .attr('d', 'M' + r * Math.sin(a0) + ',' +
72340                                r * Math.cos(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');
72346
72347           var button = menu.selectAll()
72348               .data(operations)
72349               .enter()
72350               .append('g')
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(',') + ')';
72357               });
72358
72359           button
72360               .append('circle')
72361               .attr('r', 15)
72362               .on('click', click)
72363               .on('mousedown', mousedown)
72364               .on('mouseover', mouseover)
72365               .on('mouseout', mouseout);
72366
72367           button
72368               .append('use')
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; });
72373
72374           tooltip = select(document.body)
72375               .append('div')
72376               .attr('class', 'tooltip-inner radial-menu-tooltip');
72377
72378           function mousedown() {
72379               event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
72380           }
72381
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';
72389
72390               tooltip
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]));
72397
72398               if (i === 0) {
72399                   tooltip
72400                       .style('right', right)
72401                       .style('top', top);
72402               } else if (i >= 4) {
72403                   tooltip
72404                       .style('left', left)
72405                       .style('bottom', bottom);
72406               } else {
72407                   tooltip
72408                       .style('left', left)
72409                       .style('top', top);
72410               }
72411           }
72412
72413           function mouseout() {
72414               tooltip.style('display', 'none');
72415           }
72416       };
72417
72418
72419       radialMenu.close = function() {
72420           if (menu) {
72421               menu
72422                   .style('pointer-events', 'none')
72423                   .transition()
72424                   .attr('opacity', 0)
72425                   .remove();
72426           }
72427
72428           if (tooltip) {
72429               tooltip.remove();
72430           }
72431       };
72432
72433
72434       radialMenu.center = function(_) {
72435           if (!arguments.length) return center;
72436           center = _;
72437           return radialMenu;
72438       };
72439
72440
72441       return radialMenu;
72442   }
72443
72444   function uiSelectionList(context, selectedIDs) {
72445
72446       function selectEntity(entity) {
72447           context.enter(modeSelect(context, [entity.id]));
72448       }
72449
72450
72451       function deselectEntity(entity) {
72452           event.stopPropagation();
72453           var index = selectedIDs.indexOf(entity.id);
72454           if (index > -1) {
72455               selectedIDs.splice(index, 1);
72456           }
72457           context.enter(modeSelect(context, selectedIDs));
72458       }
72459
72460
72461       function selectionList(selection$$1) {
72462           selection$$1.classed('selection-list-pane', true);
72463
72464           var header = selection$$1
72465               .append('div')
72466               .attr('class', 'header fillL cf');
72467
72468           header
72469               .append('h3')
72470               .text(t('inspector.multiselect'));
72471
72472           var listWrap = selection$$1
72473               .append('div')
72474               .attr('class', 'inspector-body');
72475
72476           var list = listWrap
72477               .append('div')
72478               .attr('class', 'feature-list cf');
72479
72480           context.history().on('change.selection-list', drawList);
72481           drawList();
72482
72483
72484           function drawList() {
72485               var entities = selectedIDs
72486                   .map(function(id) { return context.hasEntity(id); })
72487                   .filter(function(entity) { return entity; });
72488
72489               var items = list.selectAll('.feature-list-item')
72490                   .data(entities, osmEntity$$1.key);
72491
72492               items.exit()
72493                   .remove();
72494
72495               // Enter
72496               var enter = items.enter()
72497                   .append('div')
72498                   .attr('class', 'feature-list-item')
72499                   .on('click', selectEntity);
72500
72501               var label = enter
72502                   .append('button')
72503                   .attr('class', 'label');
72504
72505               enter
72506                   .append('button')
72507                   .attr('class', 'close')
72508                   .on('click', deselectEntity)
72509                   .call(svgIcon('#iD-icon-close'));
72510
72511               label
72512                   .append('span')
72513                   .attr('class', 'entity-geom-icon')
72514                   .call(svgIcon('', 'pre-text'));
72515
72516               label
72517                   .append('span')
72518                   .attr('class', 'entity-type');
72519
72520               label
72521                   .append('span')
72522                   .attr('class', 'entity-name');
72523
72524               // Update
72525               items = items.merge(enter);
72526
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);
72531                   });
72532
72533               items.selectAll('.entity-type')
72534                   .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
72535
72536               items.selectAll('.entity-name')
72537                   .text(function(entity) { return utilDisplayName(entity); });
72538           }
72539       }
72540
72541       return selectionList;
72542   }
72543
72544   function uiSourceSwitch(context) {
72545       var keys;
72546
72547
72548       function click() {
72549           event.preventDefault();
72550
72551           var osm = context.connection();
72552           if (!osm) return;
72553
72554           if (context.inIntro()) return;
72555
72556           if (context.history().hasChanges() &&
72557               !window.confirm(t('source_switch.lose_changes'))) return;
72558
72559           var isLive = select(this)
72560               .classed('live');
72561
72562           isLive = !isLive;
72563           context.enter(modeBrowse(context));
72564           context.history().clearSaved();          // remove saved history
72565           context.flush();                         // remove stored data
72566
72567           select(this)
72568               .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
72569               .classed('live', isLive);
72570
72571           osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
72572       }
72573
72574       var sourceSwitch = function(selection$$1) {
72575           selection$$1
72576               .append('a')
72577               .attr('href', '#')
72578               .text(t('source_switch.live'))
72579               .classed('live', true)
72580               .attr('tabindex', -1)
72581               .on('click', click);
72582       };
72583
72584
72585       sourceSwitch.keys = function(_) {
72586           if (!arguments.length) return keys;
72587           keys = _;
72588           return sourceSwitch;
72589       };
72590
72591
72592       return sourceSwitch;
72593   }
72594
72595   function uiSuccess$$1(context) {
72596       var MAXEVENTS = 2;
72597
72598       // All else being equal, rank more "social" communities higher
72599       // (anything not in this list receives no adjustment)
72600       var COMMUNITYRANK = {
72601           'meetup': +5,
72602           'slack': +4,
72603           'facebook': +3,
72604           'reddit': +2,
72605           'forum': -2,
72606           'mailinglist': -3,
72607           'irc': -4
72608       };
72609
72610       var detected = utilDetect();
72611       var dispatch$$1 = dispatch('cancel');
72612       var _changeset;
72613       var _location;
72614
72615
72616       // string-to-date parsing in JavaScript is weird
72617       function parseEventDate(when) {
72618           if (!when) return;
72619
72620           var raw = when.trim();
72621           if (!raw) return;
72622
72623           if (!/Z$/.test(raw)) {    // if no trailing 'Z', add one
72624               raw += 'Z';           // this forces date to be parsed as a UTC date
72625           }
72626
72627           var parsed = new Date(raw);
72628           return new Date(parsed.toUTCString().substr(0, 25));  // convert to local timezone
72629       }
72630
72631
72632       function success(selection$$1) {
72633           var header = selection$$1
72634               .append('div')
72635               .attr('class', 'header fillL');
72636
72637           header
72638               .append('button')
72639               .attr('class', 'fr')
72640               .on('click', function() { dispatch$$1.call('cancel'); })
72641               .call(svgIcon('#iD-icon-close'));
72642
72643           header
72644               .append('h3')
72645               .text(t('success.just_edited'));
72646
72647           var body = selection$$1
72648               .append('div')
72649               .attr('class', 'body save-success fillL');
72650
72651           var summary = body
72652               .append('div')
72653               .attr('class', 'save-summary');
72654
72655           summary
72656               .append('h3')
72657               .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
72658
72659           summary
72660               .append('p')
72661               .text(t('success.help_html'))
72662               .append('a')
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'))
72668               .append('span')
72669               .text(t('success.help_link_text'));
72670
72671           var osm = context.connection();
72672           if (!osm) return;
72673
72674           var changesetURL = osm.changesetURL(_changeset.id);
72675
72676           var table = summary
72677               .append('table')
72678               .attr('class', 'summary-table');
72679
72680           var row = table
72681               .append('tr')
72682               .attr('class', 'summary-row');
72683
72684           row
72685               .append('td')
72686               .attr('class', 'cell-icon summary-icon')
72687               .append('a')
72688               .attr('target', '_blank')
72689               .attr('href', changesetURL)
72690               .append('svg')
72691               .attr('class', 'logo-small')
72692               .append('use')
72693               .attr('xlink:href', '#iD-logo-osm');
72694
72695           var summaryDetail = row
72696               .append('td')
72697               .attr('class', 'cell-detail summary-detail');
72698
72699           summaryDetail
72700               .append('a')
72701               .attr('class', 'cell-detail summary-view-on-osm')
72702               .attr('target', '_blank')
72703               .attr('href', changesetURL)
72704               .text(t('success.view_on_osm'));
72705
72706           summaryDetail
72707               .append('div')
72708               .text(t('success.changeset_id', { changeset_id: _changeset.id }));
72709
72710
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; });
72714
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;
72718           });
72719
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;
72727
72728                   if (a.featureId) {
72729                       aSize = data.community.features[a.featureId].properties.area;
72730                   }
72731                   if (b.featureId) {
72732                       bSize = data.community.features[b.featureId].properties.area;
72733                   }
72734
72735                   return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
72736               });
72737
72738               body
72739                   .call(showCommunityLinks, matchResources);
72740           }
72741       }
72742
72743
72744       function showCommunityLinks(selection$$1, matchResources) {
72745           var communityLinks = selection$$1
72746               .append('div')
72747               .attr('class', 'save-communityLinks');
72748
72749           communityLinks
72750               .append('h3')
72751               .text(t('success.like_osm'));
72752
72753           var table = communityLinks
72754               .append('table')
72755               .attr('class', 'community-table');
72756
72757           var row = table.selectAll('.community-row')
72758               .data(matchResources);
72759
72760           var rowEnter = row.enter()
72761               .append('tr')
72762               .attr('class', 'community-row');
72763
72764           rowEnter
72765               .append('td')
72766               .attr('class', 'cell-icon community-icon')
72767               .append('a')
72768               .attr('target', '_blank')
72769               .attr('href', function(d) { return d.url; })
72770               .append('svg')
72771               .attr('class', 'logo-small')
72772               .append('use')
72773               .attr('xlink:href', function(d) { return '#community-' + d.type; });
72774
72775           var communityDetail = rowEnter
72776               .append('td')
72777               .attr('class', 'cell-detail community-detail');
72778
72779           communityDetail
72780               .each(showCommunityDetails);
72781
72782           communityLinks
72783               .append('div')
72784               .attr('class', 'community-missing')
72785               .text(t('success.missing'))
72786               .append('a')
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')
72792               .append('span')
72793               .text(t('success.tell_us'));
72794       }
72795
72796
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)
72803           };
72804
72805           selection$$1
72806               .append('div')
72807               .attr('class', 'community-name')
72808               .append('a')
72809               .attr('target', '_blank')
72810               .attr('href', d.url)
72811               .text(t('community.' + d.id + '.name'));
72812
72813           var descriptionHTML = t('community.' + d.id + '.description', replacements);
72814
72815           if (d.type === 'reddit') {   // linkify subreddits  #4997
72816               descriptionHTML = descriptionHTML
72817                   .replace(/(\/r\/\w*\/*)/i, function(match) { return linkify(d.url, match); });
72818           }
72819
72820           selection$$1
72821               .append('div')
72822               .attr('class', 'community-description')
72823               .html(descriptionHTML);
72824
72825           if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
72826               selection$$1
72827                   .append('div')
72828                   .call(uiDisclosure(context, 'community-more-' + d.id, false)
72829                       .expanded(false)
72830                       .updatePreference(false)
72831                       .title(t('success.more'))
72832                       .content(showMore)
72833                   );
72834           }
72835
72836           var nextEvents = (d.events || [])
72837               .map(function(event$$1) {
72838                   event$$1.date = parseEventDate(event$$1.when);
72839                   return event$$1;
72840               })
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;
72845               })
72846               .sort(function(a, b) {                  // sort by date ascending
72847                   return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
72848               })
72849               .slice(0, MAXEVENTS);                   // limit number of events shown
72850
72851           if (nextEvents.length) {
72852               selection$$1
72853                   .append('div')
72854                   .call(uiDisclosure(context, 'community-events-' + d.id, false)
72855                       .expanded(false)
72856                       .updatePreference(false)
72857                       .title(t('success.events'))
72858                       .content(showNextEvents)
72859                   )
72860                   .select('.hide-toggle')
72861                   .append('span')
72862                   .attr('class', 'badge-text')
72863                   .text(nextEvents.length);
72864           }
72865
72866
72867           function showMore(selection$$1) {
72868               var more = selection$$1
72869                   .append('div')
72870                   .attr('class', 'community-more');
72871
72872               if (d.extendedDescription) {
72873                   more
72874                       .append('div')
72875                       .attr('class', 'community-extended-description')
72876                       .html(t('community.' + d.id + '.extendedDescription', replacements));
72877               }
72878
72879               if (d.languageCodes && d.languageCodes.length) {
72880                   more
72881                       .append('div')
72882                       .attr('class', 'community-languages')
72883                       .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
72884               }
72885           }
72886
72887
72888           function showNextEvents(selection$$1) {
72889               var events = selection$$1
72890                   .append('div')
72891                   .attr('class', 'community-events');
72892
72893               var item = events.selectAll('.community-event')
72894                   .data(nextEvents);
72895
72896               var itemEnter = item.enter()
72897                   .append('div')
72898                   .attr('class', 'community-event');
72899
72900               itemEnter
72901                   .append('div')
72902                   .attr('class', 'community-event-name')
72903                   .append('a')
72904                   .attr('target', '_blank')
72905                   .attr('href', function(d) { return d.url; })
72906                   .text(function(d) {
72907                       var name = d.name;
72908                       if (d.i18n && d.id) {
72909                           name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
72910                       }
72911                       return name;
72912                   });
72913
72914               itemEnter
72915                   .append('div')
72916                   .attr('class', 'community-event-when')
72917                   .text(function(d) {
72918                       var options = {
72919                           weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
72920                       };
72921                       if (d.date.getHours() || d.date.getMinutes()) {   // include time if it has one
72922                           options.hour = 'numeric';
72923                           options.minute = 'numeric';
72924                       }
72925                       return d.date.toLocaleString(detected.locale, options);
72926                   });
72927
72928               itemEnter
72929                   .append('div')
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 });
72935                       }
72936                       return where;
72937                   });
72938
72939               itemEnter
72940                   .append('div')
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 });
72946                       }
72947                       return description;
72948                   });
72949           }
72950
72951
72952           function linkify(url, text) {
72953               text = text || url;
72954               return '<a target="_blank" href="' + url + '">' + text + '</a>';
72955           }
72956       }
72957
72958
72959       success.changeset = function(_) {
72960           if (!arguments.length) return _changeset;
72961           _changeset = _;
72962           return success;
72963       };
72964
72965
72966       success.location = function(_) {
72967           if (!arguments.length) return _location;
72968           _location = _;
72969           return success;
72970       };
72971
72972
72973       return utilRebind(success, dispatch$$1, 'on');
72974   }
72975
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 = {};
72982       var _stack;
72983       var _index;
72984       var _tree;
72985
72986
72987       // internal _act, accepts list of actions and eased time
72988       function _act(actions, t) {
72989           actions = Array.prototype.slice.call(actions);
72990
72991           var annotation;
72992           if (!isFunction(actions[actions.length - 1])) {
72993               annotation = actions.pop();
72994           }
72995
72996           _stack[_index].transform = context.projection.transform();
72997           _stack[_index].selectedIDs = context.selectedIDs();
72998
72999           var graph = _stack[_index].graph;
73000           for (var i = 0; i < actions.length; i++) {
73001               graph = actions[i](graph, t);
73002           }
73003
73004           return {
73005               graph: graph,
73006               annotation: annotation,
73007               imageryUsed: imageryUsed
73008           };
73009       }
73010
73011
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));
73017           _index++;
73018           return change(previous);
73019       }
73020
73021
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);
73028       }
73029
73030
73031       // internal _overwrite with eased time
73032       function _overwrite(args, t) {
73033           var previous = _stack[_index].graph;
73034           if (_index > 0) {
73035               _index--;
73036               _stack.pop();
73037           }
73038           _stack = _stack.slice(0, _index + 1);
73039           _stack.push(_act(args, t));
73040           _index++;
73041           return change(previous);
73042       }
73043
73044
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;
73050       }
73051
73052
73053       // iD uses namespaced keys so multiple installations do not conflict
73054       function getKey(n) {
73055           return 'iD_' + window.location.origin + '_' + n;
73056       }
73057
73058
73059       var history = {
73060
73061           graph: function() {
73062               return _stack[_index].graph;
73063           },
73064
73065
73066           base: function() {
73067               return _stack[0].graph;
73068           },
73069
73070
73071           merge: function(entities, extent) {
73072               _stack[0].graph.rebase(entities, map$3(_stack, 'graph'), false);
73073               _tree.rebase(entities, false);
73074
73075               dispatch$$1.call('change', this, undefined, extent);
73076           },
73077
73078
73079           perform: function() {
73080               // complete any transition already in progress
73081               select(document).interrupt('history.perform');
73082
73083               var transitionable = false;
73084               var action0 = arguments[0];
73085
73086               if (arguments.length === 1 ||
73087                   arguments.length === 2 && !isFunction(arguments[1])) {
73088                   transitionable = !!action0.transitionable;
73089               }
73090
73091               if (transitionable) {
73092                   var origArguments = arguments;
73093                   select(document)
73094                       .transition('history.perform')
73095                       .duration(duration)
73096                       .ease(linear$1)
73097                       .tween('history.tween', function() {
73098                           return function(t) {
73099                               if (t < 1) _overwrite([action0], t);
73100                           };
73101                       })
73102                       .on('start', function() {
73103                           _perform([action0], 0);
73104                       })
73105                       .on('end interrupt', function() {
73106                           _overwrite(origArguments, 1);
73107                       });
73108
73109               } else {
73110                   return _perform(arguments);
73111               }
73112           },
73113
73114
73115           replace: function() {
73116               select(document).interrupt('history.perform');
73117               return _replace(arguments, 1);
73118           },
73119
73120
73121           // Same as calling pop and then perform
73122           overwrite: function() {
73123               select(document).interrupt('history.perform');
73124               return _overwrite(arguments, 1);
73125           },
73126
73127
73128           pop: function(n) {
73129               select(document).interrupt('history.perform');
73130
73131               var previous = _stack[_index].graph;
73132               if (isNaN(+n) || +n < 0) {
73133                   n = 1;
73134               }
73135               while (n-- > 0 && _index > 0) {
73136                   _index--;
73137                   _stack.pop();
73138               }
73139               return change(previous);
73140           },
73141
73142
73143           // Back to the previous annotated state or _index = 0.
73144           undo: function() {
73145               select(document).interrupt('history.perform');
73146
73147               var previous = _stack[_index].graph;
73148               while (_index > 0) {
73149                   _index--;
73150                   if (_stack[_index].annotation) break;
73151               }
73152
73153               dispatch$$1.call('undone', this, _stack[_index]);
73154               return change(previous);
73155           },
73156
73157
73158           // Forward to the next annotated state.
73159           redo: function() {
73160               select(document).interrupt('history.perform');
73161
73162               var previous = _stack[_index].graph;
73163               var tryIndex = _index;
73164               while (tryIndex < _stack.length - 1) {
73165                   tryIndex++;
73166                   if (_stack[tryIndex].annotation) {
73167                       _index = tryIndex;
73168                       dispatch$$1.call('redone', this, _stack[_index]);
73169                       break;
73170                   }
73171               }
73172
73173               return change(previous);
73174           },
73175
73176
73177           undoAnnotation: function() {
73178               var i = _index;
73179               while (i >= 0) {
73180                   if (_stack[i].annotation) return _stack[i].annotation;
73181                   i--;
73182               }
73183           },
73184
73185
73186           redoAnnotation: function() {
73187               var i = _index + 1;
73188               while (i <= _stack.length - 1) {
73189                   if (_stack[i].annotation) return _stack[i].annotation;
73190                   i++;
73191               }
73192           },
73193
73194
73195           intersects: function(extent) {
73196               return _tree.intersects(extent, _stack[_index].graph);
73197           },
73198
73199
73200           difference: function() {
73201               var base = _stack[0].graph;
73202               var head = _stack[_index].graph;
73203               return coreDifference(base, head);
73204           },
73205
73206
73207           changes: function(action) {
73208               var base = _stack[0].graph;
73209               var head = _stack[_index].graph;
73210
73211               if (action) {
73212                   head = action(head);
73213               }
73214
73215               var difference$$1 = coreDifference(base, head);
73216
73217               return {
73218                   modified: difference$$1.modified(),
73219                   created: difference$$1.created(),
73220                   deleted: difference$$1.deleted()
73221               };
73222           },
73223
73224
73225           validate: function(changes) {
73226               return flatten(
73227                   map$3(Validations, function(fn) { return fn()(changes, _stack[_index].graph); })
73228               );
73229           },
73230
73231
73232           hasChanges: function() {
73233               return this.difference().length() > 0;
73234           },
73235
73236
73237           imageryUsed: function(sources) {
73238               if (sources) {
73239                   imageryUsed = sources;
73240                   return history;
73241               } else {
73242                   var arr = map$3(_stack.slice(1, _index + 1), 'imageryUsed');
73243                   return without(uniq(flatten(arr)), 'Custom');
73244               }
73245           },
73246
73247
73248           // save the current history state
73249           checkpoint: function(key) {
73250               _checkpoints[key] = {
73251                   stack: cloneDeep(_stack),
73252                   index: _index
73253               };
73254               return history;
73255           },
73256
73257
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;
73263               } else {
73264                   _stack = [{graph: coreGraph$$1()}];
73265                   _index = 0;
73266                   _tree = coreTree(_stack[0].graph);
73267                   _checkpoints = {};
73268               }
73269               dispatch$$1.call('change');
73270               return history;
73271           },
73272
73273
73274           toIntroGraph: function() {
73275               var nextId = { n: 0, r: 0, w: 0 };
73276               var permIds = {};
73277               var graph = this.graph();
73278               var baseEntities = {};
73279
73280               // clone base entities..
73281               forEach(graph.base().entities, function(entity) {
73282                   var copy = cloneDeepWith(entity, customizer);
73283                   baseEntities[copy.id] = copy;
73284               });
73285
73286               // replace base entities with head entities..
73287               forEach(graph.entities, function(entity, id) {
73288                   if (entity) {
73289                       var copy = cloneDeepWith(entity, customizer);
73290                       baseEntities[copy.id] = copy;
73291                   } else {
73292                       delete baseEntities[id];
73293                   }
73294               });
73295
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;
73301                       });
73302                   }
73303                   if (Array.isArray(entity.members)) {
73304                       entity.members = entity.members.map(function(member) {
73305                           member.id = permIds[member.id] || member.id;
73306                           return member;
73307                       });
73308                   }
73309               });
73310
73311               return JSON.stringify({ dataIntroGraph: baseEntities });
73312
73313
73314               function customizer(src) {
73315                   var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
73316                   if (isEmpty(copy.tags)) {
73317                       delete copy.tags;
73318                   }
73319
73320                   if (Array.isArray(copy.loc)) {
73321                       copy.loc[0] = +copy.loc[0].toFixed(6);
73322                       copy.loc[1] = +copy.loc[1].toFixed(6);
73323                   }
73324
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));
73330
73331                       copy.id = permIds[src.id] = permId;
73332                   }
73333                   return copy;
73334               }
73335           },
73336
73337
73338           toJSON: function() {
73339               if (!this.hasChanges()) return;
73340
73341               var allEntities = {};
73342               var baseEntities = {};
73343               var base = _stack[0];
73344
73345               var s = _stack.map(function(i) {
73346                   var modified = [], deleted = [];
73347
73348                   forEach(i.graph.entities, function(entity, id) {
73349                       if (entity) {
73350                           var key = osmEntity$$1.key(entity);
73351                           allEntities[key] = entity;
73352                           modified.push(key);
73353                       } else {
73354                           deleted.push(id);
73355                       }
73356
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];
73361                       }
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];
73366                           }
73367                       });
73368                   });
73369
73370                   var x = {};
73371
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;
73376
73377                   return x;
73378               });
73379
73380               return JSON.stringify({
73381                   version: 3,
73382                   entities: values$1(allEntities),
73383                   baseEntities: values$1(baseEntities),
73384                   stack: s,
73385                   nextIDs: osmEntity$$1.id.next,
73386                   index: _index
73387               });
73388           },
73389
73390
73391           fromJSON: function(json, loadChildNodes) {
73392               var h = JSON.parse(json);
73393               var loadComplete = true;
73394
73395               osmEntity$$1.id.next = h.nextIDs;
73396               _index = h.index;
73397
73398               if (h.version === 2 || h.version === 3) {
73399                   var allEntities = {};
73400
73401                   h.entities.forEach(function(entity) {
73402                       allEntities[osmEntity$$1.key(entity)] = osmEntity$$1(entity);
73403                   });
73404
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);
73412
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); });
73419
73420                           if (!isEmpty(missing) && osm) {
73421                               loadComplete = false;
73422                               context.redrawEnable(false);
73423
73424                               var loading = uiLoading(context).blocking(true);
73425                               context.container().call(loading);
73426
73427                               var childNodesLoaded = function(err, result) {
73428                                   if (!err) {
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);
73434                                       }
73435
73436                                       // fetch older versions of nodes that were deleted..
73437                                       forEach(visible.false, function(entity) {
73438                                           osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
73439                                       });
73440                                   }
73441
73442                                   if (err || isEmpty(missing)) {
73443                                       loading.close();
73444                                       context.redrawEnable(true);
73445                                       dispatch$$1.call('change');
73446                                   }
73447                               };
73448
73449                               osm.loadMultiple(missing, childNodesLoaded);
73450                           }
73451                       }
73452                   }
73453
73454                   _stack = h.stack.map(function(d) {
73455                       var entities = {}, entity;
73456
73457                       if (d.modified) {
73458                           d.modified.forEach(function(key) {
73459                               entity = allEntities[key];
73460                               entities[entity.id] = entity;
73461                           });
73462                       }
73463
73464                       if (d.deleted) {
73465                           d.deleted.forEach(function(id) {
73466                               entities[id] = undefined;
73467                           });
73468                       }
73469
73470                       return {
73471                           graph: coreGraph$$1(_stack[0].graph).load(entities),
73472                           annotation: d.annotation,
73473                           imageryUsed: d.imageryUsed
73474                       };
73475                   });
73476
73477               } else { // original version
73478                   _stack = h.stack.map(function(d) {
73479                       var entities = {};
73480
73481                       for (var i in d.entities) {
73482                           var entity = d.entities[i];
73483                           entities[i] = entity === 'undefined' ? undefined : osmEntity$$1(entity);
73484                       }
73485
73486                       d.graph = coreGraph$$1(_stack[0].graph).load(entities);
73487                       return d;
73488                   });
73489               }
73490
73491               if (loadComplete) {
73492                   dispatch$$1.call('change');
73493               }
73494
73495               return history;
73496           },
73497
73498
73499           save: function() {
73500               if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
73501               return history;
73502           },
73503
73504
73505           clearSaved: function() {
73506               context.debouncedSave.cancel();
73507               if (lock.locked()) context.storage(getKey('saved_history'), null);
73508               return history;
73509           },
73510
73511
73512           lock: function() {
73513               return lock.lock();
73514           },
73515
73516
73517           unlock: function() {
73518               lock.unlock();
73519           },
73520
73521
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'));
73526           },
73527
73528
73529           // load history from a version stored in localStorage
73530           restore: function() {
73531               if (!lock.locked()) return;
73532
73533               var json = context.storage(getKey('saved_history'));
73534               if (json) history.fromJSON(json, true);
73535           },
73536
73537
73538           _getKey: getKey
73539
73540       };
73541
73542
73543       history.reset();
73544
73545       return utilRebind(history, dispatch$$1, 'on');
73546   }
73547
73548   /** Used to store function metadata. */
73549   var metaMap = WeakMap && new WeakMap;
73550
73551   /**
73552    * The base implementation of `setData` without support for hot loop shorting.
73553    *
73554    * @private
73555    * @param {Function} func The function to associate metadata with.
73556    * @param {*} data The metadata.
73557    * @returns {Function} Returns `func`.
73558    */
73559   var baseSetData = !metaMap ? identity$8 : function(func, data) {
73560     metaMap.set(func, data);
73561     return func;
73562   };
73563
73564   /**
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`.
73567    *
73568    * @private
73569    * @param {Function} Ctor The constructor to wrap.
73570    * @returns {Function} Returns the new wrapped function.
73571    */
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]);
73587       }
73588       var thisBinding = baseCreate(Ctor.prototype),
73589           result = Ctor.apply(thisBinding, args);
73590
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;
73594     };
73595   }
73596
73597   /** Used to compose bitmasks for function metadata. */
73598   var WRAP_BIND_FLAG = 1;
73599
73600   /**
73601    * Creates a function that wraps `func` to invoke it with the optional `this`
73602    * binding of `thisArg`.
73603    *
73604    * @private
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.
73609    */
73610   function createBind(func, bitmask, thisArg) {
73611     var isBind = bitmask & WRAP_BIND_FLAG,
73612         Ctor = createCtor(func);
73613
73614     function wrapper() {
73615       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
73616       return fn.apply(isBind ? thisArg : this, arguments);
73617     }
73618     return wrapper;
73619   }
73620
73621   /* Built-in method references for those with the same name as other `lodash` methods. */
73622   var nativeMax$5 = Math.max;
73623
73624   /**
73625    * Creates an array that is the composition of partially applied arguments,
73626    * placeholders, and provided arguments into a single array of arguments.
73627    *
73628    * @private
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.
73634    */
73635   function composeArgs(args, partials, holders, isCurried) {
73636     var argsIndex = -1,
73637         argsLength = args.length,
73638         holdersLength = holders.length,
73639         leftIndex = -1,
73640         leftLength = partials.length,
73641         rangeLength = nativeMax$5(argsLength - holdersLength, 0),
73642         result = Array(leftLength + rangeLength),
73643         isUncurried = !isCurried;
73644
73645     while (++leftIndex < leftLength) {
73646       result[leftIndex] = partials[leftIndex];
73647     }
73648     while (++argsIndex < holdersLength) {
73649       if (isUncurried || argsIndex < argsLength) {
73650         result[holders[argsIndex]] = args[argsIndex];
73651       }
73652     }
73653     while (rangeLength--) {
73654       result[leftIndex++] = args[argsIndex++];
73655     }
73656     return result;
73657   }
73658
73659   /* Built-in method references for those with the same name as other `lodash` methods. */
73660   var nativeMax$6 = Math.max;
73661
73662   /**
73663    * This function is like `composeArgs` except that the arguments composition
73664    * is tailored for `_.partialRight`.
73665    *
73666    * @private
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.
73672    */
73673   function composeArgsRight(args, partials, holders, isCurried) {
73674     var argsIndex = -1,
73675         argsLength = args.length,
73676         holdersIndex = -1,
73677         holdersLength = holders.length,
73678         rightIndex = -1,
73679         rightLength = partials.length,
73680         rangeLength = nativeMax$6(argsLength - holdersLength, 0),
73681         result = Array(rangeLength + rightLength),
73682         isUncurried = !isCurried;
73683
73684     while (++argsIndex < rangeLength) {
73685       result[argsIndex] = args[argsIndex];
73686     }
73687     var offset = argsIndex;
73688     while (++rightIndex < rightLength) {
73689       result[offset + rightIndex] = partials[rightIndex];
73690     }
73691     while (++holdersIndex < holdersLength) {
73692       if (isUncurried || argsIndex < argsLength) {
73693         result[offset + holders[holdersIndex]] = args[argsIndex++];
73694       }
73695     }
73696     return result;
73697   }
73698
73699   /**
73700    * Gets the number of `placeholder` occurrences in `array`.
73701    *
73702    * @private
73703    * @param {Array} array The array to inspect.
73704    * @param {*} placeholder The placeholder to search for.
73705    * @returns {number} Returns the placeholder count.
73706    */
73707   function countHolders(array, placeholder) {
73708     var length = array.length,
73709         result = 0;
73710
73711     while (length--) {
73712       if (array[length] === placeholder) {
73713         ++result;
73714       }
73715     }
73716     return result;
73717   }
73718
73719   /**
73720    * The function whose prototype chain sequence wrappers inherit from.
73721    *
73722    * @private
73723    */
73724   function baseLodash() {
73725     // No operation performed.
73726   }
73727
73728   /** Used as references for the maximum length and index of an array. */
73729   var MAX_ARRAY_LENGTH = 4294967295;
73730
73731   /**
73732    * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
73733    *
73734    * @private
73735    * @constructor
73736    * @param {*} value The value to wrap.
73737    */
73738   function LazyWrapper(value) {
73739     this.__wrapped__ = value;
73740     this.__actions__ = [];
73741     this.__dir__ = 1;
73742     this.__filtered__ = false;
73743     this.__iteratees__ = [];
73744     this.__takeCount__ = MAX_ARRAY_LENGTH;
73745     this.__views__ = [];
73746   }
73747
73748   // Ensure `LazyWrapper` is an instance of `baseLodash`.
73749   LazyWrapper.prototype = baseCreate(baseLodash.prototype);
73750   LazyWrapper.prototype.constructor = LazyWrapper;
73751
73752   /**
73753    * Gets metadata for `func`.
73754    *
73755    * @private
73756    * @param {Function} func The function to query.
73757    * @returns {*} Returns the metadata for `func`.
73758    */
73759   var getData = !metaMap ? noop$3 : function(func) {
73760     return metaMap.get(func);
73761   };
73762
73763   /** Used to lookup unminified function names. */
73764   var realNames = {};
73765
73766   /** Used for built-in method references. */
73767   var objectProto$k = Object.prototype;
73768
73769   /** Used to check objects for own properties. */
73770   var hasOwnProperty$h = objectProto$k.hasOwnProperty;
73771
73772   /**
73773    * Gets the name of `func`.
73774    *
73775    * @private
73776    * @param {Function} func The function to query.
73777    * @returns {string} Returns the function name.
73778    */
73779   function getFuncName(func) {
73780     var result = (func.name + ''),
73781         array = realNames[result],
73782         length = hasOwnProperty$h.call(realNames, result) ? array.length : 0;
73783
73784     while (length--) {
73785       var data = array[length],
73786           otherFunc = data.func;
73787       if (otherFunc == null || otherFunc == func) {
73788         return data.name;
73789       }
73790     }
73791     return result;
73792   }
73793
73794   /**
73795    * The base constructor for creating `lodash` wrapper objects.
73796    *
73797    * @private
73798    * @param {*} value The value to wrap.
73799    * @param {boolean} [chainAll] Enable explicit method chain sequences.
73800    */
73801   function LodashWrapper(value, chainAll) {
73802     this.__wrapped__ = value;
73803     this.__actions__ = [];
73804     this.__chain__ = !!chainAll;
73805     this.__index__ = 0;
73806     this.__values__ = undefined;
73807   }
73808
73809   LodashWrapper.prototype = baseCreate(baseLodash.prototype);
73810   LodashWrapper.prototype.constructor = LodashWrapper;
73811
73812   /**
73813    * Creates a clone of `wrapper`.
73814    *
73815    * @private
73816    * @param {Object} wrapper The wrapper to clone.
73817    * @returns {Object} Returns the cloned wrapper.
73818    */
73819   function wrapperClone(wrapper) {
73820     if (wrapper instanceof LazyWrapper) {
73821       return wrapper.clone();
73822     }
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__;
73827     return result;
73828   }
73829
73830   /** Used for built-in method references. */
73831   var objectProto$l = Object.prototype;
73832
73833   /** Used to check objects for own properties. */
73834   var hasOwnProperty$i = objectProto$l.hasOwnProperty;
73835
73836   /**
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
73842    * with `_#value`.
73843    *
73844    * Explicit chain sequences, which must be unwrapped with `_#value`, may be
73845    * enabled using `_.chain`.
73846    *
73847    * The execution of chained methods is lazy, that is, it's deferred until
73848    * `_#value` is implicitly or explicitly called.
73849    *
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.
73857    *
73858    * Chaining is supported in custom builds as long as the `_#value` method is
73859    * directly or indirectly included in the build.
73860    *
73861    * In addition to lodash methods, wrappers have `Array` and `String` methods.
73862    *
73863    * The wrapper `Array` methods are:
73864    * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
73865    *
73866    * The wrapper `String` methods are:
73867    * `replace` and `split`
73868    *
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`
73873    *
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`
73899    *
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`
73926    *
73927    * @name _
73928    * @constructor
73929    * @category Seq
73930    * @param {*} value The value to wrap in a `lodash` instance.
73931    * @returns {Object} Returns the new `lodash` wrapper instance.
73932    * @example
73933    *
73934    * function square(n) {
73935    *   return n * n;
73936    * }
73937    *
73938    * var wrapped = _([1, 2, 3]);
73939    *
73940    * // Returns an unwrapped value.
73941    * wrapped.reduce(_.add);
73942    * // => 6
73943    *
73944    * // Returns a wrapped value.
73945    * var squares = wrapped.map(square);
73946    *
73947    * _.isArray(squares);
73948    * // => false
73949    *
73950    * _.isArray(squares.value());
73951    * // => true
73952    */
73953   function lodash(value) {
73954     if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
73955       if (value instanceof LodashWrapper) {
73956         return value;
73957       }
73958       if (hasOwnProperty$i.call(value, '__wrapped__')) {
73959         return wrapperClone(value);
73960       }
73961     }
73962     return new LodashWrapper(value);
73963   }
73964
73965   // Ensure wrappers are instances of `baseLodash`.
73966   lodash.prototype = baseLodash.prototype;
73967   lodash.prototype.constructor = lodash;
73968
73969   /**
73970    * Checks if `func` has a lazy counterpart.
73971    *
73972    * @private
73973    * @param {Function} func The function to check.
73974    * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
73975    *  else `false`.
73976    */
73977   function isLaziable(func) {
73978     var funcName = getFuncName(func),
73979         other = lodash[funcName];
73980
73981     if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
73982       return false;
73983     }
73984     if (func === other) {
73985       return true;
73986     }
73987     var data = getData(other);
73988     return !!data && func === data[0];
73989   }
73990
73991   /**
73992    * Sets metadata for `func`.
73993    *
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.
73999    *
74000    * @private
74001    * @param {Function} func The function to associate metadata with.
74002    * @param {*} data The metadata.
74003    * @returns {Function} Returns `func`.
74004    */
74005   var setData = shortOut(baseSetData);
74006
74007   /** Used to match wrap detail comments. */
74008   var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
74009       reSplitDetails = /,? & /;
74010
74011   /**
74012    * Extracts wrapper details from the `source` body comment.
74013    *
74014    * @private
74015    * @param {string} source The source to inspect.
74016    * @returns {Array} Returns the wrapper details.
74017    */
74018   function getWrapDetails(source) {
74019     var match = source.match(reWrapDetails);
74020     return match ? match[1].split(reSplitDetails) : [];
74021   }
74022
74023   /** Used to match wrap detail comments. */
74024   var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
74025
74026   /**
74027    * Inserts wrapper `details` in a comment at the top of the `source` body.
74028    *
74029    * @private
74030    * @param {string} source The source to modify.
74031    * @returns {Array} details The details to insert.
74032    * @returns {string} Returns the modified source.
74033    */
74034   function insertWrapDetails(source, details) {
74035     var length = details.length;
74036     if (!length) {
74037       return source;
74038     }
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');
74043   }
74044
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;
74055
74056   /** Used to associate wrap methods with their bit flags. */
74057   var wrapFlags = [
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]
74067   ];
74068
74069   /**
74070    * Updates wrapper `details` based on `bitmask` flags.
74071    *
74072    * @private
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`.
74076    */
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);
74082       }
74083     });
74084     return details.sort();
74085   }
74086
74087   /**
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.
74090    *
74091    * @private
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`.
74096    */
74097   function setWrapToString(wrapper, reference, bitmask) {
74098     var source = (reference + '');
74099     return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
74100   }
74101
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;
74109
74110   /**
74111    * Creates a function that wraps `func` to continue currying.
74112    *
74113    * @private
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.
74126    */
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;
74133
74134     bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
74135     bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
74136
74137     if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
74138       bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);
74139     }
74140     var newData = [
74141       func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
74142       newHoldersRight, argPos, ary, arity
74143     ];
74144
74145     var result = wrapFunc.apply(undefined, newData);
74146     if (isLaziable(func)) {
74147       setData(result, newData);
74148     }
74149     result.placeholder = placeholder;
74150     return setWrapToString(result, func, bitmask);
74151   }
74152
74153   /**
74154    * Gets the argument placeholder value for `func`.
74155    *
74156    * @private
74157    * @param {Function} func The function to inspect.
74158    * @returns {*} Returns the placeholder value.
74159    */
74160   function getHolder(func) {
74161     var object = func;
74162     return object.placeholder;
74163   }
74164
74165   /* Built-in method references for those with the same name as other `lodash` methods. */
74166   var nativeMin$2 = Math.min;
74167
74168   /**
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.
74172    *
74173    * @private
74174    * @param {Array} array The array to reorder.
74175    * @param {Array} indexes The arranged array indexes.
74176    * @returns {Array} Returns `array`.
74177    */
74178   function reorder(array, indexes) {
74179     var arrLength = array.length,
74180         length = nativeMin$2(indexes.length, arrLength),
74181         oldArray = copyArray(array);
74182
74183     while (length--) {
74184       var index = indexes[length];
74185       array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
74186     }
74187     return array;
74188   }
74189
74190   /** Used as the internal argument placeholder. */
74191   var PLACEHOLDER = '__lodash_placeholder__';
74192
74193   /**
74194    * Replaces all `placeholder` elements in `array` with an internal placeholder
74195    * and returns an array of their indexes.
74196    *
74197    * @private
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.
74201    */
74202   function replaceHolders(array, placeholder) {
74203     var index = -1,
74204         length = array.length,
74205         resIndex = 0,
74206         result = [];
74207
74208     while (++index < length) {
74209       var value = array[index];
74210       if (value === placeholder || value === PLACEHOLDER) {
74211         array[index] = PLACEHOLDER;
74212         result[resIndex++] = index;
74213       }
74214     }
74215     return result;
74216   }
74217
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;
74225
74226   /**
74227    * Creates a function that wraps `func` to invoke it with optional `this`
74228    * binding of `thisArg`, partial application, and currying.
74229    *
74230    * @private
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.
74244    */
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);
74252
74253     function wrapper() {
74254       var length = arguments.length,
74255           args = Array(length),
74256           index = length;
74257
74258       while (index--) {
74259         args[index] = arguments[index];
74260       }
74261       if (isCurried) {
74262         var placeholder = getHolder(wrapper),
74263             holdersCount = countHolders(args, placeholder);
74264       }
74265       if (partials) {
74266         args = composeArgs(args, partials, holders, isCurried);
74267       }
74268       if (partialsRight) {
74269         args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
74270       }
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
74277         );
74278       }
74279       var thisBinding = isBind ? thisArg : this,
74280           fn = isBindKey ? thisBinding[func] : func;
74281
74282       length = args.length;
74283       if (argPos) {
74284         args = reorder(args, argPos);
74285       } else if (isFlip && length > 1) {
74286         args.reverse();
74287       }
74288       if (isAry && ary < length) {
74289         args.length = ary;
74290       }
74291       if (this && this !== root$2 && this instanceof wrapper) {
74292         fn = Ctor || createCtor(fn);
74293       }
74294       return fn.apply(thisBinding, args);
74295     }
74296     return wrapper;
74297   }
74298
74299   /**
74300    * Creates a function that wraps `func` to enable currying.
74301    *
74302    * @private
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.
74307    */
74308   function createCurry(func, bitmask, arity) {
74309     var Ctor = createCtor(func);
74310
74311     function wrapper() {
74312       var length = arguments.length,
74313           args = Array(length),
74314           index = length,
74315           placeholder = getHolder(wrapper);
74316
74317       while (index--) {
74318         args[index] = arguments[index];
74319       }
74320       var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
74321         ? []
74322         : replaceHolders(args, placeholder);
74323
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);
74329       }
74330       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
74331       return apply(fn, this, args);
74332     }
74333     return wrapper;
74334   }
74335
74336   /** Used to compose bitmasks for function metadata. */
74337   var WRAP_BIND_FLAG$4 = 1;
74338
74339   /**
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.
74342    *
74343    * @private
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.
74350    */
74351   function createPartial(func, bitmask, thisArg, partials) {
74352     var isBind = bitmask & WRAP_BIND_FLAG$4,
74353         Ctor = createCtor(func);
74354
74355     function wrapper() {
74356       var argsIndex = -1,
74357           argsLength = arguments.length,
74358           leftIndex = -1,
74359           leftLength = partials.length,
74360           args = Array(leftLength + argsLength),
74361           fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
74362
74363       while (++leftIndex < leftLength) {
74364         args[leftIndex] = partials[leftIndex];
74365       }
74366       while (argsLength--) {
74367         args[leftIndex++] = arguments[++argsIndex];
74368       }
74369       return apply(fn, isBind ? thisArg : this, args);
74370     }
74371     return wrapper;
74372   }
74373
74374   /** Used as the internal argument placeholder. */
74375   var PLACEHOLDER$1 = '__lodash_placeholder__';
74376
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;
74384
74385   /* Built-in method references for those with the same name as other `lodash` methods. */
74386   var nativeMin$3 = Math.min;
74387
74388   /**
74389    * Merges the function metadata of `source` into `data`.
74390    *
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.
74398    *
74399    * @private
74400    * @param {Array} data The destination metadata.
74401    * @param {Array} source The source metadata.
74402    * @returns {Array} Returns `data`.
74403    */
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);
74409
74410     var isCombo =
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));
74414
74415     // Exit early if metadata can't be merged.
74416     if (!(isCommon || isCombo)) {
74417       return data;
74418     }
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;
74424     }
74425     // Compose partial arguments.
74426     var value = source[3];
74427     if (value) {
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];
74431     }
74432     // Compose partial right arguments.
74433     value = source[5];
74434     if (value) {
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];
74438     }
74439     // Use source `argPos` if available.
74440     value = source[7];
74441     if (value) {
74442       data[7] = value;
74443     }
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]);
74447     }
74448     // Use source `arity` if one is not provided.
74449     if (data[9] == null) {
74450       data[9] = source[9];
74451     }
74452     // Use source `func` and merge bitmasks.
74453     data[0] = source[0];
74454     data[1] = newBitmask;
74455
74456     return data;
74457   }
74458
74459   /** Error message constants. */
74460   var FUNC_ERROR_TEXT$4 = 'Expected a function';
74461
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;
74469
74470   /* Built-in method references for those with the same name as other `lodash` methods. */
74471   var nativeMax$7 = Math.max;
74472
74473   /**
74474    * Creates a function that either curries or invokes `func` with optional
74475    * `this` binding and partially applied arguments.
74476    *
74477    * @private
74478    * @param {Function|string} func The function or method name to wrap.
74479    * @param {number} bitmask The bitmask flags.
74480    *    1 - `_.bind`
74481    *    2 - `_.bindKey`
74482    *    4 - `_.curry` or `_.curryRight` of a bound function
74483    *    8 - `_.curry`
74484    *   16 - `_.curryRight`
74485    *   32 - `_.partial`
74486    *   64 - `_.partialRight`
74487    *  128 - `_.rearg`
74488    *  256 - `_.ary`
74489    *  512 - `_.flip`
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.
74497    */
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);
74502     }
74503     var length = partials ? partials.length : 0;
74504     if (!length) {
74505       bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);
74506       partials = holders = undefined;
74507     }
74508     ary = ary === undefined ? ary : nativeMax$7(toInteger(ary), 0);
74509     arity = arity === undefined ? arity : toInteger(arity);
74510     length -= holders ? holders.length : 0;
74511
74512     if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {
74513       var partialsRight = partials,
74514           holdersRight = holders;
74515
74516       partials = holders = undefined;
74517     }
74518     var data = isBindKey ? undefined : getData(func);
74519
74520     var newData = [
74521       func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
74522       argPos, ary, arity
74523     ];
74524
74525     if (data) {
74526       mergeData(newData, data);
74527     }
74528     func = newData[0];
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);
74536
74537     if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {
74538       bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);
74539     }
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);
74546     } else {
74547       result = createHybrid.apply(undefined, newData);
74548     }
74549     var setter = data ? baseSetData : setData;
74550     return setWrapToString(setter(result, newData), func, bitmask);
74551   }
74552
74553   /** Used to compose bitmasks for function metadata. */
74554   var WRAP_BIND_FLAG$7 = 1,
74555       WRAP_PARTIAL_FLAG$3 = 32;
74556
74557   /**
74558    * Creates a function that invokes `func` with the `this` binding of `thisArg`
74559    * and `partials` prepended to the arguments it receives.
74560    *
74561    * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
74562    * may be used as a placeholder for partially applied arguments.
74563    *
74564    * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
74565    * property of bound functions.
74566    *
74567    * @static
74568    * @memberOf _
74569    * @since 0.1.0
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.
74575    * @example
74576    *
74577    * function greet(greeting, punctuation) {
74578    *   return greeting + ' ' + this.user + punctuation;
74579    * }
74580    *
74581    * var object = { 'user': 'fred' };
74582    *
74583    * var bound = _.bind(greet, object, 'hi');
74584    * bound('!');
74585    * // => 'hi fred!'
74586    *
74587    * // Bound with placeholders.
74588    * var bound = _.bind(greet, object, _, '!');
74589    * bound('hi');
74590    * // => 'hi fred!'
74591    */
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;
74597     }
74598     return createWrap(func, bitmask, thisArg, partials, holders);
74599   });
74600
74601   // Assign default placeholders.
74602   bind$2.placeholder = {};
74603
74604   function presetCollection(collection) {
74605       var maxSearchResults = 50,
74606           maxSuggestionResults = 10;
74607
74608       var presets = {
74609
74610           collection: collection,
74611
74612
74613           item: function(id) {
74614               return find$1(this.collection, function(d) {
74615                   return d.id === id;
74616               });
74617           },
74618
74619
74620           matchGeometry: function(geometry) {
74621               return presetCollection(this.collection.filter(function(d) {
74622                   return d.matchGeometry(geometry);
74623               }));
74624           },
74625
74626
74627           search: function(value, geometry) {
74628               if (!value) return this;
74629
74630               function leading(a) {
74631                   var index = a.indexOf(value);
74632                   return index === 0 || a[index - 1] === ' ';
74633               }
74634
74635               function suggestionName(name) {
74636                   var nameArray = name.split(' - ');
74637                   if (nameArray.length > 1) {
74638                       name = nameArray.slice(0, nameArray.length - 1).join(' - ');
74639                   }
74640                   return name.toLowerCase();
74641               }
74642
74643
74644               value = value.toLowerCase();
74645
74646               var searchable = filter(this.collection, function(a) {
74647                       return a.searchable !== false && a.suggestion !== true;
74648                   }),
74649                   suggestions = filter(this.collection, function(a) {
74650                       return a.suggestion === true;
74651                   });
74652
74653
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(),
74660                           i;
74661
74662                       // priority if search string matches preset name exactly - #4325
74663                       if (value === aCompare) return -1;
74664                       if (value === bCompare) return 1;
74665
74666                       // priority for higher matchScore
74667                       i = b.originalScore - a.originalScore;
74668                       if (i !== 0) return i;
74669
74670                       // priority if search string appears earlier in preset name
74671                       i = aCompare.indexOf(value) - bCompare.indexOf(value);
74672                       if (i !== 0) return i;
74673
74674                       // priority for shorter preset names
74675                       return a.name().length - b.name().length;
74676                   });
74677
74678               // matches value to preset.terms values
74679               var leading_terms = filter(searchable, function(a) {
74680                       return some(a.terms() || [], leading);
74681                   });
74682
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);
74686                   });
74687
74688
74689               // finds close matches to value in preset.name
74690               var similar_name = searchable.map(function(a) {
74691                       return {
74692                           preset: a,
74693                           dist: utilEditDistance(value, a.name())
74694                       };
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) {
74700                       return a.preset;
74701                   });
74702
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;
74707                       });
74708                   });
74709
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;
74717                       else return i;
74718                   });
74719
74720               var similar_suggestions = suggestions.map(function(a) {
74721                       return {
74722                           preset: a,
74723                           dist: utilEditDistance(value, suggestionName(a.name()))
74724                       };
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) {
74730                       return a.preset;
74731                   });
74732
74733               var other = presets.item(geometry);
74734
74735               var results = leading_name.concat(
74736                       leading_terms,
74737                       leading_tag_values,
74738                       leading_suggestions.slice(0, maxSuggestionResults + 5),
74739                       similar_name,
74740                       similar_terms,
74741                       similar_suggestions.slice(0, maxSuggestionResults)
74742                   ).slice(0, maxSearchResults - 1);
74743
74744               return presetCollection(uniq(results.concat(other)));
74745           }
74746       };
74747
74748
74749       return presets;
74750   }
74751
74752   function presetCategory(id, category, all) {
74753       category = clone(category);
74754
74755       category.id = id;
74756
74757
74758       category.members = presetCollection(category.members.map(function(id) {
74759           return all.item(id);
74760       }));
74761
74762
74763       category.matchGeometry = function(geometry) {
74764           return category.geometry.indexOf(geometry) >= 0;
74765       };
74766
74767
74768       category.matchScore = function() {
74769           return -1;
74770       };
74771
74772
74773       category.name = function() {
74774           return t('presets.categories.' + id + '.name', {'default': id});
74775       };
74776
74777
74778       category.terms = function() {
74779           return [];
74780       };
74781
74782
74783       return category;
74784   }
74785
74786   function presetField(id, field) {
74787       field = clone(field);
74788
74789       field.id = id;
74790
74791       // for use in classes, element ids, css selectors
74792       field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
74793
74794       field.matchGeometry = function(geometry) {
74795           return !field.geometry || field.geometry === geometry;
74796       };
74797
74798
74799       field.t = function(scope, options) {
74800           return t('presets.fields.' + id + '.' + scope, options);
74801       };
74802
74803
74804       field.label = function() {
74805           return field.t('label', {'default': id});
74806       };
74807
74808
74809       var placeholder = field.placeholder;
74810       field.placeholder = function() {
74811           return field.t('placeholder', {'default': placeholder});
74812       };
74813
74814
74815       return field;
74816   }
74817
74818   function presetPreset(id, preset, fields) {
74819       preset = clone(preset);
74820
74821       preset.id = id;
74822       preset.fields = (preset.fields || []).map(getFields);
74823       preset.geometry = (preset.geometry || []);
74824
74825
74826       function getFields(f) {
74827           return fields[f];
74828       }
74829
74830
74831       preset.matchGeometry = function(geometry) {
74832           return preset.geometry.indexOf(geometry) >= 0;
74833       };
74834
74835
74836       preset.originalScore = preset.matchScore || 1;
74837
74838
74839       preset.matchScore = function(entity) {
74840           var tags = preset.tags,
74841               score = 0;
74842
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;
74848               } else {
74849                   return -1;
74850               }
74851           }
74852
74853           return score;
74854       };
74855
74856
74857       preset.t = function(scope, options) {
74858           return t('presets.presets.' + id + '.' + scope, options);
74859       };
74860
74861
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');
74868           }
74869           return preset.t('name', { 'default': origName });
74870       };
74871
74872       var origTerms = (preset.terms || []).join();
74873       preset.terms = function() {
74874           return preset.t('terms', { 'default': origTerms }).toLowerCase().trim().split(/\s*,+\s*/);
74875       };
74876
74877
74878       preset.isFallback = function() {
74879           var tagCount = Object.keys(preset.tags).length;
74880           return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
74881       };
74882
74883
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];
74888
74889           if (geometry === 'relation' && key === 'type') {
74890               if (value in preset.tags) {
74891                   key = value;
74892                   value = preset.tags[key];
74893               } else {
74894                   return { rtype: value };
74895               }
74896           }
74897
74898           if (value === '*') {
74899               return { key: key };
74900           } else {
74901               return { key: key, value: value };
74902           }
74903       };
74904
74905
74906       var removeTags = preset.removeTags || preset.tags || {};
74907       preset.removeTags = function(tags, geometry) {
74908           tags = omit(tags, keys$1(removeTags));
74909
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];
74914               }
74915           }
74916
74917           delete tags.area;
74918           return tags;
74919       };
74920
74921
74922       var applyTags = preset.addTags || preset.tags || {};
74923       preset.applyTags = function(tags, geometry) {
74924           var k;
74925
74926           tags = clone(tags);
74927
74928           for (k in applyTags) {
74929               if (applyTags[k] === '*') {
74930                   tags[k] = 'yes';
74931               } else {
74932                   tags[k] = applyTags[k];
74933               }
74934           }
74935
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')) {
74941               delete tags.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;
74948                               break;
74949                           }
74950                       }
74951                   }
74952                   if (needsAreaTag) {
74953                       tags.area = 'yes';
74954                   }
74955               }
74956           }
74957
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;
74962               }
74963           }
74964
74965           return tags;
74966       };
74967
74968
74969       return preset;
74970   }
74971
74972   function presetIndex() {
74973       // a presetCollection with methods for
74974       // loading new data and returning defaults
74975
74976       var all = presetCollection([]);
74977       var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
74978       var _fields = {};
74979       var _universal = [];
74980       var _recent = presetCollection([]);
74981
74982       // Index of presets by (geometry, tag key).
74983       var _index = {
74984           point: {},
74985           vertex: {},
74986           line: {},
74987           area: {},
74988           relation: {}
74989       };
74990
74991       all.match = function(entity, resolver) {
74992           var geometry = entity.geometry(resolver);
74993           var address;
74994
74995           // Treat entities on addr:interpolation lines as points, not vertices - #3241
74996           if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
74997               geometry = 'point';
74998           }
74999
75000           var geometryMatches = _index[geometry];
75001           var best = -1;
75002           var match;
75003
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];
75009               }
75010
75011               var keyMatches = geometryMatches[k];
75012               if (!keyMatches) continue;
75013
75014               for (var i = 0; i < keyMatches.length; i++) {
75015                   var score = keyMatches[i].matchScore(entity);
75016                   if (score > best) {
75017                       best = score;
75018                       match = keyMatches[i];
75019                   }
75020               }
75021           }
75022
75023           if (address && (!match || match.isFallback())) {
75024               match = address;
75025           }
75026
75027           return match || all.item(geometry);
75028       };
75029
75030
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.
75037       //
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() {
75043           var areaKeys = {};
75044           var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
75045           var presets = reject(all.collection, 'suggestion');
75046
75047           // whitelist
75048           presets.forEach(function(d) {
75049               for (var key in d.tags) break;
75050               if (!key) return;
75051               if (ignore.indexOf(key) !== -1) return;
75052
75053               if (d.geometry.indexOf('area') !== -1) {    // probably an area..
75054                   areaKeys[key] = areaKeys[key] || {};
75055               }
75056           });
75057
75058           // blacklist
75059           presets.forEach(function(d) {
75060               for (var key in d.tags) break;
75061               if (!key) return;
75062               if (ignore.indexOf(key) !== -1) return;
75063
75064               var value = d.tags[key];
75065               if (key in areaKeys &&                      // probably an area...
75066                   d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
75067                   value !== '*') {
75068                   areaKeys[key][value] = true;
75069               }
75070           });
75071
75072           return areaKeys;
75073       };
75074
75075
75076       all.init = function() {
75077           var d = data.presets;
75078
75079           all.collection = [];
75080           _recent.collection = [];
75081           _fields = {};
75082           _universal = [];
75083           _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
75084
75085           if (d.fields) {
75086               forEach(d.fields, function(d, id) {
75087                   _fields[id] = presetField(id, d);
75088                   if (d.universal) {
75089                       _universal.push(_fields[id]);
75090                   }
75091               });
75092           }
75093
75094           if (d.presets) {
75095               forEach(d.presets, function(d, id) {
75096                   all.collection.push(presetPreset(id, d, _fields));
75097               });
75098           }
75099
75100           if (d.categories) {
75101               forEach(d.categories, function(d, id) {
75102                   all.collection.push(presetCategory(id, d, all));
75103               });
75104           }
75105
75106           if (d.defaults) {
75107               var getItem = bind$2(all.item, all);
75108               _defaults = {
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))
75114               };
75115           }
75116
75117           for (var i = 0; i < all.collection.length; i++) {
75118               var preset = all.collection[i];
75119               var geometry = preset.geometry;
75120
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);
75125                   }
75126               }
75127           }
75128
75129           return all;
75130       };
75131
75132       all.field = function(id) {
75133           return _fields[id];
75134       };
75135
75136       all.universal = function() {
75137           return _universal;
75138       };
75139
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))));
75144       };
75145
75146       all.choose = function(preset) {
75147           _recent = presetCollection(uniq([preset].concat(_recent.collection)));
75148           return all;
75149       };
75150
75151       return all;
75152   }
75153
75154   var areaKeys = {};
75155
75156   function setAreaKeys(value) {
75157       areaKeys = value;
75158   }
75159
75160
75161   function coreContext() {
75162       var context = {};
75163       context.version = '2.9.2';
75164
75165       // create a special translation that contains the keys in place of the strings
75166       var tkeys = cloneDeep(en);
75167       var parents = [];
75168
75169       function traverser(v, k, obj) {
75170           parents.push(k);
75171           if (isObject(v)) {
75172               forOwn(v, traverser);
75173           } else if (isString(v)) {
75174               obj[k] = parents.join('.');
75175           }
75176           parents.pop();
75177       }
75178
75179       forOwn(tkeys, traverser);
75180       addTranslation('_tkeys_', tkeys);
75181
75182       addTranslation('en', en);
75183       setLocale('en');
75184
75185       var dispatch$$1 = dispatch('enter', 'exit', 'change');
75186
75187       // https://github.com/openstreetmap/iD/issues/772
75188       // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
75189       var storage;
75190       try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
75191       storage = storage || (function() {
75192           var s = {};
75193           return {
75194               getItem: function(k) { return s[k]; },
75195               setItem: function(k, v) { s[k] = v; },
75196               removeItem: function(k) { delete s[k]; }
75197           };
75198       })();
75199
75200       context.storage = function(k, v) {
75201           try {
75202               if (arguments.length === 1) return storage.getItem(k);
75203               else if (v === null) storage.removeItem(k);
75204               else storage.setItem(k, v);
75205           } catch (e) {
75206               // localstorage quota exceeded
75207               /* eslint-disable no-console */
75208               if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
75209               /* eslint-enable no-console */
75210           }
75211       };
75212
75213
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; };
75219
75220
75221       /* Connection */
75222       context.preauth = function(options) {
75223           if (connection) {
75224               connection.switch(options);
75225           }
75226           return context;
75227       };
75228
75229       context.loadTiles = utilCallWhenIdle(function(projection, dimensions, callback) {
75230           var cid;
75231           function done(err, result) {
75232               if (connection.getConnectionId() !== cid) {
75233                   if (callback) callback({ message: 'Connection Switched', status: -1 });
75234                   return;
75235               }
75236               if (!err) history.merge(result.data, result.extent);
75237               if (callback) callback(err, result);
75238           }
75239           if (connection && context.editable()) {
75240               cid = connection.getConnectionId();
75241               connection.loadTiles(projection, dimensions, done);
75242           }
75243       });
75244
75245       context.loadEntity = function(entityId, callback) {
75246           var cid;
75247           function done(err, result) {
75248               if (connection.getConnectionId() !== cid) {
75249                   if (callback) callback({ message: 'Connection Switched', status: -1 });
75250                   return;
75251               }
75252               if (!err) history.merge(result.data, result.extent);
75253               if (callback) callback(err, result);
75254           }
75255           if (connection) {
75256               cid = connection.getConnectionId();
75257               connection.loadEntity(entityId, done);
75258           }
75259       };
75260
75261       context.zoomToEntity = function(entityId, zoomTo) {
75262           if (zoomTo !== false) {
75263               this.loadEntity(entityId, function(err, result) {
75264                   if (err) return;
75265                   var entity = find$1(result.data, function(e) { return e.id === entityId; });
75266                   if (entity) { map.zoomTo(entity); }
75267               });
75268           }
75269
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]));
75275           });
75276
75277           context.on('enter.zoomToEntity', function() {
75278               if (mode.id !== 'browse') {
75279                   map.on('drawn.zoomToEntity', null);
75280                   context.on('enter.zoomToEntity', null);
75281               }
75282           });
75283       };
75284
75285       var minEditableZoom = 16;
75286       context.minEditableZoom = function(_) {
75287           if (!arguments.length) return minEditableZoom;
75288           minEditableZoom = _;
75289           if (connection) {
75290               connection.tileZoom(_);
75291           }
75292           return context;
75293       };
75294
75295
75296       /* History */
75297       var inIntro = false;
75298       context.inIntro = function(_) {
75299           if (!arguments.length) return inIntro;
75300           inIntro = _;
75301           return context;
75302       };
75303
75304       context.save = function() {
75305           // no history save, no message onbeforeunload
75306           if (inIntro || select('.modal').size()) return;
75307
75308           var canSave;
75309           if (mode && mode.id === 'save') {
75310               canSave = false;
75311           } else {
75312               canSave = context.selectedIDs().every(function(id) {
75313                   var entity = context.hasEntity(id);
75314                   return entity && !entity.isDegenerate();
75315               });
75316           }
75317
75318           if (canSave) {
75319               history.save();
75320           }
75321           if (history.hasChanges()) {
75322               return t('save.unsaved_changes');
75323           }
75324       };
75325
75326
75327       /* Graph */
75328       context.hasEntity = function(id) {
75329           return history.graph().hasEntity(id);
75330       };
75331       context.entity = function(id) {
75332           return history.graph().entity(id);
75333       };
75334       context.childNodes = function(way) {
75335           return history.graph().childNodes(way);
75336       };
75337       context.geometry = function(id) {
75338           return context.entity(id).geometry(history.graph());
75339       };
75340
75341
75342       /* Modes */
75343       var mode;
75344       context.mode = function() {
75345           return mode;
75346       };
75347       context.enter = function(newMode) {
75348           if (mode) {
75349               mode.exit();
75350               dispatch$$1.call('exit', this, mode);
75351           }
75352
75353           mode = newMode;
75354           mode.enter();
75355           dispatch$$1.call('enter', this, mode);
75356       };
75357
75358       context.selectedIDs = function() {
75359           if (mode && mode.selectedIDs) {
75360               return mode.selectedIDs();
75361           } else {
75362               return [];
75363           }
75364       };
75365       context.activeID = function() {
75366           return mode && mode.activeID && mode.activeID();
75367       };
75368
75369
75370       /* Behaviors */
75371       context.install = function(behavior) {
75372           context.surface().call(behavior);
75373       };
75374       context.uninstall = function(behavior) {
75375           context.surface().call(behavior.off);
75376       };
75377
75378
75379       /* Copy/Paste */
75380       var copyIDs = [], copyGraph;
75381       context.copyGraph = function() { return copyGraph; };
75382       context.copyIDs = function(_) {
75383           if (!arguments.length) return copyIDs;
75384           copyIDs = _;
75385           copyGraph = history.graph();
75386           return context;
75387       };
75388
75389
75390       /* Background */
75391       var background;
75392       context.background = function() { return background; };
75393
75394
75395       /* Features */
75396       var features;
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);
75402       };
75403
75404
75405       /* Presets */
75406       var presets;
75407       context.presets = function() { return presets; };
75408
75409
75410       /* Map */
75411       var map;
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();
75418       };
75419
75420
75421       /* Debug */
75422       var debugFlags = {
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
75430       };
75431       context.debugFlags = function() {
75432           return debugFlags;
75433       };
75434       context.setDebug = function(flag, val) {
75435           if (arguments.length === 1) val = true;
75436           debugFlags[flag] = val;
75437           dispatch$$1.call('change');
75438           return context;
75439       };
75440       context.getDebug = function(flag) {
75441           return flag && debugFlags[flag];
75442       };
75443
75444
75445       /* Container */
75446       var container = select(document.body);
75447       context.container = function(_) {
75448           if (!arguments.length) return container;
75449           container = _;
75450           container.classed('id-container', true);
75451           return context;
75452       };
75453       var embed;
75454       context.embed = function(_) {
75455           if (!arguments.length) return embed;
75456           embed = _;
75457           return context;
75458       };
75459
75460
75461       /* Assets */
75462       var assetPath = '';
75463       context.assetPath = function(_) {
75464           if (!arguments.length) return assetPath;
75465           assetPath = _;
75466           return context;
75467       };
75468
75469       var assetMap = {};
75470       context.assetMap = function(_) {
75471           if (!arguments.length) return assetMap;
75472           assetMap = _;
75473           return context;
75474       };
75475
75476       context.asset = function(_) {
75477           var filename = assetPath + _;
75478           return assetMap[filename] || filename;
75479       };
75480
75481       context.imagePath = function(_) {
75482           return context.asset('img/' + _);
75483       };
75484
75485
75486       /* locales */
75487       // `locale` variable contains a "requested locale".
75488       // It won't become the `currentLocale` until after loadLocale() is called.
75489       var locale, localePath;
75490
75491       context.locale = function(loc, path) {
75492           if (!arguments.length) return currentLocale;
75493           locale = loc;
75494           localePath = path;
75495           return context;
75496       };
75497
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) {
75502                   if (!err) {
75503                       addTranslation(locale, result[locale]);
75504                       setLocale(locale);
75505                       utilDetect(true);
75506                   }
75507                   if (callback) {
75508                       callback(err);
75509                   }
75510               });
75511           } else {
75512               if (locale) {
75513                   setLocale(locale);
75514                   utilDetect(true);
75515               }
75516               if (callback) {
75517                   callback();
75518               }
75519           }
75520       };
75521
75522
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);
75529               }
75530           });
75531           features.reset();
75532           history.reset();
75533           return context;
75534       };
75535
75536
75537       /* Init */
75538
75539       context.projection = geoRawMercator();
75540       context.curtainProjection = geoRawMercator();
75541
75542       locale = utilDetect().locale;
75543       if (locale && !dataLocales.hasOwnProperty(locale)) {
75544           locale = locale.split('-')[0];
75545       }
75546
75547       history = coreHistory(context);
75548       context.graph = history.graph;
75549       context.changes = history.changes;
75550       context.intersects = history.intersects;
75551
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();
75559               return result;
75560           };
75561       }
75562
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);
75569
75570       ui = uiInit(context);
75571
75572       connection = services.osm;
75573       background = rendererBackground(context);
75574       features = rendererFeatures(context);
75575       presets = presetIndex();
75576
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;
75586
75587       forEach(services, function(service) {
75588           if (service && typeof service.init === 'function') {
75589               service.init(context);
75590           }
75591       });
75592
75593       background.init();
75594       features.init();
75595       presets.init();
75596       areaKeys = presets.areaKeys();
75597
75598
75599       return utilRebind(context, dispatch$$1, 'on');
75600   }
75601
75602   function osmWay() {
75603       if (!(this instanceof osmWay)) {
75604           return (new osmWay()).initialize(arguments);
75605       } else if (arguments.length) {
75606           this.initialize(arguments);
75607       }
75608   }
75609
75610
75611   osmEntity$$1.way = osmWay;
75612
75613   osmWay.prototype = Object.create(osmEntity$$1.prototype);
75614
75615
75616   assignIn(osmWay.prototype, {
75617       type: 'way',
75618       nodes: [],
75619
75620
75621       copy: function(resolver, copies) {
75622           if (copies[this.id])
75623               return copies[this.id];
75624
75625           var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
75626
75627           var nodes = this.nodes.map(function(id) {
75628               return resolver.entity(id).copy(resolver, copies).id;
75629           });
75630
75631           copy = copy.update({ nodes: nodes });
75632           copies[this.id] = copy;
75633
75634           return copy;
75635       },
75636
75637
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]);
75643                   if (node) {
75644                       extent._extend(node.extent());
75645                   }
75646               }
75647               return extent;
75648           });
75649       },
75650
75651
75652       first: function() {
75653           return this.nodes[0];
75654       },
75655
75656
75657       last: function() {
75658           return this.nodes[this.nodes.length - 1];
75659       },
75660
75661
75662       contains: function(node) {
75663           return this.nodes.indexOf(node) >= 0;
75664       },
75665
75666
75667       affix: function(node) {
75668           if (this.nodes[0] === node) return 'prefix';
75669           if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
75670       },
75671
75672
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));
75677           }
75678
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;
75684
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;
75694           return 0;
75695       },
75696
75697
75698       isOneWay: function() {
75699           // explicit oneway tag..
75700           var values = {
75701               'yes': true,
75702               '1': true,
75703               '-1': true,
75704               'reversible': true,
75705               'alternating': true,
75706               'no': false,
75707               '0': false
75708           };
75709           if (values[this.tags.oneway] !== undefined) {
75710               return values[this.tags.oneway];
75711           }
75712
75713           // implied oneway tag..
75714           for (var key in this.tags) {
75715               if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
75716                   return true;
75717           }
75718           return false;
75719       },
75720
75721
75722       lanes: function() {
75723           return osmLanes(this);
75724       },
75725
75726
75727       isClosed: function() {
75728           return this.nodes.length > 1 && this.first() === this.last();
75729       },
75730
75731
75732       isConvex: function(resolver) {
75733           if (!this.isClosed() || this.isDegenerate()) return null;
75734
75735           var nodes = uniq(resolver.childNodes(this));
75736           var coords = map$3(nodes, 'loc');
75737           var curr = 0;
75738           var prev = 0;
75739
75740           for (var i = 0; i < coords.length; i++) {
75741               var o = coords[(i+1) % coords.length];
75742               var a = coords[i];
75743               var b = coords[(i+2) % coords.length];
75744               var res = geoVecCross(a, b, o);
75745
75746               curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
75747               if (curr === 0) {
75748                   continue;
75749               } else if (prev && curr !== prev) {
75750                   return false;
75751               }
75752               prev = curr;
75753           }
75754           return true;
75755       },
75756
75757
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
75762           var lineKeys = {
75763               highway: {
75764                   rest_area: true,
75765                   services: true
75766               },
75767               railway: {
75768                   roundhouse: true,
75769                   station: true,
75770                   traverser: true,
75771                   turntable: true,
75772                   wash: true
75773               }
75774           };
75775
75776           if (this.tags.area === 'yes')
75777               return true;
75778           if (!this.isClosed() || this.tags.area === 'no')
75779               return false;
75780           for (var key in this.tags) {
75781               if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
75782                   return true;
75783               }
75784               if (key in lineKeys && this.tags[key] in lineKeys[key]) {
75785                   return true;
75786               }
75787           }
75788           return false;
75789       },
75790
75791
75792       isDegenerate: function() {
75793           return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
75794       },
75795
75796
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;
75802               }
75803           }
75804           return false;
75805       },
75806
75807
75808       geometry: function(graph) {
75809           return graph.transient(this, 'geometry', function() {
75810               return this.isArea() ? 'area' : 'line';
75811           });
75812       },
75813
75814
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;
75818
75819           var nodes = this.nodes.slice();
75820           nodes = nodes.filter(noRepeatNodes);
75821           nodes.push(nodes[0]);
75822           return this.update({ nodes: nodes });
75823       },
75824
75825
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;
75829
75830           var nodes = this.nodes.slice(),
75831               connector = this.first(),
75832               i = nodes.length - 1;
75833
75834           // remove trailing connectors..
75835           while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
75836               nodes.splice(i, 1);
75837               i = nodes.length - 1;
75838           }
75839
75840           nodes = nodes.filter(noRepeatNodes);
75841           return this.update({ nodes: nodes });
75842       },
75843
75844
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;
75854
75855           if (index === undefined) {
75856               index = max;
75857           }
75858
75859           if (index < 0 || index > max) {
75860               throw new RangeError('index ' + index + ' out of range 0..' + max);
75861           }
75862
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..
75865           if (isClosed) {
75866               var connector = this.first();
75867
75868               // leading connectors..
75869               var i = 1;
75870               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
75871                   nodes.splice(i, 1);
75872                   if (index > i) index--;
75873               }
75874
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;
75881               }
75882           }
75883
75884           nodes.splice(index, 0, id);
75885           nodes = nodes.filter(noRepeatNodes);
75886
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]);
75890           }
75891
75892           return this.update({ nodes: nodes });
75893       },
75894
75895
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;
75903
75904           if (index === undefined || index < 0 || index > max) {
75905               throw new RangeError('index ' + index + ' out of range 0..' + max);
75906           }
75907
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..
75910           if (isClosed) {
75911               var connector = this.first();
75912
75913               // leading connectors..
75914               var i = 1;
75915               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
75916                   nodes.splice(i, 1);
75917                   if (index > i) index--;
75918               }
75919
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;
75926               }
75927           }
75928
75929           nodes.splice(index, 1, id);
75930           nodes = nodes.filter(noRepeatNodes);
75931
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]);
75935           }
75936
75937           return this.update({nodes: nodes});
75938       },
75939
75940
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();
75947
75948           for (var i = 0; i < nodes.length; i++) {
75949               if (nodes[i] === needle) {
75950                   nodes[i] = replacement;
75951               }
75952           }
75953
75954           nodes = nodes.filter(noRepeatNodes);
75955
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]);
75959           }
75960
75961           return this.update({nodes: nodes});
75962       },
75963
75964
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();
75971
75972           nodes = nodes
75973               .filter(function(node) { return node !== id; })
75974               .filter(noRepeatNodes);
75975
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]);
75979           }
75980
75981           return this.update({nodes: nodes});
75982       },
75983
75984
75985       asJXON: function(changeset_id) {
75986           var r = {
75987               way: {
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) } };
75992                   }),
75993                   tag: map$3(this.tags, function(v, k) {
75994                       return { keyAttributes: { k: k, v: v } };
75995                   })
75996               }
75997           };
75998           if (changeset_id) {
75999               r.way['@changeset'] = changeset_id;
76000           }
76001           return r;
76002       },
76003
76004
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()) {
76009                   return {
76010                       type: 'Polygon',
76011                       coordinates: [coordinates]
76012                   };
76013               } else {
76014                   return {
76015                       type: 'LineString',
76016                       coordinates: coordinates
76017                   };
76018               }
76019           });
76020       },
76021
76022
76023       area: function(resolver) {
76024           return resolver.transient(this, 'area', function() {
76025               var nodes = resolver.childNodes(this);
76026
76027               var json = {
76028                   type: 'Polygon',
76029                   coordinates: [map$3(nodes, 'loc')]
76030               };
76031
76032               if (!this.isClosed() && nodes.length) {
76033                   json.coordinates[0].push(nodes[0].loc);
76034               }
76035
76036               var area = d3_geoArea(json);
76037
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);
76043               }
76044
76045               return isNaN(area) ? 0 : area;
76046           });
76047       }
76048   });
76049
76050
76051   // Filter function to eliminate consecutive duplicates.
76052   function noRepeatNodes(node, i, arr) {
76053       return i === 0 || node !== arr[i - 1];
76054   }
76055
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)
76060           return false;
76061
76062       var parents = graph.parentRelations(entity);
76063       if (parents.length !== 1)
76064           return false;
76065
76066       var parent = parents[0];
76067       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
76068           return false;
76069
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
76077       }
76078
76079       return parent;
76080   }
76081
76082
76083   function osmSimpleMultipolygonOuterMember(entity, graph) {
76084       if (entity.type !== 'way')
76085           return false;
76086
76087       var parents = graph.parentRelations(entity);
76088       if (parents.length !== 1)
76089           return false;
76090
76091       var parent = parents[0];
76092       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
76093           return false;
76094
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') {
76099               if (outerMember)
76100                   return false; // Not a simple multipolygon
76101               outerMember = member;
76102           }
76103       }
76104
76105       if (!outerMember)
76106           return false;
76107
76108       var outerEntity = graph.hasEntity(outerMember.id);
76109       if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
76110           return false;
76111
76112       return outerEntity;
76113   }
76114
76115
76116   // Join `toJoin` array into sequences of connecting ways.
76117
76118   // Segments which share identical start/end nodes will, as much as possible,
76119   // be connected with each other.
76120   //
76121   // The return value is a nested array. Each constituent array contains elements
76122   // of `toJoin` which have been determined to connect.
76123   //
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.
76127   //
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.
76130   //
76131   // If an member is an `osmWay`, its tags and childnodes may be reversed via
76132   // `actionReverse` in the output.
76133   //
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.
76137   //
76138   // Incomplete members (those for which `graph.hasEntity(element.id)` returns
76139   // false) and non-way members are ignored.
76140   //
76141   function osmJoinWays(toJoin, graph) {
76142       function resolve(member) {
76143           return graph.childNodes(graph.entity(member.id));
76144       }
76145
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;
76150       }
76151
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);
76155       });
76156
76157       // Are the things we are joining relation members or `osmWays`?
76158       // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
76159       var i;
76160       var joinAsMembers = true;
76161       for (i = 0; i < toJoin.length; i++) {
76162           if (toJoin[i] instanceof osmWay) {
76163               joinAsMembers = false;
76164               break;
76165           }
76166       }
76167
76168       var sequences = [];
76169       sequences.actions = [];
76170
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;
76177
76178           // add to it
76179           while (toJoin.length && !doneSequence) {
76180               var start = currNodes[0];
76181               var end = currNodes[currNodes.length - 1];
76182               var fn = null;
76183               var nodes = null;
76184
76185               // Find the next way/member to join.
76186               for (i = 0; i < toJoin.length; i++) {
76187                   item = toJoin[i];
76188                   nodes = resolve(item);
76189
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)
76198                   ) {
76199                       currWays[0] = reverse(currWays[0]);
76200                       currNodes.reverse();
76201                       start = currNodes[0];
76202                       end = currNodes[currNodes.length - 1];
76203                   }
76204
76205                   if (nodes[0] === end) {
76206                       fn = currNodes.push;               // join to end
76207                       nodes = nodes.slice(1);
76208                       break;
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);
76213                       break;
76214                   } else if (nodes[nodes.length - 1] === start) {
76215                       fn = currNodes.unshift;            // join to beginning
76216                       nodes = nodes.slice(0, -1);
76217                       break;
76218                   } else if (nodes[0] === start) {
76219                       fn = currNodes.unshift;            // join to beginning
76220                       nodes = nodes.slice(1).reverse();
76221                       item = reverse(item);
76222                       break;
76223                   } else {
76224                       fn = nodes = null;
76225                   }
76226               }
76227
76228               if (!nodes) {     // couldn't find a joinable way/member
76229                   doneSequence = true;
76230                   break;
76231               }
76232
76233               fn.apply(currWays, [item]);
76234               fn.apply(currNodes, nodes);
76235
76236               toJoin.splice(i, 1);
76237           }
76238
76239           currWays.nodes = currNodes;
76240           sequences.push(currWays);
76241       }
76242
76243       return sequences;
76244   }
76245
76246   function osmRelation() {
76247       if (!(this instanceof osmRelation)) {
76248           return (new osmRelation()).initialize(arguments);
76249       } else if (arguments.length) {
76250           this.initialize(arguments);
76251       }
76252   }
76253
76254
76255   osmEntity$$1.relation = osmRelation;
76256
76257   osmRelation.prototype = Object.create(osmEntity$$1.prototype);
76258
76259
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);
76263
76264       if (aId < 0 || bId < 0) return aId - bId;
76265       return bId - aId;
76266   };
76267
76268
76269   assignIn(osmRelation.prototype, {
76270       type: 'relation',
76271       members: [],
76272
76273
76274       copy: function(resolver, copies) {
76275           if (copies[this.id])
76276               return copies[this.id];
76277
76278           var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
76279
76280           var members = this.members.map(function(member) {
76281               return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
76282           });
76283
76284           copy = copy.update({members: members});
76285           copies[this.id] = copy;
76286
76287           return copy;
76288       },
76289
76290
76291       extent: function(resolver, memo) {
76292           return resolver.transient(this, 'extent', function() {
76293               if (memo && memo[this.id]) return geoExtent$$1();
76294               memo = memo || {};
76295               memo[this.id] = true;
76296
76297               var extent = geoExtent$$1();
76298               for (var i = 0; i < this.members.length; i++) {
76299                   var member = resolver.hasEntity(this.members[i].id);
76300                   if (member) {
76301                       extent._extend(member.extent(resolver, memo));
76302                   }
76303               }
76304               return extent;
76305           });
76306       },
76307
76308
76309       geometry: function(graph) {
76310           return graph.transient(this, 'geometry', function() {
76311               return this.isMultipolygon() ? 'area' : 'relation';
76312           });
76313       },
76314
76315
76316       isDegenerate: function() {
76317           return this.members.length === 0;
76318       },
76319
76320
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});
76327           }
76328           return result;
76329       },
76330
76331
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});
76338               }
76339           }
76340       },
76341
76342       // Same as memberByRole, but returns all members with the given role
76343       membersByRole: function(role) {
76344           var result = [];
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}));
76348               }
76349           }
76350           return result;
76351       },
76352
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});
76359               }
76360           }
76361       },
76362
76363
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});
76370               }
76371           }
76372       },
76373
76374
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});
76379       },
76380
76381
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});
76386       },
76387
76388
76389       removeMember: function(index) {
76390           var members = this.members.slice();
76391           members.splice(index, 1);
76392           return this.update({members: members});
76393       },
76394
76395
76396       removeMembersWithID: function(id) {
76397           var members = reject(this.members, function(m) { return m.id === id; });
76398           return this.update({members: members});
76399       },
76400
76401
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))
76408               return this;
76409
76410           var members = [];
76411
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});
76418               }
76419           }
76420
76421           return this.update({members: members});
76422       },
76423
76424
76425       asJXON: function(changeset_id) {
76426           var r = {
76427               relation: {
76428                   '@id': this.osmId(),
76429                   '@version': this.version || 0,
76430                   member: map$3(this.members, function(member) {
76431                       return {
76432                           keyAttributes: {
76433                               type: member.type,
76434                               role: member.role,
76435                               ref: osmEntity$$1.id.toOSM(member.id)
76436                           }
76437                       };
76438                   }),
76439                   tag: map$3(this.tags, function(v, k) {
76440                       return { keyAttributes: { k: k, v: v } };
76441                   })
76442               }
76443           };
76444           if (changeset_id) r.relation['@changeset'] = changeset_id;
76445           return r;
76446       },
76447
76448
76449       asGeoJSON: function(resolver) {
76450           return resolver.transient(this, 'GeoJSON', function () {
76451               if (this.isMultipolygon()) {
76452                   return {
76453                       type: 'MultiPolygon',
76454                       coordinates: this.multipolygon(resolver)
76455                   };
76456               } else {
76457                   return {
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));
76462                       })
76463                   };
76464               }
76465           });
76466       },
76467
76468
76469       area: function(resolver) {
76470           return resolver.transient(this, 'area', function() {
76471               return d3_geoArea(this.asGeoJSON(resolver));
76472           });
76473       },
76474
76475
76476       isMultipolygon: function() {
76477           return this.tags.type === 'multipolygon';
76478       },
76479
76480
76481       isComplete: function(resolver) {
76482           for (var i = 0; i < this.members.length; i++) {
76483               if (!resolver.hasEntity(this.members[i].id)) {
76484                   return false;
76485               }
76486           }
76487           return true;
76488       },
76489
76490
76491       isRestriction: function() {
76492           return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
76493       },
76494
76495
76496       isValidRestriction: function() {
76497           if (!this.isRestriction()) return false;
76498
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'; });
76502
76503           if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
76504           if (froms.some(function(m) { return m.type !== 'way'; })) return false;
76505
76506           if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
76507           if (tos.some(function(m) { return m.type !== 'way'; })) return false;
76508
76509           if (vias.length === 0) return false;
76510           if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
76511
76512           return true;
76513       },
76514
76515
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.
76518       //
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.
76521       //
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.
76525       //
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; });
76529
76530           outers = osmJoinWays(outers, resolver);
76531           inners = osmJoinWays(inners, resolver);
76532
76533           outers = outers.map(function(outer) { return map$3(outer.nodes, 'loc'); });
76534           inners = inners.map(function(inner) { return map$3(inner.nodes, 'loc'); });
76535
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];
76540           });
76541
76542           function findOuter(inner) {
76543               var o, outer;
76544
76545               for (o = 0; o < outers.length; o++) {
76546                   outer = outers[o];
76547                   if (geoPolygonContainsPolygon(outer, inner))
76548                       return o;
76549               }
76550
76551               for (o = 0; o < outers.length; o++) {
76552                   outer = outers[o];
76553                   if (geoPolygonIntersectsPolygon(outer, inner, false))
76554                       return o;
76555               }
76556           }
76557
76558           for (var i = 0; i < inners.length; i++) {
76559               var inner = inners[i];
76560
76561               if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
76562                   inner = inner.reverse();
76563               }
76564
76565               var o = findOuter(inners[i]);
76566               if (o !== undefined)
76567                   result[o].push(inners[i]);
76568               else
76569                   result.push([inners[i]]); // Invalid geometry
76570           }
76571
76572           return result;
76573       }
76574   });
76575
76576   function osmTurn(turn) {
76577       if (!(this instanceof osmTurn)) {
76578           return new osmTurn(turn);
76579       }
76580       assignIn(this, turn);
76581   }
76582
76583
76584   function osmIntersection(graph, startVertexId, maxDistance) {
76585       maxDistance = maxDistance || 30;    // in meters
76586       var vgraph = coreGraph$$1();           // virtual graph
76587       var i, j, k;
76588
76589
76590       function memberOfRestriction(entity) {
76591           return graph.parentRelations(entity)
76592               .some(function(r) { return r.isRestriction(); });
76593       }
76594
76595       function isRoad(way) {
76596           if (way.isArea() || way.isDegenerate()) return false;
76597           var roads = {
76598               'motorway': true,
76599               'motorway_link': true,
76600               'trunk': true,
76601               'trunk_link': true,
76602               'primary': true,
76603               'primary_link': true,
76604               'secondary': true,
76605               'secondary_link': true,
76606               'tertiary': true,
76607               'tertiary_link': true,
76608               'residential': true,
76609               'unclassified': true,
76610               'living_street': true,
76611               'service': true,
76612               'road': true,
76613               'track': true
76614           };
76615           return roads[way.tags.highway];
76616       }
76617
76618
76619       var startNode = graph.entity(startVertexId);
76620       var checkVertices = [startNode];
76621       var checkWays;
76622       var vertices = [];
76623       var vertexIds = [];
76624       var vertex;
76625       var ways = [];
76626       var wayIds = [];
76627       var way;
76628       var nodes = [];
76629       var node;
76630       var parents = [];
76631       var parent;
76632
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
76638       var actions = [];
76639
76640
76641       // STEP 1:  walk the graph outwards from starting vertex to search
76642       //  for more key vertices and ways to include in the intersection..
76643
76644       while (checkVertices.length) {
76645           vertex = checkVertices.pop();
76646
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;
76653
76654               ways.push(way);   // it's a road, or it's already in a turn restriction
76655               hasWays = true;
76656
76657               // check the way's children for more key vertices
76658               nodes = uniq(graph.childNodes(way));
76659               for (j = 0; j < nodes.length; j++) {
76660                   node = nodes[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
76665
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
76674                       hasParents = true;
76675                       break;
76676                   }
76677
76678                   if (hasParents) {
76679                       checkVertices.push(node);
76680                   }
76681               }
76682           }
76683
76684           if (hasWays) {
76685               vertices.push(vertex);
76686           }
76687       }
76688
76689       vertices = uniq(vertices);
76690       ways = uniq(ways);
76691
76692
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);
76699           });
76700
76701           vgraph = vgraph.replace(way);
76702
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));
76709                   }
76710               }
76711           });
76712       });
76713
76714
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);
76722           }
76723       });
76724
76725
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);
76740               });
76741           }
76742       });
76743
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) {
76747       // });
76748
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;
76755
76756
76757       // STEP 5:  Update arrays to point to vgraph entities
76758       vertexIds = vertices.map(function(v) { return v.id; });
76759       vertices = [];
76760       ways = [];
76761
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);
76767       });
76768
76769       vertices = uniq(vertices);
76770       ways = uniq(ways);
76771
76772       vertexIds = vertices.map(function(v) { return v.id; });
76773       wayIds = ways.map(function(w) { return w.id; });
76774
76775
76776       // STEP 6:  Update the ways with some metadata that will be useful for
76777       // walking the intersection graph later and rendering turn arrows.
76778
76779       function withMetadata(way, vertexIds) {
76780           var __oneWay = way.isOneWay();
76781
76782           // which affixes are key vertices?
76783           var __first = (vertexIds.indexOf(way.first()) !== -1);
76784           var __last = (vertexIds.indexOf(way.last()) !== -1);
76785
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));
76790
76791           return way.update({
76792               __first:  __first,
76793               __last:  __last,
76794               __from:  __from,
76795               __via: __via,
76796               __to:  __to,
76797               __oneWay:  __oneWay
76798           });
76799       }
76800
76801       ways = [];
76802       wayIds.forEach(function(id) {
76803           var way = withMetadata(vgraph.entity(id), vertexIds);
76804           vgraph = vgraph.replace(way);
76805           ways.push(way);
76806       });
76807
76808
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
76812
76813       var keepGoing;
76814       var removeWayIds = [];
76815       var removeVertexIds = [];
76816
76817       do {
76818           keepGoing = false;
76819           checkVertices = vertexIds.slice();
76820
76821           for (i = 0; i < checkVertices.length; i++) {
76822               var vertexId = checkVertices[i];
76823               vertex = vgraph.hasEntity(vertexId);
76824
76825               if (!vertex) {
76826                   if (vertexIds.indexOf(vertexId) !== -1) {
76827                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
76828                   }
76829                   removeVertexIds.push(vertexId);
76830                   continue;
76831               }
76832
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
76837                   }
76838               }
76839
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;
76846
76847                   if (aIsLeaf && !bIsLeaf) {
76848                       leaf = a;
76849                       survivor = b;
76850                   } else if (!aIsLeaf && bIsLeaf) {
76851                       leaf = b;
76852                       survivor = a;
76853                   }
76854
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);
76859                       keepGoing = true;
76860                   }
76861               }
76862
76863               parents = vgraph.parentWays(vertex);
76864
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
76868                   }
76869                   removeVertexIds.push(vertexId);
76870                   keepGoing = true;
76871               }
76872
76873               if (parents.length < 1) {     // vertex is no longer attached to anything
76874                   vgraph = vgraph.remove(vertex);
76875               }
76876
76877           }
76878       } while (keepGoing);
76879
76880
76881       vertices = vertices
76882           .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
76883           .map(function(vertex) { return vgraph.entity(vertex.id); });
76884       ways = ways
76885           .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
76886           .map(function(way) { return vgraph.entity(way.id); });
76887
76888
76889       // OK!  Here is our intersection..
76890       var intersection = {
76891           graph: vgraph,
76892           actions: actions,
76893           vertices: vertices,
76894           ways: ways,
76895       };
76896
76897
76898
76899       // Get all the valid turns through this intersection given a starting way id.
76900       // This operates on the virtual graph for everything.
76901       //
76902       // Basically, walk through all possible paths from starting way,
76903       //   honoring the existing turn restrictions as we go (watch out for loops!)
76904       //
76905       // For each path found, generate and return a `osmTurn` datastructure.
76906       //
76907       intersection.turns = function(fromWayId, maxViaWay) {
76908           if (!fromWayId) return [];
76909           if (!maxViaWay) maxViaWay = 0;
76910
76911           var vgraph = intersection.graph;
76912           var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
76913
76914           var start = vgraph.entity(fromWayId);
76915           if (!start || !(start.__from || start.__via)) return [];
76916
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;
76921           var turns = [];
76922
76923           step(start);
76924           return turns;
76925
76926
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 || []);
76933               var i, j;
76934
76935               if (entity.type === 'node') {
76936                   var parents = vgraph.parentWays(entity);
76937                   var nextWays = [];
76938
76939                   // which ways can we step into?
76940                   for (i = 0; i < parents.length; i++) {
76941                       var way = parents[i];
76942
76943                       // if next way is a oneway incoming to this vertex, skip
76944                       if (way.__oneWay && way.nodes[0] !== entity.id) continue;
76945
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;
76948
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);
76957
76958                           // Does the current path match this turn restriction?
76959                           var matchesFrom = (f.id === fromWayId);
76960                           var matchesViaTo = false;
76961                           var isAlongOnlyPath = false;
76962
76963                           if (t.id === way.id) {     // match TO
76964
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)
76969                                   ));
76970
76971                               } else {                                         // match all VIA ways
76972                                   var pathVias = [];
76973                                   for (k = 2; k < currPath.length; k +=2 ) {   // k = 2 skips FROM
76974                                       pathVias.push(currPath[k]);              // (path goes way-node-way...)
76975                                   }
76976                                   var restrictionVias = [];
76977                                   for (k = 0; k < v.length; k++) {
76978                                       if (v[k].type === 'way') {
76979                                           restrictionVias.push(v[k].id);
76980                                       }
76981                                   }
76982                                   var diff = difference(pathVias, restrictionVias);
76983                                   matchesViaTo = !diff.length;
76984                               }
76985
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;
76991                                       break;
76992                                   }
76993                               }
76994                           }
76995
76996                           if (matchesViaTo) {
76997                               if (isOnly) {
76998                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
76999                               } else {
77000                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
77001                               }
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 };
77007                               }
77008                           }
77009
77010                           // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
77011                           if (restrict && restrict.direct)
77012                               break;
77013                       }
77014
77015                       nextWays.push({ way: way, restrict: restrict });
77016                   }
77017
77018                   nextWays.forEach(function(nextWay) {
77019                       step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
77020                   });
77021
77022
77023               } else {  // entity.type === 'way'
77024                   if (currPath.length >= 3) {     // this is a "complete" path..
77025                       var turnPath = clone(currPath);
77026
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);
77032                                   break;
77033                               }
77034                           }
77035                       }
77036
77037                       var turn = pathToTurn(turnPath);
77038                       if (turn) {
77039                           if (matchedRestriction) {
77040                               turn.restrictionID = matchedRestriction.id;
77041                               turn.no = matchedRestriction.no;
77042                               turn.only = matchedRestriction.only;
77043                               turn.direct = matchedRestriction.direct;
77044                           }
77045                           turns.push(osmTurn(turn));
77046                       }
77047
77048                       if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
77049                   }
77050
77051                   if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
77052
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 = [];
77058
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
77062                   }
77063
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
77068                   }
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
77072                   }
77073
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;
77078
77079                           var f = r.memberByRole('from');
77080                           if (!f || f.id !== entity.id) return false;
77081
77082                           var isOnly = /^only_/.test(r.tags.restriction);
77083                           if (!isOnly) return true;
77084
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) {
77095                                       isOnlyVia = true;
77096                                       break;
77097                                   }
77098                               }
77099                           }
77100                           return isOnlyVia;
77101                       });
77102
77103                       step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
77104                   });
77105               }
77106           }
77107
77108
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;
77115
77116               fromWayId = path[0];
77117               toWayId = path[path.length - 1];
77118
77119               if (path.length === 3 && fromWayId === toWayId) {  // u turn
77120                   var way = vgraph.entity(fromWayId);
77121                   if (way.__oneWay) return null;
77122
77123                   isUturn = true;
77124                   viaNodeId = fromVertexId = toVertexId = path[1];
77125                   fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
77126
77127               } else {
77128                   isUturn = false;
77129                   fromVertexId = path[1];
77130                   fromNodeId = adjacentNode(fromWayId, fromVertexId);
77131                   toVertexId = path[path.length - 2];
77132                   toNodeId = adjacentNode(toWayId, toVertexId);
77133
77134                   if (path.length === 3) {
77135                       viaNodeId = path[1];
77136                   } else {
77137                       viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
77138                       viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
77139                   }
77140               }
77141
77142               return {
77143                   key:  path.join('_'),
77144                   path: path,
77145                   from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
77146                   via:  { node: viaNodeId,  ways: viaWayIds },
77147                   to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
77148                   u:    isUturn
77149               };
77150
77151
77152               function adjacentNode(wayId, affixId) {
77153                   var nodes = vgraph.entity(wayId).nodes;
77154                   return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
77155               }
77156           }
77157
77158       };
77159
77160       return intersection;
77161   }
77162
77163
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);
77171
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;
77176
77177       while (angle < 0)
77178           angle += 360;
77179
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)
77186       if (angle < 158)
77187           return 'no_right_turn';
77188       if (angle > 202)
77189           return 'no_left_turn';
77190
77191       return 'no_straight_on';
77192   }
77193
77194   function actionAddMember(relationId, member, memberIndex, insertPair) {
77195
77196       return function action(graph) {
77197           var relation = graph.entity(relationId);
77198
77199           // There are some special rules for Public Transport v2 routes.
77200           var isPTv2 = /stop|platform/.test(member.role);
77201
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);
77205           } else {
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)) {
77210                   memberIndex = 0;
77211               }
77212
77213               graph = graph.replace(relation.addMember(member, memberIndex));
77214           }
77215
77216           return graph;
77217       };
77218
77219
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;
77224
77225           // remove PTv2 stops and platforms before doing anything.
77226           var PTv2members = [];
77227           var members = [];
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);
77232               } else {
77233                   members.push(m);
77234               }
77235           }
77236           relation = relation.update({ members: members });
77237
77238
77239           if (insertPair) {
77240               // We're adding a member that must stay paired with an existing member.
77241               // (This feature is used by `actionSplit`)
77242               //
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).
77246               //
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 || [];
77255
77256           } else {
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);
77261           }
77262
77263           members = withIndex(groups.way);
77264           var joined = osmJoinWays(members, graph);
77265
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;
77272
77273               // j = array index in `members` where this segment starts
77274               for (j = 0; j < members.length; j++) {
77275                   if (members[j].index === startIndex) {
77276                       break;
77277                   }
77278               }
77279
77280               // k = each member in segment
77281               for (k = 0; k < segment.length; k++) {
77282                   item = segment[k];
77283                   var way = graph.entity(item.id);
77284
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]) {
77288                           item.pair = [
77289                               { id: insertPair.originalID, type: 'way', role: item.role },
77290                               { id: insertPair.insertedID, type: 'way', role: item.role }
77291                           ];
77292                       } else {
77293                           item.pair = [
77294                               { id: insertPair.insertedID, type: 'way', role: item.role },
77295                               { id: insertPair.originalID, type: 'way', role: item.role }
77296                           ];
77297                       }
77298                   }
77299
77300                   // reorder `members` if necessary
77301                   if (k > 0) {
77302                       if (j+k >= members.length || item.index !== members[j+k].index) {
77303                           moveMember(members, item.index, j+k);
77304                       }
77305                   }
77306
77307                   nodes.splice(0, way.nodes.length - 1);
77308               }
77309           }
77310
77311           if (tempWay) {
77312               graph = graph.remove(tempWay);
77313           }
77314
77315           // Final pass: skip dead items, split pairs, remove index properties
77316           var wayMembers = [];
77317           for (i = 0; i < members.length; i++) {
77318               item = members[i];
77319               if (item.index === -1) continue;
77320
77321               if (item.pair) {
77322                   wayMembers.push(item.pair[0]);
77323                   wayMembers.push(item.pair[1]);
77324               } else {
77325                   wayMembers.push(omit(item, 'index'));
77326               }
77327           }
77328
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 || []) );
77333
77334           return graph.replace(relation.update({members: newMembers}));
77335
77336
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`
77340           //
77341           // j=5, k=0                jk
77342           // segment                 5 4 7 6
77343           // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
77344           //
77345           // j=5, k=1                j k
77346           // segment                 5 4 7 6
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
77349           //
77350           // j=5, k=2                j   k
77351           // segment                 5 4 7 6
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
77354           //
77355           // j=5, k=3                j     k
77356           // segment                 5 4 7 6
77357           // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
77358           //
77359           function moveMember(arr, findIndex, toIndex) {
77360               for (var i = 0; i < arr.length; i++) {
77361                   if (arr[i].index === findIndex) {
77362                       break;
77363                   }
77364               }
77365
77366               var item = clone(arr[i]);
77367               arr[i].index = -1;   // mark as dead
77368               item.index = toIndex;
77369               arr.splice(toIndex, 0, item);
77370           }
77371
77372
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;
77380               }
77381               return result;
77382           }
77383       }
77384
77385   }
77386
77387   function actionAddMidpoint(midpoint, node) {
77388       return function(graph) {
77389           graph = graph.replace(node.move(midpoint.loc));
77390
77391           var parents = intersection(
77392               graph.parentWays(graph.entity(midpoint.edge[0])),
77393               graph.parentWays(graph.entity(midpoint.edge[1])));
77394
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));
77399
77400                       // Add only one midpoint on doubled-back segments,
77401                       // turning them into self-intersections.
77402                       return;
77403                   }
77404               }
77405           });
77406
77407           return graph;
77408       };
77409   }
77410
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));
77415       };
77416   }
77417
77418   function actionChangeMember(relationId, member, memberIndex) {
77419       return function(graph) {
77420           return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
77421       };
77422   }
77423
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;
77429
77430           if (oldPreset) tags = oldPreset.removeTags(tags, geometry);
77431           if (newPreset) tags = newPreset.applyTags(tags, geometry);
77432
77433           return graph.replace(entity.update({tags: tags}));
77434       };
77435   }
77436
77437   function actionChangeTags(entityId, tags) {
77438       return function(graph) {
77439           var entity = graph.entity(entityId);
77440           return graph.replace(entity.update({tags: tags}));
77441       };
77442   }
77443
77444   function actionCircularize(wayId, projection, maxAngle) {
77445       maxAngle = (maxAngle || 20) * Math.PI / 180;
77446
77447
77448       var action = function(graph, t) {
77449           if (t === null || !isFinite(t)) t = 1;
77450           t = Math.min(Math.max(+t, 0), 1);
77451
77452           var way = graph.entity(wayId),
77453               origNodes = {};
77454
77455           graph.childNodes(way).forEach(function(node) {
77456               if (!origNodes[node.id]) origNodes[node.id] = node;
77457           });
77458
77459           if (!way.isConvex(graph)) {
77460               graph = action.makeConvex(graph);
77461           }
77462
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,
77470               ids;
77471
77472           // we need atleast two key nodes for the algorithm to work
77473           if (!keyNodes.length) {
77474               keyNodes = [nodes[0]];
77475               keyPoints = [points[0]];
77476           }
77477
77478           if (keyNodes.length === 1) {
77479               var index = nodes.indexOf(keyNodes[0]),
77480                   oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
77481
77482               keyNodes.push(nodes[oppositeIndex]);
77483               keyPoints.push(points[oppositeIndex]);
77484           }
77485
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,
77498                   nearNodes = {},
77499                   inBetweenNodes = [],
77500                   startAngle, endAngle, totalAngle, eachAngle,
77501                   angle, loc, node, origNode, j;
77502
77503               if (indexRange < 0) {
77504                   indexRange += nodes.length;
77505               }
77506
77507               // position this key node
77508               var distance = geoVecLength(centroid, keyPoints[i]);
77509               if (distance === 0) { distance = 1e-4; }
77510               keyPoints[i] = [
77511                   centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
77512                   centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
77513               ];
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);
77519
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;
77524
77525               // detects looping around -pi/pi
77526               if (totalAngle * sign > 0) {
77527                   totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
77528               }
77529
77530               do {
77531                   numberNewPoints++;
77532                   eachAngle = totalAngle / (indexRange + numberNewPoints);
77533               } while (Math.abs(eachAngle) > maxAngle);
77534
77535
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
77542                   ]);
77543
77544                   node = nodes[(j + startNodeIndex) % nodes.length];
77545                   origNode = origNodes[node.id];
77546                   nearNodes[node.id] = angle;
77547
77548                   node = node.move(geoVecInterp(origNode.loc, loc, t));
77549                   graph = graph.replace(node);
77550               }
77551
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
77558                   ]);
77559
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) {
77566                           dist = min$$1;
77567                           origNode = origNodes[nodeId];
77568                       }
77569                   }
77570
77571                   node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
77572                   graph = graph.replace(node);
77573
77574                   nodes.splice(endNodeIndex + j, 0, node);
77575                   inBetweenNodes.push(node.id);
77576               }
77577
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; }
77586
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; }
77595
77596                           if (wayDirection1 !== wayDirection2) {
77597                               inBetweenNodes.reverse();
77598                               insertAt = startIndex2;
77599                           }
77600                           for (j = 0; j < inBetweenNodes.length; j++) {
77601                               sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
77602                           }
77603                           graph = graph.replace(sharedWay);
77604                       }
77605                   });
77606                   /* eslint-enable no-loop-func */
77607               }
77608
77609           }
77610
77611           // update the way to have all the new nodes
77612           ids = nodes.map(function(n) { return n.id; });
77613           ids.push(ids[0]);
77614
77615           way = way.update({nodes: ids});
77616           graph = graph.replace(way);
77617
77618           return graph;
77619       };
77620
77621
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);
77628
77629           // D3 convex hulls go counterclockwise..
77630           if (sign === -1) {
77631               nodes.reverse();
77632               points.reverse();
77633           }
77634
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);
77639
77640               if (indexRange < 0) {
77641                   indexRange += nodes.length;
77642               }
77643
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);
77649               }
77650           }
77651           return graph;
77652       };
77653
77654
77655       action.disabled = function(graph) {
77656           if (!graph.entity(wayId).isClosed())
77657               return 'not_closed';
77658       };
77659
77660
77661       action.transitionable = true;
77662
77663
77664       return action;
77665   }
77666
77667   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
77668   function actionDeleteWay(wayId) {
77669
77670
77671       function canDeleteNode(node, graph) {
77672           return !graph.parentWays(node).length &&
77673               !graph.parentRelations(node).length &&
77674               !node.hasInterestingTags();
77675       }
77676
77677
77678       var action = function(graph) {
77679           var way = graph.entity(wayId);
77680
77681           graph.parentRelations(way)
77682               .forEach(function(parent) {
77683                   parent = parent.removeMembersWithID(wayId);
77684                   graph = graph.replace(parent);
77685
77686                   if (parent.isDegenerate()) {
77687                       graph = actionDeleteRelation(parent.id)(graph);
77688                   }
77689               });
77690
77691           uniq(way.nodes).forEach(function(nodeId) {
77692               graph = graph.replace(way.removeNode(nodeId));
77693
77694               var node = graph.entity(nodeId);
77695               if (canDeleteNode(node, graph)) {
77696                   graph = graph.remove(node);
77697               }
77698           });
77699
77700           return graph.remove(way);
77701       };
77702
77703
77704       return action;
77705   }
77706
77707   function actionDeleteMultiple(ids) {
77708       var actions = {
77709           way: actionDeleteWay,
77710           node: actionDeleteNode,
77711           relation: actionDeleteRelation
77712       };
77713
77714
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);
77719               }
77720           });
77721
77722           return graph;
77723       };
77724
77725
77726       return action;
77727   }
77728
77729   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
77730   function actionDeleteRelation(relationId) {
77731
77732
77733       function canDeleteEntity(entity, graph) {
77734           return !graph.parentWays(entity).length &&
77735               !graph.parentRelations(entity).length &&
77736               !entity.hasInterestingTags();
77737       }
77738
77739
77740       var action = function(graph) {
77741           var relation = graph.entity(relationId);
77742
77743           graph.parentRelations(relation)
77744               .forEach(function(parent) {
77745                   parent = parent.removeMembersWithID(relationId);
77746                   graph = graph.replace(parent);
77747
77748                   if (parent.isDegenerate()) {
77749                       graph = actionDeleteRelation(parent.id)(graph);
77750                   }
77751               });
77752
77753           uniq(map$3(relation.members, 'id')).forEach(function(memberId) {
77754               graph = graph.replace(relation.removeMembersWithID(memberId));
77755
77756               var entity = graph.entity(memberId);
77757               if (canDeleteEntity(entity, graph)) {
77758                   graph = actionDeleteMultiple([memberId])(graph);
77759               }
77760           });
77761
77762           return graph.remove(relation);
77763       };
77764
77765
77766       return action;
77767   }
77768
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);
77773
77774           graph.parentWays(node)
77775               .forEach(function(parent) {
77776                   parent = parent.removeNode(nodeId);
77777                   graph = graph.replace(parent);
77778
77779                   if (parent.isDegenerate()) {
77780                       graph = actionDeleteWay(parent.id)(graph);
77781                   }
77782               });
77783
77784           graph.parentRelations(node)
77785               .forEach(function(parent) {
77786                   parent = parent.removeMembersWithID(nodeId);
77787                   graph = graph.replace(parent);
77788
77789                   if (parent.isDegenerate()) {
77790                       graph = actionDeleteRelation(parent.id)(graph);
77791                   }
77792               });
77793
77794           return graph.remove(node);
77795       };
77796
77797
77798       return action;
77799   }
77800
77801   // Connect the ways at the given nodes.
77802   //
77803   // First choose a node to be the survivor, with preference given
77804   // to an existing (not new) node.
77805   //
77806   // Tags and relation memberships of of non-surviving nodes are merged
77807   // to the survivor.
77808   //
77809   // This is the inverse of `iD.actionDisconnect`.
77810   //
77811   // Reference:
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
77814   //
77815   function actionConnect(nodeIDs) {
77816       var action = function(graph) {
77817           var survivor;
77818           var node;
77819           var parents;
77820           var i, j;
77821
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
77826           }
77827
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;
77832
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));
77837                   }
77838               }
77839
77840               parents = graph.parentRelations(node);
77841               for (j = 0; j < parents.length; j++) {
77842                   graph = graph.replace(parents[j].replaceMember(node, survivor));
77843               }
77844
77845               survivor = survivor.mergeTags(node.tags);
77846               graph = actionDeleteNode(node.id)(graph);
77847           }
77848
77849           graph = graph.replace(survivor);
77850
77851           return graph;
77852       };
77853
77854
77855       action.disabled = function(graph) {
77856           var seen = {};
77857           var restrictionIDs = [];
77858           var survivor;
77859           var node, way;
77860           var relations, relation, role;
77861           var i, j, k;
77862
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
77867           }
77868
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);
77873
77874               for (j = 0; j < relations.length; j++) {
77875                   relation = relations[j];
77876                   role = relation.memberById(node.id).role || '';
77877
77878                   // if this node is a via node in a restriction, remember for later
77879                   if (relation.isValidRestriction()) {
77880                       restrictionIDs.push(relation.id);
77881                   }
77882
77883                   if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
77884                       return 'relation';
77885                   } else {
77886                       seen[relation.id] = role;
77887                   }
77888               }
77889           }
77890
77891           // gather restrictions for parent ways
77892           for (i = 0; i < nodeIDs.length; i++) {
77893               node = graph.entity(nodeIDs[i]);
77894
77895               var parents = graph.parentWays(node);
77896               for (j = 0; j < parents.length; j++) {
77897                   var parent = parents[j];
77898                   relations = graph.parentRelations(parent);
77899
77900                   for (k = 0; k < relations.length; k++) {
77901                       relation = relations[k];
77902                       if (relation.isValidRestriction()) {
77903                           restrictionIDs.push(relation.id);
77904                       }
77905                   }
77906               }
77907           }
77908
77909
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;
77915
77916               var memberWays = relation.members
77917                   .filter(function(m) { return m.type === 'way'; })
77918                   .map(function(m) { return graph.entity(m.id); });
77919
77920               memberWays = uniq(memberWays);
77921               var f = relation.memberByRole('from');
77922               var t = relation.memberByRole('to');
77923               var isUturn = (f.id === t.id);
77924
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);
77930               }
77931
77932               nodes.keyfrom = uniq(nodes.keyfrom.filter(hasDuplicates));
77933               nodes.keyto = uniq(nodes.keyto.filter(hasDuplicates));
77934
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);
77939
77940               var connectFrom = false;
77941               var connectVia = false;
77942               var connectTo = false;
77943               var connectKeyFrom = false;
77944               var connectKeyTo = false;
77945
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; }
77953               }
77954               if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
77955               if (connectFrom && connectVia) { return 'restriction'; }
77956               if (connectTo   && connectVia) { return 'restriction'; }
77957
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'; }
77963
77964                   var n0 = null;
77965                   var n1 = null;
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]; }
77970                   }
77971
77972                   if (n0 && n1) {    // both nodes are part of the restriction
77973                       var ok = false;
77974                       for (j = 0; j < memberWays.length; j++) {
77975                           way = memberWays[j];
77976                           if (way.areAdjacent(n0, n1)) {
77977                               ok = true;
77978                               break;
77979                           }
77980                       }
77981                       if (!ok) {
77982                           return 'restriction';
77983                       }
77984                   }
77985               }
77986
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;
77993
77994                       if (way.areAdjacent(nodeIDs[k], survivor.id)) {
77995                           way = way.removeNode(nodeIDs[k]);
77996                       } else {
77997                           way = way.replaceNode(nodeIDs[k], survivor.id);
77998                       }
77999                   }
78000                   if (way.isDegenerate()) {
78001                       return 'restriction';
78002                   }
78003               }
78004           }
78005
78006           return false;
78007
78008
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);
78012           }
78013
78014           function keyNodeFilter(froms, tos) {
78015               return function(n) {
78016                   return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
78017               };
78018           }
78019
78020           function collectNodes(member, collection) {
78021               var entity = graph.hasEntity(member.id);
78022               if (!entity) return;
78023
78024               var role = member.role || '';
78025               if (!collection[role]) {
78026                   collection[role] = [];
78027               }
78028
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);
78034                   }
78035
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());
78041                   }
78042                   if (role === 'to' || role === 'via') {
78043                       collection.keyto.push(entity.first());
78044                       collection.keyto.push(entity.last());
78045                   }
78046               }
78047           }
78048       };
78049
78050
78051       return action;
78052   }
78053
78054   function actionCopyEntities(ids, fromGraph) {
78055       var copies = {};
78056
78057
78058       var action = function(graph) {
78059           ids.forEach(function(id) {
78060               fromGraph.entity(id).copy(fromGraph, copies);
78061           });
78062
78063           for (var id in copies) {
78064               graph = graph.replace(copies[id]);
78065           }
78066
78067           return graph;
78068       };
78069
78070
78071       action.copies = function() {
78072           return copies;
78073       };
78074
78075
78076       return action;
78077   }
78078
78079   function actionDeleteMember(relationId, memberIndex) {
78080       return function(graph) {
78081           var relation = graph.entity(relationId)
78082               .removeMember(memberIndex);
78083
78084           graph = graph.replace(relation);
78085
78086           if (relation.isDegenerate())
78087               graph = actionDeleteRelation(relation.id)(graph);
78088
78089           return graph;
78090       };
78091   }
78092
78093   function actionDeprecateTags(entityId) {
78094
78095       return function(graph) {
78096           var entity = graph.entity(entityId),
78097               newtags = clone(entity.tags),
78098               change = false,
78099               rule;
78100
78101           // This handles dataDeprecated tags with a single condition
78102           for (var i = 0; i < dataDeprecated.length; i++) {
78103
78104               rule = dataDeprecated[i];
78105               var match = toPairs(rule.old)[0],
78106                   replacements = rule.replace ? toPairs(rule.replace) : null;
78107
78108               if (entity.tags[match[0]] && match[1] === '*') {
78109
78110                   var value = entity.tags[match[0]];
78111                   if (replacements && !newtags[replacements[0][0]]) {
78112                       newtags[replacements[0][0]] = value;
78113                   }
78114                   delete newtags[match[0]];
78115                   change = true;
78116
78117               } else if (entity.tags[match[0]] === match[1]) {
78118                   newtags = assign({}, rule.replace || {}, omit(newtags, match[0]));
78119                   change = true;
78120               }
78121           }
78122
78123           if (change) {
78124               return graph.replace(entity.update({tags: newtags}));
78125           } else {
78126               return graph;
78127           }
78128       };
78129   }
78130
78131   function actionDiscardTags(difference) {
78132
78133       return function(graph) {
78134           function discardTags(entity) {
78135               var tags = {};
78136               var keys = Object.keys(entity.tags);
78137               var discarded = false;
78138
78139               for (var i = 0; i < keys.length; i++) {
78140                   var k = keys[i];
78141                   if (dataDiscarded[k] || !entity.tags[k]) {
78142                       discarded = true;
78143                   } else {
78144                       tags[k] = entity.tags[k];
78145                   }
78146               }
78147
78148               if (discarded) {
78149                   graph = graph.replace(entity.update({ tags: tags }));
78150               }
78151           }
78152
78153           difference.modified().forEach(discardTags);
78154           difference.created().forEach(discardTags);
78155
78156           return graph;
78157       };
78158   }
78159
78160   // Disconect the ways at the given node.
78161   //
78162   // Optionally, disconnect only the given ways.
78163   //
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.
78167   //
78168   // This is the inverse of `iD.actionConnect`.
78169   //
78170   // Reference:
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
78173   //
78174   function actionDisconnect(nodeId, newNodeId) {
78175       var wayIds;
78176
78177
78178       var action = function(graph) {
78179           var node = graph.entity(nodeId);
78180           var connections = action.connections(graph);
78181
78182           connections.forEach(function(connection) {
78183               var way = graph.entity(connection.wayID);
78184               var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
78185
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));
78193               } else {
78194                   // replace shared node with multiple new nodes..
78195                   graph = graph.replace(way.updateNode(newNode.id, connection.index));
78196               }
78197           });
78198
78199           return graph;
78200       };
78201
78202
78203       action.connections = function(graph) {
78204           var candidates = [];
78205           var keeping = false;
78206           var parentWays = graph.parentWays(graph.entity(nodeId));
78207
78208           parentWays.forEach(function(way) {
78209               if (wayIds && wayIds.indexOf(way.id) === -1) {
78210                   keeping = true;
78211                   return;
78212               }
78213               if (way.isArea() && (way.nodes[0] === nodeId)) {
78214                   candidates.push({ wayID: way.id, index: 0 });
78215               } else {
78216                   way.nodes.forEach(function(waynode, index) {
78217                       if (waynode === nodeId) {
78218                           candidates.push({ wayID: way.id, index: index });
78219                       }
78220                   });
78221               }
78222           });
78223
78224           return keeping ? candidates : candidates.slice(1);
78225       };
78226
78227
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';
78232
78233           var parentWays = graph.parentWays(graph.entity(nodeId));
78234           var seenRelationIds = {};
78235           var sharedRelation;
78236
78237           parentWays.forEach(function(way) {
78238               if (wayIds && wayIds.indexOf(way.id) === -1)
78239                   return;
78240
78241               var relations = graph.parentRelations(way);
78242               relations.forEach(function(relation) {
78243                   if (relation.id in seenRelationIds) {
78244                       sharedRelation = relation;
78245                   } else {
78246                       seenRelationIds[relation.id] = true;
78247                   }
78248               });
78249           });
78250
78251           if (sharedRelation)
78252               return 'relation';
78253       };
78254
78255
78256       action.limitWays = function(_) {
78257           if (!arguments.length) return wayIds;
78258           wayIds = _;
78259           return action;
78260       };
78261
78262
78263       return action;
78264   }
78265
78266   // Join ways at the end node they share.
78267   //
78268   // This is the inverse of `iD.actionSplit`.
78269   //
78270   // Reference:
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
78273   //
78274   function actionJoin(ids) {
78275
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); }));
78279       }
78280
78281
78282       var action = function(graph) {
78283           var ways = ids.map(graph.entity, graph);
78284           var survivorID = ways[0].id;
78285
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;
78290                   break;
78291               }
78292           }
78293
78294           var sequences = osmJoinWays(ways, graph);
78295           var joined = sequences[0];
78296
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);
78300
78301           var survivor = graph.entity(survivorID);
78302           survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
78303           graph = graph.replace(survivor);
78304
78305           joined.forEach(function(way) {
78306               if (way.id === survivorID) return;
78307
78308               graph.parentRelations(way).forEach(function(parent) {
78309                   graph = graph.replace(parent.replaceMember(way, survivor));
78310               });
78311
78312               survivor = survivor.mergeTags(way.tags);
78313
78314               graph = graph.replace(survivor);
78315               graph = actionDeleteWay(way.id)(graph);
78316           });
78317
78318           return graph;
78319       };
78320
78321
78322       action.disabled = function(graph) {
78323           var geometries = groupEntitiesByGeometry(graph);
78324           if (ids.length < 2 || ids.length !== geometries.line.length)
78325               return 'not_eligible';
78326
78327           var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
78328           if (joined.length > 1)
78329               return 'not_adjacent';
78330
78331           var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
78332           var relation;
78333           var tags = {};
78334           var conflicting = false;
78335
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; }))
78340                       relation = parent;
78341               });
78342
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;
78348                   }
78349               }
78350           });
78351
78352           if (relation)
78353               return 'restriction';
78354
78355           if (conflicting)
78356               return 'conflicting_tags';
78357       };
78358
78359
78360       return action;
78361   }
78362
78363   function actionMerge(ids) {
78364
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); }));
78369       }
78370
78371
78372       var action = function(graph) {
78373           var geometries = groupEntitiesByGeometry(graph),
78374               target = geometries.area[0] || geometries.line[0],
78375               points = geometries.point;
78376
78377           points.forEach(function(point) {
78378               target = target.mergeTags(point.tags);
78379               graph = graph.replace(target);
78380
78381               graph.parentRelations(point).forEach(function(parent) {
78382                   graph = graph.replace(parent.replaceMember(point, target));
78383               });
78384
78385               var nodes = uniq(graph.childNodes(target)),
78386                   removeNode = point;
78387
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()) {
78393                       continue;
78394                   }
78395
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);
78401                   removeNode = node;
78402                   break;
78403               }
78404
78405               graph = graph.remove(removeNode);
78406           });
78407
78408           return graph;
78409       };
78410
78411
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';
78418       };
78419
78420
78421       return action;
78422   }
78423
78424   // `actionMergeNodes` is just a combination of:
78425   //
78426   // 1. move all the nodes to a common location
78427   // 2. `actionConnect` them
78428
78429   function actionMergeNodes(nodeIDs) {
78430
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;
78435           var sum = [0,0];
78436           var interestingCount = 0;
78437           var interestingLoc;
78438
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;
78443               }
78444               sum = geoVecAdd(sum, node.loc);
78445           }
78446
78447           return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
78448       }
78449
78450
78451       var action = function(graph) {
78452           if (nodeIDs.length < 2) return graph;
78453           var toLoc = chooseLoc(graph);
78454
78455           for (var i = 0; i < nodeIDs.length; i++) {
78456               var node = graph.entity(nodeIDs[i]);
78457               graph = graph.replace(node.move(toLoc));
78458           }
78459
78460           return actionConnect(nodeIDs)(graph);
78461       };
78462
78463
78464       action.disabled = function(graph) {
78465           if (nodeIDs.length < 2) return 'not_eligible';
78466
78467           for (var i = 0; i < nodeIDs.length; i++) {
78468               var entity = graph.entity(nodeIDs[i]);
78469               if (entity.type !== 'node') return 'not_eligible';
78470           }
78471
78472           return actionConnect(nodeIDs).disabled(graph);
78473       };
78474
78475       return action;
78476   }
78477
78478   function actionMergePolygon(ids, newRelationId) {
78479
78480       function groupEntities(graph) {
78481           var entities = ids.map(function (id) { return graph.entity(id); });
78482           return assignIn({
78483                   closedWay: [],
78484                   multipolygon: [],
78485                   other: []
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';
78491                   } else {
78492                       return 'other';
78493                   }
78494               }));
78495       }
78496
78497
78498       var action = function(graph) {
78499           var entities = groupEntities(graph);
78500
78501           // An array representing all the polygons that are part of the multipolygon.
78502           //
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);
78510               return member;
78511           }));
78512
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'));
78522               });
78523           });
78524
78525           // Sort all polygons as either outer or inner ways
78526           var members = [],
78527               outer = true;
78528
78529           while (polygons.length) {
78530               extractUncontained(polygons);
78531               polygons = polygons.filter(isContained);
78532               contained = contained.filter(isContained).map(filterContained);
78533           }
78534
78535           function isContained(d, i) {
78536               return some(contained[i]);
78537           }
78538
78539           function filterContained(d) {
78540               return d.filter(isContained);
78541           }
78542
78543           function extractUncontained(polygons) {
78544               polygons.forEach(function(d, i) {
78545                   if (!isContained(d, i)) {
78546                       d.forEach(function(member) {
78547                           members.push({
78548                               type: 'way',
78549                               id: member.id,
78550                               role: outer ? 'outer' : 'inner'
78551                           });
78552                       });
78553                   }
78554               });
78555               outer = !outer;
78556           }
78557
78558           // Move all tags to one relation
78559           var relation = entities.multipolygon[0] ||
78560               osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
78561
78562           entities.multipolygon.slice(1).forEach(function(m) {
78563               relation = relation.mergeTags(m.tags);
78564               graph = graph.remove(m);
78565           });
78566
78567           entities.closedWay.forEach(function(way) {
78568               function isThisOuter(m) {
78569                   return m.id === way.id && m.role !== 'inner';
78570               }
78571               if (members.some(isThisOuter)) {
78572                   relation = relation.mergeTags(way.tags);
78573                   graph = graph.replace(way.update({ tags: {} }));
78574               }
78575           });
78576
78577           return graph.replace(relation.update({
78578               members: members,
78579               tags: omit(relation.tags, 'area')
78580           }));
78581       };
78582
78583
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';
78591       };
78592
78593
78594       return action;
78595   }
78596
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/
78601   //
78602   // Expects two arrays of strings.
78603   function LCS(file1, file2) {
78604     var equivalenceClasses;
78605     var file2indices;
78606     var newCandidate;
78607     var candidates;
78608     var line;
78609     var c, i, j, jX, r, s;
78610
78611     equivalenceClasses = {};
78612     for (j = 0; j < file2.length; j++) {
78613       line = file2[j];
78614       if (equivalenceClasses[line]) {
78615         equivalenceClasses[line].push(j);
78616       } else {
78617         equivalenceClasses[line] = [j];
78618       }
78619     }
78620
78621     candidates = [
78622       { file1index: -1, file2index: -1, chain: null }
78623     ];
78624
78625     for (i = 0; i < file1.length; i++) {
78626       line = file1[i];
78627       file2indices = equivalenceClasses[line] || [];
78628
78629       r = 0;
78630       c = candidates[0];
78631
78632       for (jX = 0; jX < file2indices.length; jX++) {
78633         j = file2indices[jX];
78634
78635         for (s = r; s < candidates.length; s++) {
78636           if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
78637             break;
78638           }
78639         }
78640
78641         if (s < candidates.length) {
78642           newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
78643           if (r === candidates.length) {
78644             candidates.push(c);
78645           } else {
78646             candidates[r] = c;
78647           }
78648           r = s + 1;
78649           c = newCandidate;
78650           if (r === candidates.length) {
78651             break; // no point in examining further (j)s
78652           }
78653         }
78654       }
78655
78656       candidates[r] = c;
78657     }
78658
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].
78661
78662     return candidates[candidates.length - 1];
78663   }
78664
78665
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) {
78670     var result = [];
78671     var tail1 = file1.length;
78672     var tail2 = file2.length;
78673
78674     for (var candidate = LCS(file1, file2);
78675        candidate !== null;
78676        candidate = candidate.chain)
78677     {
78678       var mismatchLength1 = tail1 - candidate.file1index - 1;
78679       var mismatchLength2 = tail2 - candidate.file2index - 1;
78680       tail1 = candidate.file1index;
78681       tail2 = candidate.file2index;
78682
78683       if (mismatchLength1 || mismatchLength2) {
78684         result.push({
78685           file1: [tail1 + 1, mismatchLength1],
78686           file2: [tail2 + 1, mismatchLength2]
78687         });
78688       }
78689     }
78690
78691     result.reverse();
78692     return result;
78693   }
78694
78695
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
78700   //
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.
78705   //
78706   // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
78707   function diff3MergeIndices(a, o, b) {
78708     var i;
78709     var m1 = diffIndices(o, a);
78710     var m2 = diffIndices(o, b);
78711
78712     var hunks = [];
78713     function addHunk(h, side) {
78714       hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
78715     }
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]; });
78719
78720     var result = [];
78721     var commonOffset = 0;
78722     function copyCommon(targetOffset) {
78723       if (targetOffset > commonOffset) {
78724         result.push([1, commonOffset, targetOffset - commonOffset]);
78725         commonOffset = targetOffset;
78726       }
78727     }
78728
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) {
78738           break;
78739         }
78740         regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
78741         hunkIndex++;
78742       }
78743
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.
78749         if (hunk[4] > 0) {
78750           result.push([hunk[1], hunk[3], hunk[4]]);
78751         }
78752       } else {
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.
78759         var regions = {
78760           0: [a.length, -1, o.length, -1],
78761           2: [b.length, -1, o.length, -1]
78762         };
78763         for (i = firstHunkIndex; i <= hunkIndex; i++) {
78764           hunk = hunks[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]);
78775         }
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]);
78780         result.push([-1,
78781                      aLhs,      aRhs      - aLhs,
78782                      regionLhs, regionRhs - regionLhs,
78783                      bLhs,      bRhs      - bLhs]);
78784       }
78785       commonOffset = regionRhs;
78786     }
78787
78788     copyCommon(o.length);
78789     return result;
78790   }
78791
78792
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) {
78797     var result = [];
78798     var files = [a, o, b];
78799     var indices = diff3MergeIndices(a, o, b);
78800
78801     var okLines = [];
78802     function flushOk() {
78803       if (okLines.length) {
78804         result.push({ok: okLines});
78805       }
78806       okLines = [];
78807     }
78808     function pushOk(xs) {
78809       for (var j = 0; j < xs.length; j++) {
78810         okLines.push(xs[j]);
78811       }
78812     }
78813
78814     function isTrueConflict(rec) {
78815       if (rec[2] !== rec[6]) return true;
78816       var aoff = rec[1];
78817       var boff = rec[5];
78818       for (var j = 0; j < rec[2]; j++) {
78819         if (a[j + aoff] !== b[j + boff]) {
78820           return true;
78821         }
78822       }
78823       return false;
78824     }
78825
78826     for (var i = 0; i < indices.length; i++) {
78827       var x = indices[i];
78828       var side = x[0];
78829       if (side === -1) {
78830         if (excludeFalseConflicts && !isTrueConflict(x)) {
78831           pushOk(files[0].slice(x[1], x[1] + x[2]));
78832         } else {
78833           flushOk();
78834           result.push({
78835             conflict: {
78836               a: a.slice(x[1], x[1] + x[2]),
78837               aIndex: x[1],
78838               o: o.slice(x[3], x[3] + x[4]),
78839               oIndex: x[3],
78840               b: b.slice(x[5], x[5] + x[6]),
78841               bIndex: x[5]
78842             }
78843           });
78844         }
78845       } else {
78846         pushOk(files[side].slice(x[1], x[1] + x[2]));
78847       }
78848     }
78849
78850     flushOk();
78851     return result;
78852   }
78853
78854   function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
78855       var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
78856       var _conflicts = [];
78857
78858
78859       function user(d) {
78860           return isFunction(formatUser) ? formatUser(d) : d;
78861       }
78862
78863
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);
78868           }
78869
78870           if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
78871               return target;
78872           }
78873           if (_option === 'force_remote') {
78874               return target.update({loc: remote.loc});
78875           }
78876
78877           _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
78878           return target;
78879       }
78880
78881
78882       function mergeNodes(base, remote, target) {
78883           if (_option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
78884               return target;
78885           }
78886           if (_option === 'force_remote') {
78887               return target.update({nodes: remote.nodes});
78888           }
78889
78890           var ccount = _conflicts.length;
78891           var o = base.nodes || [];
78892           var a = target.nodes || [];
78893           var b = remote.nodes || [];
78894           var nodes = [];
78895           var hunks = diff3Merge(a, o, b, true);
78896
78897           for (var i = 0; i < hunks.length; i++) {
78898               var hunk = hunks[i];
78899               if (hunk.ok) {
78900                   nodes.push.apply(nodes, hunk.ok);
78901               } else {
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) }));
78911                       break;
78912                   }
78913               }
78914           }
78915
78916           return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
78917       }
78918
78919
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;
78926           }
78927
78928           var ccount = _conflicts.length;
78929
78930           for (var i = 0; i < children.length; i++) {
78931               var id = children[i];
78932               var node = graph.hasEntity(id);
78933
78934               // remove unused childNodes..
78935               if (targetWay.nodes.indexOf(id) === -1) {
78936                   if (node && !isUsed(node, targetWay)) {
78937                       updates.removeIds.push(id);
78938                   }
78939                   continue;
78940               }
78941
78942               // restore used childNodes..
78943               var local = localGraph.hasEntity(id);
78944               var remote = remoteGraph.hasEntity(id);
78945               var target;
78946
78947               if (_option === 'force_remote' && remote && remote.visible) {
78948                   updates.replacements.push(remote);
78949
78950               } else if (_option === 'force_local' && local) {
78951                   target = osmEntity$$1(local);
78952                   if (remote) {
78953                       target = target.update({ version: remote.version });
78954                   }
78955                   updates.replacements.push(target);
78956
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);
78961                   } else {
78962                       _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
78963                   }
78964
78965                   if (_conflicts.length !== ccount) break;
78966                   updates.replacements.push(target);
78967               }
78968           }
78969
78970           return targetWay;
78971       }
78972
78973
78974       function updateChildren(updates, graph) {
78975           for (var i = 0; i < updates.replacements.length; i++) {
78976               graph = graph.replace(updates.replacements[i]);
78977           }
78978           if (updates.removeIds.length) {
78979               graph = actionDeleteMultiple(updates.removeIds)(graph);
78980           }
78981           return graph;
78982       }
78983
78984
78985       function mergeMembers(remote, target) {
78986           if (_option === 'force_local' || isEqual(target.members, remote.members)) {
78987               return target;
78988           }
78989           if (_option === 'force_remote') {
78990               return target.update({members: remote.members});
78991           }
78992
78993           _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
78994           return target;
78995       }
78996
78997
78998       function mergeTags(base, remote, target) {
78999           function ignoreKey(k) {
79000               return dataDiscarded[k];
79001           }
79002
79003           if (_option === 'force_local' || isEqual(target.tags, remote.tags)) {
79004               return target;
79005           }
79006           if (_option === 'force_remote') {
79007               return target.update({tags: remote.tags});
79008           }
79009
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;
79017
79018           for (var i = 0; i < keys.length; i++) {
79019               var k = keys[i];
79020
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) }));
79025
79026                   } else {                  // unchanged locally, accept remote change..
79027                       if (b.hasOwnProperty(k)) {
79028                           tags[k] = b[k];
79029                       } else {
79030                           delete tags[k];
79031                       }
79032                       changed = true;
79033                   }
79034               }
79035           }
79036
79037           return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
79038       }
79039
79040
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.
79046       //
79047       //                  --- ... --- `localGraph` -- ... -- `graph`
79048       //                 /
79049       //  `graph.base()` --- ... --- `remoteGraph`
79050       //
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 });
79057
79058           // delete/undelete
79059           if (!remote.visible) {
79060               if (_option === 'force_remote') {
79061                   return actionDeleteMultiple([id])(graph);
79062
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);
79067                   }
79068                   return graph.replace(target);
79069
79070               } else {
79071                   _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
79072                   return graph;  // do nothing
79073               }
79074           }
79075
79076           // merge
79077           if (target.type === 'node') {
79078               target = mergeLocation(remote, target);
79079
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);
79085
79086           } else if (target.type === 'relation') {
79087               target = mergeMembers(remote, target);
79088           }
79089
79090           target = mergeTags(base, remote, target);
79091
79092           if (!_conflicts.length) {
79093               graph = updateChildren(updates, graph).replace(target);
79094           }
79095
79096           return graph;
79097       };
79098
79099
79100       action.withOption = function(opt) {
79101           _option = opt;
79102           return action;
79103       };
79104
79105
79106       action.conflicts = function() {
79107           return _conflicts;
79108       };
79109
79110
79111       return action;
79112   }
79113
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;
79118
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;
79123
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;
79127
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];
79131
79132               return parentsMoving;
79133           }
79134
79135           function cacheEntities(ids) {
79136               for (var i = 0; i < ids.length; i++) {
79137                   var id = ids[i];
79138                   if (cache.moving[id]) continue;
79139                   cache.moving[id] = true;
79140
79141                   var entity = graph.hasEntity(id);
79142                   if (!entity) continue;
79143
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);
79150                   } else {
79151                       cacheEntities(entity.members.map(function(member) {
79152                           return member.id;
79153                       }));
79154                   }
79155               }
79156           }
79157
79158           function cacheIntersections(ids) {
79159               function isEndpoint(way, id) {
79160                   return !way.isClosed() && !!way.affix(id);
79161               }
79162
79163               for (var i = 0; i < ids.length; i++) {
79164                   var id = ids[i];
79165
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;
79172
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]) {
79178                               unmoved = way;
79179                               break;
79180                           }
79181                       }
79182                       if (!unmoved) continue;
79183
79184                       // exclude ways that are overly connected..
79185                       if (intersection(moved.nodes, unmoved.nodes).length > 2) continue;
79186                       if (moved.isArea() || unmoved.isArea()) continue;
79187
79188                       cache.intersections.push({
79189                           nodeId: node.id,
79190                           movedId: moved.id,
79191                           unmovedId: unmoved.id,
79192                           movedIsEP: isEndpoint(moved, node.id),
79193                           unmovedIsEP: isEndpoint(unmoved, node.id)
79194                       });
79195                   }
79196               }
79197           }
79198
79199
79200           if (!cache) {
79201               cache = {};
79202           }
79203           if (!cache.ok) {
79204               cache.moving = {};
79205               cache.intersections = [];
79206               cache.replacedVertex = {};
79207               cache.startLoc = {};
79208               cache.nodes = [];
79209               cache.ways = [];
79210
79211               cacheEntities(moveIds);
79212               cacheIntersections(cache.ways);
79213               cache.nodes = filter(cache.nodes, canMove);
79214
79215               cache.ok = true;
79216           }
79217       }
79218
79219
79220       // Place a vertex where the moved vertex used to be, to preserve way shape..
79221       //
79222       //  Start:
79223       //      b ---- e
79224       //     / \
79225       //    /   \
79226       //   /     \
79227       //  a       c
79228       //
79229       //      *               node '*' added to preserve shape
79230       //     / \
79231       //    /   b ---- e      way `b,e` moved here:
79232       //   /     \
79233       //  a       c
79234       //
79235       //
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;
79241
79242           if (way.isClosed()) {
79243               len = way.nodes.length - 1;
79244               prevIndex = (movedIndex + len - 1) % len;
79245               nextIndex = (movedIndex + len + 1) % len;
79246           } else {
79247               len = way.nodes.length;
79248               prevIndex = movedIndex - 1;
79249               nextIndex = movedIndex + 1;
79250           }
79251
79252           var prev = graph.hasEntity(way.nodes[prevIndex]);
79253           var next = graph.hasEntity(way.nodes[nextIndex]);
79254
79255           // Don't add orig vertex at endpoint..
79256           if (!prev || !next) return graph;
79257
79258           var key = wayId + '_' + nodeId;
79259           var orig = cache.replacedVertex[key];
79260           if (!orig) {
79261               orig = osmNode();
79262               cache.replacedVertex[key] = orig;
79263               cache.startLoc[orig.id] = cache.startLoc[nodeId];
79264           }
79265
79266           var start, end;
79267           if (delta) {
79268               start = projection(cache.startLoc[nodeId]);
79269               end = projection.invert(geoVecAdd(start, delta));
79270           } else {
79271               end = cache.startLoc[nodeId];
79272           }
79273           orig = orig.move(end);
79274
79275           var angle = Math.abs(geoAngle(orig, prev, projection) -
79276                   geoAngle(orig, next, projection)) * 180 / Math.PI;
79277
79278           // Don't add orig vertex if it would just make a straight line..
79279           if (angle > 175 && angle < 185) return graph;
79280
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;
79287
79288           // moving around closed loop?
79289           if (way.isClosed() && insertAt === 0) insertAt = len;
79290
79291           way = way.addNode(orig.id, insertAt);
79292           return graph.replace(orig).replace(way);
79293       }
79294
79295
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;
79301           var prev, curr;
79302
79303           function isInteresting(node, graph) {
79304               return graph.parentWays(node).length > 1 ||
79305                   graph.parentRelations(node).length ||
79306                   node.hasInterestingTags();
79307           }
79308
79309           for (var i = 0; i < way.nodes.length; i++) {
79310               curr = graph.entity(way.nodes[i]);
79311
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);
79319                   }
79320               }
79321
79322               prev = curr;
79323           }
79324
79325           return graph;
79326       }
79327
79328
79329       // Reorder nodes around intersections that have moved..
79330       //
79331       //  Start:                way1.nodes: b,e         (moving)
79332       //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
79333       //      |                 vertex: b
79334       //      e                 isEP1: true,  isEP2, false
79335       //
79336       //  way1 `b,e` moved here:
79337       //  a ----- c = b - d
79338       //              |
79339       //              e
79340       //
79341       //  reorder nodes         way1.nodes: b,e
79342       //  a ----- c - b - d     way2.nodes: a,c,b,d
79343       //              |
79344       //              e
79345       //
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;
79352
79353           // don't move the vertex if it is the endpoint of both ways.
79354           if (isEP1 && isEP2) return graph;
79355
79356           var nodes1 = without(graph.childNodes(way1), vertex);
79357           var nodes2 = without(graph.childNodes(way2), vertex);
79358
79359           if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
79360           if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
79361
79362           var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
79363           var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
79364           var loc;
79365
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;
79374               }
79375           } else if (!isEP1) {
79376               loc = edge1.loc;
79377           } else {
79378               loc = edge2.loc;
79379           }
79380
79381           graph = graph.replace(vertex.move(loc));
79382
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);
79387           }
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);
79391           }
79392
79393           return graph;
79394       }
79395
79396
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);
79405           }
79406
79407           return graph;
79408       }
79409
79410
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);
79415           }
79416
79417           for (var i = 0; i < cache.intersections.length; i++) {
79418               var obj = cache.intersections[i];
79419
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;
79424
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);
79433
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);
79438               }
79439           }
79440       }
79441
79442
79443       var action = function(graph) {
79444           if (_delta[0] === 0 && _delta[1] === 0) return graph;
79445
79446           setupCache(graph);
79447
79448           if (cache.intersections.length) {
79449               limitDelta(graph);
79450           }
79451
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)));
79457           }
79458
79459           if (cache.intersections.length) {
79460               graph = cleanupIntersections(graph);
79461           }
79462
79463           return graph;
79464       };
79465
79466
79467       action.delta = function() {
79468           return _delta;
79469       };
79470
79471
79472       return action;
79473   }
79474
79475   function actionMoveNode(nodeID, toLoc) {
79476
79477       var action = function(graph, t) {
79478           if (t === null || !isFinite(t)) t = 1;
79479           t = Math.min(Math.max(+t, 0), 1);
79480
79481           var node = graph.entity(nodeID);
79482           return graph.replace(
79483               node.move(geoVecInterp(node.loc, toLoc, t))
79484           );
79485       };
79486
79487       action.transitionable = true;
79488
79489       return action;
79490   }
79491
79492   function actionNoop() {
79493       return function(graph) {
79494           return graph;
79495       };
79496   }
79497
79498   /*
79499    * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
79500    */
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);
79505
79506
79507       var action = function(graph, t) {
79508           if (t === null || !isFinite(t)) t = 1;
79509           t = Math.min(Math.max(+t, 0), 1);
79510
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},
79515               epsilon = 1e-4,
79516               node, loc, score, motions, i, j;
79517
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) {
79524                       break;
79525                   }
79526               }
79527
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)));
79531
79532           } else {
79533               var best,
79534                   originalPoints = clone(points);
79535               score = Infinity;
79536
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]);
79541                   }
79542                   var newScore = squareness(points);
79543                   if (newScore < score) {
79544                       best = clone(points);
79545                       score = newScore;
79546                   }
79547                   if (score < epsilon) {
79548                       break;
79549                   }
79550               }
79551
79552               points = best;
79553
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)));
79560                   }
79561               }
79562
79563               // remove empty nodes on straight sections
79564               for (i = 0; t === 1 && i < points.length; i++) {
79565                   node = graph.entity(nodes[i].id);
79566
79567                   if (graph.parentWays(node).length > 1 ||
79568                       graph.parentRelations(node).length ||
79569                       node.hasInterestingTags()) {
79570                       continue;
79571                   }
79572
79573                   var dotp = normalizedDotProduct(i, points);
79574                   if (dotp < -1 + epsilon) {
79575                       graph = actionDeleteNode(node.id)(graph);
79576                   }
79577               }
79578           }
79579
79580           return graph;
79581
79582
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),
79588                   scale, dotp;
79589
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);
79593
79594               dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
79595
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) {
79599                       dotp += 1.0;
79600                   }
79601               } else if (dotp && Math.abs(dotp) < corner.dotp) {
79602                   corner.i = i;
79603                   corner.dotp = Math.abs(dotp);
79604               }
79605
79606               return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
79607           }
79608       };
79609
79610
79611       function squareness(points) {
79612           return points.reduce(function(sum, val, i, array) {
79613               var dotp = normalizedDotProduct(i, array);
79614
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)));
79617           }, 0);
79618       }
79619
79620
79621       function normalizedDotProduct(i, points) {
79622           var a = points[(i - 1 + points.length) % points.length],
79623               b = points[i],
79624               c = points[(i + 1) % points.length],
79625               p = subtractPoints(a, b),
79626               q = subtractPoints(c, b);
79627
79628           p = normalizePoint(p, 1.0);
79629           q = normalizePoint(q, 1.0);
79630
79631           return p[0] * q[0] + p[1] * q[1];
79632       }
79633
79634
79635       function subtractPoints(a, b) {
79636           return [a[0] - b[0], a[1] - b[1]];
79637       }
79638
79639
79640       function addPoints(a, b) {
79641           return [a[0] + b[0], a[1] + b[1]];
79642       }
79643
79644
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;
79651           }
79652
79653           vector[0] *= scale;
79654           vector[1] *= scale;
79655
79656           return vector;
79657       }
79658
79659
79660       function filterDotProduct(dotp) {
79661           if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
79662               return dotp;
79663           }
79664
79665           return 0;
79666       }
79667
79668
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); });
79673
79674           if (squareness(points)) {
79675               return false;
79676           }
79677
79678           return 'not_squarish';
79679       };
79680
79681
79682       action.transitionable = true;
79683
79684
79685       return action;
79686   }
79687
79688   // `actionRestrictTurn` creates a turn restriction relation.
79689   //
79690   // `turn` must be an `osmTurn` object
79691   // see osm/intersection.js, pathToTurn()
79692   //
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.)
79696   //
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)
79699   //
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.
79703   //
79704   function actionRestrictTurn(turn, restrictionType, restrictionID) {
79705
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); });
79711           var members = [];
79712
79713           members.push({ id: fromWay.id, type: 'way',  role: 'from' });
79714
79715           if (viaNode) {
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' });
79720               });
79721           }
79722
79723           members.push({ id: toWay.id, type: 'way',  role: 'to' });
79724
79725           return graph.replace(osmRelation({
79726               id: restrictionID,
79727               tags: {
79728                   type: 'restriction',
79729                   restriction: restrictionType
79730               },
79731               members: members
79732           }));
79733       };
79734   }
79735
79736   function actionRevert(id) {
79737       var action = function(graph) {
79738           var entity = graph.hasEntity(id),
79739               base = graph.base().entities[id];
79740
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);
79747
79748                           if (parent.isDegenerate()) {
79749                               graph = actionDeleteWay(parent.id)(graph);
79750                           }
79751                       });
79752               }
79753
79754               graph.parentRelations(entity)
79755                   .forEach(function(parent) {
79756                       parent = parent.removeMembersWithID(id);
79757                       graph = graph.replace(parent);
79758
79759                       if (parent.isDegenerate()) {
79760                           graph = actionDeleteRelation(parent.id)(graph);
79761                       }
79762                   });
79763           }
79764
79765           return graph.revert(id);
79766       };
79767
79768       return action;
79769   }
79770
79771   function actionRotate(rotateIds, pivot, angle, projection) {
79772
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)));
79778               });
79779           });
79780       };
79781
79782       return action;
79783   }
79784
79785   /* Built-in method references for those with the same name as other `lodash` methods. */
79786   var nativeMax$8 = Math.max;
79787
79788   /**
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`.
79793    *
79794    * @static
79795    * @memberOf _
79796    * @since 0.1.0
79797    * @category 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`.
79802    * @example
79803    *
79804    * _.indexOf([1, 2, 1, 2], 2);
79805    * // => 1
79806    *
79807    * // Search from the `fromIndex`.
79808    * _.indexOf([1, 2, 1, 2], 2, 2);
79809    * // => 3
79810    */
79811   function indexOf(array, value, fromIndex) {
79812     var length = array == null ? 0 : array.length;
79813     if (!length) {
79814       return -1;
79815     }
79816     var index = fromIndex == null ? 0 : toInteger(fromIndex);
79817     if (index < 0) {
79818       index = nativeMax$8(length + index, 0);
79819     }
79820     return baseIndexOf(array, value, index);
79821   }
79822
79823   // Split a way at the given node.
79824   //
79825   // Optionally, split only the given ways, if multiple ways share
79826   // the given node.
79827   //
79828   // This is the inverse of `iD.actionJoin`.
79829   //
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.
79833   //
79834   // Reference:
79835   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
79836   //
79837   function actionSplit(nodeId, newWayIds) {
79838       var _wayIDs;
79839
79840       // If the way is closed, we need to search for a partner node
79841       // to split the way at.
79842       //
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
79847       // of nodes).
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);
79852           var length;
79853           var i;
79854           var best = 0;
79855           var idxB;
79856
79857           function wrap(index) {
79858               return utilWrap(index, nodes.length);
79859           }
79860
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;
79866           }
79867
79868           // calculate lengths
79869           length = 0;
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;
79873           }
79874
79875           length = 0;
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;
79880           }
79881
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]);
79885               if (cost > best) {
79886                   idxB = i;
79887                   best = cost;
79888               }
79889           }
79890
79891           return idxB;
79892       }
79893
79894
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();
79898           var nodesA;
79899           var nodesB;
79900           var isArea = wayA.isArea();
79901           var isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
79902
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);
79907
79908               if (idxB < idxA) {
79909                   nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
79910                   nodesB = nodes.slice(idxB, idxA + 1);
79911               } else {
79912                   nodesA = nodes.slice(idxA, idxB + 1);
79913                   nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
79914               }
79915           } else {
79916               var idx = indexOf(wayA.nodes, nodeId, 1);
79917               nodesA = wayA.nodes.slice(0, idx + 1);
79918               nodesB = wayA.nodes.slice(idx);
79919           }
79920
79921           wayA = wayA.update({nodes: nodesA});
79922           wayB = wayB.update({nodes: nodesB});
79923
79924           graph = graph.replace(wayA);
79925           graph = graph.replace(wayB);
79926
79927           graph.parentRelations(wayA).forEach(function(relation) {
79928               var member;
79929
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');
79938                   var i;
79939
79940                   // 1. split a FROM/TO
79941                   if (f.id === wayA.id || t.id === wayA.id) {
79942                       var keepB = false;
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) {
79950                                       keepB = true;
79951                                       break;
79952                                   }
79953                               }
79954                           }
79955                       }
79956
79957                       if (keepB) {
79958                           relation = relation.replaceMember(wayA, wayB);
79959                           graph = graph.replace(relation);
79960                       }
79961
79962                   // 2. split a VIA
79963                   } else {
79964                       for (i = 0; i < v.length; i++) {
79965                           if (v[i].type === 'way' && v[i].id === wayA.id) {
79966                               member = {
79967                                   id: wayB.id,
79968                                   type: 'way',
79969                                   role: 'via'
79970                               };
79971                               graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
79972                               break;
79973                           }
79974                       }
79975                   }
79976
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)
79980               } else {
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: {}}));
79985                   }
79986
79987                   member = {
79988                       id: wayB.id,
79989                       type: 'way',
79990                       role: relation.memberById(wayA.id).role
79991                   };
79992
79993                   var insertPair = {
79994                       originalID: wayA.id,
79995                       insertedID: wayB.id,
79996                       nodes: origNodes
79997                   };
79998
79999                   graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
80000               }
80001           });
80002
80003           if (!isOuter && isArea) {
80004               var multipolygon = osmRelation({
80005                   tags: assignIn({}, wayA.tags, {type: 'multipolygon'}),
80006                   members: [
80007                       {id: wayA.id, role: 'outer', type: 'way'},
80008                       {id: wayB.id, role: 'outer', type: 'way'}
80009                   ]
80010               });
80011
80012               graph = graph.replace(multipolygon);
80013               graph = graph.replace(wayA.update({tags: {}}));
80014               graph = graph.replace(wayB.update({tags: {}}));
80015           }
80016
80017           return graph;
80018       }
80019
80020
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]);
80025           }
80026           return graph;
80027       };
80028
80029
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'; });
80034
80035           return parents.filter(function(parent) {
80036               if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
80037                   return false;
80038
80039               if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
80040                   return false;
80041
80042               if (parent.isClosed()) {
80043                   return true;
80044               }
80045
80046               for (var i = 1; i < parent.nodes.length - 1; i++) {
80047                   if (parent.nodes[i] === nodeId) {
80048                       return true;
80049                   }
80050               }
80051
80052               return false;
80053           });
80054       };
80055
80056
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';
80061       };
80062
80063
80064       action.limitWays = function(_) {
80065           if (!arguments.length) return _wayIDs;
80066           _wayIDs = _;
80067           return action;
80068       };
80069
80070
80071       return action;
80072   }
80073
80074   /*
80075    * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
80076    */
80077   function actionStraighten(wayId, projection) {
80078
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));
80082       }
80083
80084
80085       var action = function(graph, t) {
80086           if (t === null || !isFinite(t)) t = 1;
80087           t = Math.min(Math.max(+t, 0), 1);
80088
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],
80094               toDelete = [],
80095               i;
80096
80097           for (i = 1; i < points.length-1; i++) {
80098               var node = nodes[i],
80099                   point = points[i];
80100
80101               if (t < 1 || graph.parentWays(node).length > 1 ||
80102                   graph.parentRelations(node).length ||
80103                   node.hasInterestingTags()) {
80104
80105                   var u = positionAlongWay(point, startPoint, endPoint),
80106                       p = [
80107                           startPoint[0] + u * (endPoint[0] - startPoint[0]),
80108                           startPoint[1] + u * (endPoint[1] - startPoint[1])
80109                       ],
80110                       loc2 = projection.invert(p);
80111
80112                   graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
80113
80114               } else {
80115                   // safe to delete
80116                   if (toDelete.indexOf(node) === -1) {
80117                       toDelete.push(node);
80118                   }
80119               }
80120           }
80121
80122           for (i = 0; i < toDelete.length; i++) {
80123               graph = actionDeleteNode(toDelete[i].id)(graph);
80124           }
80125
80126           return graph;
80127       };
80128
80129
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),
80138               i;
80139
80140           if (threshold === 0) {
80141               return 'too_bendy';
80142           }
80143
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));
80150
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';
80154               }
80155           }
80156       };
80157
80158
80159       action.transitionable = true;
80160
80161
80162       return action;
80163   }
80164
80165   // `actionUnrestrictTurn` deletes a turn restriction relation.
80166   //
80167   // `turn` must be an `osmTurn` object with a `restrictionID` property.
80168   // see osm/intersection.js, pathToTurn()
80169   //
80170   function actionUnrestrictTurn(turn) {
80171       return function(graph) {
80172           return actionDeleteRelation(turn.restrictionID)(graph);
80173       };
80174   }
80175
80176   /* Reflect the given area around its axis of symmetry */
80177   function actionReflect(reflectIds, projection) {
80178       var useLongAxis = true;
80179
80180
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,
80188               ssrExtent = [],
80189               ssrAngle = 0,
80190               c1 = hull[0];
80191
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();
80200
80201               if (area < minArea) {
80202                   minArea = area;
80203                   ssrExtent = extent;
80204                   ssrAngle = angle;
80205               }
80206               c1 = c2;
80207           }
80208
80209           return {
80210               poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
80211               angle: ssrAngle
80212           };
80213       }
80214
80215
80216       var action = function(graph, t) {
80217           if (t === null || !isFinite(t)) t = 1;
80218           t = Math.min(Math.max(+t, 0), 1);
80219
80220           var nodes = utilGetAllNodes(reflectIds, graph),
80221               ssr = getSmallestSurroundingRectangle(graph, nodes);
80222
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 ],
80230               p, q;
80231
80232           var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
80233           if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
80234               p = p1;
80235               q = q1;
80236           } else {
80237               p = p2;
80238               q = q2;
80239           }
80240
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);
80250               var c2 = [
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]
80253               ];
80254               var loc2 = projection.invert(c2);
80255               node = node.move(geoVecInterp(node.loc, loc2, t));
80256               graph = graph.replace(node);
80257           }
80258
80259           return graph;
80260       };
80261
80262
80263       action.useLongAxis = function(_) {
80264           if (!arguments.length) return useLongAxis;
80265           useLongAxis = _;
80266           return action;
80267       };
80268
80269
80270       action.transitionable = true;
80271
80272
80273       return action;
80274   }
80275
80276
80277
80278   var index$4 = /*#__PURE__*/Object.freeze({
80279     d3combobox: d3combobox,
80280     d3geoTile: d3geoTile,
80281     d3keybinding: d3keybinding
80282   });
80283
80284   var Connection = services.osm;
80285
80286   var debug = false;
80287
80288   var iD = /*#__PURE__*/Object.freeze({
80289     Connection: Connection,
80290     debug: debug,
80291     lib: index$4,
80292     d3: index$3,
80293     Context: coreContext,
80294     setAreaKeys: setAreaKeys,
80295     Difference: coreDifference,
80296     Graph: coreGraph$$1,
80297     History: coreHistory,
80298     Tree: coreTree,
80299     geoCross: geoVecCross,
80300     geoInterp: geoVecInterp,
80301     geoRoundCoordinates: geoVecFloor,
80302     geoEuclideanDistance: geoVecLength,
80303     Entity: osmEntity$$1,
80304     Node: osmNode,
80305     Relation: osmRelation,
80306     Way: osmWay,
80307     BackgroundSource: rendererBackgroundSource,
80308     Background: rendererBackground,
80309     Features: rendererFeatures,
80310     Map: rendererMap,
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,
80368     data: data,
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,
80379     dataEn: en,
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,
80441     osmNode: osmNode,
80442     osmRelation: osmRelation,
80443     osmWay: osmWay,
80444     osmIntersection: osmIntersection,
80445     osmTurn: osmTurn,
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,
80475     svgDefs: svgDefs,
80476     svgGpx: svgGpx$$1,
80477     svgIcon: svgIcon,
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,
80486     svgOsm: svgOsm,
80487     svgPassiveVertex: svgPassiveVertex,
80488     svgPath: svgPath,
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,
80522     uiIntro: uiIntro,
80523     uiInfoPanels: uiInfoPanels,
80524     uiPanelBackground: uiPanelBackground,
80525     uiPanelHistory: uiPanelHistory,
80526     uiPanelLocation: uiPanelLocation,
80527     uiPanelMeasurement: uiPanelMeasurement,
80528     uiInit: uiInit,
80529     uiAccount: uiAccount,
80530     uiAttribution: uiAttribution,
80531     uiBackground: uiBackground,
80532     uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
80533     uiBackgroundOffset: uiBackgroundOffset,
80534     uiChangesetEditor: uiChangesetEditor,
80535     uiCmd: uiCmd,
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,
80548     uiField: uiField,
80549     uiFieldHelp: uiFieldHelp,
80550     uiFlash: uiFlash,
80551     uiFormFields: uiFormFields,
80552     uiFullScreen: uiFullScreen,
80553     uiGeolocate: uiGeolocate,
80554     uiHelp: uiHelp,
80555     uiInfo: uiInfo,
80556     uiInspector: uiInspector,
80557     uiLasso: uiLasso,
80558     uiLoading: uiLoading,
80559     uiMapData: uiMapData,
80560     uiMapInMap: uiMapInMap,
80561     uiModal: uiModal,
80562     uiModes: uiModes,
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,
80572     uiSave: uiSave,
80573     uiScale: uiScale,
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,
80587     uiZoom: uiZoom,
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
80624   });
80625
80626   window.iD = iD;
80627
80628 }());
80629 //# sourceMappingURL=iD.js.map